~/bend-docscommunity

sbx.bend checks

raw source on the hub · import 0x2bc7fb472c80bd6a0e04725c117edb2a/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

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(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual)) -> 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual

def child2 source · line 39 · raw

@trip:Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual)) -> 0x2bc7fb472c80bd6a0e04725c117edb2a/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:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @rest:Nat -> 0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State

Draw the next per-var coin only when more variables remain.

def finish source · line 74 · raw

@+m:Nat -> @trip:Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(List<&2, F32>, List<&2, F32>)) -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual))

def done source · line 78 · raw

@rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @acc1:List<&2, F32> -> @acc2:List<&2, F32> -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/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, 0x2bc7fb472c80bd6a0e04725c117edb2a/bounds.Interval> -> @+eta:F32 -> @rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @acc1:List<&2, F32> -> @acc2:List<&2, F32> -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/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, 0x2bc7fb472c80bd6a0e04725c117edb2a/bounds.Interval> -> @rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @acc1:List<&2, F32> -> @acc2:List<&2, F32> -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/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:0x2bc7fb472c80bd6a0e04725c117edb2a/bounds.Box -> @rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @+m:Nat -> @n:Nat -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual))

def maybe source · line 185 · raw

@+eta:F32 -> @+x1s:List<&2, F32> -> @+x2s:List<&2, F32> -> @+box:0x2bc7fb472c80bd6a0e04725c117edb2a/bounds.Box -> @rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @+m:Nat -> @+n:Nat -> @skip:Bool -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual))

def draw source · line 201 · raw

@+eta:F32 -> @+prob:F32 -> @+x1s:List<&2, F32> -> @+x2s:List<&2, F32> -> @+box:0x2bc7fb472c80bd6a0e04725c117edb2a/bounds.Box -> @rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @+m:Nat -> @+n:Nat -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual))

def draw_or_copy source · line 217 · raw

@+eta:F32 -> @+prob:F32 -> @+x1s:List<&2, F32> -> @+x2s:List<&2, F32> -> @+box:0x2bc7fb472c80bd6a0e04725c117edb2a/bounds.Box -> @rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> @+m:Nat -> @+n:Nat -> @zero:Bool -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/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:0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual -> @+p2:0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual -> @+box:0x2bc7fb472c80bd6a0e04725c117edb2a/bounds.Box -> @rng:0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State -> Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/rng.State, Pair(0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual, 0x2bc7fb472c80bd6a0e04725c117edb2a/individual.Individual))