Radiate has reached 1.3.0! This release includes a major refactor of the engine's iteration model, a new expression DSL pass and operators, a substantial NSGA III simplification and optimization, a NEAT implementation refactor, and various other improvements and cleanups across the codebase. The engine is now much more efficient, and the new expression DSL features should make it easier to implement complex adaptive behaviors without custom code. The user guide has been rebuilt around testable snippets, and a new guide on diversity and speciation has been added. Check below!
User guide has been updated and expanded, if you haven't looked at it in a while, check it out!
Breaking
- Removed the
radiate-pgmcrate and its example. Probabilistic
graphical model support is no longer shipped. The Rustpreludeno longer
re-exportsradiate_pgm::*.- I don't think this was really used at all and it never really reached more than an infancy state. If PGMs are a desired feature, they can be reintroduced in the future with a more focused scope and better design - please open an issue if you'd like to see them.
- Removed the
radiate-exprcrate. The metric expression DSL has moved
intoradiate-coreunderstats::expression, and the core types are
re-exported from theradiate-corecrate root (Expr,SelectExpr,
MetricQuery,Evaluate), and are also available through
radiate::prelude(souse radiate::prelude::*;bringsExprinto scope).
No separate dependency is required, and thepreludeno longer re-exports
radiate_expr::*. - Removed the
lineagemodule fromradiate-core.Lineage,
LineageEvent, andLineageUpdateare no longer part of the public API. - Removed the
Fieldstruct fromradiate-utils(and its re-export).
AnyValue/DataTypenaming was cleaned up at the same time. If you were
constructingFieldvalues directly, useDataType/AnyValueinstead. - Python: run options restructured.
EngineUihas been removed in favor
of aRunParamhierarchy —LogParam,CheckpointParam, andUiParam.
Theboolshorthands onrun(...)are unchanged (engine.run(ui=True, log=True)still works); only the typed option objects were renamed. Code
that imported or constructedEngineUimust switch toUiParam. - Python: expression DSL constructors moved onto
rd.Expr. The flat
module functions that previously lived onrd—rd.metric,rd.when,
rd.lit,rd.element,rd.every, andrd.generation— are now
classmethods onExpr, andrd.metric(...)is renamed to
rd.Expr.select(...)(so:rd.Expr.when(...),rd.Expr.lit(...),
rd.Expr.element(...), etc.). This matches the library's
rd.Noun.factoryconvention and keeps therd.*namespace free of names
that shadowed builtins. The redundantrd.mean/min/max/stddev(metric)
shorthands were dropped — userd.Expr.select(metric).mean(). Expressions
remain experimental; no back-compat aliases are kept. - Metric names have changed. The names of certain metrics have changed to be more consistent and intuitive. Run a quick engine and print out the
metrics.dashboard()to see new names or checkout the user guide.
Added
- Expression DSL —
compile()pass. Constant subtrees fold to literals
and affine chains (a*x + b, including the common
(x - target) / target * gain + 1controller pattern) collapse to a single
fusedAffinenode. Idempotent. - Expression DSL — new operators.
stagnation/is_stagnantfor
patience-based plateau detection,is_convergedfor windowed convergence,
and a streaming P² quantile (.quantile(q)) with constant-memory online
estimation. - Expression DSL (Python) — new constructors & methods. New
Expr
classmethodsExpr.stagnation(metric, ...)and
Expr.is_stagnant(metric, patience, ...), plus instance methods
Expr.error(target)andExpr.quantile(q). - Python:
Speciesis now inspectable. New accessors expose speciation
results to Python —population(),mascot(),generation(),
stagnation(), andscore(). - Python:
Graph.from_chromosome(chromosome)classmethod for building a
Graphdirectly from a chromosome. - Python:
Dictnested dtype and aPopulation.population(size)helper. - New examples —
neat-graph(Rust) demonstrating NEAT-style
neuroevolution, plus reorganized Python examples (hello_world,
mona_lisa,playground). - Workspace-wide re-exports from
radiate-core—AnyValue,DataType,
SmallStr,dtype,dtype_names, andvalueare now re-exported from
radiate-coreso downstream crates no longer need to depend on
radiate-utilsdirectly for these types.
Changed
- Engine Iterator the engine iterator is now a
runtime. Instead of cloning the entire ecosystem every generation, the engine can now operate in a tight loop. The most common type of iterator methods used on the engine (.last(),.take(n)) are overwritten to work with the new design. That being said, if the user decides to use something like.take_while(..)or other more complex iterator methods, they will get the old behavior of cloning the entire ecosystem every generation. This is a pretty big change, but nothing should break from a user's perspective. This change should just make the engine much more efficient. - Recombination is substantially faster. Survivor and offspring
construction now share a single descending walk over the union of
selected indices, emitting oneswap_removemove plus(total - 1)
clones per unique source rather than cloning every survivor and offspring
independently. The species path applies the same optimization within
each species' sub-population. In practice ~20–50% fewerPhenotype
clones per generation. - Metric subsystem cleanup. Stale fixture data and brittle snapshot
tests removed;MetricViewis leaner and now covered by direct unit
tests. - UI refactor. Panel state moved off the
PanelIddispatch model into
a cleaner per-panel ownership scheme. - NSGA III - The NSGA III has been greatly simplified and optimized with a better niching technique. This is a pretty nice mathematical and speed improvement over the previous implementation.
- NEAT - the Graph's NEAT implementation has been refactored to be more true to the original paper. The
neat-graphexample demonstrates this new implementation.
Docs
- User guide rebuilt around testable snippets. Every code sample is now
extracted from a real source file underdocs/source/src/{python,rust}/...
viapymdownx.snippets(check_paths: true), andmkdocs build --strict
validates that the referenced snippets exist and compile/run. Docs samples
can no longer silently drift from the API. - New diversity / speciation guide (
source/diversity/species.md) plus
expanded Rust + Python parity pages across genome, alters, selectors, GP,
objectives, events, and executors. - Removed PGM documentation (
source/gp/pgm.md) alongside the
radiate-pgmcrate removal.
Fixed
- Various clippy and correctness cleanups across the alters, selectors,
and engine crates (no behavior changes intended; flagged here only
because several touched hot paths).
For example and details please refer to the user guide and API docs.
Full Changelog: v1.2.22...v1.3.0