Esempio n. 1
0
    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
Esempio n. 2
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
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