individual.bend
unified-nsga-iii@0.1.2.0 · 94 lines · 0 definitions
1# Individual — C# Unsga3.Algorithm.Individual.
2# Objectives + decision variables + evaluated + tournament bookkeeping
3# (rank / niche / associated ref / perp distance). Constraints stay
4# unused in this slice (ZDT / DTLZ here are unconstrained).
5
6import Base
7
8type Individual is Data:
9 MkIndividual{
10 x: List<&2, F32>
11 f: List<&2, F32>
12 rnk: Nat
13 nic: Nat
14 aref: Nat
15 dist: F32
16 ev: Bool
17 }
18
19# v0 / A/B path: objectives already known; no decision vector.
20def from_objectives(+f: List<&2, F32>) -> Individual:
21 MkIndividual{Nil{}, f, 0n, 0n, 0n, 0.0, True{}}
22
23# Unevaluated candidate: variables set, objectives zeroed (C# ctor).
24def from_variables(+x: List<&2, F32>, n_obj: Nat) -> Individual:
25 MkIndividual{x, List.replicate(F32, n_obj, 0.0), 0n, 0n, 0n, 0.0, False{}}
26
27def variables(ind: Individual) -> List<&2, F32>:
28 match ind:
29 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
30 x
31
32def objectives(ind: Individual) -> List<&2, F32>:
33 match ind:
34 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
35 f
36
37def rank(ind: Individual) -> Nat:
38 match ind:
39 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
40 rnk
41
42def evaluated(ind: Individual) -> Bool:
43 match ind:
44 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
45 ev
46
47def n_obj(ind: Individual) -> Nat:
48 List.length(&2, F32, objectives(ind))
49
50def n_var(ind: Individual) -> Nat:
51 List.length(&2, F32, variables(ind))
52
53def var_at(ind: Individual, i: Nat) -> F32:
54 Maybe.default(&2, F32, List.get(&2, F32, variables(ind), i), 0.0)
55
56def set_var_at(ind: Individual, i: Nat, v: F32) -> Individual:
57 match ind:
58 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
59 MkIndividual{List.set(&2, F32, x, i, v), f, rnk, nic, ar, pd, ev}
60
61def set_evaluated(ind: Individual, ev2: Bool) -> Individual:
62 match ind:
63 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
64 MkIndividual{x, f, rnk, nic, ar, pd, ev2}
65
66def niche(ind: Individual) -> Nat:
67 match ind:
68 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
69 nic
70
71def associated_ref(ind: Individual) -> Nat:
72 match ind:
73 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
74 ar
75
76def perp_dist(ind: Individual) -> F32:
77 match ind:
78 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
79 pd
80
81def set_objectives(ind: Individual, +f2: List<&2, F32>) -> Individual:
82 match ind:
83 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
84 MkIndividual{x, f2, rnk, nic, ar, pd, True{}}
85
86def set_rank(ind: Individual, rnk2: Nat) -> Individual:
87 match ind:
88 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
89 MkIndividual{x, f, rnk2, nic, ar, pd, ev}
90
91def stamp(ind: Individual, +rnk2: Nat, +nic2: Nat, +aref2: Nat, +dist2: F32) -> Individual:
92 match ind:
93 case MkIndividual{x, f, rnk, nic, ar, pd, ev}:
94 MkIndividual{x, f, rnk2, nic2, aref2, dist2, ev}