Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
m.nodes['Output'].cost = -10.0
data = {
"type": "parameterthreshold",
"parameter": {
"type": "constant",
"value": 3.0
},
"threshold": threshold,
"predicate": "<",
"ratchet": ratchet
}
p1 = load_parameter(m, data)
si = ScenarioIndex(0, np.array([0], dtype=np.int32))
# Triggered initial 3 < 5
m.setup()
m.step()
assert p1.index(m.timestepper.current, si) == 1
# Update parameter, now 8 > 5; not triggered.
p1.param.set_double_variables(np.array([8.0,]))
m.step()
# If using a ratchet the trigger remains on.
assert p1.index(m.timestepper.current, si) == (1 if ratchet else 0)
# Resetting the model resets the ratchet too.
m.reset()
m.step()
# flow < 5
def test_load(self, model):
data = {
"type": "annualharmonicseries",
"mean": 0.5,
"amplitudes": [0.25],
"phases": [np.pi/4]
}
p1 = load_parameter(model, data)
si = ScenarioIndex(0, np.array([0], dtype=np.int32))
for ts in model.timestepper:
doy = (ts.datetime.dayofyear - 1) / 365
np.testing.assert_allclose(p1.value(ts, si), 0.5 + 0.25 * np.cos(doy * 2 * np.pi + np.pi / 4))
# Use a 7 day timestep for this test and run 2015
model.timestepper.delta = datetime.timedelta(7)
model.timestepper.start = pd.to_datetime('2015-01-01')
model.timestepper.end = pd.to_datetime('2015-12-31')
model.timestepper.setup()
# Daily time-step
index = pd.date_range('2015-01-01', periods=365, freq='D')
df = pd.DataFrame(np.random.rand(365, 20), index=index)
p = DataFrameParameter(model, df, scenario=scA)
p.setup()
A = df.resample('7D', axis=0).mean()
for v, ts in zip(A.values, model.timestepper):
np.testing.assert_allclose([p.value(ts, ScenarioIndex(i, np.array([i], dtype=np.int32))) for i in range(20)], v)
p = DataFrameParameter(model, df, scenario=scB)
with pytest.raises(ValueError):
p.setup()
scA = Scenario(model, 'Scenario A', size=2)
scB = Scenario(model, 'Scenario B', size=5)
# Random factors for each Scenario B value per month
factors = np.random.rand(scB.size, 12)
p = ArrayIndexedScenarioMonthlyFactorsParameter(model, scB, values, factors)
model.setup()
# Iterate in time
for v, ts in zip(values, model.timestepper):
imth = ts.datetime.month - 1
# Now ensure the appropriate value is returned for the Scenario B indices.
for i, (a, b) in enumerate(itertools.product(range(scA.size), range(scB.size))):
f = factors[b, imth]
si = ScenarioIndex(i, np.array([a, b], dtype=np.int32))
np.testing.assert_allclose(p.value(ts, si), v*f)
def test_target_json(self):
""" Test loading a HydropowerTargetParameter from JSON. """
model = load_model("hydropower_target_example.json")
si = ScenarioIndex(0, np.array([0], dtype=np.int32))
# 30 time-steps are run such that the head gets so flow to hit the max_flow
# constraint. The first few time-steps are also bound by the min_flow constraint.
for i in range(30):
model.step()
rec = model.recorders["turbine1_energy"]
param = model.parameters["turbine1_discharge"]
turbine1 = model.nodes["turbine1"]
assert turbine1.flow[0] > 0
if np.allclose(turbine1.flow[0], 500.0):
# If flow is bounded by min_flow then more HP is produced.
assert rec.data[i, 0] > param.target.get_value(si)
elif np.allclose(turbine1.flow[0], 1000.0):
def test_parameter_array_indexed(simple_linear_model):
"""
Test ArrayIndexedParameter
"""
model = simple_linear_model
A = np.arange(len(model.timestepper), dtype=np.float64)
p = ArrayIndexedParameter(model, A)
model.setup()
# 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(pd.Period('2016-01-01', freq='1D'), 366, 1)
with pytest.raises(IndexError):
p.value(ts, si)
def test_simple_model_with_exponential_license(simple_linear_model):
m = simple_linear_model
si = ScenarioIndex(0, np.array([0], dtype=np.int32))
annual_total = 365
# Expoential licence with max_value of e should give a hard constraint of 1.0 when on track
lic = AnnualExponentialLicense(m, m.nodes["Input"], annual_total, np.e)
# Apply licence to the model
m.nodes["Input"].max_flow = lic
m.nodes["Output"].max_flow = 10.0
m.nodes["Output"].cost = -10.0
m.setup()
m.step()
# Licence is a hard constraint of 1.0
# timestepper.current is now end of the first day
assert_allclose(m.nodes["Output"].flow, 1.0)
# Check the constraint for the next timestep.
def test_simple_model_with_hyperbola_license(simple_linear_model):
m = simple_linear_model
si = ScenarioIndex(0, np.array([0], dtype=np.int32))
annual_total = 365
# Expoential licence with max_value of e should give a hard constraint of 1.0 when on track
lic = AnnualHyperbolaLicense(m, m.nodes["Input"], annual_total, 1.0)
# Apply licence to the model
m.nodes["Input"].max_flow = lic
m.nodes["Output"].max_flow = 10.0
m.nodes["Output"].cost = -10.0
m.setup()
m.step()
# Licence is a hard constraint of 1.0
# timestepper.current is now end of the first day
assert_allclose(m.nodes["Output"].flow, 1.0)
# Check the constraint for the next timestep.
df = pd.DataFrame(np.arange(365), index=index, columns=['data'])
df_path = tmpdir.join('df.csv')
df.to_csv(str(df_path))
data = {
'type': 'arrayindexed',
'url': str(df_path),
'index_col': 'date',
'parse_dates': True,
'column': 'data',
}
p = load_parameter(model, data)
model.setup()
si = ScenarioIndex(0, np.array([0], dtype=np.int32))
for v, ts in enumerate(model.timestepper):
np.testing.assert_allclose(p.value(ts, si), v)
def test_parameter_daily_profile(simple_linear_model):
"""
Test DailyProfileParameter
"""
model = simple_linear_model
values = np.arange(366, dtype=np.float64)
p = DailyProfileParameter(model, values)
model.setup()
# Iterate in time
for ts in model.timestepper:
month = ts.datetime.month
day = ts.datetime.day
iday = int((datetime.datetime(2016, month, day) - datetime.datetime(2016, 1, 1)).days)
si = ScenarioIndex(0, np.array([0], dtype=np.int32))
np.testing.assert_allclose(p.value(ts, si), values[iday])