def test_rank_one(n): """ Test the hafnian of rank one matrices so that it is within 10% of the exact value """ x = np.random.rand(n) A = np.outer(x, x) exact = factorial2(n - 1) * np.prod(x) approx = haf_real(A, approx=True, nsamples=10000) assert np.allclose(approx, exact, rtol=2e-1, atol=0)
def test_real(self): """Check hafnian(A)=haf_real(A) for a random real matrix. """ A = np.random.random([6, 6]) A += A.T haf = hafnian(A) expected = haf_real(A) self.assertEqual(haf, expected) haf = hafnian(A, loop=True) expected = haf_real(A, loop=True) self.assertAlmostEqual(haf, expected, delta=1e-10) A = np.random.random([6, 6]) A += A.T A = np.array(A, dtype=np.complex128) haf = hafnian(A) expected = haf_real(np.float64(A.real)) self.assertEqual(haf, expected)
# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """This module performs benchmarking on the Python interface rlhaf""" import time import numpy as np from hafnian import haf_real header = ["Size", "Time(complex128)", "Result(complex128)"] print("{: >5} {: >15} {: >25} ".format(*header)) for n in range(2, 23): mat2 = np.ones([2 * n, 2 * n], dtype=np.float64) init2 = time.clock() x2 = np.real(haf_real(mat2)) end2 = time.clock() row = [2 * n, end2 - init2, x2] print("{: >5} {: >15} {: >25}".format(*row))