class_docstr: CPU correlation implementation using Matrix Multiplication.
  
  Parameters
  ----------
  border_mode
      The width of a border of implicit zeros to pad the
      input with. Must be a tuple with 2 elements giving the numbers of rows
      and columns to pad on each side, or a single integer to pad the same
      on all sides, or a string shortcut setting the padding at runtime:
      ``'valid'`` for ``(0, 0)`` (valid convolution, no padding), ``'full'``
      for ``(kernel_rows - 1, kernel_columns - 1)`` (full convolution),
      ``'half'`` for ``(kernel_rows // 2, kernel_columns // 2)`` (same
      convolution for odd-sized kernels).
      If it is a tuple containing 2 pairs of integers, then these specify
      the padding to be applied on each side ((left, right), (top, bottom)).
      Otherwise, each width is applied twice, once per side (left and right,
      top and bottom).
  subsample
      The subsample operation applied to each output image.
      Should be a tuple with 2 elements.
      `(sv, sh)` is equivalent to `CorrMM(...)(...)[:,:,::sv, ::sh]`,
      but faster.
      Set to `(1, 1)` to disable subsampling.
  filter_dilation
      The filter dilation operation applied to each input image.
      Should be a tuple with 2 elements.
      Set to `(1, 1)` to disable filter dilation.
  num_groups
      Divides the image, kernel and output tensors into num_groups
      separate groups. Each which carry out convolutions separately.
      Should be an integer.
  unshared
      Boolean value. If true, then a different filter will be applied to
      each region of the input image.
class_docstr_tok: ["CPU","correlation","implementation","using","Matrix","Multiplication",".","Parameters","--","--","--","--","--","border_mode","The","width","of","a","border","of","implicit","zeros","to","pad","the","input","with",".","Must","be","a","tuple","with","2","elements","giving","the","numbers","of","rows","and","columns","to","pad","on","each","side",",","or","a","single","integer","to","pad","the","same","on","all","sides",",","or","a","string","shortcut","setting","the","padding","at","runtime",":","``","'valid","'","``","for","``","(","0",",","0",")","``","(","valid","convolution",",","no","padding",")",",","``","'full","'","``","for","``","(","kernel_rows","-","1",",","kernel_columns","-","1",")","``","(","full","convolution",")",",","``","'half","'","``","for","``","(","kernel_rows","\/\/","2",",","kernel_columns","\/\/","2",")","``","(","same","convolution","for","odd-sized","kernels",")",".","If","it","is","a","tuple","containing","2","pairs","of","integers",",","then","these","specify","the","padding","to","be","applied","on","each","side","(","(","left",",","right",")",",","(","top",",","bottom",")",")",".","Otherwise",",","each","width","is","applied","twice",",","once","per","side","(","left","and","right",",","top","and","bottom",")",".","subsample","The","subsample","operation","applied","to","each","output","image",".","Should","be","a","tuple","with","2","elements",".","`","(","sv",",","sh",")","`","is","equivalent","to","`","CorrMM","(","...",")","(","...",")","[",":",",",":",",",":",":sv",",",":",":sh","]","`",",","but","faster",".","Set","to","`","(","1",",","1",")","`","to","disable","subsampling",".","filter_dilation","The","filter","dilation","operation","applied","to","each","input","image",".","Should","be","a","tuple","with","2","elements",".","Set","to","`","(","1",",","1",")","`","to","disable","filter","dilation",".","num_groups","Divides","the","image",",","kernel","and","output","tensors","into","num_groups","separate","groups",".","Each","which","carry","out","convolutions","separately",".","Should","be","an","integer",".","unshared","Boolean","value",".","If","true",",","then","a","different","filter","will","be","applied","to","each","region","of","the","input","image","."]
code: def infer_shape(self, node, input_shape):
      imshp = input_shape[0]
      kshp = input_shape[1]
      res = get_conv_output_shape(
          imshp,
          kshp,
          self.border_mode,
          self.subsample,
          self.filter_dilation,
      )
      return [res]
  
imports: from __future__ import absolute_import, print_function, division
  import os
  import logging
  from six import integer_types
  import theano
  from theano import Apply
  from theano import gof
  from theano.gof import ParamsType, EnumList
  from theano.scalar import int64, int8
  from theano.tensor import as_tensor_variable, TensorType
  from theano.tensor.nnet.abstract_conv import get_conv_output_shape
  from theano.tensor import blas_headers
  from theano.tensor.blas import ldflags, blas_header_version
label_desc: Use image node_id 2 for calling the CorrMM obj's underlying member method code with example usage: obj.infer_shape(node, input_shape) and returns: list