def test_raise_if_target_basis_unreachable(self): """Verify we raise if the circuit cannot be transformed to the target.""" eq_lib = EquivalenceLibrary() qc = QuantumCircuit(1) qc.append(OneQubitZeroParamGate(), [0]) dag = circuit_to_dag(qc) pass_ = BasisTranslator(eq_lib, ['1q1p']) with self.assertRaises(TranspilerError): pass_.run(dag)
def test_multiple_variadic(self): """Verify circuit with multiple instances of variadic gate.""" eq_lib = EquivalenceLibrary() # e.g. MSGate oneq_gate = VariadicZeroParamGate(1) equiv = QuantumCircuit(1) equiv.append(OneQubitZeroParamGate(), [0]) eq_lib.add_equivalence(oneq_gate, equiv) twoq_gate = VariadicZeroParamGate(2) equiv = QuantumCircuit(2) equiv.append(TwoQubitZeroParamGate(), [0, 1]) eq_lib.add_equivalence(twoq_gate, equiv) qc = QuantumCircuit(2) qc.append(VariadicZeroParamGate(1), [0]) qc.append(VariadicZeroParamGate(2), [0, 1]) dag = circuit_to_dag(qc) expected = QuantumCircuit(2) expected.append(OneQubitZeroParamGate(), [0]) expected.append(TwoQubitZeroParamGate(), [0, 1]) expected_dag = circuit_to_dag(expected) pass_ = BasisTranslator(eq_lib, ['1q0p', '2q0p']) actual = pass_.run(dag) self.assertEqual(actual, expected_dag)
def test_double_substitution_with_global_phase(self): """Verify we correctly unroll gates through multiple equivalences with global phase.""" eq_lib = EquivalenceLibrary() gate = OneQubitZeroParamGate() equiv = QuantumCircuit(1, global_phase=0.2) equiv.append(OneQubitOneParamGate(pi), [0]) eq_lib.add_equivalence(gate, equiv) theta = Parameter('theta') gate = OneQubitOneParamGate(theta) equiv = QuantumCircuit(1, global_phase=0.4) equiv.append(OneQubitTwoParamGate(theta, pi / 2), [0]) eq_lib.add_equivalence(gate, equiv) qc = QuantumCircuit(1, global_phase=0.1) qc.append(OneQubitZeroParamGate(), [0]) dag = circuit_to_dag(qc) expected = QuantumCircuit(1, global_phase=0.1 + 0.2 + 0.4) expected.append(OneQubitTwoParamGate(pi, pi / 2), [0]) expected_dag = circuit_to_dag(expected) pass_ = BasisTranslator(eq_lib, ['1q2p']) actual = pass_.run(dag) self.assertEqual(actual, expected_dag)
def test_two_single_two_gate_substitutions_with_global_phase(self): """Verify we correctly unroll gates through a single equivalence with global phase.""" eq_lib = EquivalenceLibrary() gate = OneQubitZeroParamGate() equiv = QuantumCircuit(1, global_phase=0.2) equiv.append(OneQubitOneParamGate(pi), [0]) equiv.append(OneQubitOneParamGate(pi), [0]) eq_lib.add_equivalence(gate, equiv) qc = QuantumCircuit(1, global_phase=0.1) qc.append(OneQubitZeroParamGate(), [0]) qc.append(OneQubitZeroParamGate(), [0]) dag = circuit_to_dag(qc) expected = QuantumCircuit(1, global_phase=0.1 + 2 * 0.2) expected.append(OneQubitOneParamGate(pi), [0]) expected.append(OneQubitOneParamGate(pi), [0]) expected.append(OneQubitOneParamGate(pi), [0]) expected.append(OneQubitOneParamGate(pi), [0]) expected_dag = circuit_to_dag(expected) pass_ = BasisTranslator(eq_lib, ['1q1p']) actual = pass_.run(dag) self.assertEqual(actual, expected_dag)
def test_circ_in_basis_no_op(self): """Verify we don't change a circuit already in the target basis.""" eq_lib = EquivalenceLibrary() qc = QuantumCircuit(1) qc.append(OneQubitZeroParamGate(), [0]) dag = circuit_to_dag(qc) expected = circuit_to_dag(qc) pass_ = BasisTranslator(eq_lib, ['1q0p']) actual = pass_.run(dag) self.assertEqual(actual, expected)
def test_diamond_path(self): """Verify we find a path when there are multiple paths to the target basis.""" eq_lib = EquivalenceLibrary() # Path 1: 1q0p -> 1q1p(pi) -> 1q2p(pi, pi/2) gate = OneQubitZeroParamGate() equiv = QuantumCircuit(1) equiv.append(OneQubitOneParamGate(pi), [0]) eq_lib.add_equivalence(gate, equiv) theta = Parameter('theta') gate = OneQubitOneParamGate(theta) equiv = QuantumCircuit(1) equiv.append(OneQubitTwoParamGate(theta, pi / 2), [0]) eq_lib.add_equivalence(gate, equiv) # Path 2: 1q0p -> 1q1p_prime(pi/2) -> 1q2p(2 * pi/2, pi/2) gate = OneQubitZeroParamGate() equiv = QuantumCircuit(1) equiv.append(OneQubitOneParamPrimeGate(pi / 2), [0]) eq_lib.add_equivalence(gate, equiv) alpha = Parameter('alpha') gate = OneQubitOneParamPrimeGate(alpha) equiv = QuantumCircuit(1) equiv.append(OneQubitTwoParamGate(2 * alpha, pi / 2), [0]) eq_lib.add_equivalence(gate, equiv) qc = QuantumCircuit(1) qc.append(OneQubitZeroParamGate(), [0]) dag = circuit_to_dag(qc) expected = QuantumCircuit(1) expected.append(OneQubitTwoParamGate(pi, pi / 2), [0]) expected_dag = circuit_to_dag(expected) pass_ = BasisTranslator(eq_lib, ['1q2p']) actual = pass_.run(dag) self.assertEqual(actual, expected_dag)