aegis_sim.recording.popsizerecorder
1from .recorder import Recorder 2from aegis_sim.dataclasses.population import Population 3 4 5class PopsizeRecorder(Recorder): 6 def __init__(self, odir): 7 self.odir = odir 8 self._buffers = {} # filename -> list of lines 9 10 def write(self, popsize: int, filename: str): 11 if filename not in self._buffers: 12 self._buffers[filename] = [] 13 self._buffers[filename].append(str(popsize)) 14 # Flush every 100 entries to avoid unbounded memory growth 15 if len(self._buffers[filename]) >= 100: 16 self._flush(filename) 17 18 def _flush(self, filename): 19 if filename in self._buffers and self._buffers[filename]: 20 path = self.odir / filename 21 with open(path, "a") as file_: 22 file_.write("\n".join(self._buffers[filename]) + "\n") 23 self._buffers[filename] = [] 24 25 def flush_all(self): 26 """Flush all buffered data to disk.""" 27 for filename in list(self._buffers.keys()): 28 self._flush(filename) 29 30 def write_before_reproduction(self, population): 31 """ 32 # OUTPUT SPECIFICATION 33 path: /popsize_before_reproduction.csv 34 filetype: csv 35 description: Number of live individuals before reproduction. 36 category: demography 37 time granularity: every step 38 frequency parameter: N/A 39 structure: A vector of integers. 40 header: None 41 """ 42 self.write(len(population), "popsize_before_reproduction.csv") 43 44 def write_after_reproduction(self, population): 45 """ 46 # OUTPUT SPECIFICATION 47 path: /popsize_after_reproduction.csv 48 filetype: csv 49 description: Number of live individuals after reproduction. 50 category: demography 51 time granularity: every step 52 frequency parameter: N/A 53 structure: A vector of integers. 54 header: None 55 """ 56 self.write(len(population), "popsize_after_reproduction.csv") 57 58 def write_egg_num_after_reproduction(self, eggs): 59 """ 60 # OUTPUT SPECIFICATION 61 path: /eggnum_after_reproduction.csv 62 filetype: csv 63 description: Number of eggs which have not yet hatched. 64 category: demography 65 time granularity: every step 66 frequency parameter: N/A 67 structure: A vector of integers. 68 header: None 69 """ 70 eggnum = len(eggs) if eggs is not None else 0 71 self.write(eggnum, "eggnum_after_reproduction.csv")
6class PopsizeRecorder(Recorder): 7 def __init__(self, odir): 8 self.odir = odir 9 self._buffers = {} # filename -> list of lines 10 11 def write(self, popsize: int, filename: str): 12 if filename not in self._buffers: 13 self._buffers[filename] = [] 14 self._buffers[filename].append(str(popsize)) 15 # Flush every 100 entries to avoid unbounded memory growth 16 if len(self._buffers[filename]) >= 100: 17 self._flush(filename) 18 19 def _flush(self, filename): 20 if filename in self._buffers and self._buffers[filename]: 21 path = self.odir / filename 22 with open(path, "a") as file_: 23 file_.write("\n".join(self._buffers[filename]) + "\n") 24 self._buffers[filename] = [] 25 26 def flush_all(self): 27 """Flush all buffered data to disk.""" 28 for filename in list(self._buffers.keys()): 29 self._flush(filename) 30 31 def write_before_reproduction(self, population): 32 """ 33 # OUTPUT SPECIFICATION 34 path: /popsize_before_reproduction.csv 35 filetype: csv 36 description: Number of live individuals before reproduction. 37 category: demography 38 time granularity: every step 39 frequency parameter: N/A 40 structure: A vector of integers. 41 header: None 42 """ 43 self.write(len(population), "popsize_before_reproduction.csv") 44 45 def write_after_reproduction(self, population): 46 """ 47 # OUTPUT SPECIFICATION 48 path: /popsize_after_reproduction.csv 49 filetype: csv 50 description: Number of live individuals after reproduction. 51 category: demography 52 time granularity: every step 53 frequency parameter: N/A 54 structure: A vector of integers. 55 header: None 56 """ 57 self.write(len(population), "popsize_after_reproduction.csv") 58 59 def write_egg_num_after_reproduction(self, eggs): 60 """ 61 # OUTPUT SPECIFICATION 62 path: /eggnum_after_reproduction.csv 63 filetype: csv 64 description: Number of eggs which have not yet hatched. 65 category: demography 66 time granularity: every step 67 frequency parameter: N/A 68 structure: A vector of integers. 69 header: None 70 """ 71 eggnum = len(eggs) if eggs is not None else 0 72 self.write(eggnum, "eggnum_after_reproduction.csv")
def
flush_all(self):
26 def flush_all(self): 27 """Flush all buffered data to disk.""" 28 for filename in list(self._buffers.keys()): 29 self._flush(filename)
Flush all buffered data to disk.
def
write_before_reproduction(self, population):
31 def write_before_reproduction(self, population): 32 """ 33 # OUTPUT SPECIFICATION 34 path: /popsize_before_reproduction.csv 35 filetype: csv 36 description: Number of live individuals before reproduction. 37 category: demography 38 time granularity: every step 39 frequency parameter: N/A 40 structure: A vector of integers. 41 header: None 42 """ 43 self.write(len(population), "popsize_before_reproduction.csv")
OUTPUT SPECIFICATION
path: /popsize_before_reproduction.csv filetype: csv description: Number of live individuals before reproduction. category: demography time granularity: every step frequency parameter: N/A structure: A vector of integers. header: None
def
write_after_reproduction(self, population):
45 def write_after_reproduction(self, population): 46 """ 47 # OUTPUT SPECIFICATION 48 path: /popsize_after_reproduction.csv 49 filetype: csv 50 description: Number of live individuals after reproduction. 51 category: demography 52 time granularity: every step 53 frequency parameter: N/A 54 structure: A vector of integers. 55 header: None 56 """ 57 self.write(len(population), "popsize_after_reproduction.csv")
OUTPUT SPECIFICATION
path: /popsize_after_reproduction.csv filetype: csv description: Number of live individuals after reproduction. category: demography time granularity: every step frequency parameter: N/A structure: A vector of integers. header: None
def
write_egg_num_after_reproduction(self, eggs):
59 def write_egg_num_after_reproduction(self, eggs): 60 """ 61 # OUTPUT SPECIFICATION 62 path: /eggnum_after_reproduction.csv 63 filetype: csv 64 description: Number of eggs which have not yet hatched. 65 category: demography 66 time granularity: every step 67 frequency parameter: N/A 68 structure: A vector of integers. 69 header: None 70 """ 71 eggnum = len(eggs) if eggs is not None else 0 72 self.write(eggnum, "eggnum_after_reproduction.csv")
OUTPUT SPECIFICATION
path: /eggnum_after_reproduction.csv filetype: csv description: Number of eggs which have not yet hatched. category: demography time granularity: every step frequency parameter: N/A structure: A vector of integers. header: None