Source code for dubfi
# Copyright 2025 DWD
# SPDX-License-Identifier: BSD-3-Clause
"""Package for Bayesian inversion with multiple linear algebra backends.
.. codeauthor:: Valentin Bruch, DWD <valentin.bruch@dwd.de>
.. versionadded:: 0.1.0 (initial release)
"""
import logging
import os
try:
from ._version import __version__ as __version__
except ImportError:
__version__ = "unknown"
# create logger
_debug_level = os.environ.get("LOG_LEVEL", logging.INFO)
logging.basicConfig(
level=_debug_level,
format="%(asctime)s %(levelname)s %(message)s",
datefmt="%H:%M:%S",
)
colorlog = logging
if not os.environ.get("NOCOLOR", False):
try:
import colorlog
colorlog.basicConfig(
level=_debug_level,
format="%(purple)s%(asctime)s%(reset)s %(log_color)s%(levelname)s%(reset)s %(message)s",
datefmt="%H:%M:%S",
)
except ImportError:
pass
log = colorlog.getLogger("DUBFI")
[docs]
def set_log_file(log_file: str, level: str | None):
"""Set given file path as log file, replacing all other log handlers."""
log_handler = logging.FileHandler(log_file)
if level is not None:
log_handler.setLevel(level)
log_handler.setFormatter(
logging.Formatter(
fmt="%(asctime)s %(levelname)s %(message)s", datefmt="%H:%M:%S"
)
)
# remove existing handlers
for handler in log.handlers:
log.removeHandler(handler)
log.addHandler(log_handler)
log.debug(f"Added handler for {log_file}")
[docs]
def quit_clean():
"""Quit MPI processes if a connection to such processes exists.
This light-weight function will check if an MPI context has been
created and sends a quit signal through this context. Always call
this function before exiting the program to avoid dangling MPI
processes on exit of the parent process.
.. versionadded:: 0.1.1
"""
import sys
if "dubfi.linalg.mpi_parent" in sys.modules:
from .linalg.mpi_parent import CTX
CTX.quit()