def _assert_results(self, model, s, p, scale=1.0): # Test correct aggregation is performed s.setup(model) # Init memory view on storage (bypasses usual `Model.setup`) s.initial_volume = 90.0 model.reset() # Set initial volume on storage ts = next(model.timestepper) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 1.0*scale) s.initial_volume = 70.0 model.reset() # Set initial volume on storage ts = next(model.timestepper) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 0.7 * (mth - 1)*scale) s.initial_volume = 30.0 model.reset() # Set initial volume on storage ts = next(model.timestepper) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 0.3*scale)
def test_scaled_profile_nested_load(model): """ Test `ScaledProfileParameter` loading with `AggregatedParameter` """ s = Storage(model, 'Storage', max_volume=100.0) l = Link(model, 'Link') data = { 'type': 'scaledprofile', 'scale': 50.0, 'profile': { 'type': 'aggregated', 'agg_func': 'product', 'parameters': [{ 'type': 'monthlyprofile', 'values': [0.5] * 12 }, { 'type': 'monthlyprofilecontrolcurve', 'control_curves': [0.8, 0.6], 'values': [[1.0] * 12, [0.7] * np.arange(12), [0.3] * 12], 'storage_node': 'Storage' }] } } l.max_flow = p = load_parameter(model, data) p.setup(model) # Test correct aggregation is performed model.scenarios.setup() s.setup( model) # Init memory view on storage (bypasses usual `Model.setup`) s.initial_volume = 90.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 50.0 * 0.5 * 1.0) s.initial_volume = 70.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 50.0 * 0.5 * 0.7 * (mth - 1)) s.initial_volume = 30.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 50.0 * 0.5 * 0.3)
def test_daily_license(): '''Test daily licence''' si = ScenarioIndex(0, np.array([0], dtype=np.int32)) lic = TimestepLicense(None, 42.0) assert(isinstance(lic, License)) assert(lic.value(Timestep(datetime(2015, 1, 1), 0, 0), si) == 42.0) # daily licences don't have resource state assert(lic.resource_state(Timestep(datetime(2015, 1, 1), 0, 0)) is None)
def test_daily_license(simple_linear_model): '''Test daily licence''' m = simple_linear_model si = ScenarioIndex(0, np.array([0], dtype=np.int32)) lic = TimestepLicense(m, None, 42.0) assert (isinstance(lic, License)) assert (lic.value(Timestep(pandas.Period('2015-1-1'), 0, 1), si) == 42.0) # daily licences don't have resource state assert (lic.resource_state(Timestep(pandas.Period('2015-1-1'), 0, 1)) is None)
def test_threshold_parameter(model): class DummyRecorder(Recorder): def __init__(self, *args, **kwargs): super(DummyRecorder, self).__init__(*args, **kwargs) self.data = np.array([[0.0]], dtype=np.float64) rec = DummyRecorder(model) timestep = Timestep(datetime.datetime(2016, 1, 2), 1, 1) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) threshold = 10.0 values = [50.0, 60.0] expected = [ ("LT", (1, 0, 0)), ("GT", (0, 0, 1)), ("EQ", (0, 1, 0)), ("LE", (1, 1, 0)), ("GE", (0, 1, 1)), ] for predicate, (value_lt, value_eq, value_gt) in expected: param = RecorderThresholdParameter(rec, threshold, values, predicate) rec.data[...] = threshold - 5 # data is below threshold assert_allclose(param.value(timestep, si), values[value_lt]) assert (param.index(timestep, si) == value_lt) rec.data[...] = threshold # data is at threshold assert_allclose(param.value(timestep, si), values[value_eq]) assert (param.index(timestep, si) == value_eq) rec.data[...] = threshold + 5 # data is above threshold assert_allclose(param.value(timestep, si), values[value_gt]) assert (param.index(timestep, si) == value_gt)
def test_daily_profile_control_curve(model): """ Test `DailyProfileControlCurveParameter` """ s = Storage(model, 'Storage', max_volume=100.0) l = Link(model, 'Link') data = { 'type': 'dailyprofilecontrolcurve', 'control_curves': [0.8, 0.6], 'values': [[1.0]*366, [0.7]*np.arange(366), [0.3]*366], 'storage_node': 'Storage' } l.max_flow = p = load_parameter(model, data) p.setup(model) # Test correct aggregation is performed model.scenarios.setup() s.setup(model) # Init memory view on storage (bypasses usual `Model.setup`) s.initial_volume = 90.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 1.0) s.initial_volume = 70.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) doy = ts.datetime.dayofyear np.testing.assert_allclose(p.value(ts, si), 0.7*(doy - 1)) s.initial_volume = 30.0 model.reset() # Set initial volume on storage si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), 0.3)
def test_parameter_array_indexed(model): """ Test ArrayIndexedParameter """ A = np.arange(len(model.timestepper), dtype=np.float64) p = ArrayIndexedParameter(A) p.setup(model) # scenario indices (not used for this test) si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for v, ts in zip(A, model.timestepper): np.testing.assert_allclose(p.value(ts, si), v) # Now check that IndexError is raised if an out of bounds Timestep is given. ts = Timestep(datetime.datetime(2016, 1, 1), 366, 1.0) with pytest.raises(IndexError): p.value(ts, si)
def test_load(self, model): """ Test load from JSON dict""" data = { "type": "aggregated", "agg_func": "product", "parameters": [0.8, { "type": "monthlyprofile", "values": list(range(12)) }] } p = load_parameter(model, data) # Correct instance is loaded assert isinstance(p, AggregatedParameter) # Test correct aggregation is performed si = ScenarioIndex(0, np.array([0], dtype=np.int32)) for mth in range(1, 13): ts = Timestep(datetime.datetime(2016, mth, 1), 366, 1.0) np.testing.assert_allclose(p.value(ts, si), (mth - 1) * 0.8)
def build_timestep(model, date): dt = pandas.to_datetime(date) timestep = Timestep(dt, (dt - model.timestepper.start).days, 1) return timestep