Source code for diffBloch.app.loggers.comet

"""Comet ML logger backend -- confined home for the ``comet_ml`` integration.

Unlike Weights & Biases (a module-level ``wandb.log`` after ``wandb.init``), Comet ML logs to an
``Experiment`` **object**. So the app owns the run lifecycle -- it creates the
``comet_ml.Experiment`` (``uv sync --extra comet``) and passes it in -- and this logger only
forwards each event's measurements to that experiment as ``{channel}/{metric}`` metric series. The
logger itself imports no vendor SDK (it duck-types ``experiment.log_metrics``), so importing
``diffBloch.app.loggers``
never requires ``comet_ml`` and the pure core never touches it.
"""

from __future__ import annotations

from dataclasses import dataclass

from diffBloch.app.loggers import namespaced_measurements
from diffBloch.observability import Event


[docs] @dataclass class CometLogger: """Log each event's measurements to a Comet ML experiment as ``{channel}/{metric}`` series. ``experiment`` is a ``comet_ml.Experiment`` created and owned by the app (``Experiment.end()`` at the end of the run); this logger only calls ``experiment.log_metrics`` per event. """ experiment: object
[docs] def report(self, event: Event) -> None: self.experiment.log_metrics( # type: ignore[attr-defined] namespaced_measurements(event), step=event.step )