"""
Define internal system constants and functions
"""
import sciris as sc
from .function_parser import supported_functions
import pathlib
# Set up a logger that can be imported elsewhere
import logging
__all__ = ["atomica_path", "LIBRARY_PATH", "NotFoundError", "FrameworkSettings"]
logger = logging.getLogger("atomica")
[docs]
def atomica_path(subdir=None) -> pathlib.Path:
"""
Returns paths relative to the Atomica parent module
This function by default returns the directory containing the Atomica
source files. It can also return paths relative to this directory using
the optional additional arguments
Example usage:
>>> at.atomica_path()
WindowsPath('E:/projects/atomica/atomica')
>>> at.atomica_path('foo')
WindowsPath('E:/projects/atomica/atomica/foo')
>>> at.atomica_path(['foo','bar'])
WindowsPath('E:/projects/atomica/atomica/foo/bar')
:param subdir: Optionally append a list of subdirectories to the path
:return: Absolute Path object
"""
path = pathlib.Path(__file__).parent.parent
for d in sc.promotetolist(subdir):
path /= d
return path.resolve()
LIBRARY_PATH = atomica_path(["atomica", "library"])
[docs]
class NotFoundError(Exception):
"""
Error for when an item was not found
This error gets thrown if a user-specified input was not found. For example, if the
user queries a Population for a non-existent variable.
"""
pass
[docs]
class FrameworkSettings:
"""
Define system level keywords
This class stores sets of keywords such as the keys for different variable types, or the
supported quantity types (e.g., 'probability', 'number')
"""
KEY_COMPARTMENT = "comp"
KEY_CHARACTERISTIC = "charac"
KEY_TRANSITION = "link"
KEY_PARAMETER = "par"
KEY_POPULATION = "pop"
KEY_TRANSFER = "transfer"
KEY_INTERACTION = "interpop"
QUANTITY_TYPE_PROBABILITY = "probability"
QUANTITY_TYPE_DURATION = "duration"
QUANTITY_TYPE_NUMBER = "number"
QUANTITY_TYPE_FRACTION = "fraction"
QUANTITY_TYPE_PROPORTION = "proportion"
QUANTITY_TYPE_RATE = "rate"
STANDARD_UNITS = [QUANTITY_TYPE_PROBABILITY, QUANTITY_TYPE_DURATION, QUANTITY_TYPE_NUMBER, QUANTITY_TYPE_FRACTION, QUANTITY_TYPE_PROPORTION, QUANTITY_TYPE_RATE]
DEFAULT_SYMBOL_INAPPLICABLE = "N.A."
DEFAULT_POP_TYPE = "default"
RESERVED_KEYWORDS = ["t", "flow", "all", "dt", "total"] # A code_name in the framework cannot be equal to one of these values
RESERVED_KEYWORDS += supported_functions.keys()
RESERVED_SYMBOLS = set(":,;/+-*'\" @") # A code_name in the framework (for characs, comps, pars) cannot contain any of these characters