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}