Skip to content

jpanetta/catamari

Repository files navigation

catamari is a C++14, header-only implementation of sequential and DAG-scheduled, real and complex, supernodal sparse-direct Cholesky, LDL^T, and LDL^H factorizations. It similarly contains sequential and DAG-scheduled, dense and sparse-direct, real and complex, Determinantal Point Process sampling through modified LDL^H factorizations -- and a nonsymmetric dense DPP sampler based upon a modified LU factorization. The supported precisions are float, double, and their double-mantissa extensions.

Join the chat at https://gitter.im/hodge_star/community Documentation

Preprint on the techniques behind Catamari

A preprint on Catamari is available, as are the slides from a preceding talk. The paper has been accepted to a special issue of Philosophical Transactions of the Royal Society A.

Dependencies

The only strict dependencies for manually including the headers in your project are:

  • mantis: A C++14 header-only, MPL-licensed, implementation of real and complex double-mantissa arithmetic.

  • quotient: A C++14 header-only, MPL-licensed, implementation of the (Approximate) Minimum Degree reordering method.

But, if you would like to make use of the project's build system, the only strict dependency is:

  • meson: "Meson is an open source build system meant to be both extremely fast, and, even more importantly, as user friendly as possible."

Meson will automatically install quotient, Catch2 (a header-only C++ unit-testing library), and specify (a C++14 header-only, command-line argument processor).

Further, it is strongly recommended that one have optimized implementations of the Basic Linear Algebra Subprograms (BLAS) and the Linear Algebra PACKage (LAPACK), such as OpenBLAS, BLIS, or a proprietary alternative such as Intel MKL.

Quickstart

Please see the quickstart documentation for a brief introduction to the library.

Example drivers

One can factor Matrix Market examples from the Davis sparse matrix collection via example/factor_matrix_market.cc, sample a Determinantal Point Process via example/dpp_matrix_market.cc, or factor 2D or 3D Helmholtz Finite Element Method discretizations (with Perfectly Matched Layer boundary conditions) using example/helmholtz_2d_pml.cc or example/helmholtz_3d_pml.cc. An example plane from running the 3D Helmholtz solve using 120 x 120 x 120 trilinear hexahedral elements with a converging lens model spanning 14 wavelengths is shown below:

Examples of running the DPP sampler to generate uniform samples from the space of spanning trees of a 2D grid graph are given in example/uniform_spanning_tree.cc. A (lexicographically greedy) maximum likelihood 60x60 result might look like:

while a random example might look like:

An example of a uniform sample of a spanning tree for a hexagonal tiling graph is given by:

There is also support for sampling from real or complex, nonsymmetric DPP's. An import example of such processes is the Aztec diamond DPP, whose kernel is formed via Kenyon's formula. See example/aztec_diamond.cc for more information. An example output for a tiling of size 40 is given below:

License

catamari is distributed under the Mozilla Public License, v. 2.0.