As per the paper and the design principle, ExperimentalData, Engines, Params and Monitor must be immutable. However, python doesn't allow this by default. I recommend some refactoring to the base classes to use the python dataclasses library by specifying a decorator @dataclass(frozen=True). This would enforce immutability and also avoid potential bugs and might simplify fixing them in the long-run.