Los operadores de duplicación, eliminación y conmutación suelen definirse mediante matrices de transformación, que en la práctica, esas matrices pueden ser mucho más grandes que los datos sobre los que se aplican. Por ello, en xlr8 los operadores no se construyen explícitamente; se calculan a partir de relaciones de índices cuando son necesarios.
Este WIP (work in progress) surgió de entre muchas otras ideas, de la libreria del Prof. Felipe Osorio en fastmatrix, y empezó siendo algo exploratorio y ahora me gustaría darle forma y que pueda tener un lugar y uso.
La parte que más me gusta: los operadores se encadenan y se ejecutan en un solo pase de tiles.
use xlr8::prelude::*;
let pipeline = OperadorSimetrizacion::new(n, Layout::ColMajor).unwrap()
.then(OperadorConmutacion::new(n, n).unwrap())
.then(OperadorSimetrizacion::new(n, Layout::ColMajor).unwrap());
pipeline.ejecutar(&mut data, n, n);Sin copias intermedias.
El proyecto está escrito en Rust y expone una pequeña interfaz C para comunicarse con R. Para compilarlo se necesita una instalación de Rust y cbindgen, que se utiliza para generar automáticamente los headers del FFI.
git clone https://github.com/xspark21/xlr8.git
cd xlr8
make buildsource("r_binding/xlr8.r")
init_xlr8()
A <- matrix(rnorm(100), 10, 10)
simetrizar(A)
vech_A <- eliminar(A)
duplicar(vech_A, n = 10)Para evitar conversiones de formato se sigue el layout Col-Major de R.
make test # cargo test --release
make bench # cargo bench con target-cpu=nativeuse xlr8::prelude::*;
let op = OperadorConmutacion::new(m, n).unwrap();
let mut output = vec![0.0; m * n];
op.aplicar(&input, &mut output);
// con Workspace para pipelines sin presión al allocator
let ws = Workspace::new(n * n);
op.aplicar_ws(&input, &mut output, &ws);| Operador | |
|---|---|
OperadorSimetrizacion |
S_n |
OperadorConmutacion |
K_{mn} — transposición |
OperadorEliminacion |
L_n — vec → vech |
OperadorDuplicacion |
D_n — vech → vec |
BracketProduct |
producto tensorial bracket |
OperadorKronecker |
A ⊗ B |
OperadorFisher |
A diag(w) Aᵀ |
Por ahora sin SIMD explícito, detección automática de caché ni multiplicación matricial generalizada. En camino: solver para OLS, distribuciones, binding para Python.
- Osorio, F., & Ogueda, A. (2024). fastmatrix: Fast Computation of Covariance Matrices. CRAN.
- Magnus, J. R., & Neudecker, H. (2019). Matrix Differential Calculus with Applications in Statistics and Econometrics. Wiley.
- Hager, G., & Wellein, G. (2010). Introduction to High Performance Computing for Scientists and Engineers. CRC Press.
- Higham, N. J. (2002). Accuracy and Stability of Numerical Algorithms. SIAM.
- Wei, B. C. (1998). Exponential Family Nonlinear Models. Springer.