def inner_right

bendtorch-core@0.1.0.0 · src/tensor/matmul_PROOF.bend:1220

import bendtorch-core@0.1.0.0/src/tensor/matmul_PROOF.bend as MatmulPROOF
import Base
import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape
import bendtorch-core@0.1.0.0/src/tensor/matmul.bend as Matrix
import bendtorch-core@0.1.0.0/src/storage/arith.bend as Arith

1220def inner_right(-left: Shape.Shape, +right: Shape.Shape, +rows: U32, +inner: U32,
1221  -le: {Shape.dimensions(left) == [rows, inner] : List<&2, U32>}, +dims: List<&2, U32>,
1222  -same: {dims == Shape.dimensions(right) : List<&2, U32>},
1223  -wanted_inner: U32, -right_inner: U32, -columns: U32,
1224  right_matrix: {dims == [right_inner, columns] : List<&2, U32>},
1225  inner_same: {U32.to_nat(inner) == U32.to_nat(wanted_inner) : Nat},
1226  mismatch: {U32.to_nat(wanted_inner) != U32.to_nat(right_inner) : Nat}) ->
1227  {Matrix.plan_right(left, right, rows, inner, le, dims, same) == Fail{Matrix.InnerDimensionMismatch{}} : Result<&2, &2, Matrix.Error, Matrix.Plan<left, right>>}:
1228  match dims:
1229    case +ri <> +c <> Nil{}:
1230      compatible_inner(left, right, rows, inner, ri, c, le, Equal.sym(List<&2, U32>, [ri, c], Shape.dimensions(right), same),
1231        equal => mismatch(Equal.trans(Nat, U32.to_nat(wanted_inner), U32.to_nat(inner), U32.to_nat(right_inner),
1232          Equal.sym(Nat, U32.to_nat(inner), U32.to_nat(wanted_inner), inner_same),
1233          Equal.trans(Nat, U32.to_nat(inner), U32.to_nat(ri), U32.to_nat(right_inner), equal,
1234            Equal.cong(List<&2, U32>, Nat, first_nat, [ri, c], [right_inner, columns], right_matrix)))),
1235        Shape.bool_case(Nat.is_eq(U32.to_nat(inner), U32.to_nat(ri))))
1236    case Nil{}:
1237      Empty.absurd({Matrix.plan_right(left, right, rows, inner, le, Nil{}, same) == Fail{Matrix.InnerDimensionMismatch{}} : Result<&2, &2, Matrix.Error, Matrix.Plan<left, right>>},
1238        Arith.clash(Equal.cong(List<&2, U32>, Bool, xs => Nat.is_eq(Shape.rank_dimensions(xs), 2n), Nil{}, [right_inner, columns], right_matrix)))
1239    case +x <> Nil{}:
1240      Empty.absurd({Matrix.plan_right(left, right, rows, inner, le, [x], same) == Fail{Matrix.InnerDimensionMismatch{}} : Result<&2, &2, Matrix.Error, Matrix.Plan<left, right>>},
1241        Arith.clash(Equal.cong(List<&2, U32>, Bool, xs => Nat.is_eq(Shape.rank_dimensions(xs), 2n), [x], [right_inner, columns], right_matrix)))
1242    case +x <> +y <> +z <> +t:
1243      Empty.absurd({Matrix.plan_right(left, right, rows, inner, le, x <> y <> z <> t, same) == Fail{Matrix.InnerDimensionMismatch{}} : Result<&2, &2, Matrix.Error, Matrix.Plan<left, right>>},
1244        Arith.clash(Equal.cong(List<&2, U32>, Bool, xs => Nat.is_eq(Shape.rank_dimensions(xs), 2n), x <> y <> z <> t, [right_inner, columns], right_matrix)))

Uses (22)

Used by (1)