1 use na::{Cholesky, DMatrix, DVector};
2 
cholesky_100x100(bh: &mut criterion::Criterion)3 fn cholesky_100x100(bh: &mut criterion::Criterion) {
4     let m = DMatrix::<f64>::new_random(100, 100);
5     let m = &m * m.transpose();
6 
7     bh.bench_function("cholesky_100x100", move |bh| {
8         bh.iter(|| std::hint::black_box(Cholesky::new(m.clone())))
9     });
10 }
11 
cholesky_500x500(bh: &mut criterion::Criterion)12 fn cholesky_500x500(bh: &mut criterion::Criterion) {
13     let m = DMatrix::<f64>::new_random(500, 500);
14     let m = &m * m.transpose();
15 
16     bh.bench_function("cholesky_500x500", move |bh| {
17         bh.iter(|| std::hint::black_box(Cholesky::new(m.clone())))
18     });
19 }
20 
21 // With unpack.
cholesky_decompose_unpack_100x100(bh: &mut criterion::Criterion)22 fn cholesky_decompose_unpack_100x100(bh: &mut criterion::Criterion) {
23     let m = DMatrix::<f64>::new_random(100, 100);
24     let m = &m * m.transpose();
25 
26     bh.bench_function("cholesky_decompose_unpack_100x100", move |bh| {
27         bh.iter(|| {
28             let chol = Cholesky::new(m.clone()).unwrap();
29             let _ = chol.unpack();
30         })
31     });
32 }
cholesky_decompose_unpack_500x500(bh: &mut criterion::Criterion)33 fn cholesky_decompose_unpack_500x500(bh: &mut criterion::Criterion) {
34     let m = DMatrix::<f64>::new_random(500, 500);
35     let m = &m * m.transpose();
36 
37     bh.bench_function("cholesky_decompose_unpack_500x500", move |bh| {
38         bh.iter(|| {
39             let chol = Cholesky::new(m.clone()).unwrap();
40             let _ = chol.unpack();
41         })
42     });
43 }
44 
cholesky_solve_10x10(bh: &mut criterion::Criterion)45 fn cholesky_solve_10x10(bh: &mut criterion::Criterion) {
46     let m = DMatrix::<f64>::new_random(10, 10);
47     let m = &m * m.transpose();
48     let v = DVector::<f64>::new_random(10);
49     let chol = Cholesky::new(m.clone()).unwrap();
50 
51     bh.bench_function("cholesky_solve_10x10", move |bh| {
52         bh.iter(|| {
53             let _ = chol.solve(&v);
54         })
55     });
56 }
57 
cholesky_solve_100x100(bh: &mut criterion::Criterion)58 fn cholesky_solve_100x100(bh: &mut criterion::Criterion) {
59     let m = DMatrix::<f64>::new_random(100, 100);
60     let m = &m * m.transpose();
61     let v = DVector::<f64>::new_random(100);
62     let chol = Cholesky::new(m.clone()).unwrap();
63 
64     bh.bench_function("cholesky_solve_100x100", move |bh| {
65         bh.iter(|| {
66             let _ = chol.solve(&v);
67         })
68     });
69 }
70 
cholesky_solve_500x500(bh: &mut criterion::Criterion)71 fn cholesky_solve_500x500(bh: &mut criterion::Criterion) {
72     let m = DMatrix::<f64>::new_random(500, 500);
73     let m = &m * m.transpose();
74     let v = DVector::<f64>::new_random(500);
75     let chol = Cholesky::new(m.clone()).unwrap();
76 
77     bh.bench_function("cholesky_solve_500x500", move |bh| {
78         bh.iter(|| {
79             let _ = chol.solve(&v);
80         })
81     });
82 }
83 
cholesky_inverse_10x10(bh: &mut criterion::Criterion)84 fn cholesky_inverse_10x10(bh: &mut criterion::Criterion) {
85     let m = DMatrix::<f64>::new_random(10, 10);
86     let m = &m * m.transpose();
87     let chol = Cholesky::new(m.clone()).unwrap();
88 
89     bh.bench_function("cholesky_inverse_10x10", move |bh| {
90         bh.iter(|| {
91             let _ = chol.inverse();
92         })
93     });
94 }
95 
cholesky_inverse_100x100(bh: &mut criterion::Criterion)96 fn cholesky_inverse_100x100(bh: &mut criterion::Criterion) {
97     let m = DMatrix::<f64>::new_random(100, 100);
98     let m = &m * m.transpose();
99     let chol = Cholesky::new(m.clone()).unwrap();
100 
101     bh.bench_function("cholesky_inverse_100x100", move |bh| {
102         bh.iter(|| {
103             let _ = chol.inverse();
104         })
105     });
106 }
107 
cholesky_inverse_500x500(bh: &mut criterion::Criterion)108 fn cholesky_inverse_500x500(bh: &mut criterion::Criterion) {
109     let m = DMatrix::<f64>::new_random(500, 500);
110     let m = &m * m.transpose();
111     let chol = Cholesky::new(m.clone()).unwrap();
112 
113     bh.bench_function("cholesky_inverse_500x500", move |bh| {
114         bh.iter(|| {
115             let _ = chol.inverse();
116         })
117     });
118 }
119 
120 criterion_group!(
121     cholesky,
122     cholesky_100x100,
123     cholesky_500x500,
124     cholesky_decompose_unpack_100x100,
125     cholesky_decompose_unpack_500x500,
126     cholesky_solve_10x10,
127     cholesky_solve_100x100,
128     cholesky_solve_500x500,
129     cholesky_inverse_10x10,
130     cholesky_inverse_100x100,
131     cholesky_inverse_500x500
132 );
133