Пример #1
0
    def test_variable_instead_of_array(self):
        """Test that an exception is raised if an array is expected but a variable is passed"""
        class DummyOp(qml.operation.Operation):
            r"""Dummy custom operation"""
            num_wires = 1
            num_params = 1
            par_domain = 'A'
            grad_method = 'A'

        with pytest.raises(TypeError,
                           match="Array parameter expected, got a Variable"):
            DummyOp(ov.Variable(0), wires=[0], do_queue=False)
Пример #2
0
    def test_variable_instead_of_array(self):
        """Test that an exception is raised if an array is expected but a variable is passed"""
        self.logTestName()

        class DummyOp(oo.Operation):
            r"""Dummy custom operation"""
            num_wires = 1
            num_params = 1
            par_domain = 'A'
            grad_method = 'A'

        with self.assertRaisesRegex(TypeError, "Array parameter expected, got a Variable"):
            DummyOp(ov.Variable(0), wires=[0], do_queue=False)
Пример #3
0
        def op_test(cls):
            "Test the Operation subclass."
            log.debug('\tTesting: cls.{}'.format(cls.__name__))
            n = cls.num_params
            w = cls.num_wires
            ww = list(range(w))
            # valid pars
            if cls.par_domain == 'A':
                pars = [np.eye(2)] * n
            elif cls.par_domain == 'N':
                pars = [0] * n
            else:
                pars = [0.0] * n

            # valid call
            cls(*pars, wires=ww, do_queue=False)

            # too many parameters
            with self.assertRaisesRegex(ValueError,
                                        'wrong number of parameters'):
                cls(*(n + 1) * [0], wires=ww, do_queue=False)

            # too few parameters
            if n > 0:
                with self.assertRaisesRegex(ValueError,
                                            'wrong number of parameters'):
                    cls(*(n - 1) * [0], wires=ww, do_queue=False)

            if w > 0:
                # too many or too few wires
                with self.assertRaisesRegex(ValueError,
                                            'wrong number of wires'):
                    cls(*pars, wires=list(range(w + 1)), do_queue=False)
                with self.assertRaisesRegex(ValueError,
                                            'wrong number of wires'):
                    cls(*pars, wires=list(range(w - 1)), do_queue=False)
                # repeated wires
                if w > 1:
                    with self.assertRaisesRegex(ValueError,
                                                'wires must be unique'):
                        cls(*pars, wires=w * [0], do_queue=False)

            if n == 0:
                return

            # wrong parameter types
            if cls.par_domain == 'A':
                # params must be arrays
                with self.assertRaisesRegex(TypeError,
                                            'Array parameter expected'):
                    cls(*n * [0.0], wires=ww, do_queue=False)
                # params must not be Variables
                with self.assertRaisesRegex(TypeError,
                                            'Array parameter expected'):
                    cls(*n * [ov.Variable(0)], wires=ww, do_queue=False)
            elif cls.par_domain == 'N':
                # params must be natural numbers
                with self.assertRaisesRegex(TypeError, 'Natural number'):
                    cls(*n * [0.7], wires=ww, do_queue=False)
                with self.assertRaisesRegex(TypeError, 'Natural number'):
                    cls(*n * [-1], wires=ww, do_queue=False)
            elif cls.par_domain == 'R':
                # params must be real numbers
                with self.assertRaisesRegex(TypeError,
                                            'Real scalar parameter expected'):
                    cls(*n * [1j], wires=ww, do_queue=False)

            # if par_domain ever gets overridden to an unsupported value, should raise exception
            tmp = cls.par_domain
            with self.assertRaisesRegex(ValueError,
                                        'Unknown parameter domain'):
                cls.par_domain = 'junk'
                cls(*n * [0.0], wires=ww, do_queue=False)
                cls.par_domain = 7
                cls(*n * [0.0], wires=ww, do_queue=False)

            cls.par_domain = tmp
Пример #4
0
    def test_operation_init(self, cls, monkeypatch):
        "Operation subclass initialization."

        n = cls.num_params
        w = cls.num_wires
        ww = list(range(w))
        # valid pars
        if cls.par_domain == 'A':
            pars = [np.eye(2)] * n
        elif cls.par_domain == 'N':
            pars = [0] * n
        else:
            pars = [0.0] * n

        # valid call
        op = cls(*pars, wires=ww, do_queue=False)
        assert op.name == cls.__name__
        assert op.params == pars
        assert op._wires == ww

        # too many parameters
        with pytest.raises(ValueError, match='wrong number of parameters'):
            cls(*(n + 1) * [0], wires=ww, do_queue=False)

        # too few parameters
        if n > 0:
            with pytest.raises(ValueError, match='wrong number of parameters'):
                cls(*(n - 1) * [0], wires=ww, do_queue=False)

        if w > 0:
            # too many or too few wires
            with pytest.raises(ValueError, match='wrong number of wires'):
                cls(*pars, wires=list(range(w + 1)), do_queue=False)
            with pytest.raises(ValueError, match='wrong number of wires'):
                cls(*pars, wires=list(range(w - 1)), do_queue=False)
            # repeated wires
            if w > 1:
                with pytest.raises(ValueError, match='wires must be unique'):
                    cls(*pars, wires=w * [0], do_queue=False)

        if n == 0:
            return

        # wrong parameter types
        if cls.par_domain == 'A':
            # params must be arrays
            with pytest.raises(TypeError, match='Array parameter expected'):
                cls(*n * [0.0], wires=ww, do_queue=False)
            # params must not be Variables
            with pytest.raises(TypeError, match='Array parameter expected'):
                cls(*n * [ov.Variable(0)], wires=ww, do_queue=False)
        elif cls.par_domain == 'N':
            # params must be natural numbers
            with pytest.raises(TypeError, match='Natural number'):
                cls(*n * [0.7], wires=ww, do_queue=False)
            with pytest.raises(TypeError, match='Natural number'):
                cls(*n * [-1], wires=ww, do_queue=False)
        elif cls.par_domain == 'R':
            # params must be real numbers
            with pytest.raises(TypeError,
                               match='Real scalar parameter expected'):
                cls(*n * [1j], wires=ww, do_queue=False)

        # if par_domain ever gets overridden to an unsupported value, should raise exception
        monkeypatch.setattr(cls, 'par_domain', 'junk')
        with pytest.raises(ValueError, match='Unknown parameter domain'):
            cls(*pars, wires=ww, do_queue=False)

        monkeypatch.setattr(cls, 'par_domain', 7)
        with pytest.raises(ValueError, match='Unknown parameter domain'):
            cls(*pars, wires=ww, do_queue=False)