optimize derivative logic

This commit is contained in:
Simon Gardling 2022-05-22 19:23:48 -04:00
parent 57401566c0
commit 3967c8c98c

View File

@ -294,7 +294,6 @@ impl FunctionEntry {
} }
let mut partial_regen = false; let mut partial_regen = false;
let derivative_required = settings.do_extrema | self.derivative;
if width_changed { if width_changed {
self.invalidate_back(); self.invalidate_back();
@ -311,7 +310,7 @@ impl FunctionEntry {
unzip_n!(3); unzip_n!(3);
let (back_data, derivative_data_1, new_nth_derivative_data): ( let (back_data, derivative_data_1, new_nth_derivative_data): (
Vec<Value>, Vec<Value>,
Vec<Option<Value>>, Vec<Value>,
Vec<Option<Value>>, Vec<Option<Value>>,
) = resolution_iter ) = resolution_iter
.clone() .clone()
@ -320,7 +319,7 @@ impl FunctionEntry {
if let Some(i) = x_data.get_index(x) { if let Some(i) = x_data.get_index(x) {
( (
self.back_data[i], self.back_data[i],
derivative_required.then(|| self.derivative_data[i]), self.derivative_data[i],
do_nth_derivative.then(|| unsafe { do_nth_derivative.then(|| unsafe {
nth_derivative_data.map(|data| data[i]).unwrap_unchecked() nth_derivative_data.map(|data| data[i]).unwrap_unchecked()
}), }),
@ -328,15 +327,14 @@ impl FunctionEntry {
} else { } else {
( (
Value::new(x, self.function.get(x)), Value::new(x, self.function.get(x)),
derivative_required Value::new(x, self.function.get_derivative_1(x)),
.then(|| Value::new(x, self.function.get_derivative_1(x))),
do_nth_derivative.then(|| { do_nth_derivative.then(|| {
Value::new(x, self.function.get_nth_derivative(self.curr_nth, x)) Value::new(x, self.function.get_nth_derivative(self.curr_nth, x))
}), }),
) )
} }
}) })
.collect::<Vec<(Value, Option<Value>, Option<Value>)>>() .collect::<Vec<(Value, Value, Option<Value>)>>()
.into_iter() .into_iter()
.unzip_n_vec(); .unzip_n_vec();
@ -345,20 +343,7 @@ impl FunctionEntry {
self.back_data = back_data; self.back_data = back_data;
if derivative_required { self.derivative_data = derivative_data_1;
/*
debug_assert!(derivative_data_1.iter().any(|x| x.is_none()));
self.derivative_data = unsafe {
std::mem::transmute::<Vec<Option<Value>>, Vec<Value>>(derivative_data_1)
};
*/
self.derivative_data = derivative_data_1
.into_iter()
.map(|ele| unsafe { ele.unwrap_unchecked() })
.collect::<Vec<Value>>();
} else {
self.invalidate_derivative();
}
if do_nth_derivative { if do_nth_derivative {
/* /*
@ -393,7 +378,7 @@ impl FunctionEntry {
self.back_data = data; self.back_data = data;
} }
if derivative_required && self.derivative_data.is_empty() { if self.derivative_data.is_empty() {
let data: Vec<Value> = resolution_iter let data: Vec<Value> = resolution_iter
.clone() .clone()
.into_iter() .into_iter()
@ -775,7 +760,7 @@ impl FunctionEntry {
assert!(self.integral_data.is_none()); assert!(self.integral_data.is_none());
assert!(self.root_data.is_empty()); assert!(self.root_data.is_empty());
assert!(self.extrema_data.is_empty()); assert!(self.extrema_data.is_empty());
assert!(self.derivative_data.is_empty()); assert!(!self.derivative_data.is_empty());
} }
} }
} }