def newer_chain

bendtorch-core@0.1.0.0 · src/autograd/tensor_chain_PROOF.bend:573

import bendtorch-core@0.1.0.0/src/autograd/tensor_chain_PROOF.bend as TensorChainPROOF
import Base
import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape
import bendtorch-core@0.1.0.0/src/tensor/core.bend as Core
import bendtorch-core@0.1.0.0/src/autograd/gradient.bend as Gradient
import bendtorch-core@0.1.0.0/src/autograd/tensor_backward.bend as Backward
import bendtorch-core@0.1.0.0/src/autograd/tensor_chain_LAWS.bend as Laws

573def newer_chain(newer: List<&1, Backward.Entry>, +node: Backward.Node, +shape: Shape.Shape, value: Core.Dynamic, saved: Backward.Saved,
574  slot: Gradient.Slot, rest: List<&1, Backward.Entry>, +older: Nat, ones: Core.Tensor<shape>,
575  made: {Core.new(shape, 1.0) == Done{ones} : Result<&2, &1, Core.Error, Core.Tensor<shape>>}) ->
576  Passed<List.append(&1, Backward.Entry, newer, Backward.Entry{node, shape, value, saved, slot} <> rest),
577    1n+Nat.add(older, List.length(&1, Backward.Entry, newer)), older,
578    Backward.at_head(1n+Nat.add(older, List.length(&1, Backward.Entry, newer)), older),
579    Laws.seeds(List.length(&1, Backward.Entry, newer), shape, ones, older)>:
580  match newer:
581    case Nil{}:
582      %add_zero(older) :
583        Passed<Backward.Entry{node, shape, value, saved, slot} <> rest, 1n+_, older, Backward.at_head(1n+_, older),
584          Laws.seeds(0n, shape, ones, older)>
585      %eq_refl(older) :
586        Passed<Backward.Entry{node, shape, value, saved, slot} <> rest, 1n+older, older, _, Laws.seeds(0n, shape, ones, older)>
587      seeded_run(node, shape, value, saved, slot, rest, older, ones, made,
588        started(Gradient.Held{Core.Packed{shape, ones}} <> Backward.unsets(older), 1n+older))
589    case Con{Backward.Entry{+top, +top_shape, top_value, top_saved, top_slot}, tail}:
590      %older_ne(older, List.length(&1, Backward.Entry, tail)) :
591        Passed<Backward.Entry{top, top_shape, top_value, top_saved, top_slot} <>
592            List.append(&1, Backward.Entry, tail, Backward.Entry{node, shape, value, saved, slot} <> rest),
593          1n+Nat.add(older, 1n+List.length(&1, Backward.Entry, tail)), older, _,
594          Laws.seeds(1n+List.length(&1, Backward.Entry, tail), shape, ones, older)>
595      %add_succ(older, List.length(&1, Backward.Entry, tail)) :
596        Passed<Backward.Entry{top, top_shape, top_value, top_saved, top_slot} <>
597            List.append(&1, Backward.Entry, tail, Backward.Entry{node, shape, value, saved, slot} <> rest),
598          1n+_, older, False{}, Laws.seeds(1n+List.length(&1, Backward.Entry, tail), shape, ones, older)>
599      newer_step(top, top_shape, top_value, top_saved, top_slot,
600        List.append(&1, Backward.Entry, tail, Backward.Entry{node, shape, value, saved, slot} <> rest),
601        1n+Nat.add(older, List.length(&1, Backward.Entry, tail)), older,
602        Laws.seeds(List.length(&1, Backward.Entry, tail), shape, ones, older),
603        newer_chain(tail, node, shape, value, saved, slot, rest, older, ones, made))

Uses (27)

Used by (1)