# GREY BALLARD

PLANC solves the nonnegative matrix factorization problem:
approximating a matrix as a product of two matrices whose entries are nonnegative.
The code is written in C++ and uses OpenMP for shared-memory parallelism and MPI for
distributed-memory parallelism. It incorporates multiple alternating-updating techniques,
including multiplicative updates, hierarchical alternating least squares, and block
principal pivoting. It uses Armadillo to interface with BLAS and LAPACK libraries.

TuckerMPI computes the Tucker decomposition of dense tensors using
the Sequentially Truncated Higher-Order Singular Value Decomposition algorithm. It is
designed for use in distributed memory but can also be used on a single node. The code
is written in C++ with MPI. It also relies on BLAS and LAPACK libraries.

This software contains Matlab and C implementations for computing
only the largest entries of a matrix-matrix product. The C implementations rely on a
mex interface to MATLAB and use subroutines from the CSparse library. The main algorithm
is randomized, based on wedge or diamond sampling, but it can also compute the largest
entries deterministically (with reduced memory footprint).

This software contains implementations of fast matrix multiplication
algorithms (those that require fewer than the classical O(n^3) arithmetic operations)
for sequential and shared-memory parallel environments. The code is written in C++ and
can incorporate any fast algorithm that can be expressed by three matrices U, V, and W.
It relies on BLAS's DGEMM for the implementation of the classical algorithm.

This code is used to help solve the symmetric eigenvalue problem
by using similarity transformations to reduce a symmetric band matrix to symmetric
tridiagonal form (maintaining the eigenvalues). It is written in C and uses OpenMP
for shared-memory parallelization. It also includes MATLAB code for visualization of
the algorithm.

### Other Software

I've also made minor contributions to the following libraries: