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: Performs sampling & parameter updates of electrons and appends the sampled electrons to self.sampled_electrons.
  
  Parameters
  ----------
  lp1: np.ndarray
      Log probability of initial parameter state.
  lp2: np.ndarray
      Log probability of the new sampled state.
  move_prob: np.ndarray
      Sampled log probabilty of the electron moving from the initial to final state, sampled assymetrically or symetrically.
  ratio: np.ndarray
      Ratio of lp1 and lp2 state.
  x2: np.ndarray
      Numpy array of the new sampled electrons.
  
  Returns
  -------
  lp1: np.ndarray
      The update log probability of initial parameter state.
docstr_tok: ["Performs","sampling","&","parameter","updates","of","electrons","and","appends","the","sampled","electrons","to","self.sampled_electrons",".","Parameters","--","--","--","--","--","lp1",":","np.ndarray","Log","probability","of","initial","parameter","state",".","lp2",":","np.ndarray","Log","probability","of","the","new","sampled","state",".","move_prob",":","np.ndarray","Sampled","log","probabilty","of","the","electron","moving","from","the","initial","to","final","state",",","sampled","assymetrically","or","symetrically",".","ratio",":","np.ndarray","Ratio","of","lp1","and","lp2","state",".","x2",":","np.ndarray","Numpy","array","of","the","new","sampled","electrons",".","Returns","--","--","--","-","lp1",":","np.ndarray","The","update","log","probability","of","initial","parameter","state","."]
code: def electron_update(
      self, lp1, lp2, move_prob, ratio, x2
  ) -> np.ndarray:
      """
      Performs sampling & parameter updates of electrons and appends the sampled electrons to self.sampled_electrons.
  
      Parameters
      ----------
      lp1: np.ndarray
          Log probability of initial parameter state.
      lp2: np.ndarray
          Log probability of the new sampled state.
      move_prob: np.ndarray
          Sampled log probabilty of the electron moving from the initial to final state, sampled assymetrically or symetrically.
      ratio: np.ndarray
          Ratio of lp1 and lp2 state.
      x2: np.ndarray
          Numpy array of the new sampled electrons.
  
      Returns
      -------
      lp1: np.ndarray
          The update log probability of initial parameter state.
      """
      cond = move_prob < ratio
      tmp_sampled = np.where(cond[:, None, None, None], x2, self.x)
      if (self.steps % self.steps_per_update) == 0:
          self.x = tmp_sampled
          lp1 = np.where(cond, lp2, lp1)
      if np.shape(self.sampled_electrons)[0] == 0:
          self.sampled_electrons = tmp_sampled
      else:
          self.sampled_electrons = np.concatenate(
              (self.sampled_electrons, tmp_sampled)
          )
      self.num_accept += np.sum(cond)
      return lp1
  
file_path: deepchem/deepchem/utils/electron_sampler.py
imports: import numpy
  from typing import Optional, Callable
label_desc: Use image node_id 5 for calling the ElectronSampler obj's underlying member method code with example usage: obj.electron_update(lp1, lp2, move_prob, ratio, x2) and returns: lp1