def loop_after_certificate

bendtorch-core@0.1.0.0 · src/tensor/core_PROOF.bend:951

import bendtorch-core@0.1.0.0/src/tensor/core_PROOF.bend as CorePROOF
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/tensor/elementwise.bend as Elementwise

951def loop_after_certificate(+remaining: Nat, +operation: Elementwise.Operation, +plan: Shape.BroadcastPlan, +cursor: Nat,
952  -original_left: Core.Dynamic, -original_right: Core.Dynamic, -original: Elementwise.State<Shape.output_shape(plan)>,
953  -invariant: Elementwise.StateInvariant(operation, plan, original_left, original_right, cursor, original),
954  certificate: Elementwise.NaturalCertificate<operation, plan, cursor, original>,
955  rec: @state: Elementwise.State<Shape.output_shape(plan)> ->
956    @-invariant: Elementwise.StateInvariant(operation, plan, original_left, original_right, 1n+cursor, state) ->
957      Elementwise.LoopCertificate<remaining, operation, plan, 1n+cursor, original_left, original_right, state>) ->
958  Elementwise.LoopCertificate<1n+remaining, operation, plan, cursor, original_left, original_right, original>:
959  Elementwise.NaturalCertificate{result, exact, meaning} = certificate
960  match result:
961    case Elementwise.NaturalStop{left, right, error}:
962      Elementwise.LoopCertificate{((left, right), Fail{error}),
963        Equal.cong(Elementwise.NaturalStep<Shape.output_shape(plan), cursor>, (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>,
964          step => Elementwise.finish_step(Shape.output_shape(plan), cursor, state => Elementwise.loop(remaining, operation, plan, 1n+cursor, state), step),
965          Elementwise.NaturalStop{left, right, error}, Elementwise.natural_step(operation, plan, cursor, original), exact), Unit{}}
966    case Elementwise.NaturalContinue{state, index, converted}:
967      loop_continue_certificate(remaining, operation, plan, cursor, original_left, original_right, original, state, index, converted, exact,
968        rec(state,
969          {\{Elementwise.InvariantModel: invariant => invariant} :
970            Elementwise.InvariantModel<operation, plan, original_left, original_right, 1n+cursor, state> ->
971              Elementwise.StateInvariant(operation, plan, original_left, original_right, 1n+cursor, state)}(invariant_advance(operation, plan, original_left, original_right, cursor, index, converted,
972                original, state, invariant, meaning))))

Uses (22)

Used by (1)