def source_index
bendtorch-core@0.1.0.0 · src/tensor/permute_build_proof.bend:156
import bendtorch-core@0.1.0.0/src/tensor/permute_build_proof.bend as PermuteBuildProof
import Base
import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape
import bendtorch-core@0.1.0.0/src/tensor/axis_spec.bend as Axis
import bendtorch-core@0.1.0.0/src/tensor/layout.bend as Layout
import bendtorch-core@0.1.0.0/src/tensor/observation.bend as Values
import bendtorch-core@0.1.0.0/src/tensor/permute_build.bend as Build
156
157def source_index(+input: Shape.Shape, +axes: List<&2, U32>, +index: Nat) ->
158 {Build.source(Build.recipe(Build.Request{input, axes}), index) == Values.permute_source_index(input, axes, index) : Nat}:
159 +dims = Shape.dimensions(input)
160 +out = Shape.naturals(Axis.order(U32, dims, Shape.naturals(axes)))
161 +x = U32.to_nat(U32.from_nat(index))
162 +picks = Build.picks(Shape.rank_dimensions(dims), Shape.naturals(axes), out, 0n)
163 Equal.sym(Nat, Values.permute_source_index(input, axes, index), Build.found(picks, Build.strides(Shape.naturals(dims)), index),
164 %Equal.sym(Maybe<&2, List<&2, U32>>, Axis.scatter(U32, Shape.rank_dimensions(dims), Shape.naturals(axes), Shape.words(Shape.digits(out, x)), 0n),
165 coordinates_of(picks, x), scatter_digits(Shape.rank_dimensions(dims), Shape.naturals(axes), out, x, 0n)) :
166 {U32.to_nat(Maybe.default(&2, U32, Layout.reference_source_coordinates(dims, _), 0)) ==
167 Build.found(picks, Build.strides(Shape.naturals(dims)), index) : Nat}
168 found_coordinates(dims, picks, index))