def kept_after

bendtorch-core@0.1.0.0 · src/autograd/reduce_fiber_proof.bend:693

import bendtorch-core@0.1.0.0/src/autograd/reduce_fiber_proof.bend as ReduceFiberProof
import Base
import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape

693# On a kept row, the blocks after the target's digit hold no position.
694def kept_after(+f: Nat, +stride: Nat, +left: Nat, +right: Nat, +rest: List<&2, Shape.Row>, +target: Nat, +base: Nat, +digit: Nat,
695  +after: {Nat.is_lt(Nat.div(target, left), digit) == True{} : Bool}, +bound: BoundBy<rest, left, stride>) ->
696  {masked(Nat.mul(f, stride), Shape.Row{stride, left, right} <> rest, target, base, Nat.mul(digit, stride)) == Nil{} : List<&2, Nat>}:
697  match f:
698    case 0n:
699      {==}
700    case 1n+g:
701      +rows : List<&2, Shape.Row> = Shape.Row{stride, left, right} <> rest
702      +c = Nat.mul(digit, stride)
703      %Equal.sym(List<&2, Nat>, masked(Nat.add(stride, Nat.mul(g, stride)), rows, target, base, c),
704        List.append(&2, Nat, masked(stride, rows, target, base, c), masked(Nat.mul(g, stride), rows, target, base, Nat.add(c, stride))),
705        masked_split(stride, Nat.mul(g, stride), rows, target, base, c)) :
706        {_ == Nil{} : List<&2, Nat>}
707      %Equal.sym(List<&2, Nat>, masked(stride, rows, target, base, c), Nil{},
708        block_off(stride, left, right, rest, target, base, digit, Off{bound, gt_not_eq(digit, Nat.div(target, left), after)})) :
709        {List.append(&2, Nat, _, masked(Nat.mul(g, stride), rows, target, base, Nat.add(c, stride))) == Nil{} : List<&2, Nat>}
710      %next_cursor(digit, stride) :
711        {masked(Nat.mul(g, stride), rows, target, base, _) == Nil{} : List<&2, Nat>}
712      kept_after(g, stride, left, right, rest, target, base, 1n+digit, lt_succ_right(Nat.div(target, left), digit, after), bound)

Uses (18)

Used by (1)