def test_grouped_paulis(self): n = 3 # number of qubits pg = pauli_group(n, case=1) self.assertTrue(pg != -1, "Error in pauli_group()") pg = [[1.0, x] for x in pg] # create paulis with equal weight self.log.debug("Number of Paulis: {}".format(len(pg))) hamOpOriginal = Operator(paulis=pg, coloring=None) hamOpOriginal._paulis_to_grouped_paulis() gpOriginal = hamOpOriginal.grouped_paulis hamOpNew = Operator(paulis=pg, coloring="largest-degree") hamOpNew._paulis_to_grouped_paulis() gpNew = hamOpNew.grouped_paulis self.log.debug("#groups in original= {} #groups in new={}".format(len(gpOriginal), len(gpNew))) self.log.debug("------- Original --------") for each in gpOriginal: for x in each: self.log.debug('{} {}'.format(x[0], x[1].to_label())) self.log.debug('---') self.log.debug("-------- New ------------") for each in gpNew: for x in each: self.log.debug('{} {}'.format(x[0], x[1].to_label())) self.log.debug('---')
def test_evolution(self): SIZE = 2 #SPARSITY = 0 #X = [[0, 1], [1, 0]] #Y = [[0, -1j], [1j, 0]] Z = [[1, 0], [0, -1]] I = [[1, 0], [0, 1]] # + 0.5 * np.kron(Y, X)# + 0.3 * np.kron(Z, X) + 0.4 * np.kron(Z, Y) h1 = np.kron(I, Z) # np.random.seed(2) temp = np.random.random((2**SIZE, 2**SIZE)) h1 = temp + temp.T qubitOp = Operator(matrix=h1) # qubitOp_jw.chop_by_threshold(10 ** -10) if qubitOp.grouped_paulis is None: qubitOp._matrix_to_paulis() qubitOp._paulis_to_grouped_paulis() for ps in qubitOp.grouped_paulis: for p1 in ps: for p2 in ps: if p1 != p2: np.testing.assert_almost_equal( p1[1].to_matrix() @ p2[1].to_matrix(), p2[1].to_matrix() @ p1[1].to_matrix()) state_in = get_initial_state_instance('CUSTOM') state_in.init_args(SIZE, state='random') evo_time = 1 num_time_slices = 3 # announces params self.log.debug('evo time: {}'.format(evo_time)) self.log.debug('num time slices: {}'.format(num_time_slices)) self.log.debug('state_in: {}'.format(state_in._state_vector)) # get the exact state_out from raw matrix multiplication state_out_exact = qubitOp.evolve(state_in.construct_circuit('vector'), evo_time, 'matrix', 0) # self.log.debug('exact:\n{}'.format(state_out_exact)) qubitOp_temp = copy.deepcopy(qubitOp) for grouping in ['default', 'random']: self.log.debug('Under {} paulis grouping:'.format(grouping)) for expansion_mode in ['trotter', 'suzuki']: self.log.debug( 'Under {} expansion mode:'.format(expansion_mode)) for expansion_order in [ 1, 2, 3, 4 ] if expansion_mode == 'suzuki' else [1]: # assure every time the operator from the original one qubitOp = copy.deepcopy(qubitOp_temp) if expansion_mode == 'suzuki': self.log.debug( 'With expansion order {}:'.format(expansion_order)) state_out_matrix = qubitOp.evolve( state_in.construct_circuit('vector'), evo_time, 'matrix', num_time_slices, paulis_grouping=grouping, expansion_mode=expansion_mode, expansion_order=expansion_order) quantum_registers = QuantumRegister(qubitOp.num_qubits) qc = state_in.construct_circuit('circuit', quantum_registers) qc += qubitOp.evolve( None, evo_time, 'circuit', num_time_slices, quantum_registers=quantum_registers, paulis_grouping=grouping, expansion_mode=expansion_mode, expansion_order=expansion_order, ) job = q_execute( qc, qiskit.Aer.get_backend('statevector_simulator')) state_out_circuit = np.asarray( job.result().get_statevector(qc)) self.log.debug( 'The fidelity between exact and matrix: {}'.format( state_fidelity(state_out_exact, state_out_matrix))) self.log.debug( 'The fidelity between exact and circuit: {}'.format( state_fidelity(state_out_exact, state_out_circuit))) f_mc = state_fidelity(state_out_matrix, state_out_circuit) self.log.debug( 'The fidelity between matrix and circuit: {}'.format( f_mc)) self.assertAlmostEqual(f_mc, 1)