Rust benchmark: tidy up a bit

This commit is contained in:
Aaron Fenyes 2024-08-09 15:18:13 -07:00
parent 0b3fe689cd
commit 14fb6d01f0
2 changed files with 80 additions and 100 deletions

View File

@ -1,10 +1,87 @@
use nalgebra::{*, allocator::Allocator}; use nalgebra::{*, allocator::Allocator};
use std::f64::consts::{PI, E}; use std::f64::consts::{PI, E};
use web_sys::console;
/*use std::ops::Sub;*/ /*use std::ops::Sub;*/
/*use typenum::{B1, UInt, UTerm};*/ /*use typenum::{B1, UInt, UTerm};*/
/*pub fn eigvals_rotated<N>(A: SMatrix<f64, N, N>, time: f64): complex_eigenvalues(&self) -> OVector<NumComplex<T>, D>*/ /* dynamic matrices */
pub fn rand_eigval_series<N>(time_res: usize) -> Vec<OVector<Complex<f64>, Dyn>>
where
N: ToTypenum + DimName + DimSub<U1>,
DefaultAllocator:
Allocator<N> +
Allocator<N, N> +
Allocator<<N as DimSub<U1>>::Output> +
Allocator<N, <N as DimSub<U1>>::Output>
{
// initialize the random matrix
let dim = N::try_to_usize().unwrap();
let mut rand_mat = DMatrix::<f64>::from_fn(dim, dim, |j, k| {
let n = j*dim + k;
E*((n*n) as f64) % 2.0 - 1.0
}) * (3.0 / (dim as f64)).sqrt();
// initialize the rotation step
let mut rot_step = DMatrix::<f64>::identity(dim, dim);
let max_freq = 4;
for n in (0..dim).step_by(2) {
let ang = PI * ((n % max_freq) as f64) / (time_res as f64);
let ang_cos = ang.cos();
let ang_sin = ang.sin();
rot_step[(n, n)] = ang_cos;
rot_step[(n+1, n)] = ang_sin;
rot_step[(n, n+1)] = -ang_sin;
rot_step[(n+1, n+1)] = ang_cos;
}
// find the eigenvalues
let mut eigval_series = Vec::<OVector<Complex<f64>, Dyn>>::with_capacity(time_res);
eigval_series.push(rand_mat.complex_eigenvalues());
for _ in 1..time_res {
rand_mat = &rot_step * rand_mat;
eigval_series.push(rand_mat.complex_eigenvalues());
}
eigval_series
}
/* dynamic single float matrices */
/*pub fn rand_eigval_series<N>(time_res: usize) -> Vec<OVector<Complex<f32>, Dyn>>
where
N: ToTypenum + DimName + DimSub<U1>,
DefaultAllocator:
Allocator<N> +
Allocator<N, N> +
Allocator<<N as DimSub<U1>>::Output> +
Allocator<N, <N as DimSub<U1>>::Output>
{
// initialize the random matrix
let dim = N::try_to_usize().unwrap();
let mut rand_mat = DMatrix::<f32>::from_fn(dim, dim, |j, k| {
let n = j*dim + k;
(E as f32)*((n*n) as f32) % 2.0_f32 - 1.0_f32
}) * (3.0_f32 / (dim as f32)).sqrt();
// initialize the rotation step
let mut rot_step = DMatrix::<f32>::identity(dim, dim);
let max_freq = 4;
for n in (0..dim).step_by(2) {
let ang = (PI as f32) * ((n % max_freq) as f32) / (time_res as f32);
let ang_cos = ang.cos();
let ang_sin = ang.sin();
rot_step[(n, n)] = ang_cos;
rot_step[(n+1, n)] = ang_sin;
rot_step[(n, n+1)] = -ang_sin;
rot_step[(n+1, n+1)] = ang_cos;
}
// find the eigenvalues
let mut eigval_series = Vec::<OVector<Complex<f32>, Dyn>>::with_capacity(time_res);
eigval_series.push(rand_mat.complex_eigenvalues());
for _ in 1..time_res {
rand_mat = &rot_step * rand_mat;
eigval_series.push(rand_mat.complex_eigenvalues());
}
eigval_series
}*/
/* static matrices. should only be used when the dimension is really small */ /* static matrices. should only be used when the dimension is really small */
/*pub fn rand_eigval_series<N>(time_res: usize) -> Vec<OVector<Complex<f64>, N>> /*pub fn rand_eigval_series<N>(time_res: usize) -> Vec<OVector<Complex<f64>, N>>
@ -18,7 +95,6 @@ use web_sys::console;
{ {
// initialize the random matrix // initialize the random matrix
let dim = N::try_to_usize().unwrap(); let dim = N::try_to_usize().unwrap();
console::log_1(&format!("dimension {dim}").into());
let mut rand_mat = OMatrix::<f64, N, N>::from_fn(|j, k| { let mut rand_mat = OMatrix::<f64, N, N>::from_fn(|j, k| {
let n = j*dim + k; let n = j*dim + k;
E*((n*n) as f64) % 2.0 - 1.0 E*((n*n) as f64) % 2.0 - 1.0
@ -40,9 +116,7 @@ use web_sys::console;
// find the eigenvalues // find the eigenvalues
let mut eigval_series = Vec::<OVector<Complex<f64>, N>>::with_capacity(time_res); let mut eigval_series = Vec::<OVector<Complex<f64>, N>>::with_capacity(time_res);
console::log_1(&"before engine eigenvalues".into());
eigval_series.push(rand_mat.complex_eigenvalues()); eigval_series.push(rand_mat.complex_eigenvalues());
console::log_1(&"after engine eigenvalues".into());
for _ in 1..time_res { for _ in 1..time_res {
rand_mat = &rot_step * rand_mat; rand_mat = &rot_step * rand_mat;
eigval_series.push(rand_mat.complex_eigenvalues()); eigval_series.push(rand_mat.complex_eigenvalues());
@ -88,89 +162,3 @@ use web_sys::console;
} }
eigvals eigvals
}*/ }*/
/* dynamic matrices */
pub fn rand_eigval_series<N>(time_res: usize) -> Vec<OVector<Complex<f64>, Dyn>>
where
N: ToTypenum + DimName + DimSub<U1>,
DefaultAllocator:
Allocator<N> +
Allocator<N, N> +
Allocator<<N as DimSub<U1>>::Output> +
Allocator<N, <N as DimSub<U1>>::Output>
{
// initialize the random matrix
let dim = N::try_to_usize().unwrap();
console::log_1(&format!("dimension {dim}").into());
let mut rand_mat = DMatrix::<f64>::from_fn(dim, dim, |j, k| {
let n = j*dim + k;
E*((n*n) as f64) % 2.0 - 1.0
}) * (3.0 / (dim as f64)).sqrt();
// initialize the rotation step
let mut rot_step = DMatrix::<f64>::identity(dim, dim);
let max_freq = 4;
for n in (0..dim).step_by(2) {
let ang = PI * ((n % max_freq) as f64) / (time_res as f64);
let ang_cos = ang.cos();
let ang_sin = ang.sin();
rot_step[(n, n)] = ang_cos;
rot_step[(n+1, n)] = ang_sin;
rot_step[(n, n+1)] = -ang_sin;
rot_step[(n+1, n+1)] = ang_cos;
}
// find the eigenvalues
let mut eigval_series = Vec::<OVector<Complex<f64>, Dyn>>::with_capacity(time_res);
console::log_1(&"before engine eigenvalues".into());
eigval_series.push(rand_mat.complex_eigenvalues());
console::log_1(&"after engine eigenvalues".into());
for _ in 1..time_res {
rand_mat = &rot_step * rand_mat;
eigval_series.push(rand_mat.complex_eigenvalues());
}
eigval_series
}
/* dynamic single float matrices */
/*pub fn rand_eigval_series<N>(time_res: usize) -> Vec<OVector<Complex<f32>, Dyn>>
where
N: ToTypenum + DimName + DimSub<U1>,
DefaultAllocator:
Allocator<N> +
Allocator<N, N> +
Allocator<<N as DimSub<U1>>::Output> +
Allocator<N, <N as DimSub<U1>>::Output>
{
// initialize the random matrix
let dim = N::try_to_usize().unwrap();
console::log_1(&format!("dimension {dim}").into());
let mut rand_mat = DMatrix::<f32>::from_fn(dim, dim, |j, k| {
let n = j*dim + k;
(E as f32)*((n*n) as f32) % 2.0_f32 - 1.0_f32
}) * (3.0_f32 / (dim as f32)).sqrt();
// initialize the rotation step
let mut rot_step = DMatrix::<f32>::identity(dim, dim);
let max_freq = 4;
for n in (0..dim).step_by(2) {
let ang = (PI as f32) * ((n % max_freq) as f32) / (time_res as f32);
let ang_cos = ang.cos();
let ang_sin = ang.sin();
rot_step[(n, n)] = ang_cos;
rot_step[(n+1, n)] = ang_sin;
rot_step[(n, n+1)] = -ang_sin;
rot_step[(n+1, n+1)] = ang_cos;
}
// find the eigenvalues
let mut eigval_series = Vec::<OVector<Complex<f32>, Dyn>>::with_capacity(time_res);
console::log_1(&"before engine eigenvalues".into());
eigval_series.push(rand_mat.complex_eigenvalues());
console::log_1(&"after engine eigenvalues".into());
for _ in 1..time_res {
rand_mat = &rot_step * rand_mat;
eigval_series.push(rand_mat.complex_eigenvalues());
}
eigval_series
}*/

View File

@ -1,7 +1,7 @@
use nalgebra::*; use nalgebra::*;
use std::f64::consts::PI as PI; use std::f64::consts::PI as PI;
use sycamore::{prelude::*, rt::{JsCast, JsValue}}; use sycamore::{prelude::*, rt::{JsCast, JsValue}};
use web_sys::{console, window}; use web_sys::window;
mod engine; mod engine;
@ -10,14 +10,6 @@ fn main() {
#[cfg(feature = "console_error_panic_hook")] #[cfg(feature = "console_error_panic_hook")]
console_error_panic_hook::set_once(); console_error_panic_hook::set_once();
/*console::log_1(&"before test schur 60".into());*/
/*let test_rand_mat = OMatrix::<f64, U60, U60>::identity();*/
/*let test_rot_step = OMatrix::<f64, U56, U56>::identity();*/
/*let test_schur = test_rand_mat.schur();
console::log_1(&format!("after test schur").into());
let test_eigvals = test_schur.complex_eigenvalues();
console::log_1(&format!("after test eigenvalues").into());*/
sycamore::render(|| { sycamore::render(|| {
let time_res: usize = 100; let time_res: usize = 100;
let time_step = create_signal(0.0); let time_step = create_signal(0.0);