kumulant

Changelog

Synced from GitHub Releases.

  1. v0.3.0

    Third release of kumulant. Refocuses the library on streaming machine learning: adds a classification lane with calibration and anomaly detection, a pluggable optimizer strategy, and a large family of change-point, smoothing, and feature-scaling stats. Also restructures packages and replaces the docs/ folder with a dokka site.

    • feat: add a classification lane with decision-tree and random-forest classifiers, a multiclass path, and RegressionTree renamed from Tree.
    • feat: add the stat.calibration module with Platt scaling, isotonic regression, and reliability.
    • feat: add the anomaly module with GaussianScorer, QuantileFilter, and HalfSpaceTrees.
    • feat: add an optimizer strategy abstraction with Sgd, Adagrad, Rmsprop, and Adam.
    • feat: add change-point detectors: ADWIN, CUSUM, and Page-Hinkley.
    • feat: add new stats: streaming median absolute deviation, fixed-lag autocorrelation, recency, sojourn, ratioVsTarget, threshold-bucket, crossing, run-length, excursion, Holt and seasonal smoothing, and recursive variance.
    • feat: add new series operators: band over HasCenterScale results, resampleByTime with a per-bucket aggregator, standard and min-max scalers, element-wise feature scaling, and a wire-portable withFeedback operator with Center and Scale nodes.
    • feat: add AST sugar: Switch, In, Standardize, MinMax, VIndex, and a SummaryStat composite primary.
    • feat: extend the operation surface with throttle, sample, weightBy, RegressionStat decorators, and observability wrappers for univariate and contextual bandits.
    • refactor: make the live operation surface internal in favour of the spec layer.
    • refactor: restructure packages, splitting forecast, event, and threshold-bucket stats into their own packages, moving GLM-family files under stat.regression.glm, and moving hash primitives to the math package.
    • feat: add bandit accuracy, drift, and throughput analyses to the bench, plus an analyzeThroughput task with optional JFR profiling.
    • fix: bound TDigestStat drainLocked spin to avoid livelock, and unlock sparse vector paths in VectorizedStat, the Knn bandit, and Bayesian regression.
    • chore: upgrade to Kotlin 2.3.20, KMP plugin 1.2.1, and Gradle wrapper 9.5.1.
    • docs: replace the docs/ folder with a dokka module and per-package overviews.

    Full Changelog: https://github.com/Eignex/kumulant/compare/v0.2.0...v0.3.0

  2. v0.2.0

    Second release of kumulant. Adds a multi-armed and contextual bandit subsystem, regression stats with Bayesian and SGD variants, and a dedicated bench subproject. Also hardens concurrency on rate and decay stats.

    • feat: add univariate bandits: EXP3, KL-UCB, MOSS, Boltzmann, Top-Two TS, UCB-V, roulette-wheel.
    • feat: add contextual bandits: LinUCB, Exp4, k-NN, and a generic RegressionContextualBandit.
    • feat: add CompositeArm and CompositePosterior for AST-driven bandit composition.
    • feat: add HierarchicalBayesianRegression and warmStart helpers for population pooling.
    • feat: add a wire-portable spec layer for bandits.
    • feat: add BayesianLinearRegression with custom priors and population fit.
    • feat: add StochasticRegression with HOGWILD concurrency, lazy L1/L2, and a unified Penalty parameter.
    • feat: add tree and forest regression stats with lock-free leaf updates.
    • feat: add serializable tree, forest, and k-NN results.
    • feat: add the :kumulant-bench subproject producing concurrency, correctness, and perf reports.
    • fix: redesign CounterRateStat and fix a RateStat start-timestamp race under concurrent writers.
    • fix: harden DecayingVarianceStat update under all concurrency levels.
    • docs: add a docs folder covering overview, stats, concurrency, operations, schemas, and bandits.

    Full Changelog: https://github.com/Eignex/kumulant/compare/v0.1.1...v0.2.0

  3. v0.1.1

    Bug-fix release from a top-to-bottom code review. Several outputs change: DDSketch rejects relativeError == 0 or == 1, hash64 changes for chunk-aligned inputs, and VectorizedStat drops its concurrencyOverride parameter.

    What's Changed

    • fix: clamp predicted probability when accumulating ReliabilityStat sumProbability #1
    • fix: round fractional weights in SpaceSavingStat instead of truncating to zero #2
    • fix: reject boundary relativeError values in DDSketchStat #4
    • fix: preserve negative rates when merging DecayingRateStat results #3
    • fix: use floorDiv in SliceRing to bucket negative timestamps correctly #8
    • fix: widen single-point ReservoirHistogram bucket so upper exceeds lower #7
    • fix: report template concurrency from VectorizedStat and drop redundant override #5
    • fix: always finalize hash64 with a tail mix to break chunk-aligned collisions #6
    • refactor: split SliceRing.mergeNow into mergeAt with explicit timestamp #9
    • fix: skip mergeAt when the bucket has already rotated past expectedStart #10

    Full Changelog: https://github.com/Eignex/kumulant/compare/v0.1.0...v0.1.1

  4. v0.1.0

    First public release of kumulant: streaming statistical accumulators for Kotlin Multiplatform. Every stat is single-pass, mergeable, and constant-memory in the number of observations.

    • feat: add a stat library spanning the summary, quantile, cardinality, sketch, rate, regression, decay, and score families.
    • feat: provide four modality interfaces (series, paired, vector, discrete) with a uniform update, read, merge, reset, and create surface.
    • feat: introduce composable wrappers for time-windowing, weighting, filtering, transforms, vectorization, and axis projection.
    • feat: add a serializable StatSchema and StatSchemaDef wire format so groups of stats and their snapshots can travel across processes.
    • feat: ship four concurrency modes: single-threaded, lock-free relaxed atomics, strict serialized, and JVM-striped high-write.
    • feat: target JVM, JS (IR), wasmJs, wasmWasi, Linux x64/Arm64, macOS x64/Arm64, mingwX64, and iOS x64/Arm64/SimulatorArm64.