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)
Exemplo n.º 2
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)
Exemplo n.º 3
0
# 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))