anchor.diff:                  let mutable bd = aa.conv1d(dd, padding=padding)
                   // bd <- bd.view([|1; inputChannels; kernelHeight; kernelWidth|])
                   bd <- bd.view([|1; inputChannels; bd.shape.[2]|])
  -                let cBounds = array2D [[0;0;1]; [0;inputChannels-1;1]; [0;kernelLength-1;1]]
  +                let cBounds = array2D [[0;0;0]; [0;inputChannels-1;0]; [0;kernelLength-1;0]]
                   bd <- bd.GetSlice(cBounds)
                   bd <- bd.view([|1; inputChannels; kernelLength|])
                   bderivative <- bderivative.addSlice([|k; 0; 0|], bd)                    
  
positive.code:                 let mutable bd = aa.conv2d(dd, paddings=paddings)
                  // bd <- bd.view([|1; inputChannels; kernelHeight; kernelWidth|])
                  bd <- bd.view([|1; inputChannels; bd.shape.[2]; bd.shape.[3]|])
                  let cBounds = array2D [[0;0;1]; [0;inputChannels-1;1]; [0;kernelHeight-1;1]; [0;kernelWidth-1;1]]
                  bd <- bd.GetSlice(cBounds)
                  bd <- bd.view([|1; inputChannels; kernelHeight; kernelWidth|])
                  bderivative <- bderivative.addSlice([|k; 0; 0; 0|], bd)
  
negative.code:         let mutable bderivative = b.zeroLike()
          if not aConst then
              // propagate to a
              let bFlipped = b.flip([|2;3|])
              let mutable ad = a.zeroLike()
              for k=0 to outputChannels-1 do
                  let b = bFlipped.[k].view([|inputChannels; 1; kernelHeight; kernelWidth|])
                  let dBounds = array2D [[0; batchSize-1; 0]; [k; k; 0]; [0; cderivative.shape.[2]-1; 0]; [0; cderivative.shape.[3]-1; 0]]
                  let d = cderivative.GetSlice(dBounds).view([|batchSize; 1; cderivative.shape.[2]; cderivative.shape.[3]|])
                  ad <- ad + d.conv2d(b, paddings=[|kernelHeight-1; kernelWidth-1|])
              if paddings.[0] > 0 || paddings.[1] > 0 then
                  let adBounds = array2D [[0; batchSize-1; 0]; 
                                         [0; inputChannels-1; 0]; 
                                         [paddings.[0]; paddings.[0] + inputHeight - 1; 0]; 
                                         [paddings.[1]; paddings.[1] + inputWidth - 1; 0]]
                  ad <- ad.GetSlice(adBounds)
                  ad <- ad.view([|batchSize; inputChannels; inputHeight; inputWidth|])
              aderivative <- a.zerosLike().addSlice([|0; 0; 0; 0|], ad)
          if not bConst then
              // propagate to b
              bderivative <- b.zerosLike()
  