irithyll-core 0.6.0

Core types, training engine, and inference for irithyll streaming ML — no_std + alloc, histogram binning, Hoeffding trees, SGBT ensembles, drift detection, f32 + int16 packed formats
Documentation

irithyll-core

Standalone streaming ML engine for no_std + alloc targets. Train and deploy gradient boosted trees on anything with a heap allocator — microcontrollers, WASM, embedded Linux, or full desktops.

What's in the box

  • SGBT ensemble — streaming gradient boosted trees with 10 variants (distributional, MoE, multiclass, quantile, bagged, parallel, ARF, adaptive)
  • Hoeffding trees — statistically sound split decisions via Hoeffding bound
  • Histogram binning — uniform, categorical, quantile sketch, k-means, SIMD
  • Drift detection — ADWIN, Page-Hinkley, DDM with automatic tree replacement
  • Reservoir computing — NG-RC (time-delay polynomial) and ESN (cycle reservoir) with RLS readout
  • State space models — selective SSM with diagonal A, ZOH discretization, input-dependent gating
  • Spiking neural networksSpikeNetFixed with Q1.14 integer LIF neurons, e-prop learning, delta encoding (64 neurons in 22KB)
  • Loss functions — squared, logistic, Huber, softmax, expectile, quantile
  • Packed inference — 12-byte f32 nodes (66ns predict on Cortex-M0+) and 8-byte int16 nodes (integer-only traversal, zero float ops)
  • Zero-copy viewsEnsembleView::from_bytes(&[u8]), no allocation after validation

Feature flags

Feature Default What it enables
alloc No Training: histograms, trees, ensembles, drift detection, reservoir, SSM, SNN
std No Implies alloc. HashMap-based named features, SIMD runtime detection
serde No Serialize/deserialize configs and model state
parallel No Rayon-based parallel tree training
kmeans-binning No K-means histogram binning strategy
simd No AVX2 histogram acceleration (requires std)

Without any features, irithyll-core provides packed inference only — runs on bare metal with zero dependencies beyond libm.

Quick start

Training (requires alloc):

use irithyll_core::ensemble::config::SGBTConfig;
use irithyll_core::ensemble::SGBT;
use irithyll_core::loss::squared::SquaredLoss;
use irithyll_core::sample::SampleRef;

let config = SGBTConfig::builder()
    .n_steps(50)
    .learning_rate(0.05)
    .build()
    .unwrap();

let mut model = SGBT::with_loss(config, SquaredLoss);

// Train one sample at a time
let sample = SampleRef::new(&[1.0, 2.0, 3.0], 0.5);
model.train_one(&sample);
let prediction = model.predict(&[1.0, 2.0, 3.0]);

Inference on embedded (no features needed):

use irithyll_core::EnsembleView;

// Load packed binary exported from a trained model
let packed_bytes: &[u8] = include_bytes!("model.bin");
let view = EnsembleView::from_bytes(packed_bytes).unwrap();
let prediction = view.predict(&[1.0f32, 2.0, 3.0]);

License

MIT OR Apache-2.0