Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
e75831e
feat(problems): the constrained DTLZ8 and DTLZ9 of the DTLZ report, w…
tachsinatalay-code Oct 1, 2026
57f33a6
feat(problems): the DC-DTLZ problems of Li, Chen, Fu and Yao, with de…
tachsinatalay-code Oct 1, 2026
198d60c
feat(problems): the DAS-CMOP problems of Fan et al., with their diffi…
tachsinatalay-code Oct 1, 2026
6cb01d1
feat(python): DTLZ8, DTLZ9, the DC-DTLZ and the DAS-CMOP problems in …
tachsinatalay-code Oct 1, 2026
7f235c2
docs(problems): how the DAS-CMOP and DC-DTLZ fronts compare with the …
tachsinatalay-code Oct 1, 2026
230f673
test(problems): a type alias for the DAS-CMOP shapes in the tests
tachsinatalay-code Oct 1, 2026
3b5f414
docs(problems): DC3-DTLZ3's ideal point
tachsinatalay-code Oct 1, 2026
f9c009a
feat(examples): the DAS-CMOP, DC-DTLZ, DTLZ8 and DTLZ9 examples' prog…
tachsinatalay-code Oct 1, 2026
2c58b16
docs(examples): the DAS-CMOP examples' pages
tachsinatalay-code Oct 1, 2026
c26353e
docs: batch 11 in the plan, AGENTS.md, the features, the examples' in…
tachsinatalay-code Oct 1, 2026
4974cc4
docs(problems): the batch's sources in the multi-objective problems' …
tachsinatalay-code Oct 1, 2026
dd0ff83
feat(examples): the DC-DTLZ, DTLZ8 and DTLZ9 examples' pages, and 2,0…
tachsinatalay-code Oct 2, 2026
5c01c92
Merge remote-tracking branch 'origin/main' into feat/problems-batch-11
tachsin Oct 2, 2026
e27a4b7
feat(examples): 4,000 generations on DC1-DTLZ3, where NSGA-III reache…
tachsin Oct 2, 2026
b57d4f9
Merge remote-tracking branch 'origin/main' into feat/problems-batch-11
tachsin Oct 2, 2026
46d877d
Merge remote-tracking branch 'origin/main' into feat/problems-batch-11
tachsin Oct 2, 2026
98a39c6
feat(examples): MOEA/D-DE on DAS-CMOP1, DAS-CMOP2, DAS-CMOP3 and DAS-…
tachsin Oct 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,7 @@ fn main() -> genoxide::Result<()> {
- Test problems: `multi::problems::{Zdt1, Zdt2, Zdt3, Zdt4, Zdt6}::new(n)`, `Zdt5` (a `Binary` genome of 80 bits, not in `all()`), `{Dtlz1, …, Dtlz7}::<M>::new(n)` (the technical report's numbering), `{Wfg1, …, Wfg9}::<M>::new(k, l)` (k position parameters, a multiple of M − 1; l distance parameters, even for WFG2 and WFG3; `default()`: k = 4 for 2 objectives, 2(M − 1) for more, l = 20), `{FonsecaFleming, Kursawe}::new(n)`, `Schaffer1`, `Schaffer2`, `Poloni`, `Viennet1`/`2`/`3` (3 objectives), and the constrained `Bnh`, `Srn`, `Tnk`, `Osy`, `Constr` (fitness `([f64; 2], violation)`), all minimized, for `MultiEngine::new(algorithm, problem)`. The `multi::problems::MultiProblem<M>` trait gives `representation()`, `optimal_front(points)` (`Option`: `None` for KUR, POL, VNT2, VNT3, DTLZ5, DTLZ6 with 4 or more objectives, and WFG3 with 3 or more), `ideal_point()`, `nadir_point()`, `constraints(&x)` (`g <= 0`), `reference()`; `multi::problems::all::<M>()` lists them as `Box<dyn DynMultiProblem<M>>`.
- Constrained test problems of tunable difficulty: `multi::problems::{Ctp1, …, Ctp8}` (two objectives, two variables, disconnected fronts, fronts of separate points, infeasible bands and tunnels) and `{C1Dtlz1, C1Dtlz3, C2Dtlz2, ConvexC2Dtlz2, C3Dtlz1, C3Dtlz4}::<M>::new(n)` (Jain and Deb's constrained DTLZ; `C1Dtlz3` and `ConvexC2Dtlz2` take the paper's radius for 3, 5, 8, 10 and 15 objectives, else `with_radius(n, r)`), all with `optimal_front`, and in `all()`.
- More test problems, with their fronts: Deb and Jain's `{ConvexDtlz2, ScaledDtlz1, ScaledDtlz2, InvertedDtlz1}::<M>::new(n)` (scaled: the paper's factor for M, or `.with_factor(s)`), and Ma and Wang's constrained `Mw1`, `Mw2`, `Mw3`, `Mw5`, `Mw6`, `Mw7`, `Mw9`, …, `Mw13` (2 objectives, `new(n)`, n = 15 by default) and `{Mw4, Mw8, Mw14}::<M>::new(n)` (M + 12 by default), all in `all::<M>()`.
- Advanced constrained suites, with their fronts, all in `all::<M>()`: the DTLZ report's `{Dtlz8, Dtlz9}::<M>::new(n)` (10M by default; DTLZ8 from 3 objectives), Li et al.'s DC-DTLZ `{Dc1Dtlz1, Dc1Dtlz3, Dc2Dtlz1, Dc2Dtlz3, Dc3Dtlz1, Dc3Dtlz3}::<M>::new(n)` (`with_parameters(n, a, b)`), and Fan et al.'s `DasCmop1` to `DasCmop9` (2 objectives to `DasCmop6`, 3 from `DasCmop7`; `new(n, difficulty)`, `with_difficulty(d)`, 30 variables and the paper's figure 6 triplet by default), whose `Difficulty::new(η, ζ, γ)` or `Difficulty::standard(1..=16)` (the paper's table 3) sets the constraints' difficulty; their fronts are sampled per triplet.
- Engineering designs with several objectives, `multi::problems::engineering::{TwoBarTruss, WeldedBeam, DiscBrake, SpeedReducer, FourBarTruss}` (2 objectives), `{CarSideImpact, RocketInjector, VehicleCrashworthiness, MarineDesign}` (3) and `WaterResourcePlanning` (5), in `all::<M>()`: the trusses' and `WaterResourcePlanning`'s fronts are derived; the others' `optimal_front` is `None`, with an `ideal_point()` (and `nadir_point()` for 2 objectives). `DiscBrake` and `SpeedReducer` round their integer gene; `design(&x)` gives the rounded design. Python: `gx.problems.multi_engineering`.
- `multi::indicator`: `hypervolume(&front, &reference_point, &objectives)`, `hypervolume_contributions`; `igd_plus`, `igd`, `gd`, `spread` against a reference front.

Expand Down Expand Up @@ -1313,4 +1314,4 @@ every = 50
- **Reproducible:** a seed gives the same results on every platform and thread count, parallel or not. The exception is a fitness function that calls the platform's `sin`, `cos`, `exp` and the like (`f64::sin`, numpy): their last bit can differ between operating systems, and long runs drift apart. `genoxide::math::{sin, cos, tan, exp, ln, powf, powi, atan2, ...}` are the same to the bit everywhere, at native speed; `problems` and `multi::problems` use them.
- **Ties:** the earlier individual wins.
- **The best is kept:** `outcome.best()` is the best individual ever evaluated.
- **Errors, not panics,** for invalid settings, including sizes above 2^24. The only panics (`# Panics`): an index out of bounds (`Bits::set`, `Order::swap`), a `problems` or `multi::problems` constructor with too few dimensions or variables (or a radius that isn't above 0, or none from the paper for `C1Dtlz3::new` and `ConvexC2Dtlz2::new`), a `Batch` returning no score for a single genome, a gradient or constraint-values slice of the wrong length for a test problem's `evaluate_with`, an input, output or observation slice of the wrong length for an `nn` network or a `control` task, and a point of the wrong length for a `model::gp::GaussianProcess`'s predictions or `Bo::acquisition_at`.
- **Errors, not panics,** for invalid settings, including sizes above 2^24. The only panics (`# Panics`): an index out of bounds (`Bits::set`, `Order::swap`), a `problems` or `multi::problems` constructor with too few dimensions or variables (or a radius that isn't above 0, or none from the paper for `C1Dtlz3::new` and `ConvexC2Dtlz2::new`, a DC-DTLZ `a` that isn't above 0 or `b` outside (−1, 1), or a `Difficulty` level outside [0, 1]), a `Batch` returning no score for a single genome, a gradient or constraint-values slice of the wrong length for a test problem's `evaluate_with`, an input, output or observation slice of the wrong length for an `nn` network or a `control` task, and a point of the wrong length for a `model::gp::GaussianProcess`'s predictions or `Bo::acquisition_at`.
1 change: 1 addition & 0 deletions docs/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ What genoxide has on main; [docs.rs](https://docs.rs/genoxide) documents the lat
- **Test problems** (`multi::problems`): ZDT1-6 (ZDT5 on bit strings), DTLZ1-7, WFG1-9 (any number of objectives, checked against the authors' toolkit), Schaffer's two, Fonseca and Fleming's, Kursawe's, Poloni's and Viennet's three, and the constrained BNH, SRN, TNK, OSY and CONSTR, each with its optimal front where it's known and its reference, in Rust and Python.
- **Constrained test problems of tunable difficulty** (`multi::problems`): CTP1-8 (Deb, Pratap and Meyarivan), whose constraints make the front disconnected, a set of points or hidden behind infeasible bands, and Jain and Deb's constrained DTLZ problems C1-DTLZ1, C1-DTLZ3, C2-DTLZ2, convex C2-DTLZ2, C3-DTLZ1 and C3-DTLZ4 for any number of objectives, with their fronts, in Rust and Python.
- **More test problems** (`multi::problems`): Deb and Jain's convex DTLZ2, scaled DTLZ1 and DTLZ2 and inverted DTLZ1, and Ma and Wang's constrained MW1-14, with fronts derived from their definitions, in Rust and Python.
- **Advanced constrained suites** (`multi::problems`): the DTLZ report's constrained DTLZ8 and DTLZ9, Li et al.'s DC-DTLZ problems (DC1-DC3 on DTLZ1 and DTLZ3, constraints on the decision variables) and Fan et al.'s DAS-CMOP1-9, whose difficulty triplet (the paper's sixteen, or any) sets how hard their constraints make diversity, feasibility and convergence, with fronts derived or sampled from their definitions, in Rust and Python.
- **Engineering design problems with several objectives** (`multi::problems::engineering`): the two-bar and four-bar trusses, the welded beam, the disc brake and the speed reducer (two objectives), the car side impact, the rocket injector, vehicle crashworthiness and conceptual marine design (three) and water resource planning (five), the trusses' and water resource planning's fronts derived from their definitions, in Rust and Python.

## Engine
Expand Down
54 changes: 53 additions & 1 deletion docs/problems-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,18 @@ All x ∈ [0, 1]ⁿ, n = M + k − 1.
| DTLZ8 (eq. 28), constrained | n = 10M | a line (f₁ = … = f_{M−1} = t, f_M = 1 − 4t, t ∈ [0, 1/6]) and a hyperplane 2f_M + fᵢ + fⱼ = 1, f_M ∈ [0, 1/3] (derived) | M constraints; **index erratum:** the block sums start at ⌊(j − 1)n/M⌋ + 1 (1-based) |
| DTLZ9 (eq. 29), constrained | n = 10M | f₁ = … = f_{M−1}, f_M² + fⱼ² = 1 | M − 1 constraints |

**Checked in batch 11** (DTLZ8 and DTLZ9, in the report, section 8.8-8.9, eqs. 28-29; no code of
the authors' found). The index erratum is read as above. DTLZ8 needs M ≥ 3 (its last constraint
takes the least sum of two different objectives other than f_M), and its surface part is not the
whole plane but, derived and checked against random feasible points for M = 3 and 4: f_M = t in
[0, 1/3], one of the first M − 1 objectives s in [(1 − t)/4, (1 − 2t)/2] and the others equal,
u = 1 − 2t − s (a point with two unequal larger objectives is dominated by the lesser); ideal 0,
nadir (3/4, …, 3/4, 1). DTLZ9 prints no mean (its objectives are sums, up to ⌈n/M⌉). Examples:
NSGA-II for the report's 500 generations fails on both (DTLZ9: IGD+ 3.4 to 4.8), SMS-EMOA for
20,000 generations reaches 99.5% to 100.7% (DTLZ8) and 99.8% to 99.9% (DTLZ9, IGD+ 0.0025, the
sample's own) of a population-sized sample's hypervolume: the weakly dominated surfaces next to the line
and the curve are what NSGA-II keeps and hypervolume selection drops.

- **Erratum (DTLZ1):** the report's text says the Pareto set is x_M = 0; it is x_M = 0.5 (the
CEC paper's eq. 8). genoxide's DTLZ1 uses 0.5 already.
- **Numbering:** the CEC 2002 paper has seven problems: its DTLZ5 is the report's DTLZ6, its
Expand Down Expand Up @@ -717,6 +729,30 @@ v3 (the journal text not compared; v1 had different problems, "DAC-MOP").
ellipse parameters a_k² = 0.3, b_k² = 1.2 (Table 2) vs 0.4 and 1.6 (eq. 5's example), and
implementations in circulation that read 0.3 and 1.2 as the semi-axes; d at ζ = 0.

**Checked in batch 11.** Read: the arXiv v3 text (tables 2-5, figure 6), and the authors' Java
code and sampled fronts (their laboratory's page,
<http://imagelab.stu.edu.cn/Content.aspx?type=content&Content_ID=1310>: no license, compared
only). Settled by the code, which agrees with the paper otherwise: g sums from j = 2; a_k² = 0.3
and b_k² = 1.2 are squares; at ζ = 0, d = 0 and e = 10³⁰ (genoxide: the constraint −g); at
ζ = 1, |g − 0.5| ≤ 10⁻⁴. Fronts: the first feasible point of each ray α + g (1, …, 1) (each
ellipse or sphere a quadratic in g along it), non-dominated: 20,000 rays plus the type I
intervals' ends for two objectives, Das and Dennis's 288 divisions for three, cached per triplet.
Against the authors' 144 sampled fronts, the mean distance is under 0.01 both ways for 130 (theirs
to genoxide's) and 140 (genoxide's to theirs); the rest are their points that break the
constraints (g ≠ 0.5 at ζ = 1, x₁ outside the type I intervals), the isolated x₁ = 1 at η = 0.5
(feasible only in exact arithmetic), and genoxide's points pushed out by the type III spheres near
the corners of DAS-CMOP8/9's front, which their files leave out. Examples (the paper's figure 6
triplets, N = 300, 300,000 evaluations): NSGA-II with constrained dominance reproduces the
paper's NSGA-II-CDP (DAS-CMOP1 IGD ≈ 0.7, DAS-CMOP2-3 ≈ 0.15); DAS-CMOP1-3 and DAS-CMOP9, with
linked distance variables, take MOEA/D-DE (differential evolution moves the linked variables
together; SBX and polynomial mutation move them one at a time), with parents from the
neighbourhood with probability δ = 0.2: DAS-CMOP1-3 reached in 20 of 20 seeds (δ = 0.9, the
paper's, 18, 13 and 1 of 20, as the violation-only phase gathers the population at one stretch of
x₁), DAS-CMOP9 on the front (median distance about 0.002) at 97.3-98.0% of a sample's
hypervolume, above the 96.7% of the 300 Tchebycheff weights' own best points of the front;
DAS-CMOP4-6 are reached by NSGA-II with polynomial mutation η = 5 (19-20 of 20 seeds), and
DAS-CMOP7-8 by NSGA-III with η = 5 (20 of 20 at 99% of a sample's hypervolume).

#### LIR-CMOP1-14

Fan, Z., Li, W., Cai, X., Huang, H., Fang, Y., You, Y., Mo, J., Wei, C. and Goodman, E. (2019).
Expand Down Expand Up @@ -752,6 +788,22 @@ DTLZ1 and DTLZ3. **U:** n (M + 4 and M + 9 assumed), DC2's and DC3's a and b val
are printed strict (">"). The supplement gives C2-DTLZ2's r as 0.1, which conflicts with Jain and
Deb (0.4 / 0.5): genoxide follows Jain and Deb.

**Checked in batch 11.** Read: the supplement and the arXiv paper, and the C++ code of the
authors' laboratory, EMOC (<https://github.com/COLA-Laboratory/EMOC>, `src/problem/dcdtlz`, and
its sampled fronts `pf_data/dc*dtlz`; no license, compared only). Settled: a = 3 throughout,
b = 0.5 but for DC2-DTLZ1's 0.9 (EMOC; the supplement gives values for DC1 only); DC3 constrains
the M − 1 position variables and g, M constraints (EMOC and the supplement's table 2, whose
feasible shares, 3⁻ᵐ, fit only that; the supplement's "j = 1, …, m" would make the front
infeasible); DTLZ3's g keeps DTLZ3's factor 100 (EMOC has 10, in its C1-DTLZ3 too); n = M + 4 and
M + 9 stay assumed; the strict ">" is read as ≥. Table 2 gives DC1 a feasible share of 10.1%,
arccos(b)/π for b = 0.95, where the text and EMOC have b = 0.5 (a third): genoxide follows the
text. Fronts derived (DTLZ's front where the position variables are feasible; DC2's whole),
agreeing with EMOC's samples (mean distances at most 0.011 both ways). Examples (NSGA-III with
C-NSGA-III's settings, 1,000 generations on DTLZ1, 2,000 on DTLZ3, 4,000 on DC1-DTLZ3): constrained
dominance reaches DC1 (DC1-DTLZ3 in 20 of 20 runs; 13 of 20 after 2,000 generations) and stalls on DC2 (at the violation's local minima, no feasible solution in
20/20) and DC3 (in a band of g), as the paper's C-NSGA-III does; solving without the constraints
(DC2) or without the one on g (DC3) reaches the front.

### 1.5 Engineering design

None of the paywalled originals (Ragsdell and Phillips, Sandgren, Kannan and Kramer, Golinski,
Expand Down Expand Up @@ -1194,7 +1246,7 @@ page); a comparison belongs on the problems' own pages.
| 9 | done ([#357](https://github.com/tachsin/genoxide/pull/357); the marine design after it, once its original was read) | Engineering design, several objectives (`multi::problems::engineering`, section 1.5's "Checked in batch 9") | Two-bar truss, welded beam (2 objectives), disc brake, car side impact (3 objectives), speed reducer (2 objectives), four-bar truss, water resource planning, rocket injector, vehicle crashworthiness, conceptual marine design (10) | an example per problem: `two_bar_truss`, `welded_beam_2obj`, `disc_brake`, `speed_reducer_2obj`, `four_bar_truss` (NSGA-II), `car_side_impact_3obj` (NSGA-III, Jain and Deb's settings), `rocket_injector`, `vehicle_crashworthiness`, `marine_design` (SMS-EMOA), `water_resource_planning` (SPEA2) |
| 10a | done | Remaining low-dimensional and classic scalable functions (section 1.1's "Checked in batch 10a") | Beale, Booth, Matyas, Bohachevsky 1-3, Three-hump camel, Dixon-Price, Trid, Powell, Langermann, Shekel's foxholes, Kowalik, Schwefel 2.21, Schwefel 2.22 (15) | an example per function: `beale`, `booth`, `matyas`, `bohachevsky1` to `bohachevsky3`, `three_hump_camel`, `langermann`, `shekel_foxholes` and `kowalik` (30 seeds each of CMA-ES with and without IPOP, DE, PSO or a GA), `dixon_price` (CMA-ES with IPOP, DE and PSO in 5 and 10 dimensions), and `schwefel_2_21`, `schwefel_2_22`, `trid` and `powell` (CMA-ES, sep-CMA-ES, DE, PSO and a GA to errors of 1 … 1e-8) |
| 10b | done | CEC and BBOB-style functions, and the shift / rotation wrappers (section 1.1's "Checked in batch 10b") | `Shifted<P>`, `Rotated<P>`; Sum of different powers, Step, Quartic (deterministic: without noise, or with noise seeded from the genome, since fitness functions must be deterministic), Penalized 1 and 2, High-conditioned elliptic, Bent cigar, Discus, Büche-Rastrigin, Non-continuous Rastrigin, Weierstrass, Katsuura, HappyCat, HGBat, Schaffer F7, Rotated hyper-ellipsoid, BBOB different powers (17; the shifted and rotated Rastrigin of CEC 2005 and BBOB are the wrappers around `Rastrigin`) | an example per function: `sum_of_different_powers`, `step`, `quartic` (with and without noise), `rotated_hyper_ellipsoid`, `high_conditioned_elliptic`, `bent_cigar`, `discus` and `different_powers` (CMA-ES, sep-CMA-ES, DE, PSO and a GA to errors of 1 … 1e-8, as they are and shifted and rotated, or rotated), and `schaffer_f7`, `penalized1`, `penalized2`, `buche_rastrigin`, `non_continuous_rastrigin`, `weierstrass`, `katsuura`, `happy_cat` and `hg_bat` (10 seeds each of CMA-ES with and without IPOP, DE, PSO and a GA) |
| 11 | | Advanced constrained multi-objective suites | DAS-CMOP1-9 (with the 16 difficulty triplets as a parameter), DC-DTLZ (DC1-DC3 on DTLZ1/DTLZ3), DTLZ8, DTLZ9 (≈15) | an example per problem |
| 11 | done | Advanced constrained multi-objective suites (sections 1.3's and 1.4's "Checked in batch 11") | DAS-CMOP1-9 (with the 16 difficulty triplets as a parameter), DC-DTLZ (DC1-DC3 on DTLZ1/DTLZ3), DTLZ8, DTLZ9 (17) | an example per problem: `das_cmop1` to `das_cmop3` (MOEA/D-DE, and NSGA-II with the paper's settings), `das_cmop4` to `das_cmop6` (NSGA-II, the paper's settings and η = 5), `das_cmop7`, `das_cmop8` (NSGA-II and NSGA-III), `das_cmop9` (MOEA/D-DE, at its 300 weights' limit, and NSGA-II), `dc1_dtlz1_3obj`, `dc1_dtlz3_3obj` (NSGA-III and SMS-EMOA), `dc2_dtlz1_3obj`, `dc2_dtlz3_3obj`, `dc3_dtlz1_3obj`, `dc3_dtlz3_3obj` (NSGA-III with constrained dominance, and without the constraints, or the one on g), `dtlz8_3obj`, `dtlz9_3obj` (NSGA-II for the report's 500 generations, and SMS-EMOA) |
| 12 | | Binary and combinatorial problems | OneMax, LeadingOnes, deceptive trap, royal road, NK landscapes (seeded), 0/1 knapsack (generated instance classes) (6) | an example per problem; `one_max` and `knapsack` switch to the problems |
| 13 (optional) | | Competition suites whose definitions are long | LIR-CMOP1-14, CEC 2009 UF1-UF10 and CF1-CF10, MaF1-MaF15, Deb's 1999 two-objective problems, Van Veldhuizen's constrained problems; the deferred engineering problems (section 1.5) once their originals are read | none; used by the benchmark suite |

Expand Down
Loading
Loading