Exemplo n.º 1
0
    def test_grouped_paulis(self):
        n = 3  # number of qubits

        pg = pauli_group(n, case='tensor')
        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('---')
Exemplo n.º 2
0
    def test_grouped_paulis(self):
        """ grouped paulis test """
        n = 3  # number of qubits

        p_g = pauli_group(n, case='tensor')
        self.assertTrue(p_g != -1, "Error in pauli_group()")

        p_g = [[1.0, x] for x in p_g]  # create paulis with equal weight
        self.log.debug("Number of Paulis: %s", len(p_g))

        ham_op_original = Operator(paulis=p_g, coloring=None)
        ham_op_original._paulis_to_grouped_paulis()
        gp_original = ham_op_original.grouped_paulis

        ham_op_new = Operator(paulis=p_g, coloring="largest-degree")
        ham_op_new._paulis_to_grouped_paulis()
        gp_new = ham_op_new.grouped_paulis

        self.log.debug("#groups in original= %s #groups in new=%s",
                       len(gp_original), len(gp_new))

        self.log.debug("------- Original --------")
        for each in gp_original:
            for x in each:
                self.log.debug('%s %s', x[0], x[1].to_label())
            self.log.debug('---')

        self.log.debug("-------- New ------------")
        for each in gp_new:
            for x in each:
                self.log.debug('%s %s', x[0], x[1].to_label())
            self.log.debug('---')
Exemplo n.º 3
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
        qubit_op = Operator(matrix=h1)
        # qubit_op_jw.chop_by_threshold(10 ** -10)

        if qubit_op.grouped_paulis is None:
            qubit_op._matrix_to_paulis()
            qubit_op._paulis_to_grouped_paulis()

        for ps in qubit_op.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 = Custom(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 = qubit_op.evolve(
            state_in=state_in.construct_circuit('vector'),
            evo_time=evo_time,
            evo_mode='matrix',
            num_time_slices=0)
        # self.log.debug('exact:\n{}'.format(state_out_exact))
        qubit_op_temp = copy.deepcopy(qubit_op)
        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
                qubit_op = copy.deepcopy(qubit_op_temp)
                if expansion_mode == 'suzuki':
                    self.log.debug(
                        'With expansion order {}:'.format(expansion_order))
                state_out_matrix = qubit_op.evolve(
                    state_in=state_in.construct_circuit('vector'),
                    evo_time=evo_time,
                    evo_mode='matrix',
                    num_time_slices=num_time_slices,
                    expansion_mode=expansion_mode,
                    expansion_order=expansion_order)

                quantum_registers = QuantumRegister(qubit_op.num_qubits,
                                                    name='q')
                qc = QuantumCircuit(quantum_registers)
                qc += state_in.construct_circuit('circuit', quantum_registers)
                qc += qubit_op.evolve(
                    evo_time=evo_time,
                    evo_mode='circuit',
                    num_time_slices=num_time_slices,
                    quantum_registers=quantum_registers,
                    expansion_mode=expansion_mode,
                    expansion_order=expansion_order,
                )
                job = q_execute(qc,
                                BasicAer.get_backend('statevector_simulator'))
                state_out_circuit = np.asarray(job.result().get_statevector(
                    qc, decimals=16))

                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)