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")
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")
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')
([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, ),
([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, ),