Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 (tag v0.3.0, the first crates.io release of optimization-job-api and optimization-runner): crate metadata, the shared guide that get_guide serves 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 describe lists a JSON Schema (draft 2020-12) of each profile’s payload (payload_schemas), the warm-start snapshot format (input_schemas), each model’s parameters_schema and runnable examples, so an MCP-only client can build and validate one job per profile from describe alone. The examples come from the registry: describe builds every model for a registered Example (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_worker registers its curve fit’s CSV. profiles now lists only the profiles the registered models support. The job and surrogate tutorials validate every example and tutorial payload with jsonschema>=4.18 and run every example. Stock describe output is 38,858 bytes (the pinned runner reads at most 64 KiB).

  • fcmaes.retry/1 takes an optional guess (review F10): every retry starts its CMA-ES, CR-FM-NES or PGPE distribution there with the given sigma (IPOP/BIPOP restarts start at random points), BiteOpt builds its initial population around it, and DE samples around it with sigma (only with a guess). Jobs without a guess are unchanged.

  • Scalar::simulation models run in fcmaes.retry/1 and fcmaes.evaluate/1 too (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 +inf in 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 claim none with details.error and takes run_seed to reproduce a retry’s simulation seeds.

  • AGENTS.md and a “Start here” task index at the top of ai-context.md, which also warns that the published fcmaes-core and fcmaes-rust 0.1.5 lack the MODE fixes below and ParetoArchive2D: use a git dependency or a source build for MODE until the next release.

  • fcmaes-surrogate (source-only, 0.1.0) and the experimental fcmaes.surrogate/1 profile 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 cancellable Scalar::simulation models with SimContext. 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 gives rechecked evidence. 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-comparison compares it with BoTorch, egobox, scikit-optimize and Optuna. See docs/job-api/surrogate.md and tutorials/surrogate/.

  • fcmaes-core: ParetoArchive2D, an exact archive of the non-dominated pairs of two minimized objectives with incremental hypervolume, derived from BiteOpt’s bitehv2.h (crates/fcmaes-core/PARETO_ARCHIVE.md, example pareto_mode).

  • optimization-mcp, the MCP server of the shared job API: the build of optimization-runner makes it next to optimization-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. See docs/job-api.md and the tutorial.

  • Application models for the fcmaes job worker. A Registry holds 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, its problem.parameters and SHA-256-checked job inputs, and runs Adapter::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.rs and docs/job-api/models.md show 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 > 1 and 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 with optimizer.parameters.batch: BiteOpt evaluates batches of candidates and DE keeps batch candidates in flight, the delayed update of the Python fcmaes de.minimize(workers=...), told in ask order so that results do not depend on timing. Without batch they run the serial algorithm, as in fcmaes.job/0.1, and require inner_threads=1, as does fcmaes.evaluate/1.

  • fcmaes-core: De::optimize_delayed(objective, workers), the delayed update with workers candidates in flight on the current Rayon pool, and BiteOpt::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 in fcmaes.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 running and breaks jobs list (the attempt is sealed failed with runner.journal_error); staging uses a directory under the node root, so a noexec TMPDIR works; 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.json is a valid input path; detached common jobs run in optimization-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.py with fake_worker.py, now in optimization-jobs) run in CI.

  • The common fcmaes job worker covers CMA-ES, MODE and MAP-Elites. fcmaes.retry/1 accepts optimizer.kind: "cmaes" (soft limit of at most population-1 extra evaluations, normalized sigma, a seeded random start); BiteOpt and DE payloads and digests are unchanged. The new fcmaes.mode/1 profile 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 new fcmaes.map-elites/1 profile 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 direct fcmaes-core runs from the same seeds. The shared result contract gains the non_dominated_set and elite_archive claims; runners built before them reject such journals. fcmaes-job-worker is now a library plus a thin binary. See tutorials/job-api/README.md.

  • Added the shared optimization job API: optimization-job-api (versioned optimization.job/0.1 envelope, worker SDK, checked journals, input hashing) and optimization-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-worker runs the fcmaes problems through the fcmaes.retry/1 profile with the same retry seeds as the native worker. fcmaes-run keeps its interface as a thin facade. JSON numbers now round-trip exactly, which a repeated parse of tiny values previously broke. See docs/job-api.md and tutorials/job-api/.

  • Added a native experiment runner: fcmaes-run (crate fcmaes-runner), the fcmaes-native-worker binary and the fcmaes.job/0.1 contract, 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 compares run.json manifests. A systemd user-service backend for detached jobs is included but not yet host-accepted. See docs/experiment-runner.md.

  • The GTOC1 route-search tutorial now delegates its durable JSONL, snapshot, checksummed-archive and subprocess helpers to optimization-job-api, and tutorials/RESULT_SCHEMA.md documents the runner’s run.json profile. scripts/runner adds a real-binary integration suite (run in CI), a systemd host acceptance gate and a telemetry benchmark matrix.

Changed

  • fcmaes-core on 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) links PARETO_ARCHIVE.md by absolute URL, which a relative link would break on docs.rs, and its API map lists ParetoArchive2D.

  • Discovery: the repository README, the fcmaes-core crate README and the Python README start with links to the shared solver-selection guide and the ecosystem overview; pyproject.toml adds both as project URLs. The crates.io and PyPI pages show them from the next release. RELEASING.md covers discovery after a release.

  • fcmaes.evaluate/1 (review F08): scalar and quality-diversity outcomes say in details.constraints that the model declares no constraints and that penalties inside the objective are not checked, and describe documents their feasible claim as “within bounds and a usable value; no constraint check”. ai-context.md adds 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 so moretry and the Python minimize_moretry): a satisfied constraint no longer enters the weighted p-norm; only its violation max(c, 0) does, plus the weight of each violated constraint as before. A constraint value c <= 0 used 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-es moretry.

  • 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-mcp gains put_input, which stages an input file such as an application model’s CSV or a surrogate snapshot, and get_guide, which returns the cross-repository AI entry point. node doctor reports the host’s usable CPUs and memory, workers add accepts up to 1 MiB of describe output, 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 to 8d19278): the guide that optimization-mcp serves with get_guide has 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 on null optional fields. The new workflow shared-pin.yml fails when optimization-jobs main has 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.md points 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-api and optimization-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-runner still builds optimization-run. docs/job-api.md now points to the shared guide, and scripts/job-api/shared_root.py locates Cargo’s checkout so that CI and the tutorial use its harness and schemas.

  • fcmaes-core: the CVT construction of Archive no longer depends on the number of Rayon threads (Lloyd steps sum fixed chunks in order), and Archive implements Clone and Debug.

  • The fcmaes job worker bounds the memory of population-based runs at validation: fcmaes.retry/1 CMA-ES jobs accept at most 3,162 variables (CR-FM-NES and PGPE scale further), and population × dimension is 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/1 results name how their hypervolume was computed: method: "exact" through four objectives, method: "monte_carlo" above four (application models), with the estimate’s samples, seed and standard_error. Discovery, the tutorial and ai-context.md no longer call every MODE hypervolume exact.

  • tutorials/job-api/run.py takes --bin-dir and honors CARGO_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 runs fcmaes.surrogate/1. The surrogate profile declares its trace and snapshot; describe and details name 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-core MODE (#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)) for r > 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 of norm^(eta+1), so a variable that touched its lower bound never moved again;
    • pareto_levels counted 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 eps let slightly infeasible points displace every feasible one); the ranking of infeasible points is unchanged. fast-cma-es got the same fixes (its #31).

  • fcmaes.retry/1 and legacy fcmaes.job/0.1 validation now also bound population × 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 cmaes through one serial restart lane and through physical-core restart lanes coordinated by generic fcmaes_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 cmaes 0.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 cmaes serial 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 cmaes 0.2.2’s internal run_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_batch evaluation 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-v1 follow-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::indicators APIs 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 ragged GridLayout reporting 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 argmin L-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 EVEEEJSJA sequence, 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 sindr AC circuit design, thevenin transient 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-rs water-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-core dependency 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 uses Archive::grid_layout(); refreshed standalone local-path tutorial lockfiles while leaving deliberate crates.io =0.1.3 reproduction pins unchanged.

  • Marked RetryContext as non-exhaustive while adding run_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-core after 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-core 0.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 publication preset 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 report path 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.md chapters, 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-core item, 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-pi example 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-core rustdoc 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-core 0.1.2 on crates.io with API documentation on docs.rs.
  • Published fcmaes-rust 0.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-core with short-lived GitHub OIDC credentials after package validation.
  • Released both public packages from the v0.1.2 source 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-core crates.io package metadata and docs.rs documentation.

Packaging

  • Published fcmaes-core 0.1.1 manually to establish crates.io ownership before configuring trusted publishing.
  • There was no corresponding fcmaes-rust 0.1.1 release on PyPI.