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)