Boltzmann
Boltzmann exploration (softmax bandit): plays arm a with probability proportional to exp(mean(a) / tau(t)), where the temperature cools as tau(t) = max(minTau, initialTau / t^decay) over the 1-based round t; decay = 1 is Cesa-Bianchi & Fischer's classical recipe and decay = 0 a fixed temperature. High temperature flattens play toward uniform exploration; low temperature sharpens it toward greedy exploitation.
The softmax draw is the argmax of mean / tau plus independent standard Gumbel noise per arm, which samples the softmax distribution exactly, so the policy scores arms independently inside MultiArmedBandit. A non-finite mean scores as logit 0, so a corrupt arm stays playable without dominating.
Use cases: stationary scalar-reward problems where smooth probabilistic exploration is preferable to UCB's deterministic confidence bounds; any setting where a tunable cooling schedule is convenient.
Randomness: one rng.nextDouble() per arm per evaluation.
Constructors
Boltzmann
Functions
evaluate
Score an arm given its current snapshot. Higher scores are preferred by the bandit. step is the global update count (for time-dependent exploration schedules); rng is the bandit's shared com.eignex.kumulant.bandit.Bandit.random (consumed by sampling policies).
Hook called when a new arm joins the population. Lets stateful policies fold the new arm's snapshot into their global counters (UCB's total-samples). Default no-op.
Allocate a fresh per-arm accumulator from the arm spec with the given concurrency. Default delegates to arm.createStat(concurrency); override only if the policy needs a non-standard variant.
Fresh policy carrying the same configuration but no accumulated global state. A replica bandit must not share counters with the bandit it was created from, so any policy holding mutable state has to override this; the default returns this because a stateless policy is safe to share.
Hook called when an arm leaves the population. Inverse of addArm; lets stateful policies remove the departing arm's contribution from their global counters. Default no-op.