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)
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)
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
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)