class_docstr: This class enables to initialize electron's position using gauss distribution around a nucleus and update using Markov Chain Monte-Carlo(MCMC) moves.
  
  Using the probability obtained from the square of magnitude of wavefunction of a molecule/atom, MCMC steps can be performed to get the electron's positions and further update the wavefunction.
  This method is primarily used in methods like Variational Monte Carlo to sample electrons around the nucleons.
  Sampling can be done in 2 ways:
  -Simultaneous: All the electrons' positions are updated all at once.
  
  -Single-electron: MCMC steps are performed only a particular electron, given their index value.
  
  Further these moves can be done in 2 methods:
  -Symmetric: In this configuration, the standard deviation for all the steps are uniform.
  
  -Asymmetric: In this configuration, the standard deviation are not uniform and typically the standard deviation is obtained a function like harmonic distances, etc.
  
  Irrespective of these methods, the initialization is done uniformly around the respective nucleus and the number of electrons specified.
  
  Example
  -------
  >>> from deepchem.utils.electron_sampler import ElectronSampler
  >>> test_f = lambda x: 2*np.log(np.random.uniform(low=0,high=1.0,size=np.shape(x)[0]))
  >>> distribution=ElectronSampler(central_value=np.array([[1,1,3],[3,2,3]]),f=test_f,seed=0,batch_no=2,steps=1000,)
  >>> distribution.gauss_initialize_position(np.array([[1],[2]]))
  
  >> print(distribution.x)
  [[[[1.03528105 1.00800314 3.01957476]]
  
    [[3.01900177 1.99697286 2.99793562]]
  
    [[3.00821197 2.00288087 3.02908547]]]
  
  
  [[[1.04481786 1.03735116 2.98045444]]
  
    [[3.01522075 2.0024335  3.00887726]]
  
    [[3.00667349 2.02988158 2.99589683]]]]
  >>> distribution.move()
  0.5115
  
  >> print(distribution.x)
  [[[[-0.32441754  1.23330263  2.67927645]]
  
    [[ 3.42250997  2.23617126  3.55806632]]
  
    [[ 3.37491385  1.54374006  3.13575241]]]
  
  
  [[[ 0.49067726  1.03987841  3.70277884]]
  
    [[ 3.5631939   1.68703947  2.5685874 ]]
  
    [[ 2.84560249  1.73998364  3.41274181]]]]
docstr: Calculates the log probability of a gaussian distribution, given the mean and standard deviation
  
  Parameters
  ----------
  y: np.ndarray
      data for which the log normal distribution is to be found
  mu: np.ndarray
      Means wrt which the log normal is calculated. Same shape as x or should be brodcastable to x
  sigma: np.ndarray,
      The standard deviation of the log normal distribution. Same shape as x or should be brodcastable to x
  
  Returns
  -------
  np.ndarray
      Log probability of gaussian distribution, with the shape - (batch_no,).
docstr_tok: ["Calculates","the","log","probability","of","a","gaussian","distribution",",","given","the","mean","and","standard","deviation","Parameters","--","--","--","--","--","y",":","np.ndarray","data","for","which","the","log","normal","distribution","is","to","be","found","mu",":","np.ndarray","Means","wrt","which","the","log","normal","is","calculated",".","Same","shape","as","x","or","should","be","brodcastable","to","x","sigma",":","np.ndarray",",","The","standard","deviation","of","the","log","normal","distribution",".","Same","shape","as","x","or","should","be","brodcastable","to","x","Returns","--","--","--","-","np.ndarray","Log","probability","of","gaussian","distribution",",","with","the","shape","-","(","batch_no",",",")","."]
code: def log_prob_gaussian(
      self, y: np.ndarray, mu: np.ndarray, sigma: np.ndarray
  ) -> np.ndarray:
      """Calculates the log probability of a gaussian distribution, given the mean and standard deviation
  
      Parameters
      ----------
      y: np.ndarray
          data for which the log normal distribution is to be found
      mu: np.ndarray
          Means wrt which the log normal is calculated. Same shape as x or should be brodcastable to x
      sigma: np.ndarray,
          The standard deviation of the log normal distribution. Same shape as x or should be brodcastable to x
  
      Returns
      -------
      np.ndarray
          Log probability of gaussian distribution, with the shape - (batch_no,).
      """
  
      numer = np.sum(
          (-0.5 * ((y - mu) ** 2) / (sigma**2)), axis=(1, 2, 3)
      )
      denom = y.shape[-1] * np.sum(np.log(sigma), axis=(1, 2, 3))
      return numer - denom
  
file_path: deepchem/deepchem/utils/electron_sampler.py
imports: import numpy
  from typing import Optional, Callable
label_desc: Use image node_id 3 for calling the ElectronSampler obj's underlying member method code with example usage: obj.log_prob_gaussian(y, mu, sigma) and returns: unknown