sbx.bend checks
raw source on the hub · import 0xd1de66b5d9157913a654c39186289f3d/sbx.bend as Sbx
Simulated Binary Crossover — C# Unsga3.Operators.Crossover.SimulatedBinaryCrossover. Defaults match C#: η = 30, pair probability = 1.0 (Deb & Agrawal). Per-variable walk peels x1 / x2 / box intervals together (guide: the list is the shape a flat loop walks). Same RNG order as the old index + List.get / set_var_at loop; children are built once at the end.
5 imports
import Base import ./individual.bend as Ind import ./bounds.bend as Bounds import ./rng.bend as Rng import ./util.bend as Util
Types
type Sbx source · line 13 · raw
Data
MkSbx@e:F32 -> @p:F32 -> Sbx
Definitions
def mk source · line 19 · raw
@+e:F32 -> @+p:F32 -> Sbx
def default source · line 22 · raw
Sbx
def eta source · line 25 · raw
@op:Sbx -> F32
def probability source · line 30 · raw
@op:Sbx -> F32
def child1 source · line 35 · raw
@trip:Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual)) -> 0xd1de66b5d9157913a654c39186289f3d/individual.Individual
def child2 source · line 39 · raw
@trip:Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual)) -> 0xd1de66b5d9157913a654c39186289f3d/individual.Individual
def near source · line 43 · raw
@+x1:F32 -> @+x2:F32 -> Bool
def beta.pick source · line 47 · raw
@+rand:F32 -> @+alpha:F32 -> @+inv:F32 -> @lo:Bool -> F32
C#: if rand <= 1/alpha then (rand*alpha)^(1/(η+1)) else (1/(2-rand*alpha))^(1/(η+1)).
def beta source · line 54 · raw
@+rand:F32 -> @+alpha:F32 -> @+inv:F32 -> F32
def close_heads source · line 57 · raw
@xs:List<&2, F32> -> @ys:List<&2, F32> -> Bool
def advance source · line 67 · raw
@rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @rest:Nat -> 0xd1de66b5d9157913a654c39186289f3d/rng.State
Draw the next per-var coin only when more variables remain.
def finish source · line 74 · raw
@+m:Nat -> @trip:Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(List<&2, F32>, List<&2, F32>)) -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual))
def done source · line 78 · raw
@rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @acc1:List<&2, F32> -> @acc2:List<&2, F32> -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(List<&2, F32>, List<&2, F32>))
def skip_kind source · line 81 · raw
@skip:Bool -> @close:Bool -> Nat
def loop.go source · line 94 · raw
@fuel:Nat -> @kind:Nat -> @xs1:List<&2, F32> -> @xs2:List<&2, F32> -> @ivs:List<&2, 0xd1de66b5d9157913a654c39186289f3d/bounds.Interval> -> @+eta:F32 -> @rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @acc1:List<&2, F32> -> @acc2:List<&2, F32> -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(List<&2, F32>, List<&2, F32>))
Kind: 0n = copy heads (skip or close), 1n = SBX the heads.
One def so skip/cross are not mutually recursive with loop.
def loop source · line 147 · raw
@fuel:Nat -> @skip:Bool -> @close:Bool -> @+eta:F32 -> @xs1:List<&2, F32> -> @xs2:List<&2, F32> -> @ivs:List<&2, 0xd1de66b5d9157913a654c39186289f3d/bounds.Interval> -> @rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @acc1:List<&2, F32> -> @acc2:List<&2, F32> -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(List<&2, F32>, List<&2, F32>))
def start source · line 161 · raw
@+eta:F32 -> @+x1s:List<&2, F32> -> @+x2s:List<&2, F32> -> @+box:0xd1de66b5d9157913a654c39186289f3d/bounds.Box -> @rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @+m:Nat -> @n:Nat -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual))
def maybe source · line 185 · raw
@+eta:F32 -> @+x1s:List<&2, F32> -> @+x2s:List<&2, F32> -> @+box:0xd1de66b5d9157913a654c39186289f3d/bounds.Box -> @rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @+m:Nat -> @+n:Nat -> @skip:Bool -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual))
def draw source · line 201 · raw
@+eta:F32 -> @+prob:F32 -> @+x1s:List<&2, F32> -> @+x2s:List<&2, F32> -> @+box:0xd1de66b5d9157913a654c39186289f3d/bounds.Box -> @rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @+m:Nat -> @+n:Nat -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual))
def draw_or_copy source · line 217 · raw
@+eta:F32 -> @+prob:F32 -> @+x1s:List<&2, F32> -> @+x2s:List<&2, F32> -> @+box:0xd1de66b5d9157913a654c39186289f3d/bounds.Box -> @rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> @+m:Nat -> @+n:Nat -> @zero:Bool -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual))
p=0 copies parents before any NextDouble. Matches C# children when pair probability is 0 (every draw is > 0). Bit-zero is definitional on the 0.0 literal; F32.is_gt stays off this path.
def crossover source · line 234 · raw
@+op:Sbx -> @+p1:0xd1de66b5d9157913a654c39186289f3d/individual.Individual -> @+p2:0xd1de66b5d9157913a654c39186289f3d/individual.Individual -> @+box:0xd1de66b5d9157913a654c39186289f3d/bounds.Box -> @rng:0xd1de66b5d9157913a654c39186289f3d/rng.State -> Pair(0xd1de66b5d9157913a654c39186289f3d/rng.State, Pair(0xd1de66b5d9157913a654c39186289f3d/individual.Individual, 0xd1de66b5d9157913a654c39186289f3d/individual.Individual))