def decided_step

bendtorch-core@0.1.0.0 · src/tensor/from_values_contract.bend:239

import bendtorch-core@0.1.0.0/src/tensor/from_values_contract.bend as FromValuesContract
import Base
import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape
import bendtorch-core@0.1.0.0/src/shape/nat_proofs.bend as Nats
import bendtorch-core@0.1.0.0/src/storage/main.bend as Storage
import bendtorch-core@0.1.0.0/src/storage/LAWS.bend as StorageLaws
import bendtorch-core@0.1.0.0/src/tensor/core.bend as Core
import bendtorch-core@0.1.0.0/src/tensor/lifecycle.bend as Lifecycle
import bendtorch-core@0.1.0.0/src/tensor/allocation_PROOF.bend as AllocationProof

239def decided_step(+shape: Shape.Shape, +value: F32, -rest: List<&2, F32>, +cursor: Nat, +prefix: List<&2, StorageLaws.Op>, +index: U32,
240  decision: Shape.BoolCase<Nat.is_eq(U32.to_nat(index), cursor)>,
241  converted: {U32.to_nat(index) == cursor : Nat},
242  inside: {Nat.is_lt(U32.to_nat(index), U32.to_nat(Shape.count(shape))) == True{} : Bool},
243  -valid: {Lifecycle.logical_length(base(shape, prefix)) == Shape.logical_numel(Shape.dimensions(shape)) : Nat},
244  -P: Result<&2, &1, Core.Error, Core.Tensor<shape>> -> Type,
245  next: @-valid: {Lifecycle.logical_length(base(shape, List.append(&2, StorageLaws.Op, prefix, [StorageLaws.Write{index, value}]))) ==
246    Shape.logical_numel(Shape.dimensions(shape)) : Nat} ->
247    P(Core.fill_values(rest, shape, Core.TTensor{base(shape, List.append(&2, StorageLaws.Op, prefix, [StorageLaws.Write{index, value}])), valid}, 1n+cursor))) ->
248  P(Core.fill_values_decided(shape, cursor, index, value, Core.TTensor{base(shape, prefix), valid},
249    tensor => Core.fill_values(rest, shape, tensor, 1n+cursor), decision)):
250  match decision:
251    case Shape.BFalse{equal}:
252      Empty.absurd(P(Fail{Core.StorageError{Storage.InvalidIndex{}}}),
253        Nats.contradiction(Nat.is_eq(U32.to_nat(index), cursor),
254          AllocationProof.natural_equal_true(U32.to_nat(index), cursor, converted), equal))
255    case Shape.BTrue{equal}:
256      written_step(shape, value, rest, cursor, prefix, index,
257        Core.write_flat(shape, Core.TTensor{base(shape, prefix), valid}, index, value),
258        write_done(shape, prefix, valid, index, value, inside), write_moved(shape, prefix, valid, index, value), P, next)

Uses (30)

Used by (1)