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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use std::fs;
use crate::{
base::{
LoadFromJson,
SaveToJson
},
bitransform::{
BitransformDesc,
BitransformRegister
},
boolnet::Boolnet,
evolearn::Parameters
};
use super::{
Counters,
Evolver,
Settings
};
const BITRAN_FILENAME: &str = "bitran.json";
const POP_DIR: &str = "population";
const BOOLNET_FILE_EXT: &str = "bnt";
const PARAMS_FILENAME: &str = "parameters.json";
const COUNTERS_FILENAME: &str = "counters.json";
const SETTINGS_FILENAME: &str = "settings.json";
impl Evolver {
pub fn save(&self, dirpath: &str) -> Result<(), String> {
if dirpath.starts_with("/") {
return Err(String::from("Save path cannot start with \"/\" due to safety reasons"));
}
let pop_dirpath = format!("{}/{}", dirpath, POP_DIR);
fs::create_dir_all(&pop_dirpath).map_err(|e| e.to_string())?;
fs::remove_dir_all(&pop_dirpath).map_err(|e| e.to_string())?;
fs::create_dir_all(&pop_dirpath).map_err(|e| e.to_string())?;
self.bitran.desc().save_to_json(& format!("{}/{}", dirpath, BITRAN_FILENAME))?;
for i in 0..self.population.len() {
let filepath = format!("{}/{}.{}", pop_dirpath, i, BOOLNET_FILE_EXT);
self.population[i].save(&filepath)?;
}
self.parameters.save_to_json(& format!("{}/{}", dirpath, PARAMS_FILENAME))?;
self.counters.save_to_json(& format!("{}/{}", dirpath, COUNTERS_FILENAME))?;
self.settings.save_to_json(& format!("{}/{}", dirpath, SETTINGS_FILENAME))?;
Ok(())
}
pub fn load(register: &BitransformRegister, dirpath: &str) -> Result<Self, String> {
let bitran_desc = BitransformDesc::load_from_json(& format!("{}/{}", dirpath, BITRAN_FILENAME))?;
let bitran = register.new_from_desc(&bitran_desc)?;
let mut population = Vec::<Boolnet>::new();
let pop_dirpath = format!("{}/{}", dirpath, POP_DIR);
for i in 0.. {
let filepath = format!("{}/{}.{}", pop_dirpath, i, BOOLNET_FILE_EXT);
match Boolnet::load(&filepath) {
Ok(bn) => population.push(bn),
Err(..) => break
};
}
if population.len() == 0 {
return Err(String::from("No boolnets were found, cannot load empty population"));
}
let parameters = Parameters::load_from_json(& format!("{}/{}", dirpath, PARAMS_FILENAME))?;
let counters = Counters::load_from_json(& format!("{}/{}", dirpath, COUNTERS_FILENAME))?;
let settings = Settings::load_from_json(& format!("{}/{}", dirpath, SETTINGS_FILENAME))?;
Ok(Self{bitran, population, parameters, counters, settings})
}
}