class_docstr: Base class for `CorrMM`, `CorrMM_gradWeights` and
  `CorrMM_gradInputs`. Cannot be used directly.
  
  Every sub-class must define internal attribute ``_direction`` out of __init__().
  ``_direction`` must take one of following values:
  
   - "forward" to correlate bottom with weights and store results in top.
   - "backprop weights" to do a valid convolution of bottom with top
     (swapping the first two dimensions) and store results in weights.
   - "backprop inputs" to do a full convolution of top with weights
     (swapping the first two dimensions) and store results in bottom.
  
  Parameters
  ----------
  border_mode : {'valid', 'full', 'half'}
      Additionally, the padding size could be directly specified by an integer,
      a pair of integers, or two pairs of integers.
  subsample
      Perform subsampling of the output (default: (1, 1)).
  filter_dilation
      Perform dilated correlation (default: (1,1))
  num_groups
      Perform grouped convolutions (default: 1)
  unshared
      Perform unshared correlation (default: False)
class_docstr_tok: ["Base","class","for","`","CorrMM","`",",","`","CorrMM_gradWeights","`","and","`","CorrMM_gradInputs","`",".","Can","not","be","used","directly",".","Every","sub-class","must","define","internal","attribute","``","_direction","``","out","of","__init__","(",")",".","``","_direction","``","must","take","one","of","following","values",":","-","``","forward","''","to","correlate","bottom","with","weights","and","store","results","in","top",".","-","``","backprop","weights","''","to","do","a","valid","convolution","of","bottom","with","top","(","swapping","the","first","two","dimensions",")","and","store","results","in","weights",".","-","``","backprop","inputs","''","to","do","a","full","convolution","of","top","with","weights","(","swapping","the","first","two","dimensions",")","and","store","results","in","bottom",".","Parameters","--","--","--","--","--","border_mode",":","{","'valid","'",",","'full","'",",","'half","'","}","Additionally",",","the","padding","size","could","be","directly","specified","by","an","integer",",","a","pair","of","integers",",","or","two","pairs","of","integers",".","subsample","Perform","subsampling","of","the","output","(","default",":","(","1",",","1",")",")",".","filter_dilation","Perform","dilated","correlation","(","default",":","(","1,1",")",")","num_groups","Perform","grouped","convolutions","(","default",":","1",")","unshared","Perform","unshared","correlation","(","default",":","False",")"]
code: def c_support_code_apply(self, node, nodename):
      # REMEMBER TO RAISE c_code_cache_version when changing any of
      # these files
      sub = {}
      dtype = str(node.__dict__["inputs"][0].dtype)
      assert dtype in ("float32", "float64")
      if dtype == "float32":
          sub["gemm"] = "sgemm_"
          sub["gemv"] = "sgemv_"
          sub["float_type"] = "npy_float"
          sub["float_typenum"] = "NPY_FLOAT"
          sub["n_bytes"] = 4
          sub["c_float_type"] = "float"
      else:
          sub["gemm"] = "dgemm_"
          sub["gemv"] = "dgemv_"
          sub["float_type"] = "npy_double"
          sub["float_typenum"] = "NPY_DOUBLE"
          sub["n_bytes"] = 8
          sub["c_float_type"] = "double"
  
      if self.openmp:
          sub["omp_flags"] = "#pragma omp parallel for schedule(static)"
          sub["omp_get_max_threads"] = "omp_get_max_threads()"
          sub["omp_get_thread_num"] = "omp_get_thread_num()"
  
          if self.blas_type == "openblas":
              sub["blas_set_num_threads"] = "openblas_set_num_threads"
              sub["blas_get_num_threads"] = "openblas_get_num_threads()"
          elif self.blas_type == "mkl":
              sub["blas_set_num_threads"] = "mkl_set_num_threads"
              sub["blas_get_num_threads"] = "mkl_get_max_threads()"
          else:
              sub["blas_set_num_threads"] = ""
              sub["blas_get_num_threads"] = "0"
      else:
          sub["omp_flags"] = ""
          sub["omp_get_max_threads"] = "1"
          sub["omp_get_thread_num"] = "0"
          sub["blas_set_num_threads"] = ""
          sub["blas_get_num_threads"] = "0"
  
      files = [os.path.join("c_code", "corr_gemm.c")]
      codes = [
          open(os.path.join(os.path.split(__file__)[0], f)).read()
          for f in files
      ]
      final_code = ""
      for code in codes:
          final_code += code
      return final_code % sub
  
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 13 for calling the BaseCorrMM obj's underlying member method code with example usage: obj.c_support_code_apply(node, nodename) and returns: unknown