-
Notifications
You must be signed in to change notification settings - Fork 6
/
serializer.py
59 lines (44 loc) · 1.67 KB
/
serializer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import pickle
from contextlib import suppress
from pathlib import Path
from typing import Any
from simulation.model import SimulationCase
class Result:
def __init__(self, population, population_fitnesses, **additional_data):
self.population = population
self.fitnesses = population_fitnesses
self.additional_data = additional_data
class ResultWithMetadata(Result):
def __init__(
self, result: Result, path: Path, run_no: int, simulation_case: SimulationCase
):
super().__init__(result.population, result.fitnesses, **result.additional_data)
self.path = path
self.name = path.with_suffix("").name
self.run_no = run_no
self.simulation_case = simulation_case
def load_file(path: Path):
with path.open(mode="rb") as fh:
return pickle.load(fh)
def save_file(path: Path, obj: Any):
with path.open(mode="wb") as fh:
pickle.dump(obj, fh)
class Serializer:
def __init__(self, simulation_case: SimulationCase):
self.path = Path(
simulation_case.results_dir,
simulation_case.problem_name,
simulation_case.algorithm_name,
simulation_case.id,
)
def store(self, result: Result, file_name: str) -> Path:
with suppress(FileExistsError):
self.path.mkdir(parents=True)
store_path = self.get_result_path(file_name)
save_file(store_path, result)
return store_path
def get_result_path(self, file_name) -> Path:
return self.path / f"{file_name}.pickle"
def load(self, file_name) -> Result:
load_path = self.get_result_path(file_name)
return load_file(load_path)