def loop.go

unified-nsga-iii@0.2.2.0 · sbx.bend:92

import unified-nsga-iii@0.2.2.0/sbx.bend as Sbx
import Base
import unified-nsga-iii@0.2.2.0/bounds.bend as Bounds
import unified-nsga-iii@0.2.2.0/rng.bend as Rng

92# Kind: 0n = copy heads (skip or close), 1n = SBX the heads.
93# One def so skip/cross are not mutually recursive with `loop`.
94def loop.go(
95  fuel: Nat,
96  kind: Nat,
97  xs1: List<&2, F32>,
98  xs2: List<&2, F32>,
99  ivs: List<&2, Bounds.Interval>,
100  +eta: F32,
101  rng: Rng.State,
102  acc1: List<&2, F32>,
103  acc2: List<&2, F32>
104) -> Rng.State & List<&2, F32> & List<&2, F32>:
105  match fuel kind xs1 xs2 ivs:
106    case 0n k a b c:
107      done(rng, acc1, acc2)
108    case 1n++f 0n +x1 <> +rest1 +x2 <> +rest2 +iv <> ivrest:
109      +rng2 = advance(rng, f)
110      loop.go(
111        f,
112        skip_kind(F32.is_gt(Rng.last_double(rng2), 0.5), close_heads(rest1, rest2)),
113        rest1, rest2, ivrest, eta, rng2, x1 <> acc1, x2 <> acc2
114      )
115    case 1n++f 1n+p +x1 <> +rest1 +x2 <> +rest2 +iv <> ivrest:
116      +lo = Bounds.lo(iv)
117      +hi = Bounds.hi(iv)
118      +gt = F32.is_gt(x1, x2)
119      +a = Bool.pick(F32, gt, x2, x1)
120      +b = Bool.pick(F32, gt, x1, x2)
121      +delta = F32.sub(b, a)
122      +rng_a = Rng.next_double(rng)
123      +rand = Rng.last_double(rng_a)
124      +inv = F32.div(1.0, F32.add(eta, 1.0))
125      +neg = F32.neg(F32.add(eta, 1.0))
126      +alpha1 = F32.sub(2.0, F32.pow(F32.add(1.0, F32.div(F32.mul(2.0, F32.sub(a, lo)), delta)), neg))
127      +alpha2 = F32.sub(2.0, F32.pow(F32.add(1.0, F32.div(F32.mul(2.0, F32.sub(hi, b)), delta)), neg))
128      +c1v = F32.clamp(F32.mul(0.5, F32.sub(F32.add(a, b), F32.mul(beta(rand, alpha1, inv), delta))), lo, hi)
129      +c2v = F32.clamp(F32.mul(0.5, F32.add(F32.add(a, b), F32.mul(beta(rand, alpha2, inv), delta))), lo, hi)
130      +rng_b = Rng.next_double(rng_a)
131      +sw = F32.is_gt(Rng.last_double(rng_b), 0.5)
132      +n1 = Bool.pick(F32, sw, c2v, c1v)
133      +n2 = Bool.pick(F32, sw, c1v, c2v)
134      +rng_c = advance(rng_b, f)
135      loop.go(
136        f,
137        skip_kind(F32.is_gt(Rng.last_double(rng_c), 0.5), close_heads(rest1, rest2)),
138        rest1, rest2, ivrest, eta, rng_c, n1 <> acc1, n2 <> acc2
139      )
140    case 1n++f k Nil{} b c:
141      done(rng, acc1, acc2)
142    case 1n++f k a <> as Nil{} c:
143      done(rng, acc1, acc2)
144    case 1n++f k a <> as b <> bs Nil{}:
145      done(rng, acc1, acc2)

Uses (24)

Used by (1)