numrs/ops/
mod.rs

1//! # NumRs Operations API
2//! 
3//! Este módulo proporciona operaciones de array con dispatch automático al mejor backend.
4//!
5//! ## Uso directo (RECOMENDADO)
6//! ```no_run
7//! use numrs::ops;
8//! # use numrs::Array;
9//! # let a = Array::new(vec![2], vec![1.0, 2.0]);
10//! # let b = Array::new(vec![2], vec![3.0, 4.0]);
11//! # let arr = Array::new(vec![4], vec![1.0, 2.0, 3.0, 4.0]);
12//! let result = ops::add(&a, &b)?;        // Dispatch automático (SIMD/BLAS/GPU)
13//! let sum = ops::sum(&arr, None)?;       // Zero-overhead kernel call
14//! let c = ops::matmul(&a, &b)?;          // Usa MKL/OpenBLAS/WebGPU según disponibilidad
15//! # Ok::<(), anyhow::Error>(())
16//! ```
17//! - ✅ Zero overhead (inline + function pointers)
18//! - ✅ Validación funcional de backends
19//! - ✅ Selección automática del mejor kernel
20//! - ✅ Perfecto para wrappers JS/Python
21//!
22//! ## Organización modular
23//! Las operaciones están organizadas por categoría:
24//! - `ops::elementwise::binary` - Operaciones binarias elemento por elemento (add, mul, etc.)
25//! - `ops::elementwise::unary` - Operaciones unarias (sin, cos, sqrt, relu, etc.)
26//! - `ops::reduction` - Reducciones (sum, mean, etc.)
27//! - `ops::linalg` - Álgebra lineal (matmul, dot, etc.)
28//!
29//! Todas las operaciones usan el sistema de dispatch y son zero-cost.
30
31mod promotion_wrappers;
32
33pub mod elementwise {
34	pub mod binary {
35		pub mod add;
36		pub mod mul;
37		pub mod div;
38		pub mod sub;
39		pub mod pow;
40	}
41	pub mod unary;
42}
43
44pub mod linalg;
45pub mod reduction;
46pub mod shape;
47pub mod model;
48pub mod export; // Automatic ONNX export
49pub mod stats;
50pub mod conv;
51pub mod batchnorm;
52pub mod dropout;
53
54// Re-export all operations at top level for convenient access
55pub use elementwise::binary::add::add;
56pub use elementwise::binary::mul::mul;
57pub use elementwise::binary::div::div;
58pub use elementwise::binary::sub::sub;
59pub use elementwise::binary::pow::pow;
60
61pub use elementwise::unary::{
62    sqrt, sin, cos, tan, abs, exp, log, asin, acos, atan, relu, leaky_relu,
63    sigmoid, tanh, softplus, neg
64};
65
66pub use reduction::{sum, max, min, mean, variance, argmax};
67pub use linalg::{matmul, dot};
68pub use shape::{reshape, transpose, concat, broadcast_to, flatten};
69pub use stats::{norm, softmax, cross_entropy};
70
71// Model operations for ONNX compatibility
72pub use model::{
73    save_onnx, load_onnx, save_checkpoint, load_checkpoint,
74    create_mlp, create_linear_node, create_relu_node, create_softmax_node,
75    create_matmul_node, create_add_node, array_to_onnx_tensor, infer
76};
77
78// Compatibility alias - todas las operaciones están disponibles directamente en ops::*
79// Para compatibilidad con código legacy que usa ops::fast::*, re-exportamos todo aquí también
80pub mod fast {
81    //! Alias de compatibilidad para código existente que usa ops::fast::*
82    //! 
83    //! Todas estas funciones son idénticas a las exportadas en ops::* directamente.
84    //! El namespace "fast" ya no es necesario ya que todas las operaciones usan dispatch.
85    pub use super::*;
86}
87
88