1pub mod nn;
2
3mod arithmetic;
4mod assign;
5mod clip;
6mod col_op;
7mod diagflat;
8mod fns;
9mod gemm;
10mod max;
11mod row_op;
12mod scalar;
13mod scalar_assign;
14mod sum;
15mod transpose;
16
17#[cfg(feature = "fastrand")]
18mod random;
19
20pub use arithmetic::*;
21pub use assign::*;
22pub use clip::*;
23pub use col_op::*;
24pub use diagflat::*;
25pub use fns::*;
26pub use gemm::*;
27pub use max::*;
28pub use row_op::*;
29pub use scalar::*;
30pub use scalar_assign::*;
31pub use sum::*;
32pub use transpose::*;
33
34#[cfg(feature = "fastrand")]
35pub use random::*;
36
37#[cfg(feature = "opencl")]
38use crate::Matrix;
39#[cfg(feature = "opencl")]
40use custos::cpu::CPU;
41
42#[cfg(feature = "opencl")]
43use custos::OpenCL;
44
45#[cfg(feature = "opencl")]
46pub fn cl_to_cpu_lr<'a, 'o, T, F>(
48 device: &'a OpenCL,
49 lhs: &Matrix<T, OpenCL>,
50 rhs: &Matrix<T, OpenCL>,
51 f: F,
52) -> Matrix<'a, T, OpenCL>
53where
54 T: Copy + Default + std::fmt::Debug,
55 F: for<'b> Fn(&'b CPU, &Matrix<T>, &Matrix<T>) -> Matrix<'b, T>,
56{
57 use crate::opencl::cpu_exec_lhs_rhs;
58 cpu_exec_lhs_rhs(device, lhs, rhs, f).unwrap()
59}
60
61#[cfg(feature = "opencl")]
62pub fn cl_to_cpu_s<'a, 'o, T, F>(
64 device: &'o OpenCL,
65 x: &Matrix<'a, T, OpenCL>,
66 f: F,
67) -> Matrix<'o, T, OpenCL>
68where
69 T: Copy + Default + std::fmt::Debug,
70 F: for<'b> Fn(&'b CPU, &Matrix<'_, T>) -> Matrix<'b, T>,
71{
72 use crate::opencl::cpu_exec;
73 cpu_exec(device, x, &f).unwrap()
74}
75
76#[cfg(feature = "opencl")]
77fn cl_to_cpu_scalar<T: Default + Copy, F: Fn(&CPU, &Matrix<T>) -> T>(
79 device: &OpenCL,
80 x: &Matrix<T, OpenCL>,
81 f: F,
82) -> T {
83 use crate::opencl::cpu_exec_scalar;
84 cpu_exec_scalar(device, x, f)
85}