def test_optimize_cliffords(self): """Test OptimizeCliffords pass.""" rng = np.random.default_rng(1234) for _ in range(20): # Create several random Cliffords cliffs = [random_clifford(3, rng) for _ in range(5)] # The first circuit contains these cliffords qc1 = QuantumCircuit(5) for cliff in cliffs: qc1.append(cliff, [4, 0, 2]) self.assertEqual(qc1.count_ops()["clifford"], 5) # The second circuit is obtained by running the OptimizeCliffords pass. qc2 = PassManager(OptimizeCliffords()).run(qc1) self.assertEqual(qc2.count_ops()["clifford"], 1) # The third circuit contains the decompositions of Cliffods. qc3 = QuantumCircuit(5) for cliff in cliffs: qc3.append(cliff.to_circuit(), [4, 0, 2]) self.assertNotIn("clifford", qc3.count_ops()) # Check that qc1, qc2 and qc3 and their decompositions are all equivalent. self.assertTrue(Operator(qc1).equiv(Operator(qc1.decompose()))) self.assertTrue(Operator(qc2).equiv(Operator(qc2.decompose()))) self.assertTrue(Operator(qc3).equiv(Operator(qc3.decompose()))) self.assertTrue(Operator(qc1).equiv(Operator(qc2))) self.assertTrue(Operator(qc1).equiv(Operator(qc3)))
def test_can_combine_cliffords(self): """Test that we can combine a pair of Cliffords over the same qubits using OptimizeCliffords transpiler pass.""" cliff1 = self.create_cliff1() cliff2 = self.create_cliff2() cliff3 = self.create_cliff3() # Create a circuit with two consective cliffords qc1 = QuantumCircuit(4) qc1.append(cliff1, [3, 1, 2]) qc1.append(cliff2, [3, 1, 2]) self.assertEqual(qc1.count_ops()["clifford"], 2) # Run OptimizeCliffords pass, and check that only one Clifford remains qc1opt = PassManager(OptimizeCliffords()).run(qc1) self.assertEqual(qc1opt.count_ops()["clifford"], 1) # Create the expected circuit qc2 = QuantumCircuit(4) qc2.append(cliff3, [3, 1, 2]) # Check that all possible operators are equal self.assertTrue(Operator(qc1).equiv(Operator(qc1.decompose()))) self.assertTrue(Operator(qc1opt).equiv(Operator(qc1opt.decompose()))) self.assertTrue(Operator(qc1).equiv(Operator(qc1opt))) self.assertTrue(Operator(qc2).equiv(Operator(qc2.decompose()))) self.assertTrue(Operator(qc1opt).equiv(Operator(qc2)))