Source code for atsim.potentials.config._potential_form_builder

import logging

from .._multi_range_potential_form import create_Multi_Range_Potential_Form, Multi_Range_Defn

from ._common import ConfigurationException

[docs]class UnknownModifierException(ConfigurationException):
[docs] def __str__(self): return "unknown modifier '{}'".format(super(UnknownModifierException, self).__str__())
[docs]class UnknownPotentialFormException(ConfigurationException):
[docs] def __str__(self): return "unknown potential form '{}'".format(super(UnknownPotentialFormException, self).__str__())
[docs]class Potential_Form_Builder(object): """Class that instantiates potential function callables from PotentialFormInstanceTuple""" def __init__(self, potential_form_registry, modifier_registry): """:param potential_form_registry: Instance of `atsim.potentials.config._potential_form_registry.Potential_Form_Registry` :param modifier_registry: Instance of `atsim.potentials.config._modifier_registry.Modifier_Registry`""" self.potential_form_registry = potential_form_registry self.modifier_registry = modifier_registry def _make_multi_range_tuple(self, pform_instance): """Convert PotentialFormInstanceTuple into Multi_Range_Defn""" # Is pform_instance a modifier or a potential_instance? if hasattr(pform_instance, "modifier"): try: pform_factory = self.modifier_registry[pform_instance.modifier] except KeyError as e: raise UnknownModifierException(*e.args) pform = pform_factory(pform_instance.potential_forms, self) else: try: pform_factory = self.potential_form_registry[pform_instance.potential_form] except KeyError as e: raise UnknownPotentialFormException(*e.args) params = pform_instance.parameters pform = pform_factory(*params) if pform_instance.start: start = pform_instance.start.start range_type = pform_instance.start.range_type else: start = float("-inf") range_type = ">=" mr_tuple = Multi_Range_Defn(range_type, start, pform) return mr_tuple
[docs] def create_potential_function(self, potential_form_instance): """Create a callable for a given potential form tuple. :param potential_form_instance: PotentialFormInstanceTuple (or PotentialModifierTuple) defining potential form callable. :return: Single parameter potential function""" logger = logging.getLogger(__name__).getChild("Potential_Form_Builder.create_potential") logger.debug("Creating potential object for potential form instance: {}".format(potential_form_instance)) # Parametrise the potential form to create a potential function tuples = [self._make_multi_range_tuple(potential_form_instance)] n = potential_form_instance.next while n: tuples.append(self._make_multi_range_tuple(n)) n = n.next pot_func = create_Multi_Range_Potential_Form(*tuples) return pot_func