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.walkers.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.walkers.nwalkers
)
[docs]
def get_sampling_size(self):
"""evaluate the number of sampling point we'll have."""
if self.ntherm == -1:
return self.walkers.nwalkers
else:
return self.walkers.nwalkers * int((self.nstep - self.ntherm) / self.ndecor)