Skip to content

Commit

Permalink
perf(rust): argpcp: reduce re-allocations of intermediate matrices (#9)
Browse files Browse the repository at this point in the history
* Add benchmark for Argpcp
* Use .resize_mut() rather than view().into() to avoid reallocating internal matrices
  • Loading branch information
sd2k authored May 31, 2024
1 parent 65f517a commit e95c7a2
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 4 deletions.
8 changes: 8 additions & 0 deletions changepoint/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,11 @@ harness = false
[[bench]]
name = "bocpd_truncated"
harness = false

[[bench]]
name = "argpcpd"
harness = false

[profile.profiling]
inherits = "release"
debug = 2
43 changes: 43 additions & 0 deletions changepoint/benches/argpcpd.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
use changepoint::*;
use criterion::*;
use rv::process::gaussian::kernel::{ConstantKernel, RBFKernel, WhiteKernel};

fn bench_argpcpd(c: &mut Criterion) {
let raw_data: &str = include_str!("../../resources/TB3MS.csv");
let data: Vec<f64> = raw_data
.lines()
.skip(1)
.map(|line| line.split_at(11).1.parse().unwrap())
.collect();

let mut group = c.benchmark_group("Argpcp");

for nelems in (0..500).step_by(100) {
let subdata: Vec<f64> = data.iter().take(nelems).copied().collect();

group.throughput(Throughput::Elements(nelems as u64));
group.bench_with_input(
BenchmarkId::from_parameter(nelems),
&subdata,
|b, data| {
b.iter(|| {
let constant_kernel = ConstantKernel::new(0.5).unwrap();
let rbf_kernel = RBFKernel::new(10.0).unwrap();
let white_kernel = WhiteKernel::new(0.01).unwrap();
let kernel = constant_kernel * rbf_kernel + white_kernel;
// Create the Argpcp processor
let mut cpd =
Argpcp::new(kernel, 3, 2.0, 1.0, -5.0, 1.0, 1.0);

// Feed data into change point detector
let _res: Vec<Vec<f64>> =
data.iter().map(|d| cpd.step(d).to_vec()).collect();
});
},
);
}
group.finish();
}

criterion_group!(benches, bench_argpcpd);
criterion_main!(benches);
8 changes: 4 additions & 4 deletions changepoint/src/gp/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -385,11 +385,11 @@ where
self.mrc = self.run_length_pr.len();

// Adjust other variables
self.u = self.u.view((0, 0), (self.mrc - 1, self.mrc - 1)).into();
self.u.resize_mut(self.mrc - 1, self.mrc - 1, 0.0);
self.last_nlml = self.last_nlml.rows_range(0..(self.mrc - 1)).into();
self.alpha = self.alpha.view((0, 0), (self.mrc - 1, 1)).into();
self.alpha_t = self.alpha_t.view((0, 0), (self.mrc - 1, 1)).into();
self.beta_t = self.beta_t.view((0, 0), (self.mrc - 1, 1)).into();
self.alpha.resize_mut(self.mrc - 1, 1, 0.0);
self.alpha_t.resize_mut(self.mrc - 1, 1, 0.0);
self.beta_t.resize_mut(self.mrc - 1, 1, 0.0);

&self.run_length_pr
}
Expand Down

0 comments on commit e95c7a2

Please sign in to comment.