# The libwalrus C++ library¶

The libwalrus C++ library is provided as a header-only 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 -fopenmp  where /path/to/libwalrus.hpp is the path to the directory containing libwalrus.hpp and the -fopenmp flag instructs the compiler to parallelize the compiled program using OpenMP. 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 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.

 libwalrus::hafnian_recursive() Returns the hafnian of a matrix using the recursive algorithm described in Counting perfect matchings as fast as Ryser [9]. libwalrus::hafnian() 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. libwalrus::loop_hafnian() 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. libwalrus::hafnian_rpt() 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. libwalrus::permanent() Returns the permanent of a matrix using Ryser’s algorithm with Gray code ordering. libwalrus::perm_fsum() Returns the permanent of a matrix using Ryser’s algorithm with Gray code ordering, with increased accuracy via the fsum summation algorithm. libwalrus::hermite_multidimensional_cpp() 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.

## API¶

See here for full details on the C++ API and the libwalrus namespace.