view release on metacpan or search on metacpan
benchmarking/bench-axis-fit-accel.pl view on Meta::CPAN
# 1. n_trees -- packing cost grows with tree count
# 2. dataset size -- subsampling dominates; packing is fixed
# 3. feature count -- wide sweep (2, 5, 10, 20, 50)
# 4. feature count -- fine-grained 2-10
#
# Run with:
# perl -Ilib benchmarking/bench-axis-fit-accel.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-axis-predict-accel.pl view on Meta::CPAN
# 4. Feature count (wide) -- 2, 5, 10, 20, 50
# 5. Feature count (2-10) -- fine-grained sweep
#
# Models are pre-trained before any timing begins.
#
# Run with:
# perl -Ilib benchmarking/bench-axis-predict-accel.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-extended-fit-accel.pl view on Meta::CPAN
# 1. n_trees -- packing cost grows with tree count
# 2. dataset size -- subsampling dominates; packing is fixed
# 3. feature count -- wide sweep (2, 5, 10, 20, 50)
# 4. feature count -- fine-grained 2-10
#
# Run with:
# perl -Ilib benchmarking/bench-extended-fit-accel.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-extended-predict-accel.pl view on Meta::CPAN
# 4. Feature count (wide) -- 2, 5, 10, 20, 50
# 5. Feature count (2-10) -- fine-grained sweep
#
# Models are pre-trained before any timing begins.
#
# Run with:
# perl -Ilib benchmarking/bench-extended-predict-accel.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-fit-parallel.pl view on Meta::CPAN
# With the C builder, a single-process fit is often fast enough that
# this fixed per-worker overhead costs more than splitting the work
# saves -- watch for parallel_fit making things *slower* on small/
# medium datasets in the sweep below.
#
# Run with:
# perl -Ilib benchmarking/bench-fit-parallel.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_time_median);
use Config;
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-fit.pl view on Meta::CPAN
#
# Each section uses BenchAccel::wall_cmpthese so results include both the raw
# rate (fits/sec) and relative %-difference between variants.
# Data generation is done before timing starts.
#
# Run with:
# perl -Ilib benchmarking/bench-fit.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
# Simple Box-Muller Gaussian sample
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-modes.pl view on Meta::CPAN
# Extended mode at high feature counts is where the SIMD pragma on the
# oblique dot product matters most, so the sweep extends up to 100
# features. The closer the extended:score row gets to axis:score, the
# less the per-node dot product is costing.
#
# Run with:
# perl -Ilib benchmarking/bench-modes.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-online-score-accel.pl view on Meta::CPAN
# Reference numbers (2026-07-08, 8-core dev box, 100 trees, window 2048,
# 5 features): batch scoring of 20k query points -- pure Perl ~3.6 s/call,
# C serial ~58 ms, C+OpenMP ~9 ms; score_learn stream -- pure Perl ~270
# pts/s, C ~2,400 pts/s.
#
# Run with:
# perl -Ilib benchmarking/bench-online-score-accel.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest ();
use Algorithm::Classifier::IsolationForest::Online ();
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-score.pl view on Meta::CPAN
# 3. n_trees scaling on scoring -- effect of model size on score time
# 4. Feature count 2â10 -- fine-grained column-count sweep on scoring
#
# Models are pre-trained before any timing begins.
#
# Run with:
# perl -Ilib benchmarking/bench-score.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}
benchmarking/bench-sklearn-scoring.pl view on Meta::CPAN
# >1 means sklearn is faster; <1 means Perl is faster.
#
# Unavailable backends (Inline::C not installed, OpenMP not linked,
# scikit-learn not installed) are omitted from the table.
#
# Run with:
# perl -Ilib benchmarking/bench-sklearn-scoring.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_rate);
use File::Temp qw(tempfile);
use JSON::PP ();
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
my $HAS_C = $Algorithm::Classifier::IsolationForest::HAS_C;
my $HAS_OPENMP = $Algorithm::Classifier::IsolationForest::HAS_OPENMP;
benchmarking/bench-streamd.pl view on Meta::CPAN
# shared model, one loop -- by design); ping ~29,000 round trips/s;
# save ~140 ms. The wire is nowhere near the bottleneck -- the model
# is.
#
# Run with:
# perl -Ilib benchmarking/bench-streamd.pl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";
use lib "$FindBin::Bin";
use BenchAccel qw(wall_rate wall_time_median);
use Time::HiRes qw(time);
use File::Temp qw(tempdir);
use IO::Select ();
use IO::Socket::UNIX ();
use POSIX ();
use Algorithm::Classifier::IsolationForest::Online ();
eval { require JSON::MaybeXS; 1 }
or die "this benchmark needs JSON::MaybeXS (streamd's wire protocol): $@";
benchmarking/bench-voting.pl view on Meta::CPAN
# flags (false alarms), and how often the two modes agree. The
# threshold means different things in each mode -- a forest-level
# score cutoff for mean, a per-tree cutoff for majority -- but the
# paper compares them at the same nominal value (0.6), so we do too.
#
# Run with:
# perl -Ilib benchmarking/bench-voting.pl
use strict;
use warnings;
use lib '../lib';
use FindBin;
use lib "$FindBin::Bin";
use BenchAccel qw(wall_cmpthese);
use Algorithm::Classifier::IsolationForest;
use constant PI => 3.14159265358979;
sub gaussian {
my ( $mu, $sigma ) = @_;
return $mu + $sigma * sqrt( -2 * log( rand() || 1e-12 ) ) * cos( 2 * PI * rand() );
}