Changelog
All notable changes to this project are documented here. The project follows Semantic Versioning during its pre-1.0 development phase, with breaking changes called out explicitly.
Unreleased
Changed
- optimization-jobs pin
37b30e4(tagv0.3.0, the first crates.io release ofoptimization-job-apiandoptimization-runner): crate metadata, the shared guide thatget_guideserves names the October 2026 registry releases, and the job crates are 0.3.0. Envelope, result contract and worker protocol are unchanged.
0.2.0 - 2026-10-22
What reaches the registries: the published crate fcmaes-core and the
Python wheel fcmaes-rust change through the entries marked fcmaes-core
(MODE fixes, ParetoArchive2D, De::optimize_delayed,
BiteOpt::optimize_batch, deterministic CVT archives, the moretry
scalarization). The job worker, the experiment runner, the shared job API,
fcmaes-surrogate and the tutorials are source-only (publish = false).
Added
-
Discovery for agents (review F01): the fcmaes job worker’s
describelists a JSON Schema (draft 2020-12) of each profile’s payload (payload_schemas), the warm-start snapshot format (input_schemas), each model’sparameters_schemaand runnableexamples, so an MCP-only client can build and validate one job per profile fromdescribealone. The examples come from the registry:describebuilds every model for a registeredExample(Registry::example, with data inputs, parameters, bounds or a reference point) or a probe of small dimensions, so an application worker advertises its own models;custom_workerregisters its curve fit’s CSV.profilesnow lists only the profiles the registered models support. The job and surrogate tutorials validate every example and tutorial payload withjsonschema>=4.18and run every example. Stockdescribeoutput is 38,858 bytes (the pinned runner reads at most 64 KiB). -
fcmaes.retry/1takes an optionalguess(review F10): every retry starts its CMA-ES, CR-FM-NES or PGPE distribution there with the givensigma(IPOP/BIPOP restarts start at random points), BiteOpt builds its initial population around it, and DE samples around it withsigma(only with a guess). Jobs without a guess are unchanged. -
Scalar::simulationmodels run infcmaes.retry/1andfcmaes.evaluate/1too (review F11), so one model can be compared under the surrogate and BiteOpt. fcmaes-core’s optimizers sanitize non-finite values and rank them worst, so a failed evaluation counts as+infin a retry and is counted (failed_evaluations,failures); a cancel stops the simulation at its checkpoints and leaves the retry’s best point unchecked (claimed). Evaluate reports a failed point as claimnonewithdetails.errorand takesrun_seedto reproduce a retry’s simulation seeds. -
AGENTS.mdand a “Start here” task index at the top ofai-context.md, which also warns that the publishedfcmaes-coreandfcmaes-rust0.1.5 lack the MODE fixes below andParetoArchive2D: use a git dependency or a source build for MODE until the next release. -
fcmaes-surrogate(source-only, 0.1.0) and the experimentalfcmaes.surrogate/1profile of the fcmaes job worker: exact-GP Bayesian optimization of expensive deterministic scalar box models (1–32 variables, at most 256 new plus reused observations, synchronous batches of 1–8), including cancellableScalar::simulationmodels withSimContext. Matérn-5/2 or RBF ARD kernels with MAP lengthscales fitted by bounded L-BFGS on the analytic gradient, LogEI or LCB, a TuRBO-1-style trust region for two of three proposals, a configurable nugget and Kriging-believer batches; one exact recheck of the best point givesrecheckedevidence. Each task’s trace and observations snapshot are declared artifacts of the shared job API, readable while the job runs, the trace in pages, and indexed with their SHA-256; a later job warm starts from the snapshot.benchmarks/surrogate-comparisoncompares it with BoTorch, egobox, scikit-optimize and Optuna. Seedocs/job-api/surrogate.mdandtutorials/surrogate/. -
fcmaes-core:ParetoArchive2D, an exact archive of the non-dominated pairs of two minimized objectives with incremental hypervolume, derived from BiteOpt’sbitehv2.h(crates/fcmaes-core/PARETO_ARCHIVE.md, examplepareto_mode). -
optimization-mcp, the MCP server of the shared job API: the build ofoptimization-runnermakes it next tooptimization-run. An agent connected to a node with the fcmaes worker describes the worker, validates and submits jobs, waits for them, reads their claims and evidence and cancels them; with the MCP Tasks extension, a submitted job is a task that completes with its result. Seedocs/job-api.mdand the tutorial. -
Application models for the fcmaes job worker. A
Registryholds the models a worker solves; an application worker registers its own as Rust closures (scalar, multi-objective or quality-diversity) built by a factory from the problem’s dimension, itsproblem.parametersand SHA-256-checked jobinputs, and runsAdapter::new(registry). The worker records every parameter value used in the resolved job and rejects parameters and inputs the model does not read. The built-in benchmarks are registered the same way; their jobs resolve and run exactly as before.examples/custom_worker.rsanddocs/job-api/models.mdshow how; the tutorial runs the example worker on a data file. -
Parallel population evaluation in the fcmaes job worker: CMA-ES, CR-FM-NES, PGPE, MODE and MAP-Elites accept
inner_threads > 1and evaluate each population on threads of the task’s own, with results that do not depend on the number of threads. BiteOpt and DE accept it withoptimizer.parameters.batch: BiteOpt evaluates batches of candidates and DE keepsbatchcandidates in flight, the delayed update of the Python fcmaesde.minimize(workers=...), told in ask order so that results do not depend on timing. Withoutbatchthey run the serial algorithm, as infcmaes.job/0.1, and requireinner_threads=1, as doesfcmaes.evaluate/1. -
fcmaes-core:De::optimize_delayed(objective, workers), the delayed update withworkerscandidates in flight on the current Rayon pool, andBiteOpt::optimize_batch(batch, eval_batch), the ask/tell loop in batches. Both keep the evaluation budget and give results that do not depend on thread scheduling. -
More algorithms behind the fcmaes job profiles: CR-FM-NES and PGPE retries in
fcmaes.retry/1; IPOP and BIPOP restarts for CMA-ES within a retry’s budget; CVT archives (any descriptor dimension, one tessellation per job) and CMA-ME or CMA-MAE emitter phases with exact budgets infcmaes.map-elites/1. -
The shared job crates 0.1.1 bring together the fixes that the three repositories’ copies had made separately after the 0.1.0 delivery. Changes taken from the SQP-craft review: a worker that writes an invalid journal record no longer leaves its job
runningand breaksjobs list(the attempt is sealedfailedwithrunner.journal_error); staging uses a directory under the node root, so anoexecTMPDIRworks; a signal during validation stops the validator; an append after a torn journal tail no longer destroys earlier records; finished jobs are not flagged after a reboot;./model.jsonis a valid input path; detached common jobs run inoptimization-job-ID.service. The repair of a job whose launcher died while queued combines both reviews: it keeps the zero-work, complete accounting of this repository’s fix, and detached attempts that their unit may still start stay unknown. Their runner regression tests (scripts/job-api/test_review.pywithfake_worker.py, now in optimization-jobs) run in CI. -
The common fcmaes job worker covers CMA-ES, MODE and MAP-Elites.
fcmaes.retry/1acceptsoptimizer.kind: "cmaes"(soft limit of at mostpopulation-1extra evaluations, normalizedsigma, a seeded random start); BiteOpt and DE payloads and digests are unchanged. The newfcmaes.mode/1profile runs seeded MODE runs on registered ZDT1, DTLZ2 and Binh–Korn models and reports each run’s re-evaluated, feasible, non-dominated front with its exact hypervolume. The newfcmaes.map-elites/1profile runs seeded MAP-Elites runs on the sphere and Rastrigin linear-projection benchmarks and reports the re-evaluated elite archive with coverage and QD score. Both stop cooperatively between generations, have exact evaluation budgets, and give the same results as directfcmaes-coreruns from the same seeds. The shared result contract gains thenon_dominated_setandelite_archiveclaims; runners built before them reject such journals.fcmaes-job-workeris now a library plus a thin binary. Seetutorials/job-api/README.md. -
Added the shared optimization job API:
optimization-job-api(versionedoptimization.job/0.1envelope, worker SDK, checked journals, input hashing) andoptimization-runner(optimization-run), shared with the LP-IP-craft and SQP-craft repositories. The runner admits jobs against one explicit CPU budget (outer_workers * inner_threads <= cpu_slots), stages hashed inputs and the worker binary, and recovers conservatively from lost processes.fcmaes-job-workerruns the fcmaes problems through thefcmaes.retry/1profile with the same retry seeds as the native worker.fcmaes-runkeeps its interface as a thin facade. JSON numbers now round-trip exactly, which a repeated parse of tiny values previously broke. Seedocs/job-api.mdandtutorials/job-api/. -
Added a native experiment runner:
fcmaes-run(cratefcmaes-runner), thefcmaes-native-workerbinary and thefcmaes.job/0.1contract, all source-only. Jobs declare a problem, optimizer, retry budget and wall time; BiteOpt honours a hard evaluation cap and DE a declared soft bound. Retries are seeded from their global ID, so results do not depend on worker count or wave size. Each completed retry is durably journaled. The CLI validates specs, runs idempotent jobs under a node-wide CPU-slot ledger, supports graceful and immediate cancellation, recovers from a lost launcher and comparesrun.jsonmanifests. A systemd user-service backend for detached jobs is included but not yet host-accepted. Seedocs/experiment-runner.md. -
The GTOC1 route-search tutorial now delegates its durable JSONL, snapshot, checksummed-archive and subprocess helpers to
optimization-job-api, andtutorials/RESULT_SCHEMA.mddocuments the runner’srun.jsonprofile.scripts/runneradds a real-binary integration suite (run in CI), a systemd host acceptance gate and a telemetry benchmark matrix.
Changed
-
fcmaes-coreon crates.io and docs.rs: the homepage is the user guide (https://dietmarwo.github.io/fcmaes-rust/), the README (also the crate’s rustdoc front page) linksPARETO_ARCHIVE.mdby absolute URL, which a relative link would break on docs.rs, and its API map listsParetoArchive2D. -
Discovery: the repository README, the
fcmaes-corecrate README and the Python README start with links to the shared solver-selection guide and the ecosystem overview;pyproject.tomladds both as project URLs. The crates.io and PyPI pages show them from the next release.RELEASING.mdcovers discovery after a release. -
fcmaes.evaluate/1(review F08): scalar and quality-diversity outcomes say indetails.constraintsthat the model declares no constraints and that penalties inside the objective are not checked, anddescribedocuments theirfeasibleclaim as “within bounds and a usable value; no constraint check”.ai-context.mdadds the rule to keep raw objective and constraint values and to check feasibility separately, for example on a multi-objective model with declared constraints. -
scalarize(and somoretryand the Pythonminimize_moretry): a satisfied constraint no longer enters the weighted p-norm; only its violationmax(c, 0)does, plus the weight of each violated constraint as before. A constraint valuec <= 0used to add(w*c)^p, which penalized points deep inside the feasible region and made results depend on the constraint weights. Same change as fast-cma-esmoretry. -
The shared job API moved to optimization-jobs
423cd87: streaming artifact pages (one pass over the file, memory for the page alone). -
The shared job API moved to optimization-jobs
069d87c(its review of agent discovery):optimization-mcpgainsput_input, which stages an input file such as an application model’s CSV or a surrogate snapshot, andget_guide, which returns the cross-repository AI entry point.node doctorreports the host’s usable CPUs and memory,workers addaccepts up to 1 MiB ofdescribeoutput, and the shared harness checks every worker’s payload schemas and runs its examples, also over MCP. -
optimization-jobs pin
43ef3ae(third review of agent workflows, N1; the merge of optimization-jobs #10, which adds only the landing page and discovery docs to8d19278): the guide thatoptimization-mcpserves withget_guidehas the corrected Pareto guidance (scalarization gives candidates), and the shared harness, which CI runs from the pinned checkout, checks that the payload schemas and the worker agree onnulloptional fields. The new workflowshared-pin.ymlfails when optimization-jobsmainhas changed the shared crates, guide, job API docs or test scripts since the pinned revision (weekly, and on changes to Cargo files), so the pin no longer drifts. Landing-page and discovery files do not count. -
The README describes installation from source, including the git dependency on optimization-jobs that Cargo fetches at the pinned revision.
ai-context.mdpoints to the AI entry point of optimization-jobs, which chooses between the four solver repositories. -
The shared job API moved to optimization-jobs:
optimization-job-apiandoptimization-runner(0.2.0, unchanged), the common guide, the plan, the JSON Schemas and the shared test scripts. This repository depends on the crates at a pinned git revision instead of carrying a byte-identical copy and its checksum manifest;cargo build -p optimization-runnerstill buildsoptimization-run.docs/job-api.mdnow points to the shared guide, andscripts/job-api/shared_root.pylocates Cargo’s checkout so that CI and the tutorial use its harness and schemas. -
fcmaes-core: the CVT construction ofArchiveno longer depends on the number of Rayon threads (Lloyd steps sum fixed chunks in order), andArchiveimplementsCloneandDebug. -
The fcmaes job worker bounds the memory of population-based runs at validation:
fcmaes.retry/1CMA-ES jobs accept at most 3,162 variables (CR-FM-NES and PGPE scale further), andpopulation × dimensionis at most 10⁷ for CMA-ES, CR-FM-NES and PGPE. Every task runs inside its own thread pool, so no Rayon work reaches the global pool. -
fcmaes.mode/1results name how their hypervolume was computed:method: "exact"through four objectives,method: "monte_carlo"above four (application models), with the estimate’ssamples,seedandstandard_error. Discovery, the tutorial andai-context.mdno longer call every MODE hypervolume exact. -
tutorials/job-api/run.pytakes--bin-dirand honorsCARGO_TARGET_DIR. -
The shared job API moved to optimization-jobs
6a42472: workers declare artifacts, which agents read while a job runs (records in pages) and which the sealed result indexes with their SHA-256; the shared harness runsfcmaes.surrogate/1. The surrogate profile declares its trace and snapshot; describe anddetailsname them as artifacts. -
The shared job API moved to optimization-jobs
eb1c9de(cancellation that only escalates, objective-bound checks, MCP request limits, nested PID namespaces in its tests, CI that builds this worker against the shared checkout).
Fixed
-
fcmaes-coreMODE (#1): three variation and selection bugs made MODE collapse to one extreme point or stall, and change its results:- the SBX expanding branch used
(2r)^(-1/(eta+1))forr > 0.5, so children never left the parents’ interval; it is(2-2r)^(-1/(eta+1)); - polynomial mutation’s upward branch used
(1-norm)^(eta+1)instead ofnorm^(eta+1), so a variable that touched its lower bound never moved again; pareto_levelscounted sequential-elimination rounds instead of non-dominated fronts; it is standard non-dominated sorting now.
With the defaults (population 64, 10 seeds, 300,000 evaluations) the NSGA update solves ZDT2 in 10 of 10 runs instead of 3, ZDT4 reaches a hypervolume of 1.000 instead of 0.125, and the DE update reaches 0.586 instead of 0.000 on ZDT4. Constraint handling is feasibility first: a point counts as feasible only if it violates no constraint (the adaptive tolerance
epslet slightly infeasible points displace every feasible one); the ranking of infeasible points is unchanged. fast-cma-es got the same fixes (its #31). - the SBX expanding branch used
-
fcmaes.retry/1and legacyfcmaes.job/0.1validation now also boundpopulation × dimension(at most 10⁷) for BiteOpt and DE, which allocate their population tables before the first evaluation: a one-evaluation DE job with dimension 10,000 and population 1,000,000 passed validation and would have needed 80 GB per table. BiteOpt’s default population,9 + 3 × dimension, exceeds the limit from dimension 1,825 on.
0.1.5 - 2026-08-13
Added
-
Added
#![forbid(unsafe_code)]to all three workspace crates (fcmaes-core, fcmaes-gtop, fcmaes-py). The crates contain no unsafe code and this is now enforced at compile time. -
Added a security policy covering supported releases, private disclosure, Python/FFI and dependency issues, and silent optimizer-integrity failures; linked it from the package metadata, repository guide, and mdBook.
-
Added a dependency-isolated GTOP experiment that runs external serial
cmaesthrough one serial restart lane and through physical-core restart lanes coordinated by genericfcmaes_core::retry. The primary 100-pair, seven-GTOP protocol gives both arms the same four-second wall allowance and reports best-objective mean/sdev plus paired retry wins; measured wall mean/sdev, CPU time, active cores, starts, and evaluations audit fairness and expose the deliberately higher parallel work. Deterministic seed streams, immediate restart after protective termination, alternating arm order, resume validation, and generated reports complete the protocol. A separate five-pair fixed-work pilot retains 11.18×–12.23× scheduling evidence at 16 physical cores but is explicitly secondary to equal-wall solution quality. The completed campaign improves mean objective on all seven problems and wins 86–96 of 100 pairs; sdev improves on five problems but increases on SAGAS and Tandem. Cassini1 success rises from 38/100 to 100/100, while the other six cases honestly remain at zero target successes. -
Added a dependency-isolated active-CMA-ES implementation diagnostic against
cmaes0.2.2. Its shared reflected objective, explicit three-arm topology, physical-core default, paired deadline ordering, direct cost calibration, termination accounting, resume validation, raw CSV/JSON artifacts, and three-seed smoke bundle establish the protocol without treating smoke data as publication evidence or the easy controls as recommended CMA-ES applications. -
Completed its 20-pair, 7,920-row publication campaign on a 16-core Ryzen 9 9950X, recording about 24.96 billion objective calls, 5.327 active wall hours, exhaustive generated tables, and deterministic quality/throughput figures. The scoped result reports mixed quality, a
cmaesserial advantage on cheap/high-dimensional cases, a fcmaes-core aggregate-throughput advantage in equal multistart, and the observed 61.5% external protective- stop rate.
Fixed
- Rejected non-finite and physically impossible negative time-to-50-AU values in the Rust SAGAS port. The equal-wall campaign exposed one false negative objective; a focused regression guard and complete same-seed SAGAS rerun replace it with 200 validated rows and zero false target successes.
Changed
-
Updated the AI operational context for the published 0.1.4 surface, twenty-two tutorials, equal-wall retry evidence, population ask/tell, optimizer boundary, and current reference map; refreshed the measured Rustdoc coverage from 399 to 452 documented public items.
-
Promoted equal-wall solution quality to an explicit retry design principle in the main README and retry guide. The external-CMA GTOP benchmark now carries complete quality, wall/core fairness, and starts/evaluations tables, and documents how the generic retry closure can coordinate compatible single-threaded third-party or FFI optimizers.
-
Promoted population ask/tell as the complementary fixed-wall-time strategy for expensive objectives. The documentation now enumerates each core optimizer’s batch boundary, records sequential Dual Annealing as the one non-population exception, distinguishes external
cmaes0.2.2’s internalrun_parallel()from public ask/tell, and warns against nested-worker oversubscription. -
Audited the Foundations evidence narrative against its artifacts: clarified initial/requested/actual budgets, the scalar DE batch overshoot, exact timing scope, the ten-seed Lennard-Jones scale, and L-BFGS’s early-stop traversal advantage.
-
Corrected split-brain attribution in both agent tutorials. GTOC1 now exposes the assisted run’s 4/95/1 ranked-choice split, incremental versus prior-chain cost, 7–9-route concentration, JPL calibration gap, and reconstructible provider prompts. Oscillator search now records that the unlabeled repressilator was offered 17 times, attributes results to the complete v4 menu–model policy, and names the missing menu-matched controls.
-
Clarified that every Foundations MODE example and publication result uses the default NSGA-II-style population update, while the supported DE update is not part of that evidence; froze the setting and intentional serial evaluation policy in the benchmark contract and run manifest, and documented ordered
parallel_batchevaluation for costly objectives. -
Hardened the oscillator topology-search live-agent protocol with forced structured output, an 8,000-token MiniMax cap, and local unauthenticated llama.cpp support. Protocol v4 now gives OpenAI-compatible models a balanced deterministic menu of unseen elite mutations, underrepresented structures, and random immigrants; deduplicates rejection feedback; and rejects older agent archives at resume time.
-
Replaced the oscillator tutorial’s preliminary 20-candidate serial evidence with a matched seed-42 comparison of 200 random, evolutionary, and Gemma 4 31B Q8 proposals at 16 × 12,000 inner evaluations. The v4 agent completed without proposal failures, achieved the best and median scores, and exactly rediscovered the held-out repressilator at proposal 188.
-
Reframed the GTOC1 route-search tutorial around impulsive-MGA portfolio discovery and replaced its interim cold-Gemma snapshot with complete 100-route seed-42 random, evolutionary, and Gemma 4 evidence. Cold Gemma concentrates 90 routes at the 14-encounter limit and trails evolutionary search on the declared best-20 sum while using more than twice its worker time.
-
Added the separately versioned
gemma4-assisted-v1follow-up. It verifies and consumes the completed baseline archives, presents length-stratified unseen candidate menus, and uses ranked fallbacks; the completed run raises the best-20 MGA sum from 19.676 M to 26.964 M and cuts wall time from 11.66 to 4.70 hours. Documentation explicitly treats it as prior-informed protocol evidence rather than an independent model-comparison arm.
0.1.4 - 2026-07-31
Added
-
Added a standalone Foundations guide with seven compact, size-tested lessons; eight classic scalar functions; ZDT1–4/ZDT6 and DTLZ1–7 with deterministic analytic fronts; a strict local CEC transform loader; and explicit WFG/BBOB evidence-gate skip artifacts.
-
Added reusable
fcmaes-core::indicatorsAPIs for hypervolume, IGD/IGD+, GD/GD+, additive epsilon, spacing, and spread, including exact-vs-sampled provenance, explicit reference points, sampling uncertainty, and front cleanup accounting. -
Added schedule-independent
RetryContext::run_seed, exact raggedGridLayoutreporting for MAP-Elites, strict/excluding hypervolume reference-box policies with exclusion counts, and public non-dominated-sort and crowding-distance utilities. -
Added a dependency-isolated, 20-seed optimizer-boundary experiment with exact wall-resource accounting, held-out stochastic validation, equal-wall DE/EGO traces, and raw per-seed artifacts. Its public guide defines retry’s closure as the supported adapter point for external local, Bayesian, gradient, and structured solvers.
-
Added schema-v2 Foundations conformance evidence with equal-budget random controls, initial-population baselines, stored front decisions, deterministic same-evaluator rechecks, recorded normalization extrema, MODE convergence checkpoints, and four deterministic explanatory/result SVGs.
-
Extended Foundations with a 33–294-dimensional Lennard-Jones cluster study: analytic gradients, finite C1 overlap handling, free and fixed-frame encodings, independently audited source-cited putative targets without redistributed coordinates, schedule-independent retry arms, external
argminL-BFGS and basin-hopping references, tiered target attainment, explicit pair/population accounting, a CR-FM-NES configuration sensitivity check, ten-seed scaling evidence, and a pre-registered descriptor-pilot rejection with an explicit QD skip. -
Added the reviewed GTOC1 “Save the Earth” tutorial with the real
EVEEEJSJAsequence, staged global optimization, a finite-thrust ZOH transcription, accelerated Taylor propagation, independent DOP853 validation, and a 5–8-segment-per-leg whole-tour formulation. -
Added a work-in-progress split-brain GTOC1 route-search tutorial with a provider-independent agent subprocess, deterministic grammar and duration decoding, equal-budget random and evolutionary controls, crash-safe replay artifacts, feasibility-first Lambert L0 evaluation, Sims–Flanagan L1 promotion, and optional Taylor/DOP853 L2 validation.
-
Added the reviewed MiniMax-M3 seed-42 L0 audit bundles: all three arms complete 40 candidates after repairing evolutionary bootstrap and exploration, random supplies 15 L0-admissible routes, and evolutionary supplies 24.
-
Added a predeclared random-arm L1 follow-up promoting L0 ranks 1, 8, and 15; none passes closure, the leader yields a finite surrogate-gap diagnostic, and both lower-ranked controls retain typed propagation failures.
-
Added GitHub-only tutorials for
sindrAC circuit design,thevenintransient gate-driver design, pure-Rust optical lens design, and Rapier quadruped gait repertoires. -
Added GitHub-only tutorials for hardware-quantized phased-array codebooks, bilevel energy-hub sizing with an embedded dispatch LP, robust random-key field-service routing, and
epanet-rswater-network pump scheduling. -
Added a GitHub-only truss topology and catalogue-section sizing tutorial with exact-k decoding, a validated native FEM, typed mechanism/conditioning failures, equal-budget scalar retry, constrained MODE, removal reanalysis, and a pre-registered descriptor-gate rejection.
-
Added a GitHub-only weighted network-coverage tutorial with deterministic synthetic fixtures, exact native group-pair scoring, separate matching and primal-dual certificates, exact tiny ILPs, a pre-optimization throughput gate, integer-aware DE/MODE, and an honestly dominant marginal-greedy baseline.
-
Added a GitHub-only split-brain oscillator topology-search tutorial with a signed three-gene grammar, runtime ReBop Hill propensities, variable 10–18-dimensional fixed-budget BiteOpt tuning, held-out motif rediscovery, equal-budget random/evolutionary controls, an optional live-agent boundary, and a fresh descriptor-pilot rejection with explicit QD skip.
-
Added shared result-schema, descriptor-pilot, and robustness/holdout protocols for application tutorials, with deterministic custom renderers and compact checked-in publication evidence.
-
Added dependency-policy files for application workspaces, including a crate-specific MPL-2.0 exception and notice for the unmodified
pykep-coredependency used by GTOC1 route search. -
Added a rendered-mdBook link and anchor validator to the GitHub Pages build.
Changed
-
Bumped the unreleased Rust workspace version to 0.1.4 for the additive core evidence and reproducibility APIs.
Archive::grid_shape()remains as a compatibility convenience, while exact rendering usesArchive::grid_layout(); refreshed standalone local-path tutorial lockfiles while leaving deliberate crates.io=0.1.3reproduction pins unchanged. -
Marked
RetryContextas non-exhaustive while addingrun_seed. Normal retry closures are unaffected, but downstream direct struct literals must be removed; retry owns construction of this input context. -
Kept Nelder–Mead, Bayesian optimization, gradient solvers, and their dependencies outside
fcmaes-coreafter the corrected boundary experiment found no general DE→NM advantage and only a narrow low-budget BO regime. -
Expanded the tutorial CI matrix, rendered guide, main index, and mdBook navigation to cover all twenty-two application tutorials.
-
Made result-driven figure checks use the CI-pinned plotting environment and allow tutorials with domain-specific artifacts to opt into custom renderers.
-
Upgraded GTOC1 to
pykep-core0.1.4 and separated the fixed-sequence continuous-thrust chapter from the variable-order campaign protocol. -
Extended the route-search evidence from its mock transport fixture to a feasibility-first completed live seed-42 L0 audit and targeted random-arm L1 controls, while retaining independent seeds, matched three-arm L1 promotions, and L2 validation as open requirements.
-
Hardened the oscillator-topology descriptor pilot with an explicit two-of-three-arm failure, observed ranges and bound fractions, 6×6 coarse retention, and an additive eight-replication sensitivity measurement.
-
Added deterministic worker-budgeted parallel BiteOpt retry inside each oscillator topology while preserving sequential agent/evolutionary feedback, fixed seeds, and explicit per-retry versus total evaluation accounting; physical-core retry and worker counts are the default.
Fixed
-
Replaced degenerate partial-front Foundations hypervolume with one union-front reference shared by every arm and checkpoint of a problem; retained fixed
[1.1; m]hypervolume as a nullable secondary field without filtering points, and labeled same-evaluator repeats as deterministic rechecks rather than independent validation. -
Marked the one-seed Foundations
publicationpreset as conformance evidence, completed WFG/BBOB skip manifests with command/protocol fields, and documented that the initial scalar baseline is nested in the random stream. -
Prevented an infeasible high raw-score Earth–Saturn route from being described or plotted as a campaign leader; its launch-excess violation is now documented and result figures follow the Rust archive ordering.
-
Diagnosed the seed-42 evolutionary control as a protocol failure: one-edit mutations cannot clear the edit-distance-3 gate while the archive remains below its six-route bootstrap threshold.
-
Repaired evolutionary route search with independent bootstrap seeds and random exploration immigrants, preserving elite mutations for exploitation; numerical L1 propagation failures now become archived promotion outcomes instead of aborting the campaign.
-
Repaired oscillator evolutionary search to sample eight ranked elites plus deterministic 20% random immigrants instead of exhausting one incumbent’s one-edit neighborhood, and added schema-v2 resume validation for the seed, optimizer protocol, worker count, proposal policy, and candidate budgets.
-
Added an oscillator
--mode reportpath that validates completed matched arms, preserves their manifests and archives, retains agent usage accounting, and writes only the comparison and descriptor-gate reports without launching optimization, an agent, or QD. -
Hardened the oscillator agent boundary with a no-request configuration preflight, typed transport versus response errors, format repair only for malformed responses, a persistent three-failure circuit breaker with the final diagnostic, and cumulative attempts/failures/tokens across resume.
-
Replaced the oscillator tutorial’s visibility-patch claim with an accurate reduced-ReBop compatibility notice and a dual-source upstream replay test; its skipped-QD manifest, comparison direction, rediscovery cells, and exact random-sampling prior now match the shared documentation contracts.
-
Fixed mdBook links to directory
README.mdchapters, published linked supporting chapters, and replaced non-browsable artifact-directory links with their GitHub tree targets. -
Corrected moved docs.rs, ReBop, Optiland, and release-history links.
-
Reconciled all 22 tutorial inventories, corrected stale architecture and AI context counts, removed drift-prone tutorial ordinals, aligned the phased-array and energy-hub QD summaries with their accepted native-grid pilots, and made release commands derive the workspace version. Added a CI consistency check for tutorial inventories, repeated counts, registry pins, MODE-using tutorial counts, and workspace lockfile versions.
0.1.3 - 2026-07-25
Added
- Added complete rustdoc for every public
fcmaes-coreitem, runnable examples for all major solver families, and primary literature references for DE, active CMA-ES, CR-FM-NES, PGPE, Dual Annealing, MODE and MAP-Elites. - Added complete runtime docstrings for every public PyO3 function, class, method, and property, with an installed-extension test preventing regression.
- Added an mdBook documentation site assembled from the canonical guides and tutorials, plus a GitHub Pages deployment workflow.
- Added a combinatorial encoding cookbook and tested, dependency-free example helpers for bounded and logarithmic integers, categories, Booleans, random-key permutations, exact-cardinality subsets, unique-selection repair, route partitions, and ordered breakpoints.
- Added a GitHub-only fixed-topology neural-controller policy-search tutorial with a native stochastic cart-pole model, PGPE and CR-FM-NES showcases, equal-protocol active CMA-ES and BiteOpt comparisons, common scenario sets, disjoint validation, a frozen final test, parallel-scaling measurements, tests, raw result data, and deterministic figures.
- Added a GitHub-only SmartCore hyperparameter-optimization tutorial with a native probability-forest adapter, mixed-variable decoding, fixed-fold tuning, disjoint selection and frozen final evaluation, BiteOpt retry, constrained MODE, a MAP-Elites pilot, fair baselines, cost accounting, latency/scaling measurements, tests, and deterministic figures.
- Added a GitHub-only room-ventilation optimization tutorial with a purpose-built D2Q9/D2Q5 Rust backend, worst-case training releases, held-out validation, BiteOpt retry, MODE, MAP-Elites, a straight-channel property check, three-grid sensitivity, three optimizer seeds, and deterministic field/result figures.
- Added a GitHub-only atmospheric dispersion source-localization tutorial with a native ISC-3-derived educational model, BiteOpt coordinated advanced retry, MODE, MAP-Elites, disjoint holdout validation, reproducible result artifacts, and deterministic figures.
- Added the GitHub-only
buckingham-piexample with native dimension-matrix preprocessing, nullspace calculation, repeating-variable enumeration, π-group construction, deterministic train/holdout regression, independent BiteOpt retry, constrained MODE, tests, and a dedicated guide.
Changed
- Raised
fcmaes-corerustdoc coverage from 37.34% to 100% and made missing public API documentation a compile-time and CI error. - Reframed module documentation around algorithms and primary publications instead of historical implementation provenance.
- Pointed the crates.io and PyPI package documentation paths at the generated API reference and rendered guide, respectively.
- Extended tutorial artifact validation to check the neural policy-search comparison, scaling, convergence, and replay figures byte for byte.
- Extended tutorial artifact validation to check the room-ventilation multi-seed, field, and resolution figures byte for byte.
- Separated Pareto titles and legends in the shared tutorial renderer and regenerated the byte-for-byte checked SVG figures.
0.1.2 - 2026-07-24
First synchronized crates.io and PyPI release.
Released
- Published
fcmaes-core0.1.2 on crates.io with API documentation on docs.rs. - Published
fcmaes-rust0.1.2 on PyPI with a source distribution, CPython 3.11 through 3.13 wheels for Linux x86-64, Windows x86-64, macOS x86-64 and macOS ARM64, and a PyPy 3.11 wheel for Linux x86-64. - Kept
fcmaes-gtop, the example crate and the five simulator tutorials as GitHub-only source; they are not separate registry packages.
The synchronized release contains the pure-Rust implementations of
Differential Evolution, active CMA-ES, CR-FM-NES, PGPE, Dual Annealing,
BiteOpt, MODE, weighted multi-objective retry, CVT MAP-Elites and the
Diversifier. It also contains independent and coordinated retry, reproducible
per-worker random streams, ask/tell interfaces, parallel batch evaluation and
the optional fcmaes_rust Python facade.
Packaging
- Added a tag-gated crates.io workflow for publishing
fcmaes-corewith short-lived GitHub OIDC credentials after package validation. - Released both public packages from the
v0.1.2source revision through registry trusted publishing. - Rust 1.88 is the tested minimum supported Rust version.
0.1.1 - 2026-07-24
Initial crates.io bootstrap release.
Added
- Pure-Rust implementations of Differential Evolution, active CMA-ES, CR-FM-NES, PGPE, Dual Annealing and BiteOpt.
- MODE, weighted multi-objective retry, CVT MAP-Elites and the Diversifier.
- Independent and coordinated retry with reproducible per-worker random streams.
- Ask/tell and parallel batch-evaluation interfaces.
fcmaes-corecrates.io package metadata and docs.rs documentation.
Packaging
- Published
fcmaes-core0.1.1 manually to establish crates.io ownership before configuring trusted publishing. - There was no corresponding
fcmaes-rust0.1.1 release on PyPI.