Source code for easyvvuq.sampling.base

from easyvvuq.base_element import BaseElement
import logging

__copyright__ = """

    Copyright 2018 Robin A. Richardson, David W. Wright

    This file is part of EasyVVUQ

    EasyVVUQ is free software: you can redistribute it and/or modify
    it under the terms of the Lesser GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    EasyVVUQ is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    Lesser GNU General Public License for more details.

    You should have received a copy of the Lesser GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

"""
__license__ = "LGPL"


# Dict to store all registered samplers (any class which extends
# BaseSamplingElement is automatically registered as a sampler)
AVAILABLE_SAMPLERS = {}


[docs]class BaseSamplingElement(BaseElement): """Baseclass for all EasyVVUQ sampling elements. Attributes ---------- sampler_name : str Name of the particular sampler. """ iteration = 0 def __init_subclass__(cls, sampler_name, **kwargs): """ Catch any new samplers (all samplers must inherit from BaseSamplingElement) and add them to the dict of available samplers. Parameters ---------- sampler_name : str Name of the particular sampler. """ super().__init_subclass__(**kwargs) cls.sampler_name = sampler_name # Register new sampler AVAILABLE_SAMPLERS[sampler_name] = cls
[docs] def element_category(self): return "sampling"
[docs] def element_name(self): return self.sampler_name
[docs] def is_finite(self): raise NotImplementedError
[docs] def n_samples(self): raise NotImplementedError
def __iter__(self): """ This method allows the sampler to be used as an iterator. The campaign object's draw_samples() method uses samplers in that manner. """ return self def __next__(self): """ This must be implemented by any sampler class. It should return the next run in the sequence. In the case of a finite sampler, when there are no more runs remaining, __next__() should raise a StopIteration exception """ raise NotImplementedError @property def analysis_class(self): raise NotImplementedError @property def sampler_id(self): try: return self._sampler_id except AttributeError: raise RuntimeError('this sampler does not have an id assigned, run set_sampler first') @sampler_id.setter def sampler_id(self, val): self._sampler_id = val
[docs]class Vary: def __init__(self, vary_dict): if vary_dict is None: msg = ("'vary_dict' cannot be None. RandomSampler must be passed a " "dict of the names of the parameters you want to vary, " "and their corresponding distributions.") logging.error(msg) raise Exception(msg) if not isinstance(vary_dict, dict): msg = ("'vary_dict' must be a dictionary of the names of the " "parameters you want to vary, and their corresponding " "distributions.") logging.error(msg) raise Exception(msg) if len(vary_dict) == 0: msg = "'vary_dict' cannot be empty." logging.error(msg) raise Exception(msg) self.vary_dict = vary_dict
[docs] def get_items(self): return self.vary_dict.items()
[docs] def get_values(self): return self.vary_dict.values()
[docs] def get_keys(self): return self.vary_dict.keys()
def __str__(self): return self.vary_dict.__str__()