The libwalrus C++ library¶
The libwalrus
C++ library is provided as a headeronly library, libwalrus.hpp
, which can be included at the top of your source file:
#include <libwalrus.hpp>
The following templated functions are then available for use within the libwalrus
namespace.
Example¶
For instance, consider the following example example.cpp
, which calculates the loop hafnian of several all ones matrices:
#include <iostream>
#include <complex>
#include <vector>
#include <libwalrus.hpp>
int main() {
int nmax = 10;
for (int m = 1; m <= nmax; m++) {
// create a 2m*2m all ones matrix
int n = 2 * m;
std::vector<std::complex<double>> mat(n * n, 1.0);
// calculate the hafnian
std::complex<double> hafval = libwalrus::loop_hafnian(mat);
// print out the result
std::cout << hafval << std::endl;
}
return 0;
};
This can be compiled using the gcc g++
compiler as follows,
$ g++ example.cpp o example std=c++11 O3 Wall I/path/to/libwalrus.hpp I/path/to/Eigen fopenmp
where /path/to/libwalrus.hpp
is the path to the directory containing libwalrus.hpp
, /path/to/Eigen
is the path to the Eigen C++ linear algebra header library, and the fopenmp
flag instructs the compiler to parallelize the compiled program using OpenMP.
Additionally, you may instruct Eigen to simply act as a ‘frontend’ to an installed LAPACKE library. To do so, you must pass additional flags:
$ g++ example.cpp o example std=c++11 O3 Wall I/path/to/libwalrus.hpp I/path/to/Eigen \
fopenmp DLAPACKE llapacke lblas
Below, the main interface (available as templated functions) as well as all auxiliary functions are summarized and listed.
Note
If compiling using the clang
compiler provided by Xcode on MacOS, OpenMP is natively supported, however the libomp.so
library must be installed and linked to separately. One approach is to use the Homebrew packaging manager:
$ brew install eigen libomp
$ clang example.cpp o example O3 Wall fPIC shared Xpreprocessor fopenmp lomp \
I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
Main interface¶
The following functions are intended as the main interface to the C++ libwalrus
library. Most support parallelization via OpenMP.
Returns the hafnian of a matrix using the recursive algorithm described in Counting perfect matchings as fast as Ryser [5]. 

Returns the hafnian of a matrix using the algorithm described in A faster hafnian formula for complex matrices and its benchmarking on the Titan supercomputer, arxiv:1805.12498. 

Returns the loop hafnian of a matrix using the algorithm described in A faster hafnian formula for complex matrices and its benchmarking on the Titan supercomputer, arxiv:1805.12498. 

Returns the hafnian of a matrix with repeated rows and columns using the algorithm described in From moments of sum to moments of product, doi:10.1016/j.jmva.2007.01.013. 

Returns the approximate hafnian of a matrix with nonnegative entries by sampling over determinants. The higher the number of samples, the better the accuracy. 

Returns the Torontonian of a matrix using the algorithm described in A faster hafnian formula for complex matrices and its benchmarking on the Titan supercomputer, arxiv:1805.12498. 

Returns the torontonian of a matrix using the algorithm described in A faster hafnian formula for complex matrices and its benchmarking on the Titan supercomputer, arxiv:1805.12498, with increased accuracy via the 

Returns the permanent of a matrix using Ryser’s algorithm with Gray code ordering. 

Returns the permanent of a matrix using Ryser’s algorithm with Gray code ordering, with increased accuracy via the 

Returns photon number statistics of a Gaussian state for a given covariance matrix as described in Multidimensional Hermite polynomials and photon distribution for polymode mixed light arxiv:9308033. 
Contents
Downloads