Source code for sequince.steps.log

import logging
from typing import TYPE_CHECKING, Callable

from .base import SMCStep

logger = logging.getLogger(__name__)

if TYPE_CHECKING:
    from orng import RandomGenerator

    from ..state import ParticleState
    from .base import StepContext


[docs] class LoggingStep(SMCStep): """A simple step that logs a message at each iteration. Examples -------- >>> def log_fn(state, context): ... return f"Iteration {context.t}: ESS={state.effective_sample_size():.2f}" >>> step = LoggingStep(str_fn=log_fn, level=logging.INFO, frequency=1) >>> smc = SequentialMonteCarlo(steps=[..., step, ...]) Parameters ---------- str_fn: A function that takes the current ``ParticleState`` and ``StepContext`` and returns a string message to log. level: The logging level to use (e.g., ``logging.INFO``). frequency: How often to log the message (in terms of SMC iterations). """ def __init__( self, str_fn: Callable[["ParticleState", "StepContext"], str], level: int = logging.INFO, frequency: int = 1, ): super().__init__() self._str_fn = str_fn self._level = level self._frequency = frequency
[docs] def apply( self, state: "ParticleState", context: "StepContext", rng: "RandomGenerator", ) -> tuple["ParticleState", "StepContext", None]: if context.t % self._frequency != 0 or not logger.isEnabledFor( self._level ): return state, context, None message = self._str_fn(state, context) logger.log(self._level, message) return state, context, None