Source code for expertsystem.reaction.default_settings

"""Default configuration for the `expertsystem`."""

from copy import deepcopy
from enum import Enum, auto
from os.path import dirname, join, realpath
from typing import Dict, List, Optional, Tuple, Union

from expertsystem.reaction.conservation_rules import (
    BaryonNumberConservation,
    BottomnessConservation,
    ChargeConservation,
    CharmConservation,
    ConservationRule,
    EdgeQNConservationRule,
    ElectronLNConservation,
    GraphElementRule,
    MassConservation,
    MuonLNConservation,
    StrangenessConservation,
    TauLNConservation,
    c_parity_conservation,
    clebsch_gordan_helicity_to_canonical,
    g_parity_conservation,
    gellmann_nishijima,
    helicity_conservation,
    identical_particle_symmetrization,
    isospin_conservation,
    isospin_validity,
    ls_spin_validity,
    parity_conservation,
    parity_conservation_helicity,
    spin_conservation,
    spin_magnitude_conservation,
    spin_validity,
)
from expertsystem.reaction.quantum_numbers import (
    EdgeQuantumNumbers,
    NodeQuantumNumbers,
)
from expertsystem.reaction.solving import EdgeSettings, NodeSettings

__EXPERT_SYSTEM_PATH = dirname(dirname(realpath(__file__)))
__DEFAULT_PARTICLE_LIST_FILE = "reaction/additional_definitions.yml"
ADDITIONAL_PARTICLES_DEFINITIONS_PATH = join(
    __EXPERT_SYSTEM_PATH, __DEFAULT_PARTICLE_LIST_FILE
)

# If a conservation law is not listed here, a default priority of 1 is assumed.
# Higher number means higher priority
__CONSERVATION_LAW_PRIORITIES: Dict[
    Union[GraphElementRule, EdgeQNConservationRule, ConservationRule], int
] = {
    spin_conservation: 8,
    ls_spin_validity: 89,
    spin_magnitude_conservation: 8,
    helicity_conservation: 7,
    MassConservation: 10,
    ChargeConservation: 100,
    ElectronLNConservation: 45,
    MuonLNConservation: 44,
    TauLNConservation: 43,
    BaryonNumberConservation: 90,
    identical_particle_symmetrization: 2,
    CharmConservation: 70,
    StrangenessConservation: 69,
    parity_conservation: 6,
    c_parity_conservation: 5,
    parity_conservation_helicity: 4,
    isospin_conservation: 60,
    g_parity_conservation: 3,
    BottomnessConservation: 68,
}


__EDGE_RULE_PRIORITIES: Dict[GraphElementRule, int] = {
    gellmann_nishijima: 50,
    isospin_validity: 61,
    spin_validity: 62,
}


[docs]class InteractionTypes(Enum): """Types of interactions in the form of an enumerate.""" STRONG = auto() EM = auto() WEAK = auto()
def _get_spin_magnitudes(is_nbody: bool) -> List[float]: if is_nbody: return [ 0, ] return [0, 0.5, 1, 1.5, 2] def _get_ang_mom_magnitudes(is_nbody: bool) -> List[float]: if is_nbody: return [ 0, ] return [0, 1, 2] def __create_projections( magnitudes: List[Union[int, float]] ) -> List[Union[int, float]]: return magnitudes + [-x for x in magnitudes if x > 0]
[docs]def create_default_interaction_settings( formalism_type: str, nbody_topology: bool = False, mass_conservation_factor: Optional[float] = 3.0, ) -> Dict[InteractionTypes, Tuple[EdgeSettings, NodeSettings]]: """Create a container that holds the settings for the various interactions. E.g.: strong, em and weak interaction. """ interaction_type_settings = {} formalism_edge_settings = EdgeSettings( conservation_rules={ isospin_validity, gellmann_nishijima, spin_validity, }, rule_priorities=__EDGE_RULE_PRIORITIES, qn_domains={ EdgeQuantumNumbers.charge: [-2, -1, 0, 1, 2], EdgeQuantumNumbers.baryon_number: [-1, 0, 1], EdgeQuantumNumbers.electron_lepton_number: [-1, 0, 1], EdgeQuantumNumbers.muon_lepton_number: [-1, 0, 1], EdgeQuantumNumbers.tau_lepton_number: [-1, 0, 1], EdgeQuantumNumbers.parity: [-1, 1], EdgeQuantumNumbers.c_parity: [-1, 1, None], EdgeQuantumNumbers.g_parity: [-1, 1, None], EdgeQuantumNumbers.spin_magnitude: [0, 0.5, 1, 1.5, 2], EdgeQuantumNumbers.spin_projection: __create_projections( [0, 0.5, 1, 1.5, 2] ), EdgeQuantumNumbers.isospin_magnitude: [0, 0.5, 1, 1.5], EdgeQuantumNumbers.isospin_projection: __create_projections( [0, 0.5, 1, 1.5] ), EdgeQuantumNumbers.charmness: [-1, 0, 1], EdgeQuantumNumbers.strangeness: [-1, 0, 1], EdgeQuantumNumbers.bottomness: [-1, 0, 1], }, ) formalism_node_settings = NodeSettings( rule_priorities=__CONSERVATION_LAW_PRIORITIES ) if "helicity" in formalism_type: formalism_node_settings.conservation_rules = { spin_magnitude_conservation, helicity_conservation, } formalism_node_settings.qn_domains = { NodeQuantumNumbers.l_magnitude: _get_ang_mom_magnitudes( nbody_topology ), NodeQuantumNumbers.s_magnitude: _get_spin_magnitudes( nbody_topology ), } elif formalism_type == "canonical": formalism_node_settings.conservation_rules = { spin_magnitude_conservation } if nbody_topology: formalism_node_settings.conservation_rules = { spin_conservation, ls_spin_validity, } formalism_node_settings.qn_domains = { NodeQuantumNumbers.l_magnitude: _get_ang_mom_magnitudes( nbody_topology ), NodeQuantumNumbers.l_projection: __create_projections( _get_ang_mom_magnitudes(nbody_topology) ), NodeQuantumNumbers.s_magnitude: _get_spin_magnitudes( nbody_topology ), NodeQuantumNumbers.s_projection: __create_projections( _get_spin_magnitudes(nbody_topology) ), } if formalism_type == "canonical-helicity": formalism_node_settings.conservation_rules.update( { clebsch_gordan_helicity_to_canonical, ls_spin_validity, } ) formalism_node_settings.qn_domains.update( { NodeQuantumNumbers.l_projection: [0], NodeQuantumNumbers.s_projection: __create_projections( _get_spin_magnitudes(nbody_topology) ), } ) if mass_conservation_factor is not None: formalism_node_settings.conservation_rules.add( MassConservation(mass_conservation_factor) ) weak_node_settings = deepcopy(formalism_node_settings) weak_node_settings.conservation_rules.update( [ ChargeConservation(), ElectronLNConservation(), MuonLNConservation(), TauLNConservation(), BaryonNumberConservation(), identical_particle_symmetrization, ] ) weak_node_settings.interaction_strength = 10 ** (-4) weak_edge_settings = deepcopy(formalism_edge_settings) interaction_type_settings[InteractionTypes.WEAK] = ( weak_edge_settings, weak_node_settings, ) em_node_settings = deepcopy(weak_node_settings) em_node_settings.conservation_rules.update( { CharmConservation(), StrangenessConservation(), BottomnessConservation(), parity_conservation, c_parity_conservation, } ) if "helicity" in formalism_type: em_node_settings.conservation_rules.add(parity_conservation_helicity) em_node_settings.qn_domains.update( {NodeQuantumNumbers.parity_prefactor: [-1, 1]} ) em_node_settings.interaction_strength = 1 em_edge_settings = deepcopy(weak_edge_settings) interaction_type_settings[InteractionTypes.EM] = ( em_edge_settings, em_node_settings, ) strong_node_settings = deepcopy(em_node_settings) strong_node_settings.conservation_rules.update( {isospin_conservation, g_parity_conservation} ) strong_node_settings.interaction_strength = 60 strong_edge_settings = deepcopy(em_edge_settings) interaction_type_settings[InteractionTypes.STRONG] = ( strong_edge_settings, strong_node_settings, ) return interaction_type_settings