update function tests and improve caching logic
This commit is contained in:
parent
e9ba5b43b4
commit
686322c95e
@ -186,6 +186,8 @@ impl FunctionEntry {
|
|||||||
let mut partial_regen = false;
|
let mut partial_regen = false;
|
||||||
let min_max_changed = (min_x != &self.min_x) | (max_x != &self.max_x);
|
let min_max_changed = (min_x != &self.min_x) | (max_x != &self.max_x);
|
||||||
|
|
||||||
|
let derivative_required = settings.do_extrema | self.derivative;
|
||||||
|
|
||||||
self.min_x = *min_x;
|
self.min_x = *min_x;
|
||||||
self.max_x = *max_x;
|
self.max_x = *max_x;
|
||||||
if width_changed {
|
if width_changed {
|
||||||
@ -214,6 +216,7 @@ impl FunctionEntry {
|
|||||||
// assert_eq!(back_data.len(), settings.plot_width + 1);
|
// assert_eq!(back_data.len(), settings.plot_width + 1);
|
||||||
self.back_data = Some(back_data);
|
self.back_data = Some(back_data);
|
||||||
|
|
||||||
|
if derivative_required {
|
||||||
let derivative_cache = self.derivative_data.as_ref().unwrap();
|
let derivative_cache = self.derivative_data.as_ref().unwrap();
|
||||||
let new_derivative_data: Vec<Value> = dyn_iter(&resolution_iter)
|
let new_derivative_data: Vec<Value> = dyn_iter(&resolution_iter)
|
||||||
.map(|x| {
|
.map(|x| {
|
||||||
@ -228,6 +231,9 @@ impl FunctionEntry {
|
|||||||
// assert_eq!(new_derivative_data.len(), settings.plot_width + 1);
|
// assert_eq!(new_derivative_data.len(), settings.plot_width + 1);
|
||||||
|
|
||||||
self.derivative_data = Some(new_derivative_data);
|
self.derivative_data = Some(new_derivative_data);
|
||||||
|
} else {
|
||||||
|
self.derivative_data = None;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
self.invalidate_back();
|
self.invalidate_back();
|
||||||
self.invalidate_derivative();
|
self.invalidate_derivative();
|
||||||
@ -245,7 +251,7 @@ impl FunctionEntry {
|
|||||||
self.back_data = Some(data);
|
self.back_data = Some(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.derivative_data.is_none() {
|
if derivative_required && self.derivative_data.is_none() {
|
||||||
let data: Vec<Value> = dyn_iter(&resolution_iter)
|
let data: Vec<Value> = dyn_iter(&resolution_iter)
|
||||||
.map(|x| Value::new(*x, self.function.get_derivative_1(*x)))
|
.map(|x| Value::new(*x, self.function.get_derivative_1(*x)))
|
||||||
.collect();
|
.collect();
|
||||||
@ -344,6 +350,7 @@ impl FunctionEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Invalidate entire cache
|
||||||
pub fn invalidate_whole(&mut self) {
|
pub fn invalidate_whole(&mut self) {
|
||||||
self.back_data = None;
|
self.back_data = None;
|
||||||
self.integral_data = None;
|
self.integral_data = None;
|
||||||
@ -392,6 +399,26 @@ impl FunctionEntry {
|
|||||||
|
|
||||||
assert_eq!(self.integral_data.clone().unwrap().1, area_target);
|
assert_eq!(self.integral_data.clone().unwrap().1, area_target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
self.update("x^3", false, false);
|
||||||
|
assert!(!self.integral);
|
||||||
|
assert!(!self.derivative);
|
||||||
|
|
||||||
|
assert!(self.back_data.is_none());
|
||||||
|
assert!(self.integral_data.is_none());
|
||||||
|
assert!(self.roots_data.is_none());
|
||||||
|
assert!(self.extrema_data.is_none());
|
||||||
|
assert!(self.derivative_data.is_none());
|
||||||
|
|
||||||
|
self.calculate(&min_x, &max_x, true, &settings);
|
||||||
|
|
||||||
|
assert!(self.back_data.is_some());
|
||||||
|
assert!(self.integral_data.is_none());
|
||||||
|
assert!(self.roots_data.is_none());
|
||||||
|
assert!(self.extrema_data.is_none());
|
||||||
|
assert!(self.derivative_data.is_none());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user