Skip to content

Commit c301cee

Browse files
authored
Pls bench (rust-ml#263)
* Create ols_bench.rs * add bench * criterion benchmark * use make_dataset function * make return Dim compatiable with Fit methods * dev-depenences: add generate to linfa-datasets * omit dataset creation from bench timing * pub use pls_generics * added CCA and Canonical benches * reduce future count
1 parent 54ed16f commit c301cee

File tree

4 files changed

+123
-29
lines changed

4 files changed

+123
-29
lines changed

algorithms/linfa-linear/benches/ols_bench.rs

+26-29
Original file line numberDiff line numberDiff line change
@@ -20,42 +20,39 @@ fn perform_glm(dataset: &Dataset<f64, f64, Ix1>) {
2020

2121
fn bench(c: &mut Criterion) {
2222
let mut group = c.benchmark_group("Linfa_linear");
23-
let sizes: [usize; 3] = [1_000, 10_000, 100_000];
24-
let num_feats: [usize; 2] = [5, 10];
23+
let params: [(usize, usize); 4] = [(1_000, 5), (10_000, 5), (100_000, 5), (100_000, 10)];
2524

2625
let feat_distr = Laplace::new(0.5, 5.).unwrap();
2726
let target_distr = DiscreteUniform::new(0, 5).unwrap();
2827

2928
let ols_id = "OLS-".to_string();
3029
let glm_id = "GLM-".to_string();
3130

32-
for size in sizes {
33-
for num_feat in num_feats {
34-
let suffix = format!("{}Feats", num_feat);
35-
let mut func_name = ols_id.clone();
36-
func_name.push_str(&suffix);
37-
38-
let dataset = make_dataset(size, num_feat, 1, feat_distr, target_distr);
39-
let dataset = dataset.into_single_target();
40-
41-
group.bench_with_input(
42-
BenchmarkId::new(&func_name, size),
43-
&dataset,
44-
|b, dataset| {
45-
b.iter(|| perform_ols(&dataset));
46-
},
47-
);
48-
49-
let mut func_name = glm_id.clone();
50-
func_name.push_str(&suffix);
51-
group.bench_with_input(
52-
BenchmarkId::new(&func_name, size),
53-
&dataset,
54-
|b, dataset| {
55-
b.iter(|| perform_glm(&dataset));
56-
},
57-
);
58-
}
31+
for (size, num_feat) in params {
32+
let suffix = format!("{}Feats", num_feat);
33+
let mut func_name = ols_id.clone();
34+
func_name.push_str(&suffix);
35+
36+
let dataset = make_dataset(size, num_feat, 1, feat_distr, target_distr);
37+
let dataset = dataset.into_single_target();
38+
39+
group.bench_with_input(
40+
BenchmarkId::new(&func_name, size),
41+
&dataset,
42+
|b, dataset| {
43+
b.iter(|| perform_ols(&dataset));
44+
},
45+
);
46+
47+
let mut func_name = glm_id.clone();
48+
func_name.push_str(&suffix);
49+
group.bench_with_input(
50+
BenchmarkId::new(&func_name, size),
51+
&dataset,
52+
|b, dataset| {
53+
b.iter(|| perform_glm(&dataset));
54+
},
55+
);
5956
}
6057
group.finish();
6158
}

algorithms/linfa-pls/Cargo.toml

+6
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,9 @@ linfa = { version = "0.6.0", path = "../.." }
3939
linfa-datasets = { version = "0.6.0", path = "../../datasets", features = ["linnerud"] }
4040
approx = "0.4"
4141
rand_xoshiro = "0.6"
42+
criterion = "0.4.0"
43+
statrs = "0.16.0"
44+
45+
[[bench]]
46+
name = "pls"
47+
harness = false

algorithms/linfa-pls/benches/pls.rs

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
2+
use linfa::traits::Fit;
3+
use linfa::Dataset;
4+
use linfa_datasets::generate::make_dataset;
5+
use linfa_pls::Algorithm;
6+
use linfa_pls::{PlsCanonical, PlsCca, PlsRegression};
7+
use statrs::distribution::{DiscreteUniform, Laplace};
8+
9+
#[allow(unused_must_use)]
10+
fn pls_regression(dataset: &Dataset<f64, f64>, alg: Algorithm) {
11+
let model = PlsRegression::params(3)
12+
.scale(true)
13+
.max_iterations(200)
14+
.algorithm(alg);
15+
model.fit(&dataset);
16+
}
17+
18+
#[allow(unused_must_use)]
19+
fn pls_canonical(dataset: &Dataset<f64, f64>, alg: Algorithm) {
20+
let model = PlsCanonical::params(3)
21+
.scale(true)
22+
.max_iterations(200)
23+
.algorithm(alg);
24+
model.fit(&dataset);
25+
}
26+
#[allow(unused_must_use)]
27+
fn pls_cca(dataset: &Dataset<f64, f64>, alg: Algorithm) {
28+
let model = PlsCca::params(3)
29+
.scale(true)
30+
.max_iterations(200)
31+
.algorithm(alg);
32+
model.fit(&dataset);
33+
}
34+
35+
fn bench(c: &mut Criterion) {
36+
let mut group = c.benchmark_group("Linfa_pls");
37+
let params: [(usize, usize); 4] = [(1_000, 5), (10_000, 5), (100_000, 5), (100_000, 10)];
38+
39+
for (alg, name) in [(Algorithm::Nipals, "Nipals-"), (Algorithm::Svd, "Svd-")] {
40+
let feat_distr = Laplace::new(0.5, 5.).unwrap();
41+
let target_distr = DiscreteUniform::new(0, 5).unwrap();
42+
43+
let mut pls_regression_id = "Regression-".to_string();
44+
pls_regression_id.push_str(name);
45+
let mut pls_canonical_id = "Canonical-".to_string();
46+
pls_canonical_id.push_str(name);
47+
let mut pls_cca_id = "Cca-".to_string();
48+
pls_cca_id.push_str(name);
49+
50+
for (size, num_feat) in params {
51+
let suffix = format!("{}Feats", num_feat);
52+
let mut func_name = pls_regression_id.clone();
53+
func_name.push_str(&suffix);
54+
let dataset = make_dataset(size, num_feat, 1, feat_distr, target_distr);
55+
let input = (dataset, alg);
56+
57+
group.bench_with_input(
58+
BenchmarkId::new(&func_name, size),
59+
&input,
60+
|b, (dataset, alg)| {
61+
b.iter(|| pls_regression(dataset, *alg));
62+
},
63+
);
64+
65+
let mut func_name = pls_canonical_id.clone();
66+
func_name.push_str(&suffix);
67+
group.bench_with_input(
68+
BenchmarkId::new(&func_name, size),
69+
&input,
70+
|b, (dataset, alg)| {
71+
b.iter(|| pls_canonical(dataset, *alg));
72+
},
73+
);
74+
75+
let mut func_name = pls_cca_id.clone();
76+
func_name.push_str(&suffix);
77+
group.bench_with_input(
78+
BenchmarkId::new(&func_name, size),
79+
&input,
80+
|b, (dataset, alg)| {
81+
b.iter(|| pls_cca(dataset, *alg));
82+
},
83+
);
84+
}
85+
}
86+
group.finish();
87+
}
88+
89+
criterion_group!(benches, bench);
90+
criterion_main!(benches);

algorithms/linfa-pls/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
mod errors;
4141
mod hyperparams;
4242
mod pls_generic;
43+
pub use pls_generic::*;
4344
mod pls_svd;
4445
mod utils;
4546

0 commit comments

Comments
 (0)