class_docstr: Multiply a BaseXC with a float or a tensor
  
  Examples
  --------
  >>> import torch
  >>> from deepchem.utils.dft_utils import ValGrad, SpinParam
  >>> from deepchem.utils.dft_utils import BaseXC, MulBaseXC
  >>> class MyXC(BaseXC):
  ...     @property
  ...     def family(self) -> int:
  ...         return 1
  ...     def get_edensityxc(self, densinfo: Union[ValGrad, SpinParam[ValGrad]]) -> torch.Tensor:
  ...         if isinstance(densinfo, ValGrad):
  ...             return densinfo.value.pow(2)
  ...         else:
  ...             return densinfo.u.value.pow(2) + densinfo.d.value.pow(2)
  ...     def get_vxc(self, densinfo: Union[ValGrad, SpinParam[ValGrad]]) -> Union[ValGrad, SpinParam[ValGrad]]:
  ...         if isinstance(densinfo, ValGrad):
  ...             return ValGrad(value=2*densinfo.value)
  ...         else:
  ...             return SpinParam(u=ValGrad(value=2*densinfo.u.value),
  ...                              d=ValGrad(value=2*densinfo.d.value))
  >>> xc = MyXC()
  >>> densinfo = ValGrad(value=torch.tensor([1., 2., 3.], requires_grad=True))
  >>> xc.get_edensityxc(densinfo)
  tensor([1., 4., 9.], grad_fn=<PowBackward0>)
  >>> xc.get_vxc(densinfo)
  ValGrad(value=tensor([2., 4., 6.], grad_fn=<MulBackward0>), grad=None, lapl=None, kin=None)
  >>> densinfo = SpinParam(u=ValGrad(value=torch.tensor([1., 2., 3.], requires_grad=True)),
  ...                      d=ValGrad(value=torch.tensor([4., 5., 6.], requires_grad=True)))
  >>> xc.get_edensityxc(densinfo)
  tensor([17., 29., 45.], grad_fn=<AddBackward0>)
  >>> xc.get_vxc(densinfo)
  SpinParam(u=ValGrad(value=tensor([2., 4., 6.], grad_fn=<MulBackward0>), grad=None, lapl=None, kin=None), d=ValGrad(value=tensor([ 8., 10., 12.], grad_fn=<MulBackward0>), grad=None, lapl=None, kin=None))
  >>> xc2 = MulBaseXC(xc, 2.)
  >>> xc2.get_edensityxc(densinfo)
  tensor([34., 58., 90.], grad_fn=<MulBackward0>)
  >>> xc2.get_vxc(densinfo)
  SpinParam(u=ValGrad(value=tensor([ 4.,  8., 12.], grad_fn=<MulBackward0>), grad=None, lapl=None, kin=None), d=ValGrad(value=tensor([16., 20., 24.], grad_fn=<MulBackward0>), grad=None, lapl=None, kin=None))
  >>> xc3 = xc * 2.
  >>> xc3.get_edensityxc(densinfo)
  tensor([34., 58., 90.], grad_fn=<MulBackward0>)
  >>> xc3.get_vxc(densinfo)
  SpinParam(u=ValGrad(value=tensor([ 4.,  8., 12.], grad_fn=<MulBackward0>), grad=None, lapl=None, kin=None), d=ValGrad(value=tensor([16., 20., 24.], grad_fn=<MulBackward0>), grad=None, lapl=None, kin=None))
class_docstr_tok: ["Multiply","a","BaseXC","with","a","float","or","a","tensor","Examples","--","--","--","--",">",">",">","import","torch",">",">",">","from","deepchem.utils.dft_utils","import","ValGrad",",","SpinParam",">",">",">","from","deepchem.utils.dft_utils","import","BaseXC",",","MulBaseXC",">",">",">","class","MyXC","(","BaseXC",")",":","...","@","property","...","def","family","(","self",")","-",">","int",":","...","return","1","...","def","get_edensityxc","(","self",",","densinfo",":","Union","[","ValGrad",",","SpinParam","[","ValGrad","]","]",")","-",">","torch.Tensor",":","...","if","isinstance","(","densinfo",",","ValGrad",")",":","...","return","densinfo.value.pow","(","2",")","...","else",":","...","return","densinfo.u.value.pow","(","2",")","+","densinfo.d.value.pow","(","2",")","...","def","get_vxc","(","self",",","densinfo",":","Union","[","ValGrad",",","SpinParam","[","ValGrad","]","]",")","-",">","Union","[","ValGrad",",","SpinParam","[","ValGrad","]","]",":","...","if","isinstance","(","densinfo",",","ValGrad",")",":","...","return","ValGrad","(","value=2","*","densinfo.value",")","...","else",":","...","return","SpinParam","(","u=ValGrad","(","value=2","*","densinfo.u.value",")",",","...","d=ValGrad","(","value=2","*","densinfo.d.value",")",")",">",">",">","xc","=","MyXC","(",")",">",">",">","densinfo","=","ValGrad","(","value=torch.tensor","(","[","1.",",","2.",",","3",".","]",",","requires_grad=True",")",")",">",">",">","xc.get_edensityxc","(","densinfo",")","tensor","(","[","1.",",","4.",",","9",".","]",",","grad_fn=","<","PowBackward0",">",")",">",">",">","xc.get_vxc","(","densinfo",")","ValGrad","(","value=tensor","(","[","2.",",","4.",",","6",".","]",",","grad_fn=","<","MulBackward0",">",")",",","grad=None",",","lapl=None",",","kin=None",")",">",">",">","densinfo","=","SpinParam","(","u=ValGrad","(","value=torch.tensor","(","[","1.",",","2.",",","3",".","]",",","requires_grad=True",")",")",",","...","d=ValGrad","(","value=torch.tensor","(","[","4.",",","5.",",","6",".","]",",","requires_grad=True",")",")",")",">",">",">","xc.get_edensityxc","(","densinfo",")","tensor","(","[","17.",",","29.",",","45",".","]",",","grad_fn=","<","AddBackward0",">",")",">",">",">","xc.get_vxc","(","densinfo",")","SpinParam","(","u=ValGrad","(","value=tensor","(","[","2.",",","4.",",","6",".","]",",","grad_fn=","<","MulBackward0",">",")",",","grad=None",",","lapl=None",",","kin=None",")",",","d=ValGrad","(","value=tensor","(","[","8.",",","10.",",","12",".","]",",","grad_fn=","<","MulBackward0",">",")",",","grad=None",",","lapl=None",",","kin=None",")",")",">",">",">","xc2","=","MulBaseXC","(","xc",",","2",".",")",">",">",">","xc2.get_edensityxc","(","densinfo",")","tensor","(","[","34.",",","58.",",","90",".","]",",","grad_fn=","<","MulBackward0",">",")",">",">",">","xc2.get_vxc","(","densinfo",")","SpinParam","(","u=ValGrad","(","value=tensor","(","[","4.",",","8.",",","12",".","]",",","grad_fn=","<","MulBackward0",">",")",",","grad=None",",","lapl=None",",","kin=None",")",",","d=ValGrad","(","value=tensor","(","[","16.",",","20.",",","24",".","]",",","grad_fn=","<","MulBackward0",">",")",",","grad=None",",","lapl=None",",","kin=None",")",")",">",">",">","xc3","=","xc","*","2",".",">",">",">","xc3.get_edensityxc","(","densinfo",")","tensor","(","[","34.",",","58.",",","90",".","]",",","grad_fn=","<","MulBackward0",">",")",">",">",">","xc3.get_vxc","(","densinfo",")","SpinParam","(","u=ValGrad","(","value=tensor","(","[","4.",",","8.",",","12",".","]",",","grad_fn=","<","MulBackward0",">",")",",","grad=None",",","lapl=None",",","kin=None",")",",","d=ValGrad","(","value=tensor","(","[","16.",",","20.",",","24",".","]",",","grad_fn=","<","MulBackward0",">",")",",","grad=None",",","lapl=None",",","kin=None",")",")"]
docstr: Returns the ValGrad for the xc potential given the density info
  for unpolarized case.
  
  Parameters
  ----------
  densinfo : Union[ValGrad, SpinParam[ValGrad]]
      The density information.
      If the XC is unpolarized, then densinfo is ValGrad.
      If the XC is polarized, then densinfo is SpinParam[ValGrad].
      The ValGrad contains the value and gradient of the density.
      The SpinParam[ValGrad] contains the value and gradient of the density
      for each spin channel.
  
  Returns
  -------
  Union[ValGrad, SpinParam[ValGrad]]
      The ValGrad for the xc potential.
      If the XC is unpolarized, then the return is ValGrad.
      If the XC is polarized, then the return is SpinParam[ValGrad].
docstr_tok: ["Returns","the","ValGrad","for","the","xc","potential","given","the","density","info","for","unpolarized","case",".","Parameters","--","--","--","--","--","densinfo",":","Union","[","ValGrad",",","SpinParam","[","ValGrad","]","]","The","density","information",".","If","the","XC","is","unpolarized",",","then","densinfo","is","ValGrad",".","If","the","XC","is","polarized",",","then","densinfo","is","SpinParam","[","ValGrad","]",".","The","ValGrad","contains","the","value","and","gradient","of","the","density",".","The","SpinParam","[","ValGrad","]","contains","the","value","and","gradient","of","the","density","for","each","spin","channel",".","Returns","--","--","--","-","Union","[","ValGrad",",","SpinParam","[","ValGrad","]","]","The","ValGrad","for","the","xc","potential",".","If","the","XC","is","unpolarized",",","then","the","return","is","ValGrad",".","If","the","XC","is","polarized",",","then","the","return","is","SpinParam","[","ValGrad","]","."]
code: def get_vxc(
      self, densinfo: Union[ValGrad, SpinParam[ValGrad]]
  ) -> Union[ValGrad, SpinParam[ValGrad]]:
      """Returns the ValGrad for the xc potential given the density info
      for unpolarized case.
  
      Parameters
      ----------
      densinfo : Union[ValGrad, SpinParam[ValGrad]]
          The density information.
          If the XC is unpolarized, then densinfo is ValGrad.
          If the XC is polarized, then densinfo is SpinParam[ValGrad].
          The ValGrad contains the value and gradient of the density.
          The SpinParam[ValGrad] contains the value and gradient of the density
          for each spin channel.
  
      Returns
      -------
      Union[ValGrad, SpinParam[ValGrad]]
          The ValGrad for the xc potential.
          If the XC is unpolarized, then the return is ValGrad.
          If the XC is polarized, then the return is SpinParam[ValGrad].
  
      """
      avxc = self.a.get_vxc(densinfo)
  
      if isinstance(densinfo, ValGrad):
          return avxc * self.b
      else:
          return SpinParam(u=avxc.u * self.b, d=avxc.d * self.b)
  
imports: from contextlib import contextmanager
  from abc import abstractmethod, abstractproperty
  import torch
  from deepchem.utils.differentiation_utils import EditableModule
  from typing import Any, List, Union, Iterator
  from deepchem.utils.dft_utils import ValGrad, SpinParam
label_desc: Use image node_id 3 for calling the MulBaseXC obj's underlying member method code with example usage: obj.get_vxc(densinfo) and returns: unknown, SpinParam