Skip to main content

vector_ta/
lib.rs

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}