class_docstr: Gradient of generalized eigenvalues of a Hermitian positive definite
  eigensystem.
class_docstr_tok: ["Gradient","of","generalized","eigenvalues","of","a","Hermitian","positive","definite","eigensystem","."]
code: def perform(self, node, inputs, outputs):
      (a, b, gw) = inputs
      w, v = scipy.linalg.eigh(a, b, lower=self.lower)
      gA = v.dot(np.diag(gw).dot(v.T))
      gB = -v.dot(np.diag(gw * w).dot(v.T))
  
      # See EighGrad comments for an explanation of these lines
      out1 = self.tri0(gA) + self.tri1(gA).T
      out2 = self.tri0(gB) + self.tri1(gB).T
      outputs[0][0] = np.asarray(out1, dtype=node.outputs[0].dtype)
      outputs[1][0] = np.asarray(out2, dtype=node.outputs[1].dtype)
  
imports: from __future__ import absolute_import, print_function, division
  import logging
  import warnings
  from six.moves import xrange
  import numpy
  from theano import tensor
  import theano.tensor
  from theano.tensor import as_tensor_variable
  from theano.gof import Op, Apply
label_desc: Use image node_id 3 for calling the EigvalshGrad obj's underlying member method code with example usage: obj.perform(node, inputs, outputs) without return types