1#![cfg_attr(
2 all(feature = "nightly-avx", rustc_is_nightly),
3 feature(stdarch_x86_avx512)
4)]
5#![cfg_attr(
6 all(feature = "nightly-avx", rustc_is_nightly),
7 feature(avx512_target_feature)
8)]
9#![cfg_attr(all(feature = "nightly-avx", rustc_is_nightly), feature(portable_simd))]
10#![cfg_attr(
11 all(feature = "nightly-avx", rustc_is_nightly),
12 feature(likely_unlikely)
13)]
14#![allow(warnings)]
15#![allow(clippy::needless_range_loop)]
16
17pub mod indicators;
18pub mod utilities;
19
20#[cfg(feature = "cuda")]
21pub mod cuda;
22
23#[cfg(all(test, not(target_arch = "wasm32")))]
24mod _rayon_one_big_stack {
25 use ctor::ctor;
26 use rayon::ThreadPoolBuilder;
27
28 #[ctor]
29 fn init_rayon_pool() {
30 let _ = ThreadPoolBuilder::new()
31 .num_threads(1)
32 .stack_size(8 * 1024 * 1024)
33 .build_global();
34 }
35}
36
37pub mod bindings {
38 #[cfg(feature = "python")]
39 pub mod python;
40
41 #[cfg(all(target_arch = "wasm32", feature = "wasm"))]
42 pub mod wasm;
43}
44
45#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
46use wasm_bindgen::prelude::*;
47
48#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
49#[wasm_bindgen]
50pub fn allocate_f64_array(len: usize) -> *mut f64 {
51 let mut v = Vec::<f64>::with_capacity(len);
52 let ptr = v.as_mut_ptr();
53 std::mem::forget(v);
54 ptr
55}
56
57#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
58#[wasm_bindgen]
59pub fn copy_f64_array(values: &[f64]) -> *mut f64 {
60 let mut v = values.to_vec();
61 let ptr = v.as_mut_ptr();
62 std::mem::forget(v);
63 ptr
64}
65
66#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
67#[wasm_bindgen]
68pub fn deallocate_f64_array(ptr: *mut f64) {}
69
70#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
71#[wasm_bindgen]
72pub fn read_f64_array(ptr: *const f64, len: usize) -> Vec<f64> {
73 unsafe { std::slice::from_raw_parts(ptr, len).to_vec() }
74}
75
76#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
77#[wasm_bindgen]
78pub fn write_f64_array(ptr: *mut f64, data: &[f64]) {
79 unsafe {
80 std::slice::from_raw_parts_mut(ptr, data.len()).copy_from_slice(data);
81 }
82}
83
84#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
85#[wasm_bindgen]
86pub fn allocate_f64_matrix(rows: usize, cols: usize) -> *mut f64 {
87 let mut v = Vec::<f64>::with_capacity(rows * cols);
88 let ptr = v.as_mut_ptr();
89 std::mem::forget(v);
90 ptr
91}
92
93#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
94#[wasm_bindgen]
95pub fn deallocate_f64_matrix(ptr: *mut f64) {}
96
97#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
98#[wasm_bindgen]
99pub fn wasm_memory() -> JsValue {
100 wasm_bindgen::memory()
101}
102
103#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
104#[wasm_bindgen]
105pub fn read_f64_matrix(ptr: *const f64, rows: usize, cols: usize) -> js_sys::Array {
106 unsafe {
107 let flat = std::slice::from_raw_parts(ptr, rows * cols);
108 let result = js_sys::Array::new_with_length(rows as u32);
109 for i in 0..rows {
110 let row = js_sys::Float64Array::from(&flat[i * cols..(i + 1) * cols][..]);
111 result.set(i as u32, row.into());
112 }
113 result
114 }
115}