Algorithm-Classifier-IsolationForest

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

          for citations). The existing sklearn comparison only ever ran
          against synthetic blobs, and only on machines with Python.
          sklearn's scores are now checked in beside each dataset, so the
          comparison runs everywhere; where Python is present an extra arm
          re-runs sklearn live and catches drift against the checked-in
          reference. Agreement is required to be no worse than our own
          seed-to-seed agreement, rather than against a per-dataset floor:
          an Isolation Forest is a random estimator, so that spread is the
          ceiling, and measuring against it keeps the thresholds from
          encoding how hard a given dataset is to rank. Also checks that C
          and pure-Perl score identically on 30+ correlated columns, and
          that fit_from_csv detects a real header.

0.6.0   2026-07-09/08:15
        - Implement Online Isolation Forest (Filippo Leveni, Guilherme
          Weigert Cassales, Bernhard Pfahringer, Albert Bifet, Giacomo
          Boracchi (2024)) as the new companion class
          Algorithm::Classifier::IsolationForest::Online and releated
          CLI commands.
        - initial prototype support
        - munging via Algorithm::ToNumberMunger

0.5.0   2026-07-04/14:30
        - Wide-NV perls (-Duselongdouble / -Dusequadmath(maybe? does this
          even exist? but possibly some idiot on github... but would fix
          it in this case as well): the pure-Perl tree builder now rounds
          every value it stores (split points, hyperplane coefficients and
          offsets, impute fills) to C double precision at the same points
          the C builder rounds preserving the seed-for-seed bit-identical
          guarantee across backends. Possible breakages for the tests for
          extended mode where -Duselongdouble is in play may exist so tests
          for those systems where it is are skipped for now.
        - Implement Majority Voting Isolation Forest (MVIForest --
          Chabchoub, Togbe, Boly & Chiky 2022, IEEE Access,
          doi:10.1109/ACCESS.2022.3144425) as new(voting => 'majority'):
          Since this only affects how the trees are walked etc and not build,
          the voting method can be switched between majority and mean.
         - adjust how iforest info displays tag info

0.4.0   2026-07-03/22:45
        - Implement named features and methods for testing single rows using
          tagged data.
        - The C backend can be built and installed at install time, meaning
          nothing needs built unless changing the opts. See the docs for
          more details.
        - new IF_NO_OPENMP=1 selects/builds the serial C backend: no
          libgomp linkage and no OpenMP runtime in the process at all
          (unlike OMP_NUM_THREADS=1, which just caps the thread count);
          IF_NO_OPENMP=0 re-enables OpenMP over a serial install default
        - new IF_RUNTIME_BUILD=1 ignores the prebuilt object and forces
          the classic runtime build even when the flags match
        - iforest accel updated to reflect various changes to the C backend
        - scoring: the per-leaf path-length adjustment c(size) is now
          precomputed at tree-pack time and stored in the (previously
          unused) third slot of packed leaf records, removing a log()
          call per point per tree from the C scoring hot loop -- about
          25% faster axis-mode scoring; results are bit-identical
        - scoring: score_all_xs now picks between two loop shapes based
          on total forest size: small forests keep the point-major loop
          (whole forest stays cache-resident anyway), while forests
          over 4 MB switch to a tree-blocked loop that walks a block of
          points through one tree at a time so each tree stays hot in
          L1/L2 instead of being re-streamed from memory per point --
          measured ~3.2x faster extended-mode scoring at 400 trees
          (20k points, 16 features); both shapes add the same terms in
          the same order, so scores are bit-identical either way
        - any -march (IF_ARCH / IF_NATIVE, configure- or run-time) now
          automatically adds -ffp-contract=off: with FMA available the
          compiler otherwise contracts a*b+c into fused multiply-adds
          whose different rounding silently broke the use_c bit-parity
          guarantee (one ulp in a split value builds a different tree);
          the -march win comes from vectorization, so this costs ~nothing
        - scoring: oblique nodes now prefetch both child records before
          the dot product resolves which branch is taken, hiding the
          next node's memory latency under the FMA work (~7-10% faster
          extended-mode scoring on top of the tiling; axis path is
          untouched -- its single compare has no work to hide a
          prefetch under); purely a hint, results unchanged

0.3.0   2026-07-02/23:00
        - lots of POD fixes/cleanup
        - various further C optmizations
        - fit() can now handle training data with missing (undef) feature
          cells, selectable via the new `missing =>` constructor option:
            die    :: croak on undef in the training data (default)
            zero   :: treat a missing cell as the value 0
            impute :: fill with the per-feature mean/median (see `impute_with`)
            nan    :: range over present values and route missing rows to the
                      right child, consistently at fit and score time
        - new `impute_with => 'mean'|'median'` option for impute mode ...
          missing strategy + impute fill vector are persisted in saved models;
          models from older releases load as `zero` (the prior undef -> 0
          scoring behaviour)
        - the C build is now tunable via environment variables read at first
          module load: IF_ARCH=<value> adds -march=<value>, IF_NATIVE=1 is
          shorthand for IF_ARCH=native, IF_OPT overrides the default -O3,
          and IF_NO_C=1 skips building the C backend entirely; values are
          validated (bad ones warn and fall back to the defaults) and the
          flags actually used are exposed via $OPT_LEVEL
        - Benchmarking: bench-sklearn-scoring.pl now compares pure Perl, C,
          and C+OpenMP fit/score paths against sklearn side by side

0.2.1   2026-06-30/14:30
        - derp... actually update MANIFEST so a bunch of files from last release
          are actually included

0.2.0   2026-06-30/14:15
        - C acceleration via Inline::C for core fit and predict ops
        - OpenMP support for parallel multi-threaded fitting and predict ops
        - SIMD (AVX/SSE) acceleration where available
        - Data packing support for compact model storage (new `pack` CLI command)
        - Parallel fit capability
        - New `score_predict_split` method
        - New `accel` CLI command for querying available acceleration flags
        - New `bench` CLI command for running built-in benchmarks
        - New `info` CLI command with expanded model introspection
        - Benchmarking scripts covering fit, predict, scoring, and accel modes
        - Tests: accel flag detection, accel selection, undef column handling,
          data packing, parallel fit, sklearn comparison (including undef),
          and CLI
        - minor tweaks to `csv2plot` for a bit nicer rendering



( run in 1.202 second using v1.01-cache-2.11-cpan-800906f7e73 )