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 6 import Base 7 8 type 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. 20 def 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). 24 def 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 27 def variables(ind: Individual) -> List<&2, F32>: 28 match ind: 29 case MkIndividual{x, f, rnk, nic, ar, pd, ev}: 30 x 31 32 def objectives(ind: Individual) -> List<&2, F32>: 33 match ind: 34 case MkIndividual{x, f, rnk, nic, ar, pd, ev}: 35 f 36 37 def rank(ind: Individual) -> Nat: 38 match ind: 39 case MkIndividual{x, f, rnk, nic, ar, pd, ev}: 40 rnk 41 42 def evaluated(ind: Individual) -> Bool: 43 match ind: 44 case MkIndividual{x, f, rnk, nic, ar, pd, ev}: 45 ev 46 47 def n_obj(ind: Individual) -> Nat: 48 List.length(&2, F32, objectives(ind)) 49 50 def n_var(ind: Individual) -> Nat: 51 List.length(&2, F32, variables(ind)) 52 53 def var_at(ind: Individual, i: Nat) -> F32: 54 Maybe.default(&2, F32, List.get(&2, F32, variables(ind), i), 0.0) 55 56 def 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 61 def 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 66 def niche(ind: Individual) -> Nat: 67 match ind: 68 case MkIndividual{x, f, rnk, nic, ar, pd, ev}: 69 nic 70 71 def associated_ref(ind: Individual) -> Nat: 72 match ind: 73 case MkIndividual{x, f, rnk, nic, ar, pd, ev}: 74 ar 75 76 def perp_dist(ind: Individual) -> F32: 77 match ind: 78 case MkIndividual{x, f, rnk, nic, ar, pd, ev}: 79 pd 80 81 def 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 86 def 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 91 def 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}