def run(self, dag): """ Args: dag(DAGCircuit): DAG circuit. Returns: DAGCircuit: optimized DAG circuit. Raises: TranspilerError: If the template has not the right form or if the output circuit acts differently as the input circuit. """ circuit_dag = dag circuit_dag_dep = dag_to_dagdependency(circuit_dag) for template in self.template_list: if not isinstance(template, QuantumCircuit): raise TranspilerError('A template is a Quantumciruit().') if template.num_qubits > len(circuit_dag_dep.qubits): continue identity = np.identity(2**template.num_qubits, dtype=complex) try: comparison = np.allclose(Operator(template).data, identity) if not comparison: raise TranspilerError( 'A template is a Quantumciruit() that ' 'performs the identity.') except TypeError: pass template_dag_dep = circuit_to_dagdependency(template) template_m = TemplateMatching(circuit_dag_dep, template_dag_dep, self.heuristics_qubits_param, self.heuristics_backward_param) template_m.run_template_matching() matches = template_m.match_list if matches: maximal = MaximalMatches(matches) maximal.run_maximal_matches() max_matches = maximal.max_match_list substitution = TemplateSubstitution( max_matches, template_m.circuit_dag_dep, template_m.template_dag_dep) substitution.run_dag_opt() circuit_dag_dep = substitution.dag_dep_optimized else: continue circuit_dag = dagdependency_to_dag(circuit_dag_dep) return circuit_dag
def test_calibrations(self): """Test that calibrations are properly copied over.""" circuit_in = QuantumCircuit(1) circuit_in.add_calibration('h', [0], None) self.assertEqual(len(circuit_in.calibrations), 1) dag_dependency = circuit_to_dagdependency(circuit_in) self.assertEqual(len(dag_dependency.calibrations), 1) circuit_out = dagdependency_to_circuit(dag_dependency) self.assertEqual(len(circuit_out.calibrations), 1)
def test_metadata(self): """Test circuit metadata is preservered through conversion.""" meta_dict = dict(experiment_id="1234", execution_number=4) qr = QuantumRegister(2) circuit_in = QuantumCircuit(qr, metadata=meta_dict) circuit_in.h(qr[0]) circuit_in.cx(qr[0], qr[1]) circuit_in.measure_all() dag_dependency = circuit_to_dagdependency(circuit_in) self.assertEqual(dag_dependency.metadata, meta_dict) circuit_out = dagdependency_to_circuit(dag_dependency) self.assertEqual(circuit_out.metadata, meta_dict)
def test_accept_dagdependency(self): """ Check that users can supply DAGDependency in the template list. """ circuit_in = QuantumCircuit(2) circuit_in.cnot(0, 1) circuit_in.cnot(0, 1) templates = [circuit_to_dagdependency(circuit_in)] pass_ = TemplateOptimization(template_list=templates) circuit_out = PassManager(pass_).run(circuit_in) self.assertEqual(circuit_out.count_ops().get('cx', 0), 0)
def test_circuit_and_dag_canonical(self): """Check convert to dag dependency and back""" qr = QuantumRegister(3) cr = ClassicalRegister(3) circuit_in = QuantumCircuit(qr, cr) circuit_in.h(qr[0]) circuit_in.h(qr[1]) circuit_in.measure(qr[0], cr[0]) circuit_in.measure(qr[1], cr[1]) circuit_in.x(qr[0]).c_if(cr, 0x3) circuit_in.measure(qr[0], cr[0]) circuit_in.measure(qr[1], cr[1]) circuit_in.measure(qr[2], cr[2]) dag_dependency = circuit_to_dagdependency(circuit_in) circuit_out = dagdependency_to_circuit(dag_dependency) self.assertEqual(circuit_out, circuit_in)
def test_accept_dagdependency(self): """ Check that users can supply DAGDependency in the template list. """ circuit_in = QuantumCircuit(2) circuit_in.cnot(0, 1) circuit_in.cnot(0, 1) templates = [circuit_to_dagdependency(circuit_in)] pass_ = TemplateOptimization(template_list=templates) circuit_out = PassManager(pass_).run(circuit_in) # these are NOT equal if template optimization works self.assertNotEqual(circuit_in, circuit_out) # however these are equivalent if the operators are the same self.assertTrue(Operator(circuit_in).equiv(circuit_out))
def run(self, dag): """ Args: dag(DAGCircuit): DAG circuit. Returns: DAGCircuit: optimized DAG circuit. Raises: TranspilerError: If the template has not the right form or if the output circuit acts differently as the input circuit. """ circuit_dag = dag circuit_dag_dep = dag_to_dagdependency(circuit_dag) circuit = dagdependency_to_circuit(circuit_dag_dep) operator_ini = Operator(circuit) for template in self.template_list: if not isinstance(template, QuantumCircuit): raise TranspilerError('A template is a Quantumciruit().') identity = np.identity(2**template.num_qubits, dtype=complex) comparison = np.allclose(Operator(template).data, identity) if not comparison: raise TranspilerError( 'A template is a Quantumciruit() that performs the identity.' ) if template.num_qubits > len(circuit_dag_dep.qubits): raise TranspilerError( 'A template should have equal or less number of qubit' ' compared to the circuit.') template_dag_dep = circuit_to_dagdependency(template) template_m = TemplateMatching(circuit_dag_dep, template_dag_dep, self.heuristics_qubits_param, self.heuristics_backward_param) template_m.run_template_matching() matches = template_m.match_list if matches: maximal = MaximalMatches(matches) maximal.run_maximal_matches() max_matches = maximal.max_match_list substitution = TemplateSubstitution( max_matches, template_m.circuit_dag_dep, template_m.template_dag_dep) substitution.run_dag_opt() circuit_dag_dep = substitution.dag_dep_optimized circuit_intermediate = dagdependency_to_circuit( circuit_dag_dep) opertator_intermediate = Operator(circuit_intermediate) if operator_ini != opertator_intermediate: raise TranspilerError( 'A failure happened during the substitution.') else: continue circuit_dag = dagdependency_to_dag(circuit_dag_dep) return circuit_dag