code: def local_log_prod_sqr(node):
      if node.op == tensor.log:
          (x,) = node.inputs
          if x.owner and isinstance(x.owner.op, tensor.elemwise.Prod):
              # we cannot always make this substitution because
              # the prod might include negative terms
              p = x.owner.inputs[0]
  
              # p is the matrix we're reducing with prod
              if is_positive(p):
                  return [tensor.log(p).sum(axis=x.owner.op.axis)]
  
imports: from __future__ import absolute_import, print_function, division
  import logging
  from six import iteritems, integer_types
  from six.moves import xrange
  from theano.gof import Op, Apply
  from theano.tensor import DimShuffle, Dot
  from theano.tensor.blas import Dot22
  from theano import tensor
  import theano.tensor
  from theano.tensor.opt import register_stabilize, register_specialize, register_canonicalize
  from theano.gof import local_optimizer
  from theano.gof.opt import Optimizer
  from theano.tensor.nlinalg import MatrixInverse, matrix_inverse, extract_diag, trace, det
  from theano.tensor.slinalg import Cholesky, cholesky, Solve, solve, imported_scipy
label_desc: Use image node_id 14 for calling a global function with example usage: local_log_prod_sqr(node) and returns: list