Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

XLR8

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.


Instalación

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 build

Desde R

source("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=native

Desde Rust

use 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);

Operadores

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.


Referencias

  • 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.

About

High-performance linear algebra operators in Rust (FFI for R). Zero-alloc, cache-tiled pipelines: duplication, elimination, commutation, Kronecker.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages