anchor.diff:              let xd = dsharp.randnLike(x)
               let yd = dsharp.randnLike(y)
   
  +            // Tensor, Tensor
               let fwdx = x.forwardDiff(xd)
               let fwdy = y.forwardDiff(yd)
               let fwdz1 : Tensor = op1 fwdx fwdy
  
positive.code:             let revxd1 = revx1.derivative
              let revxd2 = revx2.derivative
  
              // printfn "x %A" x
              // printfn "fwdz1 %A" fwdz1
              // printfn "fwdz2 %A" fwdz2
              // printfn "fwdzd1 %A" fwdzd1
              // printfn "fwdzd2 %A" fwdzd2
              // printfn "revz1 %A" revz1
              // printfn "revz2 %A" revz2
              // printfn "revxd1 %A" revxd1
              // printfn "revxd2 %A\n" revxd2
  
              Assert.True(fwdz1.allclose(fwdz2, 0.01))
              Assert.True(fwdzd1.allclose(fwdzd2, 0.01))
              Assert.True(revz1.allclose(revz2, 0.01))
  
negative.code:             let revyd1 = revy1.derivative
              let revyd2 = revy2.derivative
  
              Assert.True(fwdz1.allclose(fwdz2, 0.01))
              Assert.True(fwdzd1.allclose(fwdzd2, 0.01))
              Assert.True(revz1.allclose(revz2, 0.01))
              Assert.True(revxd1.allclose(revxd2, 0.01))
              Assert.True(revyd1.allclose(revyd2, 0.01))
  
              // Tensor, constant Tensor
              let fwdx = x.forwardDiff(xd)
              let fwdy = y
              let fwdz1 : Tensor = op1 fwdx fwdy
              let fwdz2 : Tensor = op2 fwdx fwdy
              let fwdzd1 = fwdz1.derivative
              let fwdzd2 = fwdz2.derivative
  
              let zd = dsharp.randnLike(fwdz1)
              let revx1 = x.reverseDiff()
              let revy1 = y
              let revx2 = x.reverseDiff()
              let revy2 = y
              let revz1 = op1 revx1 revy1
              let revz2 = op1 revx2 revy2
              revz1.reverse(zd)
              revz2.reverse(zd)
              let revxd1 = revx1.derivative
              let revxd2 = revx2.derivative
              let revyd1 = revy1.isNoDiff()
              let revyd2 = revy2.isNoDiff()
  
              Assert.True(fwdz1.allclose(fwdz2, 0.01))
              Assert.True(fwdzd1.allclose(fwdzd2, 0.01))
              Assert.True(revz1.allclose(revz2, 0.01))
              Assert.True(revxd1.allclose(revxd2, 0.01))
              Assert.CheckEqual(revyd1, revyd2)
  
              // Constant Tensor, Tensor
              let fwdx = x
              let fwdy = y.forwardDiff(yd)
              let fwdz1 : Tensor = op1 fwdx fwdy
              let fwdz2 : Tensor = op2 fwdx fwdy
              let fwdzd1 = fwdz1.derivative
              let fwdzd2 = fwdz2.derivative
  
              let zd = dsharp.randnLike(fwdz1)
              let revx1 = x
              let revy1 = y.reverseDiff()
              let revx2 = x
              let revy2 = y.reverseDiff()
              let revz1 = op1 revx1 revy1
              let revz2 = op1 revx2 revy2
              revz1.reverse(zd)
              revz2.reverse(zd)
              let revxd1 = revx1.isNoDiff()
              let revxd2 = revx2.isNoDiff()
              let revyd1 = revy1.derivative
              let revyd2 = revy2.derivative            
  
              Assert.True(fwdz1.allclose(fwdz2, 0.01))
              Assert.True(fwdzd1.allclose(fwdzd2, 0.01))
              Assert.True(revz1.allclose(revz2, 0.01))
              Assert.CheckEqual(revxd1, revxd2)
              Assert.True(revyd1.allclose(revyd2, 0.01))
  
      [<Test>]
  