anchor.diff:              let inline dfTensorRevCT(a,b) = MatMulT2ConstT2(a,b)
               Tensor.OpBinary(a, b, fRaw, fTensor, dfTensorFwdTT, dfTensorFwdTC, dfTensorFwdCT, dfTensorRevTT, dfTensorRevTC, dfTensorRevCT)
           else failwithf "Cannot multiply Tensors with shapes %A, %A" a.Shape b.Shape
  -
       member t1.MatMul(t2:Tensor) = Tensor.MatMul(t1, t2)
   
       static member (~-) (a:Tensor) =
  
positive.code:         let i4max = i4
          let bounds = array2D [[i0min; i0max]; [i1min; i1max]; [i2min; i2max]; [i3min; i3max]; [i4min; i4max]]
          t.GetSlice(bounds)
  
      member t.GetSlice(i0min:int option, i0max:int option, i1:int, i2min:int option, i2max:int option, i3min:int option, i3max:int option, i4min:int option, i4max:int option) =
          let i0min = defaultArg i0min 0
          let i0max = defaultArg i0max (t.Shape.[0] - 1)
  
negative.code:             Tensor.OpBinary(a, b, fRaw, fTensor, dfTensorFwdTT, dfTensorFwdTC, dfTensorFwdCT, dfTensorRevTT, dfTensorRevTC, dfTensorRevCT)
          // TODO: implement general broadcasting?
          else failwithf "Cannot add Tensors with shapes %A, %A" a.Shape b.Shape
      static member (*) (a:Tensor, b) = a * a.Create(b)
      static member (*) (a, b:Tensor) = b.Create(a) * b
      member t1.Mul(t2:Tensor) = t1 * t2
      member t1.Mul(t2) = t1 * t1.Create(t2)
  
      static member (/) (a:Tensor, b:Tensor) =
  