def test_being_a_variable(self, simple_linear_model): """ Test the basic use of `ConstantParameter` when `is_variable=True` """ model = simple_linear_model p = ConstantParameter(model, np.pi, name='pi', comment='Mmmmm Pi!', is_variable=True, lower_bounds=np.pi/2, upper_bounds=2*np.pi) model.setup() assert p.is_variable assert p.double_size == 1 assert p.integer_size == 0 np.testing.assert_allclose(p.get_double_lower_bounds(), np.array([np.pi/2])) np.testing.assert_allclose(p.get_double_upper_bounds(), np.array([2*np.pi])) np.testing.assert_allclose(p.get_double_variables(), np.array([np.pi])) # No test updating the variables p.set_double_variables(np.array([1.5*np.pi, ])) np.testing.assert_allclose(p.get_double_variables(), np.array([1.5*np.pi])) # None of the integer functions should be implemented because this parameter # has no integer variables with pytest.raises(NotImplementedError): p.get_integer_lower_bounds() with pytest.raises(NotImplementedError): p.get_integer_upper_bounds() with pytest.raises(NotImplementedError): p.get_integer_variables()
def test_storage_max_volume_param(): """Test a that an max_volume with a Parameter results in the correct current_pc """ model = Model(start=pandas.to_datetime('2016-01-01'), end=pandas.to_datetime('2016-01-01')) storage = Storage(model, 'storage', inputs=1, outputs=0) otpt = Output(model, 'output', max_flow=99999, cost=-99999) storage.connect(otpt) p = ConstantParameter(model, 20.0) storage.max_volume = p storage.initial_volume = 10.0 storage.initial_volume_pc = 0.5 model.setup() np.testing.assert_allclose(storage.current_pc, 0.5) model.run() p.set_double_variables(np.asarray([ 40.0, ])) model.reset() # This is a demonstration of the issue describe in #470 # https://github.com/pywr/pywr/issues/470 # The initial storage is defined in both absolute and relative terms # but these are now not consistent with one another and the updated max_volume np.testing.assert_allclose(storage.volume, 10.0) np.testing.assert_allclose(storage.current_pc, 0.5)
def test_storage_initial_volume_pc(): """Test that setting initial volume as a percentage works as expected. """ model = Model( start=pandas.to_datetime('2016-01-01'), end=pandas.to_datetime('2016-01-01') ) storage = Storage(model, 'storage', num_inputs=1, num_outputs=0) otpt = Output(model, 'output', max_flow=99999, cost=-99999) storage.connect(otpt) p = ConstantParameter(model, 20.0) storage.max_volume = p storage.initial_volume_pc = 0.5 model.setup() np.testing.assert_allclose(storage.current_pc, 0.5) np.testing.assert_allclose(storage.volume, 10.0) model.run() p.set_double_variables(np.asarray([40.0, ])) model.reset() np.testing.assert_allclose(storage.current_pc, 0.5) np.testing.assert_allclose(storage.volume, 20.0)
def test_storage_max_volume_param(): """Test a that an max_volume with a Parameter results in the correct current_pc """ model = Model( start=pandas.to_datetime('2016-01-01'), end=pandas.to_datetime('2016-01-01') ) storage = Storage(model, 'storage', num_inputs=1, num_outputs=0) otpt = Output(model, 'output', max_flow=99999, cost=-99999) storage.connect(otpt) p = ConstantParameter(model, 20.0) storage.max_volume = p storage.initial_volume = 10.0 model.setup() np.testing.assert_allclose(storage.current_pc, 0.5) model.run() p.set_double_variables(np.asarray([40.0, ])) model.reset() np.testing.assert_allclose(storage.current_pc, 0.25)
def test_control_curve_interpolated(model): m = model m.timestepper.delta = 200 s = m.nodes['Storage'] o = m.nodes['Output'] s.connect(o) cc = ConstantParameter(model, 0.8) values = [20.0, 5.0, 0.0] s.cost = p = ControlCurveInterpolatedParameter(model, s, cc, values) @assert_rec(model, p) def expected_func(timestep, scenario_index): v = s.initial_volume c = cc.value(timestep, scenario_index) if c == 1.0 and v == 100.0: expected = values[1] elif c == 0.0 and v == 0.0: expected = values[1] else: expected = np.interp(v/100.0, [0.0, c, 1.0], values[::-1]) return expected for control_curve in (0.0, 0.8, 1.0): cc.set_double_variables(np.array([control_curve,])) for initial_volume in (0.0, 10.0, 50.0, 80.0, 90.0, 100.0): s.initial_volume = initial_volume model.run()
def test_control_curve_interpolated(model, use_parameters): m = model m.timestepper.delta = 200 s = m.nodes["Storage"] o = m.nodes["Output"] s.connect(o) cc = ConstantParameter(model, 0.8) values = [20.0, 5.0, 0.0] if use_parameters: # Create the parameter using parameters for the values parameters = [ConstantParameter(model, v) for v in values] s.cost = p = ControlCurveInterpolatedParameter(model, s, cc, parameters=parameters) else: # Create the parameter using a list of values s.cost = p = ControlCurveInterpolatedParameter(model, s, cc, values) @assert_rec(model, p) def expected_func(timestep, scenario_index): v = s.initial_volume c = cc.value(timestep, scenario_index) if c == 1.0 and v == 100.0: expected = values[1] elif c == 0.0 and v == 0.0: expected = values[1] else: expected = np.interp(v / 100.0, [0.0, c, 1.0], values[::-1]) return expected for control_curve in (0.0, 0.8, 1.0): cc.set_double_variables(np.array([ control_curve, ])) for initial_volume in (0.0, 10.0, 50.0, 80.0, 90.0, 100.0): s.initial_volume = initial_volume model.run()