code: def perform(self, node, inputs, output_storage):
      cA, calpha, cx, cy = inputs
      (cZ,) = output_storage
      # N.B. some versions of scipy (e.g. mine) don't actually work
      # in-place on a, even when I tell it to.
      A = cA
      local_ger = node.tag.local_ger
      if A.size == 0:
          # We don't have to compute anything, A is empty.
          # We need this special case because Numpy considers it
          # C-contiguous, which is confusing.
          if not self.destructive:
              # Sometimes numpy thinks empty matrices can share memory,
              # so here to stop DebugMode from complaining.
              A = A.copy()
      elif A.flags["C_CONTIGUOUS"]:
          A = local_ger(
              calpha, cy, cx, a=A.T, overwrite_a=int(self.destructive)
          ).T
      else:
          A = local_ger(
              calpha, cx, cy, a=A, overwrite_a=int(self.destructive)
          )
      cZ[0] = A
  
file_path: Theano/theano/tensor/blas_scipy.py
imports: from __future__ import absolute_import, print_function, division
  import numpy
  from theano.tensor.blas import Ger, ger, ger_destructive, have_fblas
  from theano.tensor.blas import blas_optdb, optdb, local_optimizer
  from theano.tensor.opt import in2out
label_desc: Use image node_id 2 for calling the ScipyGer obj's underlying member method code with example usage: obj.perform(node, inputs, output_storage) without return types