1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//! Objective direction: the [`ObjectiveSense`] primitive.
//!
//! `rlevo` spans three fields whose native optimisation conventions disagree —
//! reinforcement learning **maximises** return, evolutionary computation
//! **maximises** fitness, and gradient descent **minimises** loss. To keep the
//! library coherent, the *internal* engine convention is **maximise (higher =
//! better)**, and an objective declares its *natural* direction with an
//! [`ObjectiveSense`].
//!
//! # Two value spaces
//!
//! The contract separates two spaces and confines the mapping between them to a
//! single chokepoint (the evolutionary harness / fitness adapters):
//!
//! - **User space** — the sense the problem declares. A cost/loss/landscape is
//! `Minimize`; a reward/fitness/accuracy is `Maximize`.
//! - **Canonical (engine) space** — always *maximise, higher = better*. Every
//! strategy, operator, shaping rule, and metric aggregation works purely here
//! and never sees an `ObjectiveSense`.
//!
//! [`to_canonical`](crate::objective::ObjectiveSense::to_canonical) maps user space → canonical
//! space (negate iff `Minimize`); [`from_canonical`](crate::objective::ObjectiveSense::from_canonical)
//! is its inverse, used to report results back in the user's sense (a `Minimize`
//! landscape's `best_fitness` reads as its natural cost — Sphere → 0).
//!
//! The mapping is an **involution**: applying it twice is the identity, so the
//! same negate-iff-`Minimize` operation serves both directions.
//!
//! # Multi-objective seam
//!
//! `ObjectiveSense` is the `K = 1` atom of a future per-objective sense vector.
//! Multi-objective dominance canonicalises every objective to maximise space and
//! then applies "≥ on all, > on at least one" with no per-objective branching —
//! the same chokepoint philosophy scaled to a vector.
use ;
/// The direction in which an objective is optimised.
///
/// This is the typed direction primitive that reconciles the library's
/// maximise-native engine with cost objectives (the benchmark landscapes). See
/// the [module documentation](crate::objective) for the two-space model.