pounce_cli/minima/
archive.rs1use pounce_common::types::Number;
10
11pub fn scaled_distance(a: &[Number], b: &[Number], l: &[Number]) -> Number {
13 let mut acc = 0.0;
14 for i in 0..a.len() {
15 let d = (a[i] - b[i]) / l[i];
16 acc += d * d;
17 }
18 acc.sqrt()
19}
20
21pub struct Archive {
23 dedup: Number,
24 l: Vec<Number>,
26 pub xs: Vec<Vec<Number>>,
27 pub fs: Vec<Number>,
28 pub ls: Vec<Vec<Number>>,
32}
33
34impl Archive {
35 pub fn new(dedup: Number, l: Vec<Number>) -> Self {
36 Self {
37 dedup,
38 l,
39 xs: Vec::new(),
40 fs: Vec::new(),
41 ls: Vec::new(),
42 }
43 }
44
45 pub fn len(&self) -> usize {
46 self.xs.len()
47 }
48
49 pub fn is_empty(&self) -> bool {
50 self.xs.is_empty()
51 }
52
53 pub fn is_known(&self, x: &[Number]) -> bool {
55 self.xs
56 .iter()
57 .any(|m| scaled_distance(x, m, &self.l) <= self.dedup)
58 }
59
60 pub fn near_any(&self, x: &[Number], radius: Number) -> bool {
62 self.xs
63 .iter()
64 .any(|m| scaled_distance(x, m, &self.l) <= radius)
65 }
66
67 pub fn add(&mut self, x: Vec<Number>, lambda: Vec<Number>, f: Number) {
68 self.xs.push(x);
69 self.ls.push(lambda);
70 self.fs.push(f);
71 }
72
73 pub fn order_by_objective(&self) -> Vec<usize> {
75 let mut idx: Vec<usize> = (0..self.fs.len()).collect();
76 idx.sort_by(|&a, &b| {
77 self.fs[a]
78 .partial_cmp(&self.fs[b])
79 .unwrap_or(std::cmp::Ordering::Equal)
80 });
81 idx
82 }
83}