"""Concrete predefined callbacks"""
import abc
from enum import Enum
from typing import Dict, List
[docs]class Signal(Enum):
REGISTER = "signal_register"
SOLVE_START = "signal_solve_start"
TRAIN_PIPE_START = "signal_train_pipe_start"
BEFORE_COMPUTE_LOSS = "before_compute_loss"
AFTER_COMPUTE_LOSS = "compute_loss"
BEFORE_BACKWARD = "signal_before_backward"
TRAIN_PIPE_END = "signal_train_pipe_end"
SOLVE_END = "signal_solve_end"
[docs]class Receiver(metaclass=abc.ABCMeta):
[docs] @abc.abstractmethod
def receive_notify(self, obj: object, message: Dict):
raise NotImplementedError("Method receive_notify() not implemented!")
[docs]class Notifier:
@property
def receivers(self):
return self._receivers
@receivers.setter
def receivers(self, receivers: List[Receiver]):
self._receivers = receivers
[docs] def notify(self, obj: object, message: Dict):
for receiver in self.receivers[::-1]:
receiver.receive_notify(obj, message)
[docs] def register_receiver(self, receiver: Receiver):
self.receivers.append(receiver)
self.notify(self, message={Signal.REGISTER: receiver})