def test_H2_experiment_perfect(self): print('\n') #the RHF H2 energy at equilibrium bond length E_hf = -1.1166843870661929 #the H2 qubit hamiltonian circ_vec = [ Circuit(), build_circuit('Z_0'), build_circuit('Z_1'), build_circuit('Z_2'), build_circuit('Z_3'), build_circuit('Z_0 Z_1'), build_circuit('Y_0 X_1 X_2 Y_3'), build_circuit('Y_0 Y_1 X_2 X_3'), build_circuit('X_0 X_1 Y_2 Y_3'), build_circuit('X_0 Y_1 Y_2 X_3'), build_circuit('Z_0 Z_2'), build_circuit('Z_0 Z_3'), build_circuit('Z_1 Z_2'), build_circuit('Z_1 Z_3'), build_circuit('Z_2 Z_3') ] coef_vec = [ -0.098863969784274, 0.1711977489805748, 0.1711977489805748, -0.222785930242875, -0.222785930242875, 0.1686221915724993, 0.0453222020577776, -0.045322202057777, -0.045322202057777, 0.0453222020577776, 0.1205448220329002, 0.1658670240906778, 0.1658670240906778, 0.1205448220329002, 0.1743484418396386 ] H2_qubit_hamiltonian = QubitOperator() for i in range(len(circ_vec)): H2_qubit_hamiltonian.add(coef_vec[i], circ_vec[i]) # circuit for making HF state circ = Circuit() circ.add(gate('X', 0, 0)) circ.add(gate('X', 1, 1)) TestExperiment = Experiment(4, circ, H2_qubit_hamiltonian, 1000000) params2 = [] avg_energy = TestExperiment.perfect_experimental_avg(params2) print('Perfectly Measured H2 Experimental Avg. Energy') print(avg_energy) print('H2 RHF Energy') print(E_hf) experimental_error = abs(avg_energy - E_hf) assert experimental_error == approx(0, abs=1.0e-14)
def test_op_exp_val_1(self): # test direct expectation value measurement trial_state = Computer(4) trial_prep = [None] * 5 trial_prep[0] = gate('H', 0, 0) trial_prep[1] = gate('H', 1, 1) trial_prep[2] = gate('H', 2, 2) trial_prep[3] = gate('H', 3, 3) trial_prep[4] = gate('cX', 0, 1) trial_circ = Circuit() #prepare the circuit for gate_ in trial_prep: trial_circ.add(gate_) # use circuit to prepare trial state trial_state.apply_circuit(trial_circ) # gates needed for [a1^ a2] operator X1 = gate('X', 1, 1) X2 = gate('X', 2, 2) Y1 = gate('Y', 1, 1) Y2 = gate('Y', 2, 2) # initialize circuits to make operator circ1 = Circuit() circ1.add(X2) circ1.add(Y1) circ2 = Circuit() circ2.add(Y2) circ2.add(Y1) circ3 = Circuit() circ3.add(X2) circ3.add(X1) circ4 = Circuit() circ4.add(Y2) circ4.add(X1) #build the quantum operator for [a1^ a2] a1_dag_a2 = QubitOperator() a1_dag_a2.add(0.0 - 0.25j, circ1) a1_dag_a2.add(0.25, circ2) a1_dag_a2.add(0.25, circ3) a1_dag_a2.add(0.0 + 0.25j, circ4) #get direct expectatoin value exp = trial_state.direct_op_exp_val(a1_dag_a2) assert exp == approx(0.25, abs=2.0e-16)
from pytest import approx from qforte import Circuit, Computer, gate import numpy as np num_qubits = 5 prep_circ = Circuit() ct_lst = [(4, 3), (4, 2), (4, 1), (4, 0), (3, 2), (3, 1), (3, 0), (2, 1), (2, 0), (1, 0)] for i in range(num_qubits): prep_circ.add(gate('H', i, i)) for i in range(num_qubits): prep_circ.add(gate('cR', i, i + 1, 1.116 / (i + 1.0))) def generic_test_circ_vec_builder(qb_list, id): circ_vec_tc = [Circuit() for i in range(len(qb_list))] circ_vec_ct = [Circuit() for i in range(len(qb_list))] for i, pair in enumerate(ct_lst): t = pair[0] c = pair[1] if (id == 'cR'): circ_vec_ct[i].add(gate(id, t, c, 3.17 * t * c)) circ_vec_tc[i].add(gate(id, c, t, 1.41 * t * c)) else: circ_vec_ct[i].add(gate(id, t, c)) circ_vec_tc[i].add(gate(id, c, t)) return circ_vec_tc, circ_vec_ct
def test_circ_op_print(self): # initialize empty circuit circ1 = Circuit() # add (Z1 H2 Y4 X4) Pauli string # note: the rightmost gate is applied first circ1.add(gate('X', 4)) circ1.add(gate('Y', 4)) circ1.add(gate('H', 2)) circ1.add(gate('Z', 1)) # test built-in print function out = str(circ1) assert out == '[Z1 H2 Y4 X4]' # test smart_print function with patch('sys.stdout', new=StringIO()) as fake_out: smart_print(circ1) assert fake_out.getvalue( ) == '\n Quantum circuit:\n(Z1 H2 Y4 X4) |Ψ>\n' # initialize empty circuit circ2 = Circuit() # add (H1 Y2 S3 I4) Pauli string # note: the rightmost gate is applied first circ2.add(gate('I', 4)) circ2.add(gate('S', 3)) circ2.add(gate('Y', 2)) circ2.add(gate('H', 1)) # initialize empty circuit circ3 = Circuit() # add (X1 Y2 H3 Z4) Pauli string # note: the rightmost gate is applied first circ3.add(gate('Z', 4)) circ3.add(gate('H', 3)) circ3.add(gate('Y', 2)) circ3.add(gate('X', 1)) # initialize empty QubitOperator q_op = QubitOperator() # add u1*circ1 + u2*circ2 + u3*circ3 u1 = 0.5 + 0.1j u2 = -0.5j u3 = +0.3 q_op.add(u1, circ1) q_op.add(u2, circ2) q_op.add(u3, circ3) # test built-in print function out = str(q_op) assert out == '+0.500000 +0.100000i[Z1 H2 Y4 X4]\n'\ '-0.500000j[H1 Y2 S3 I4]\n'\ '+0.300000[X1 Y2 H3 Z4]' # test smart_print function with patch('sys.stdout', new=StringIO()) as fake_out: smart_print(q_op) assert fake_out.getvalue() == '\n Quantum operator:\n(0.5+0.1j) (Z1 H2 Y4 X4) |Ψ>\n'\ '+ (-0-0.5j) (H1 Y2 S3 I4) |Ψ>\n'\ '+ (0.3+0j) (X1 Y2 H3 Z4) |Ψ>\n'
def test_circuit(self): print('\n') num_qubits = 10 qc1 = Computer(num_qubits) qc2 = Computer(num_qubits) prep_circ = Circuit() circ = Circuit() for i in range(num_qubits): prep_circ.add(gate('H', i, i)) for i in range(num_qubits): prep_circ.add(gate('cR', i, i + 1, 1.116 / (i + 1.0))) for i in range(num_qubits - 1): circ.add(gate('cX', i, i + 1)) circ.add(gate('cX', i + 1, i)) circ.add(gate('cY', i, i + 1)) circ.add(gate('cY', i + 1, i)) circ.add(gate('cZ', i, i + 1)) circ.add(gate('cZ', i + 1, i)) circ.add(gate('cR', i, i + 1, 3.14159 / (i + 1.0))) circ.add(gate('cR', i + 1, i, 2.17284 / (i + 1.0))) qc1.apply_circuit_safe(prep_circ) qc2.apply_circuit_safe(prep_circ) qc1.apply_circuit_safe(circ) qc2.apply_circuit(circ) C1 = qc1.get_coeff_vec() C2 = qc2.get_coeff_vec() diff_vec = [(C1[i] - C2[i]) * np.conj(C1[i] - C2[i]) for i in range(len(C1))] diff_norm = np.sum(diff_vec) print('\nNorm of diff vec |C - Csafe|') print('-----------------------------') print(' ', diff_norm) assert diff_norm == approx(0, abs=1.0e-16)