def test_definition_parameters(self, gate_class):
        """Verify decompositions from standard equivalence library match definitions."""
        n_params = len(_get_free_params(gate_class))
        param_vector = ParameterVector('th', n_params)
        float_vector = [0.1 * i for i in range(n_params)]

        param_gate = gate_class(*param_vector)
        float_gate = gate_class(*float_vector)

        param_entry = std_eqlib.get_entry(param_gate)
        float_entry = std_eqlib.get_entry(float_gate)

        if not param_gate.definition or not param_gate.definition.data:
            return

        self.assertGreaterEqual(len(param_entry), 1)
        self.assertGreaterEqual(len(float_entry), 1)

        param_qc = QuantumCircuit(param_gate.num_qubits)
        float_qc = QuantumCircuit(float_gate.num_qubits)

        param_qc.append(param_gate, param_qc.qregs[0])
        float_qc.append(float_gate, float_qc.qregs[0])

        self.assertTrue(any(equiv == param_qc.decompose()
                            for equiv in param_entry))
        self.assertTrue(any(equiv == float_qc.decompose()
                            for equiv in float_entry))
Exemplo n.º 2
0
    def test_definition_parameters(self, gate_class):
        """Verify decompositions from standard equivalence library match definitions."""
        n_params = len(_get_free_params(gate_class))
        param_vector = ParameterVector('th', n_params)
        float_vector = [0.1 * i for i in range(n_params)]

        param_gate = gate_class(*param_vector)
        float_gate = gate_class(*float_vector)

        param_entry = std_eqlib.get_entry(param_gate)
        float_entry = std_eqlib.get_entry(float_gate)

        if not param_gate.definition:
            self.assertEqual(len(param_entry), 0)
            self.assertEqual(len(float_entry), 0)
            return

        if gate_class is CXGate:
            # CXGate currently has a definition in terms of CXGate.
            self.assertEqual(len(param_entry), 0)
            self.assertEqual(len(float_entry), 0)
            return

        self.assertEqual(len(param_entry), 1)
        self.assertEqual(len(float_entry), 1)

        param_qc = QuantumCircuit(param_gate.num_qubits)
        float_qc = QuantumCircuit(float_gate.num_qubits)

        param_qc.append(param_gate, param_qc.qregs[0])
        float_qc.append(float_gate, float_qc.qregs[0])

        self.assertEqual(param_entry[0], param_qc.decompose())
        self.assertEqual(float_entry[0], float_qc.decompose())
    def test_equivalence_phase(self):
        """Test that the equivalent circuits from the equivalency_library
        have equal matrix representations"""
        for gate_class in self._gate_classes:
            with self.subTest(i=gate_class):
                n_params = len(_get_free_params(gate_class))
                params = [0.1 * i for i in range(1, n_params + 1)]
                if gate_class.__name__ == "RXXGate":
                    params = [np.pi / 2]
                if gate_class.__name__ in ["MSGate"]:
                    params[0] = 2
                if gate_class.__name__ in ["PauliGate"]:
                    params = ["IXYZ"]
                if gate_class.__name__ in ["BooleanExpression"]:
                    params = ["x | y"]
                if gate_class.__name__ in [
                        "PauliEvolutionGate", "PauliEvolutionGate"
                ]:
                    continue

                gate = gate_class(*params)
                equiv_lib_list = std_eqlib.get_entry(gate)
                for ieq, equivalency in enumerate(equiv_lib_list):
                    with self.subTest(msg=gate.name + "_" + str(ieq)):
                        op1 = Operator(gate)
                        op2 = Operator(equivalency)
                        self.assertEqual(op1, op2)
 def test_equivalence_phase(self):
     """Test that the equivalent circuits from the equivalency_library
     have equal matrix representations"""
     for gate_class in self._gate_classes:
         with self.subTest(i=gate_class):
             n_params = len(_get_free_params(gate_class))
             params = [0.1 * i for i in range(1, n_params+1)]
             if gate_class.__name__ == 'RXXGate':
                 params = [np.pi/2]
             if gate_class.__name__ in ['MSGate']:
                 params[0] = 2
             gate = gate_class(*params)
             equiv_lib_list = std_eqlib.get_entry(gate)
             for ieq, equivalency in enumerate(equiv_lib_list):
                 with self.subTest(msg=gate.name + '_' + str(ieq)):
                     op1 = Operator(gate)
                     op2 = Operator(equivalency)
                     self.assertEqual(op1, op2)