rsl_interpolation/
accel.rs1#[doc(alias = "gsl_interp_accel")]
24pub struct Accelerator {
25 pub(crate) cache: usize,
27 pub(crate) hits: usize,
29 pub(crate) misses: usize,
31}
32
33impl Accelerator {
34 pub fn new() -> Self {
36 Accelerator {
37 cache: 0,
38 hits: 0,
39 misses: 0,
40 }
41 }
42
43 #[doc(alias = "gsl_interp_bsearch")]
46 pub(crate) fn bsearch<T>(&self, xarray: &[T], x: T, ilo: usize, ihi: usize) -> usize
47 where
48 T: num::Float,
49 {
50 let mut ilo = ilo;
51 let mut ihi = ihi;
52 while ihi > ilo + 1 {
53 let i = (ihi + ilo) / 2;
54 if xarray[i] > x {
55 ihi = i;
56 } else {
57 ilo = i;
58 }
59 }
60 ilo
61 }
62
63 #[doc(alias = "gsl_interp_accel_find")]
66 pub(crate) fn find<T>(&mut self, xarray: &[T], x: T) -> usize
67 where
68 T: num::Float,
69 {
70 if x < xarray[self.cache] {
71 self.misses += 1;
72 self.cache = self.bsearch(xarray, x, 0, self.cache);
73 } else if x >= xarray[self.cache + 1] {
74 self.misses += 1;
75 self.cache = self.bsearch(xarray, x, self.cache, xarray.len() - 1);
76 } else {
77 self.hits += 1;
78 }
79 self.cache
80 }
81
82 #[doc(alias = "gsl_interp_accel_reset")]
84 pub fn reset(&mut self) {
85 self.cache = 0;
86 self.hits = 0;
87 self.misses = 0;
88 }
89}
90
91impl std::fmt::Debug for Accelerator {
92 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
93 f.debug_struct("Accelerator")
94 .field("cache", &self.cache)
95 .field("hits ", &self.hits)
96 .field("misses", &self.misses)
97 .finish()
98 }
99}
100
101impl Default for Accelerator {
102 fn default() -> Self {
103 Self::new()
104 }
105}
106
107#[cfg(test)]
108mod test {
109 use super::*;
110
111 #[test]
112 fn test_instantiation() {
113 let _ = Accelerator::new();
114 }
115
116 #[test]
117 fn test_reset() {
118 let mut acc = Accelerator::new();
119 acc.cache = 1;
120 acc.hits = 1;
121 acc.misses = 1;
122 acc.reset();
123
124 assert_eq!(acc.cache, 0);
125 assert_eq!(acc.hits, 0);
126 assert_eq!(acc.misses, 0);
127 }
128}