Skip to content

VAMOS 1.0.2

Choose a tag to compare

@github-actions github-actions released this 18 Oct 19:48
· 359 commits to main since this release
0db7acd

VAMOS 1.0.2 release notes

Released 2026-10-18.

VAMOS 1.0.2 extends the optional Numba engine to every built-in algorithm,
speeds up NSGA-II and MOEA/D, and fixes defects that made results depend on the
selected engine or on whether Numba was installed. The stable 1.x API and the
1.0.0 run and study schemas remain the compatibility baseline. The default
engine, the engine="auto" policy and the optional status of Numba are
unchanged.

Engine parity fixes

  • The Numba binary tournament now draws tie-break coins exactly like the NumPy
    reference. For the same seed in the same environment, NSGA-II, NSGA-III,
    IBEA, AGE-MOEA and SMS-EMOA with tournament selection now follow the same
    trajectory with engine="numba" and engine="numpy".
  • Single-mating-pair SBX, which uses compiled arithmetic whenever Numba is
    installed, consumes random draws exactly like the NumPy implementation.
    Steady-state runs (MOEA/D, SMS-EMOA and steady-state NSGA-II) no longer
    depend on whether Numba is installed when two parents are identical.
  • NumbaKernel.nsga2_survival returns arrays owned by the caller. A later call
    with the same kernel, for example a second run of the same algorithm object,
    no longer overwrites previously returned populations.
  • NumbaKernel.polynomial_mutation reproduces NumPy for eta == 1.

Numba engine coverage and performance

With engine="numba":

  • SBX crossover and polynomial mutation use compiled arithmetic in NSGA-II,
    NSGA-III, MOEA/D, SMS-EMOA, SPEA2, IBEA, SMPSO turbulence, AGE-MOEA and RVEA.
    The compiled operators are enabled only after a one-time check confirms that
    the compiled power function matches np.power bit for bit; otherwise the
    NumPy operators are used.
  • The AGE-MOEA survival scores, SPEA2 archive truncation, IBEA indicator-based
    removal and crowding-distance archive truncation (SMPSO leaders and crowding
    external archives) run as compiled loops.
  • Populations with three or more objectives are ranked by sequential-search
    non-dominated sorting, and NSGA-II survival computes crowding only for the
    front it truncates.
  • MOEA/D computes its differential-evolution children with a compiled kernel.

Both engines also benefit from cheaper bookkeeping: NSGA-II reuses the
generation-end ranking for the next parent selection and no longer computes a
discarded ranking under constraints, and MOEA/D samples the parents of a single
offspring without vectorized overhead.

On the recorded benchmark campaign, complete runs with the Numba engine were
1.04x to 4.5x faster than with VAMOS 1.0.1, for example NSGA-II on
three-objective DTLZ2 with 500 individuals (1.07 s to 0.24 s) and MOEA/D on ZDT1
(2.55 s to 1.61 s). Final fronts were identical between engines in every
measured case. The first run without a Numba cache compiles more kernels and
takes 0.3 to 1.5 s longer; cached startup is unchanged. Speedups depend on the
problem, the population size and the hardware.

Installation and compatibility

python -m pip install --upgrade "vamos-optimization==1.0.2"

Python 3.10 or newer remains required. The 1.0.0 compatibility fixtures and
schemas are preserved. Runs with engine="numba" that use tournament
selection, and steady-state runs with Numba installed whose parents coincide,
can follow different trajectories than in 1.0.1 because their random draws now
match the NumPy reference. Exact replay requires a matching material
environment; keep the original environment when replaying an older recorded
experiment.

See stability and versioning,
known limitations,
the 1.0.1 release notes, and
release verification.