Source code for ersilia

# External imports
# ruff: noqa
import os
from ._version import __version__
import warnings

# Filter out some warnings
warnings.filterwarnings("ignore", category=RuntimeWarning)

# Disable GPU
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

# Default variables
from .default import EOS, CONFIG_JSON, INSTALL_STATUS_FILE

# Config
if not os.path.exists(os.path.join(EOS, CONFIG_JSON)):
    from .utils.config import Checker

    Checker().config()

# Environmental variables
os.environ["EOS_HOME"] = EOS

# User profile
from .default import bashrc_cli_snippet

bashrc_cli_snippet(overwrite=False)


# Lazy re-exports of heavy library classes/utilities. Importing them eagerly
# pulled ~300 ms of transitive dependencies into every CLI startup. PEP 562
# __getattr__ defers each import until first access while preserving the
# `from ersilia import X` ergonomics.
_LAZY = {
    "logger": ("ersilia.utils.logging", "logger"),
    "throw_ersilia_exception": (
        "ersilia.utils.exceptions_utils.throw_ersilia_exception",
        "throw_ersilia_exception",
    ),
    "Config": ("ersilia.utils.config", "Config"),
    "ErsiliaBase": ("ersilia.core.base", "ErsiliaBase"),
    "ModelBase": ("ersilia.core.modelbase", "ModelBase"),
    "ErsiliaModel": ("ersilia.core.model", "ErsiliaModel"),
}


def __getattr__(name):
    if name in _LAZY:
        import importlib

        mod_name, attr = _LAZY[name]
        obj = getattr(importlib.import_module(mod_name), attr)
        globals()[name] = obj
        return obj
    raise AttributeError(f"module 'ersilia' has no attribute {name!r}")


def __dir__():
    return sorted(list(globals().keys()) + list(_LAZY.keys()))


# Check status of installs
[docs] def check_install_status(): fn = os.path.join(EOS, INSTALL_STATUS_FILE) if not os.path.exists(fn): status = None else: with open(fn, "r") as f: status = f.read().strip() results = {"install_status_file": fn, "status": status} return results
INSTALL_STATUS = check_install_status()["status"]