def test_pauli_cob_traverse(self):
        """pauli cob traverse test"""
        # Helpful prints for debugging commented out below.
        multis = [(X ^ Y) + (I ^ Z) + (Z ^ Z),
                  (Y ^ X ^ I ^ I) + (I ^ Z ^ Y ^ X)]
        dests = [Y ^ Y, I ^ I ^ I ^ Z]
        for paulis, dest in zip(multis, dests):
            converter = PauliBasisChange(destination_basis=dest, traverse=True)

            cob = converter.convert(paulis)
            self.assertIsInstance(cob, SummedOp)
            inst = [None] * len(paulis)
            ret_dest = [None] * len(paulis)
            cob_mat = [None] * len(paulis)
            for i, pauli in enumerate(paulis):
                inst[i], ret_dest[i] = converter.get_cob_circuit(
                    pauli.to_pauli_op().primitive)
                self.assertEqual(dest, ret_dest[i])

                self.assertIsInstance(cob.oplist[i], ComposedOp)
                cob_mat[i] = cob.oplist[i].to_matrix()
                np.testing.assert_array_almost_equal(pauli.to_matrix(),
                                                     cob_mat[i])
            np.testing.assert_array_almost_equal(paulis.to_matrix(),
                                                 sum(cob_mat))
 def test_pauli_cob_multiqubit(self):
     """pauli cob multi qubit test"""
     # Helpful prints for debugging commented out below.
     multis = [
         Y ^ X ^ I ^ I, I ^ Z ^ Y ^ X, X ^ Y ^ I ^ Z, I ^ I ^ I ^ X,
         X ^ X ^ X ^ X
     ]
     for pauli, dest in itertools.product(multis, reversed(multis)):
         # print(pauli)
         # print(dest)
         converter = PauliBasisChange(destination_basis=dest)
         inst, dest = converter.get_cob_circuit(pauli.primitive)
         cob = converter.convert(pauli)
         # print(inst)
         # print(pauli.to_matrix())
         # print(np.round(inst.adjoint().to_matrix() @ cob.to_matrix()))
         np.testing.assert_array_almost_equal(
             pauli.to_matrix(),
             inst.adjoint().to_matrix() @ dest.to_matrix()
             @ inst.to_matrix())
         np.testing.assert_array_almost_equal(pauli.to_matrix(),
                                              cob.to_matrix())
         np.testing.assert_array_almost_equal(
             inst.compose(pauli).compose(inst.adjoint()).to_matrix(),
             dest.to_matrix())
    def test_grouped_pauli_statefn(self):
        """grouped pauli test with statefn"""
        grouped_pauli = PauliSumOp(SparsePauliOp(["Y"]), grouping_type="TPB")
        observable = OperatorStateFn(grouped_pauli, is_measurement=True)

        converter = PauliBasisChange(
            replacement_fn=PauliBasisChange.measurement_replacement_fn)
        cob = converter.convert(observable)

        expected = PauliSumOp(SparsePauliOp(["Z"]), grouping_type="TPB")
        self.assertEqual(cob[0].primitive, expected)
        circuit = QuantumCircuit(1)
        circuit.sdg(0)
        circuit.h(0)
        self.assertEqual(cob[1].primitive, circuit)
 def test_pauli_cob_two_qubit(self):
     """pauli cob two qubit test"""
     multis = [Y ^ X, Z ^ Y, I ^ Z, Z ^ I, X ^ X, I ^ X]
     for pauli, dest in itertools.product(multis, reversed(multis)):
         converter = PauliBasisChange(destination_basis=dest)
         inst, dest = converter.get_cob_circuit(pauli.primitive)
         cob = converter.convert(pauli)
         np.testing.assert_array_almost_equal(
             pauli.to_matrix(),
             inst.adjoint().to_matrix() @ dest.to_matrix()
             @ inst.to_matrix())
         np.testing.assert_array_almost_equal(pauli.to_matrix(),
                                              cob.to_matrix())
         np.testing.assert_array_almost_equal(
             inst.compose(pauli).compose(inst.adjoint()).to_matrix(),
             dest.to_matrix())
 def test_pauli_cob_singles(self):
     """from to file test"""
     singles = [X, Y, Z]
     dests = [None, Y]
     for pauli, dest in itertools.product(singles, dests):
         # print(pauli)
         converter = PauliBasisChange(destination_basis=dest)
         inst, dest = converter.get_cob_circuit(pauli.primitive)
         cob = converter.convert(pauli)
         np.testing.assert_array_almost_equal(
             pauli.to_matrix(),
             inst.adjoint().to_matrix() @ dest.to_matrix()
             @ inst.to_matrix())
         np.testing.assert_array_almost_equal(pauli.to_matrix(),
                                              cob.to_matrix())
         np.testing.assert_array_almost_equal(
             inst.compose(pauli).compose(inst.adjoint()).to_matrix(),
             dest.to_matrix())
    def test_grouped_pauli(self):
        """grouped pauli test"""
        pauli = 2 * (I ^ I) + (X ^ I) + 3 * (X ^ Y)
        grouped_pauli = PauliSumOp(pauli.primitive, grouping_type="TPB")

        converter = PauliBasisChange()
        cob = converter.convert(grouped_pauli)
        np.testing.assert_array_almost_equal(pauli.to_matrix(),
                                             cob.to_matrix())

        origin_x = reduce(np.logical_or, pauli.primitive.table.X)
        origin_z = reduce(np.logical_or, pauli.primitive.table.Z)
        origin_pauli = Pauli((origin_z, origin_x))
        inst, dest = converter.get_cob_circuit(origin_pauli)
        self.assertEqual(str(dest), "ZZ")
        expected_inst = np.array([
            [0.5, -0.5j, 0.5, -0.5j],
            [0.5, 0.5j, 0.5, 0.5j],
            [0.5, -0.5j, -0.5, 0.5j],
            [0.5, 0.5j, -0.5, -0.5j],
        ])
        np.testing.assert_array_almost_equal(inst.to_matrix(), expected_inst)