/
test_piecewise.py
73 lines (54 loc) · 2.23 KB
/
test_piecewise.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from __future__ import print_function
import pywr.core
from pywr.parameters import ConstantParameter
import datetime
import numpy as np
from numpy.testing import assert_allclose
import pytest
from helpers import assert_model, load_model
@pytest.fixture(params=[(10.0, 10.0, 10.0), (5.0, 5.0, 1.0)])
def simple_piecewise_model(request):
"""
Make a simple model with a single Input and Output and PiecewiseLink
Input -> PiecewiseLink -> Output
"""
in_flow, out_flow, benefit = request.param
min_flow_req = 5.0
model = pywr.core.Model()
inpt = pywr.core.Input(model, name="Input", max_flow=in_flow)
lnk = pywr.core.PiecewiseLink(model, name="Link", cost=[-1.0, 0.0], max_flow=[min_flow_req, None])
inpt.connect(lnk)
otpt = pywr.core.Output(model, name="Output", min_flow=out_flow, cost=-benefit)
lnk.connect(otpt)
default = inpt.domain
expected_sent = in_flow if benefit > 1.0 else out_flow
expected_node_results = {
"Input": expected_sent,
"Link": expected_sent,
"Link Sublink 0": min(min_flow_req, expected_sent),
"Link Sublink 1": expected_sent - min(min_flow_req, expected_sent),
"Output": expected_sent,
}
return model, expected_node_results
def test_piecewise_model(simple_piecewise_model):
assert_model(*simple_piecewise_model)
def test_piecewise_json():
"""Test loading of a piecewise link from JSON"""
model = load_model("piecewise1.json")
sublinks = model.nodes["link1"].sublinks
max_flows = [sublink.max_flow for sublink in sublinks]
costs = [sublink.cost for sublink in sublinks]
assert_allclose(max_flows, [20, np.inf])
assert_allclose(costs, [-10, 5])
model.run()
assert_allclose(model.nodes["demand1"].flow, 20)
def test_piecewise_with_parameters_json():
"""Test using parameters with piecewise link."""
model = load_model("piecewise1_with_parameters.json")
sublinks = model.nodes["link1"].sublinks
assert isinstance(sublinks[0].max_flow, ConstantParameter)
assert np.isinf(sublinks[1].max_flow)
assert isinstance(sublinks[0].cost, ConstantParameter)
assert isinstance(sublinks[1].cost, ConstantParameter)
model.run()
assert_allclose(model.nodes["demand1"].flow, 20)