Beispiel #1
0
def transform_interaction_operator(transformation: str,
                                   input_operator: Union[str,
                                                         SymbolicOperator]):
    """Transform an interaction operator through either the Bravyi-Kitaev or Jordan-Wigner transformations.
    The results are serialized into a JSON under the files: "transformed-operator.json" and "timing.json"

    ARGS:
        transformation (str): The transformation to use. Either "Jordan-Wigner" or "Bravyi-Kitaev"
        input_operator (Union[str, SymbolicOperator]): The interaction operator to transform
    """
    if isinstance(input_operator, str):
        input_operator = load_interaction_operator(input_operator)

    if transformation == "Jordan-Wigner":
        transformation = jordan_wigner
    elif transformation == "Bravyi-Kitaev":
        input_operator = get_fermion_operator(input_operator)
        transformation = bravyi_kitaev
    else:
        raise RuntimeError("Unrecognized transformation ", transformation)

    start_time = time.time()
    transformed_operator = transformation(input_operator)
    walltime = time.time() - start_time

    save_qubit_operator(transformed_operator, "transformed-operator.json")
    save_timing(walltime, "timing.json")
def reorder_fermionic_modes(
    interaction_operator: str, ordering: List
) -> InteractionOperator:

    interaction_operator = load_interaction_operator(interaction_operator)

    reordered_operator = _reorder_fermionic_modes(interaction_operator, ordering)
    save_interaction_operator(reordered_operator, "reordered-operator.json")
def remove_inactive_orbitals(
    interaction_operator: str,
    n_active: Optional[int] = None,
    n_core: Optional[int] = None,
):

    interaction_operator = load_interaction_operator(interaction_operator)

    frozen_operator = _remove_inactive_orbitals(
        interaction_operator, n_active=n_active, n_core=n_core
    )

    save_interaction_operator(frozen_operator, "frozen-operator.json")
def get_one_qubit_hydrogen_hamiltonian(
    interaction_operator: Union[InteractionOperator, str]
):
    """Generate a one qubit H2 hamiltonian from a corresponding interaction operator.

    Original H2 hamiltonian will be reduced to a 2 x 2 matrix defined on a subspace
    spanned by |0011> and |1100> and expanded in terms of I, X, Y, and Z matrices

    Args:
        interaction_operator: The input interaction operator
    """
    if isinstance(interaction_operator, str):
        interaction_operator = load_interaction_operator(interaction_operator)

    fermion_h = get_fermion_operator(interaction_operator)

    # H00
    H00 = normal_ordered(FermionOperator("0 1") * fermion_h * FermionOperator("1^ 0^"))
    H00 = H00.terms[()]

    # H11
    H11 = normal_ordered(FermionOperator("2 3") * fermion_h * FermionOperator("3^ 2^"))
    H11 = H11.terms[()]

    # H10
    H10 = normal_ordered(FermionOperator("2 3") * fermion_h * FermionOperator("1^ 0^"))
    H10 = H10.terms[()]

    # H01
    H01 = np.conj(H10)

    one_qubit_h_matrix = np.array([[H00, H01], [H10, H11]])
    pauli_x = np.array([[0.0, 1.0], [1.0, 0.0]])
    pauli_y = np.array([[0.0, -1.0j], [1.0j, 0.0]])
    pauli_z = np.array([[1.0, 0.0], [0.0, -1.0]])

    r_id = 0.5 * np.trace(one_qubit_h_matrix)
    r_x = 0.5 * np.trace(one_qubit_h_matrix @ pauli_x)
    r_y = 0.5 * np.trace(one_qubit_h_matrix @ pauli_y)
    r_z = 0.5 * np.trace(one_qubit_h_matrix @ pauli_z)

    one_qubit_h = (
        r_id * QubitOperator("")
        + r_x * QubitOperator("X0")
        + r_y * QubitOperator("Y0")
        + r_z * QubitOperator("Z0")
    )

    save_qubit_operator(one_qubit_h, "qubit-operator.json")
Beispiel #5
0
def get_diagonal_component(interaction_operator: Union[InteractionOperator,
                                                       str]):
    """Get the diagonal component and remainder of an input interaction operator. Outputs are serialized to JSON
    under the files: "diagonal-operator.json" and "remainder-operator.json"

    ARGS:
        interaction_operator (Union[InteractionOperator, str]): The input interaction operator
    """
    if isinstance(interaction_operator, str):
        interaction_operator = load_interaction_operator(interaction_operator)

    diagonal_operator, remainder_operator = _get_diagonal_component(
        interaction_operator)
    save_interaction_operator(diagonal_operator, "diagonal-operator.json")
    save_interaction_operator(remainder_operator, "remainder-operator.json")
Beispiel #6
0
def get_one_qubit_hydrogen_hamiltonian(
        interaction_operator: Union[InteractionOperator, str]):
    """Generate a one qubit H2 hamiltonian from a corresponding interaction operator. 

    Original H2 hamiltonian will be reduced to a 2 x 2 matrix defined on a subspace spanned
    by |0011> and |1100> and expanded in terms of I, X, Y, and Z matrices

    ARGS:
        interaction_operator (Union[InteractionOperator, str]): The input interaction operator
    """
    if isinstance(interaction_operator, str):
        interaction_operator = load_interaction_operator(interaction_operator)

    fermion_h = get_fermion_operator(interaction_operator)

    # H00
    H00 = normal_ordered(
        FermionOperator('0 1') * fermion_h * FermionOperator('1^ 0^'))
    H00 = H00.terms[()]

    # H11
    H11 = normal_ordered(
        FermionOperator('2 3') * fermion_h * FermionOperator('3^ 2^'))
    H11 = H11.terms[()]

    # H10
    H10 = normal_ordered(
        FermionOperator('2 3') * fermion_h * FermionOperator('1^ 0^'))
    H10 = H10.terms[()]

    # H01
    H01 = np.conj(H10)

    one_qubit_h_matrix = np.array([[H00, H01], [H10, H11]])
    pauli_x = np.array([[0., 1.], [1., 0.]])
    pauli_y = np.array([[0., -1.j], [1.j, 0.]])
    pauli_z = np.array([[1., 0.], [0., -1.]])

    r_id = 0.5 * np.trace(one_qubit_h_matrix)
    r_x = 0.5 * np.trace(one_qubit_h_matrix @ pauli_x)
    r_y = 0.5 * np.trace(one_qubit_h_matrix @ pauli_y)
    r_z = 0.5 * np.trace(one_qubit_h_matrix @ pauli_z)

    one_qubit_h = r_id * QubitOperator('') + r_x * QubitOperator(
        'X0') + r_y * QubitOperator('Y0') + r_z * QubitOperator('Z0')

    save_qubit_operator(one_qubit_h, 'qubit-operator.json')
Beispiel #7
0
        ([0.5, 0.3, 0.2], 2, [1, 1, 0]),
    ],
)
def test_scale_and_discretize(values, total, expected_result):
    assert scale_and_discretize(values, total) == expected_result


# Hamiltonians and energies from Psi4 H2 minimal basis
# first one is RHF, second one is H2- doublet with ROHF
@pytest.mark.parametrize(
    "hamiltonian, ref_energy, nalpha",
    [
        (
            load_interaction_operator(
                pkg_resources.resource_filename(
                    "zquantum.core.testing", "hamiltonian_H2_minimal_basis.json"
                )
            ),
            -0.8543376267387818,
            1,
        ),
        (
            load_interaction_operator(
                pkg_resources.resource_filename(
                    "zquantum.core.testing",
                    "hamiltonian_H2_minus_ROHF_minimal_basis.json",
                )
            ),
            -0.6857403043904364,
            2,
        ),
Beispiel #8
0
        ([0.5, 0.3, 0.2], 2, [1, 1, 0]),
    ],
)
def test_scale_and_discretize(values, total, expected_result):
    assert scale_and_discretize(values, total) == expected_result


# Hamiltonians and energies from Psi4 H2 minimal basis
# first one is RHF, second one is H2- doublet with ROHF
@pytest.mark.parametrize(
    "hamiltonian, ref_energy, nalpha",
    [
        (
            load_interaction_operator(
                os.path.join(
                    os.path.dirname(__file__),
                    "testing",
                    "hamiltonian_H2_minimal_basis.json",
                )),
            -0.8543376267387818,
            1,
        ),
        (
            load_interaction_operator(
                os.path.join(
                    os.path.dirname(__file__),
                    "testing",
                    "hamiltonian_H2_minus_ROHF_minimal_basis.json",
                )),
            -0.6857403043904364,
            2,
        ),