class_docstr: Build indices for a sparse CSC matrix that could implement A
  (convolve) B.
  
     This generates a sparse matrix M, which generates a stack of
     image patches when computing the dot product of M with image
     patch. Convolution is then simply the dot product of (img x M)
     and the kernels.
class_docstr_tok: ["Build","indices","for","a","sparse","CSC","matrix","that","could","implement","A","(","convolve",")","B",".","This","generates","a","sparse","matrix","M",",","which","generates","a","stack","of","image","patches","when","computing","the","dot","product","of","M","with","image","patch",".","Convolution","is","then","simply","the","dot","product","of","(","img","x","M",")","and","the","kernels","."]
code: def conv_eval(inshp, kshp, strides=(1, 1), mode="valid"):
      (dx, dy) = strides
      return convolution_indices.evaluate(
          inshp, kshp, (dx, dy), mode=mode, ws=True
      )
  
file_path: pytensor/pytensor/sparse/sandbox/sp.py
imports: import numpy
  from scipy import sparse
  import pytensor
  import pytensor.sparse
  from pytensor import sparse
  from pytensor import tensor
  from pytensor.graph.op import Op
  from pytensor.tensor.math import dot
  from pytensor.tensor.math import max
  from pytensor.tensor.shape import reshape
  from pytensor.tensor.subtensor import DimShuffle
label_desc: Use image node_id 1 for calling the ConvolutionIndices obj's underlying member method code with example usage: obj.conv_eval(inshp, kshp, strides, mode) and returns: convolution_indices