示例#1
0
    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('---')
示例#2
0
    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)