1use std::fmt;
8
9pub mod permutation;
11pub mod inversion;
12pub mod rim;
13pub mod problems;
14
15pub mod errors;
17use errors::Error;
18
19use std::fmt::Debug;
20
21pub trait Population<T> : Debug {
23
24 fn learn(&self) -> Distribution;
28
29 fn sample(&mut self, distr: &mut Distribution) -> Result<(), Error>;
31
32 fn to_permus(&self, permus: &mut permutation::PermuPopulation<T>) -> Result<(), Error>;
35
36 fn from_permus(&mut self, permus: &permutation::PermuPopulation<T>) -> Result<(), Error>;
38}
39
40#[derive(Debug)]
42#[derive(PartialEq)]
43pub enum Distribution {
44 PermuDistribution(Vec<Vec<usize>>, bool),
46 InversionDistribution(Vec<Vec<usize>>, bool),
48 RimDistribution(Vec<Vec<usize>>, bool),
50}
51
52impl fmt::Display for Distribution {
53 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
54
55 let (distr, soften, distr_type) = match self {
56 Distribution::PermuDistribution(v, s) => (v, s, "PermuDistribution"),
57 Distribution::InversionDistribution(v, s) => (v, s, "InversionDistribution"),
58 Distribution::RimDistribution(v, s) => (v, s, "RimDistribution"),
59 };
60
61 if distr.len() == 0 {
63 return write!(f, "[]\n");
64 }
65
66 let mut formatted = String::from("[");
67 distr.iter()
68 .take(distr.len() -1) .for_each(|row| {
70 formatted.push_str(format!("{:?},\n", row).as_str());
71 });
72
73 formatted.push_str(format!("{:?}]",
75 distr[distr.len()-1]).as_str());
76 write!(f, "{}\n{}, soften: {}\n", formatted, distr_type, soften)
77 }
78}