anchor.diff:      override t1.Conv1D(t2, stride, padding) =
           // t1: input, NxCxI (batchSize x inputChannels x inputLength)
           // t2: filters, KxCxF (outputChannels x inputChannels x kernelLength)
  -        if t1.Dim <> 3 || t2.Dim <> 3 then invalidOp <| sprintf "Expecting two 3d Tensors t1, t2 where t1 is input (NxCxI: batchSize x inputChannels x inputLength) and t2 is filters (KxCxF: outputChannels x inputChannels x kernelLength), received Tensors with shapes %A, %A" t1.Shape t2.Shape
  +        if t1.Dim <> 3 || t2.Dim <> 3 then failwithf "Expecting two 3d Tensors t1, t2 where t1 is input (NxCxI: batchSize x inputChannels x inputLength) and t2 is filters (KxCxF: outputChannels x inputChannels x kernelLength), received Tensors with shapes %A, %A" t1.Shape t2.Shape
           let t1 =
               if padding = 0 then
                   t1
  
positive.code:         upcast RawTensorFloat32CPU(result, shapeUnsqueeze dim t.Shape)
  
      override t.FlipT(dims:int[]) =
          if dims.Length > t.Dim then invalidOp <| sprintf "Expecting dims (list of dimension indices to flip) of length less than Tensor's dimensions, received %A, %A" dims.Length t.Dim
          if hasDuplicates dims then invalidOp <| sprintf "Expecting dims (list of dimension indices to flip) without repetition, received %A" dims
          if (Array.max dims) >= t.Dim then invalidOp <| sprintf "Expecting dims (list of dimension indices to flip) where all indices are less than the tensor dimension, received %A, %A" dims t.Dim
          match t.Dim with
          | 0 -> t.Clone()
          | _ ->
  
negative.code:         upcast RawTensorFloat32CPU(result, t1.Shape)
  
      override t1.MatMulT2T2(t2) =
          if t1.Dim <> 2 || t2.Dim <> 2 then failwithf "Expecting two 2d Tensors, received Tensors with shapes %A, %A" t1.Shape t2.Shape
          let t1rows, t1cols = t1.Shape.[0], t1.Shape.[1]
          let t2rows, t2cols = t2.Shape.[0], t2.Shape.[1]
          if t1cols <> t2rows then failwithf "Cannot multiply Tensors with shapes %A, %A" t1.Shape t2.Shape
          let t1value = t1.Values
          let t2value = (t2 :?> RawTensorFloat32CPU).Values        
          let result = Array2D.init t1rows t2cols (fun i j -> Array.sumBy (fun k -> t1value.[i*t1cols + k] * t2value.[k*t2cols + j]) [|0..(t2rows-1)|] )
  