25 /// Structure for storing iteration statistics |
25 /// Structure for storing iteration statistics |
26 #[derive(Debug, Clone, Serialize)] |
26 #[derive(Debug, Clone, Serialize)] |
27 pub struct IterInfo<F : Float, const N : usize> { |
27 pub struct IterInfo<F : Float, const N : usize> { |
28 /// Function value |
28 /// Function value |
29 pub value : F, |
29 pub value : F, |
30 /// Number of speaks |
30 /// Number of spikes |
31 pub n_spikes : usize, |
31 pub n_spikes : usize, |
32 /// Number of iterations this statistic covers |
32 /// Number of iterations this statistic covers |
33 pub this_iters : usize, |
33 pub this_iters : usize, |
34 /// Number of spikes removed by merging since last IterInfo statistic |
34 /// Number of spikes removed by merging since last IterInfo statistic |
35 pub merged : usize, |
35 pub merged : usize, |
36 /// Number of spikes removed by pruning since last IterInfo statistic |
36 /// Number of spikes removed by pruning since last IterInfo statistic |
37 pub pruned : usize, |
37 pub pruned : usize, |
38 /// Number of inner iterations since last IterInfo statistic |
38 /// Number of inner iterations since last IterInfo statistic |
39 pub inner_iters : usize, |
39 pub inner_iters : usize, |
|
40 /// Tuple of (transported mass, source mass) |
|
41 pub untransported_fraction : Option<(F, F)>, |
|
42 /// Tuple of (|destination mass - untransported_mass|, transported mass) |
|
43 pub transport_error : Option<(F, F)>, |
40 /// Current tolerance |
44 /// Current tolerance |
41 pub ε : F, |
45 pub ε : F, |
42 /// Solve fin.dim problem for this measure to get the optimal `value`. |
46 /// Solve fin.dim problem for this measure to get the optimal `value`. |
43 pub postprocessing : Option<DiscreteMeasure<Loc<F, N>, F>>, |
47 pub postprocessing : Option<DiscreteMeasure<Loc<F, N>, F>>, |
44 } |
48 } |
53 merged : 0, |
57 merged : 0, |
54 pruned : 0, |
58 pruned : 0, |
55 inner_iters : 0, |
59 inner_iters : 0, |
56 ε : F::NAN, |
60 ε : F::NAN, |
57 postprocessing : None, |
61 postprocessing : None, |
|
62 untransported_fraction : None, |
|
63 transport_error : None, |
58 } |
64 } |
59 } |
65 } |
60 } |
66 } |
61 |
67 |
|
68 #[replace_float_literals(F::cast_from(literal))] |
62 impl<F, const N : usize> LogRepr for IterInfo<F, N> where F : LogRepr + Float { |
69 impl<F, const N : usize> LogRepr for IterInfo<F, N> where F : LogRepr + Float { |
63 fn logrepr(&self) -> ColoredString { |
70 fn logrepr(&self) -> ColoredString { |
64 format!("{}\t| N = {}, ε = {:.8}, inner_iters_mean = {}, merged+pruned_mean = {}+{}", |
71 format!("{}\t| N = {}, ε = {:.8}, inner_iters_mean = {}, merged+pruned_mean = {}+{}{}{}", |
65 self.value.logrepr(), |
72 self.value.logrepr(), |
66 self.n_spikes, |
73 self.n_spikes, |
67 self.ε, |
74 self.ε, |
68 self.inner_iters as float / self.this_iters as float, |
75 self.inner_iters as float / self.this_iters as float, |
69 self.merged as float / self.this_iters as float, |
76 self.merged as float / self.this_iters as float, |
70 self.pruned as float / self.this_iters as float, |
77 self.pruned as float / self.this_iters as float, |
|
78 match self.untransported_fraction { |
|
79 None => format!(""), |
|
80 Some((a, b)) => if b > 0.0 { |
|
81 format!(", untransported {:.2}%", 100.0*a/b) |
|
82 } else { |
|
83 format!("") |
|
84 } |
|
85 }, |
|
86 match self.transport_error { |
|
87 None => format!(""), |
|
88 Some((a, b)) => if b > 0.0 { |
|
89 format!(", transport error {:.2}%", 100.0*a/b) |
|
90 } else { |
|
91 format!("") |
|
92 } |
|
93 } |
71 ).as_str().into() |
94 ).as_str().into() |
72 } |
95 } |
73 } |
96 } |
74 |
97 |
75 /// Branch and bound refinement settings |
98 /// Branch and bound refinement settings |