Sbx.loop.go: def of unified-nsga-iii@0.2.2.0 Import: import unified-nsga-iii@0.2.2.0/sbx.bend as Sbx Lines 92-145 of unified-nsga-iii@0.2.2.0/sbx.bend: https://jend.leeeet.dev/read.txt?path=unified-nsga-iii@0.2.2.0/sbx.bend&start_line=92&end_line=145 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 # Kind: 0n = copy heads (skip or close), 1n = SBX the heads. # One def so skip/cross are not mutually recursive with `loop`. def loop.go( fuel: Nat, kind: Nat, xs1: List<&2, F32>, xs2: List<&2, F32>, ivs: List<&2, Bounds.Interval>, +eta: F32, rng: Rng.State, acc1: List<&2, F32>, acc2: List<&2, F32> ) -> Rng.State & List<&2, F32> & List<&2, F32>: match fuel kind xs1 xs2 ivs: case 0n k a b c: done(rng, acc1, acc2) case 1n++f 0n +x1 <> +rest1 +x2 <> +rest2 +iv <> ivrest: +rng2 = advance(rng, f) loop.go( f, skip_kind(F32.is_gt(Rng.last_double(rng2), 0.5), close_heads(rest1, rest2)), rest1, rest2, ivrest, eta, rng2, x1 <> acc1, x2 <> acc2 ) case 1n++f 1n+p +x1 <> +rest1 +x2 <> +rest2 +iv <> ivrest: +lo = Bounds.lo(iv) +hi = Bounds.hi(iv) +gt = F32.is_gt(x1, x2) +a = Bool.pick(F32, gt, x2, x1) +b = Bool.pick(F32, gt, x1, x2) +delta = F32.sub(b, a) +rng_a = Rng.next_double(rng) +rand = Rng.last_double(rng_a) +inv = F32.div(1.0, F32.add(eta, 1.0)) +neg = F32.neg(F32.add(eta, 1.0)) +alpha1 = F32.sub(2.0, F32.pow(F32.add(1.0, F32.div(F32.mul(2.0, F32.sub(a, lo)), delta)), neg)) +alpha2 = F32.sub(2.0, F32.pow(F32.add(1.0, F32.div(F32.mul(2.0, F32.sub(hi, b)), delta)), neg)) +c1v = F32.clamp(F32.mul(0.5, F32.sub(F32.add(a, b), F32.mul(beta(rand, alpha1, inv), delta))), lo, hi) +c2v = F32.clamp(F32.mul(0.5, F32.add(F32.add(a, b), F32.mul(beta(rand, alpha2, inv), delta))), lo, hi) +rng_b = Rng.next_double(rng_a) +sw = F32.is_gt(Rng.last_double(rng_b), 0.5) +n1 = Bool.pick(F32, sw, c2v, c1v) +n2 = Bool.pick(F32, sw, c1v, c2v) +rng_c = advance(rng_b, f) loop.go( f, skip_kind(F32.is_gt(Rng.last_double(rng_c), 0.5), close_heads(rest1, rest2)), rest1, rest2, ivrest, eta, rng_c, n1 <> acc1, n2 <> acc2 ) case 1n++f k Nil{} b c: done(rng, acc1, acc2) case 1n++f k a <> as Nil{} c: done(rng, acc1, acc2) case 1n++f k a <> as b <> bs Nil{}: done(rng, acc1, acc2) Uses (24): https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Bool.pick https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32 https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.add https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.clamp https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.div https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.is_gt https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.mul https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.neg https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.pow https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=F32.sub https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=List https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Nat https://jend.leeeet.dev/definition.txt?path=Base/base.bend&name=Pair https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/bounds.bend&name=Interval https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/bounds.bend&name=hi https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/bounds.bend&name=lo https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/rng.bend&name=State https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/rng.bend&name=last_double https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/rng.bend&name=next_double https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/sbx.bend&name=advance https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/sbx.bend&name=beta https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/sbx.bend&name=close_heads https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/sbx.bend&name=done https://jend.leeeet.dev/definition.txt?path=unified-nsga-iii@0.2.2.0/sbx.bend&name=skip_kind