|
| 1 | +from ferrmion import FermionHamiltonian |
1 | 2 | import numpy as np |
2 | 3 | import pytest |
3 | 4 | import scipy as sp |
|
17 | 18 | from openfermion.transforms import jordan_wigner |
18 | 19 | from ferrmion.hamiltonians import molecular_hamiltonian |
19 | 20 | from ferrmion.core import standard_symplectic_matrix |
| 21 | +from scipy.sparse.linalg import eigsh |
20 | 22 |
|
21 | 23 |
|
22 | 24 | @pytest.fixture |
@@ -573,3 +575,50 @@ def test_core_standard_encodings(n_modes,encoding,name): |
573 | 575 | ci, cs = standard_symplectic_matrix(name,20) |
574 | 576 | assert np.all(i==ci) |
575 | 577 | assert np.all(s==cs) |
| 578 | + |
| 579 | +@pytest.mark.parametrize("encoding", [JW, BK, ParityEncoding, JKMN]) |
| 580 | +def test_encode_standard_water_eigvals_equal_expected(encoding, water_data): |
| 581 | + ones = water_data["ones"] |
| 582 | + twos = water_data["twos"] |
| 583 | + e_nuc = water_data["constant_energy"] |
| 584 | + |
| 585 | + fham = FermionHamiltonian(terms = {"+-":ones,"++--":twos}, constant_energy=e_nuc) |
| 586 | + qham = encoding(fham.n_modes).encode(fham) |
| 587 | + assert np.isclose(qham["I"*14], -46.465600781952176) |
| 588 | + |
| 589 | + ofop = QubitOperator() |
| 590 | + for k, v in qham.items(): |
| 591 | + string = " ".join( |
| 592 | + [ |
| 593 | + f"{char.upper()}{pos}" if char != "I" else "" |
| 594 | + for pos, char in enumerate(k) |
| 595 | + ] |
| 596 | + ) |
| 597 | + ofop+= QubitOperator(term=string, coefficient=v) |
| 598 | + print(expected:=water_data["eigvals"]) |
| 599 | + diag, _ = eigsh(get_sparse_operator(ofop), k=2, which="SA") |
| 600 | + print(diag) |
| 601 | + assert np.allclose(np.sort(diag), np.sort(expected)[:2]) |
| 602 | + |
| 603 | +@pytest.mark.parametrize("encoding", [JW, BK, ParityEncoding, JKMN]) |
| 604 | +def test_encode_standard_h2_eigvals_equal_expected(encoding, h2_mol_data_sets): |
| 605 | + ones = h2_mol_data_sets["ones"] |
| 606 | + twos = h2_mol_data_sets["twos"] |
| 607 | + e_nuc = h2_mol_data_sets["constant_energy"] |
| 608 | + n_modes = ones.shape[0] |
| 609 | + fham = FermionHamiltonian(terms = {"+-":ones,"++--":twos}, constant_energy=e_nuc) |
| 610 | + qham = encoding(n_modes).encode(fham) |
| 611 | + |
| 612 | + ofop = QubitOperator() |
| 613 | + for k, v in qham.items(): |
| 614 | + string = " ".join( |
| 615 | + [ |
| 616 | + f"{char.upper()}{pos}" if char != "I" else "" |
| 617 | + for pos, char in enumerate(k) |
| 618 | + ] |
| 619 | + ) |
| 620 | + ofop+= QubitOperator(term=string, coefficient=v) |
| 621 | + print(expected:=h2_mol_data_sets["eigvals"]) |
| 622 | + diag, _ = eigsh(get_sparse_operator(ofop), k=2*n_modes, which="SA") |
| 623 | + print(diag) |
| 624 | + assert np.allclose(np.sort(diag), np.sort(h2_mol_data_sets["eigvals"])) |
0 commit comments