Source code for qmctorch.sampler.sampler_base

import torch

from .. import log
from .walkers import Walkers


[docs]class SamplerBase: def __init__(self, nwalkers, nstep, step_size, ntherm, ndecor, nelec, ndim, init, cuda): """Base class for the sampler Args: nwalkers (int): number of walkers nstep (int): number of MC steps step_size (float): size of the steps in bohr ntherm (int): number of MC steps to thermalize ndecor (int): unmber of MC steps to decorellate nelec (int): number of electrons in the system ndim (int): number of cartesian dimension init (dict): method to initialize the walkers cuda ([type]): [description] """ self.nwalkers = nwalkers self.nelec = nelec self.ndim = ndim self.nstep = nstep self.step_size = step_size self.ntherm = ntherm self.ndecor = ndecor self.cuda = cuda if cuda: self.device = torch.device('cuda') else: self.device = torch.device('cpu') self.walkers = Walkers( nwalkers=nwalkers, nelec=nelec, ndim=ndim, init=init, cuda=cuda) log.info('') log.info(' Monte-Carlo Sampler') log.info(' Number of walkers : {0}', self.nwalkers) log.info(' Number of steps : {0}', self.nstep) log.info(' Step size : {0}', self.step_size) log.info(' Thermalization steps: {0}', self.ntherm) log.info(' Decorelation steps : {0}', self.ndecor) log.info(' Walkers init pos : {0}', init['method']) def __call__(self, pdf, *args, **kwargs): raise NotImplementedError( "Sampler must have a __call__ method") def __repr__(self): return self.__class__.__name__ + ' sampler with %d walkers' % self.nwalkers
[docs] def get_sampling_size(self): """evaluate the number of sampling point we'll have.""" if self.ntherm == -1: return self.nwalkers else: return self.walkers.nwalkers * int((self.nstep-self.ntherm)/self.ndecor)