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
93
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)