From 8205e4acbcaf7462044a4b50d89b7de4879834dd Mon Sep 17 00:00:00 2001 From: RunasSudo Date: Sun, 22 Oct 2023 18:56:27 +1100 Subject: [PATCH] turnbull: Improve performance of compute_pi Faster to repeatedly index Vec than DVector, so work directly with Vec 80% speedup! --- src/turnbull.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/turnbull.rs b/src/turnbull.rs index 7713aaf..ffc2c0c 100644 --- a/src/turnbull.rs +++ b/src/turnbull.rs @@ -328,13 +328,17 @@ fn get_sum_fail_prob(data: &TurnbullData, s: &DVector) -> DVector { } fn compute_pi(data: &TurnbullData, s: &DVector, sum_fail_prob: DVector) -> DVector { - let mut pi: DVector = DVector::zeros(data.num_intervals()); - for (i, (idx_left, idx_right)) in data.data_time_interval_indexes.iter().enumerate() { + // Faster to repeatedly index Vec than DVector, so first work on Vec then convert to DVector at the end + let mut pi: Vec = vec![0.0; data.num_intervals()]; + let s_vec = s.data.as_vec(); + + for ((idx_left, idx_right), sum_fail_prob_i) in data.data_time_interval_indexes.iter().zip(sum_fail_prob.iter()) { for j in *idx_left..(*idx_right + 1) { - pi[j] += s[j] / sum_fail_prob[i] / data.num_obs() as f64; + pi[j] += s_vec[j] / sum_fail_prob_i / data.num_obs() as f64; } } - return pi; + + return DVector::from_vec(pi); } fn compute_hessian(data: &TurnbullData, s: &DVector) -> DMatrix {