def test_aggregated_node_two_factors_time_varying(model): """Nodes constrained by a time-varying ratio between flows (2 nodes)""" model.timestepper.end = Timestamp("2016-01-03") A = Input(model, "A") B = Input(model, "B", max_flow=40.0) Z = Output(model, "Z", max_flow=100, cost=-10) agg = AggregatedNode(model, "agg", [A, B]) agg.factors = [0.5, 0.5] assert_allclose(agg.factors, [0.5, 0.5]) A.connect(Z) B.connect(Z) model.setup() model.step() assert_allclose(agg.flow, 80.0) assert_allclose(A.flow, 40.0) assert_allclose(B.flow, 40.0) agg.factors = [1.0, 2.0] model.step() assert_allclose(agg.flow, 60.0) assert_allclose(A.flow, 20.0) assert_allclose(B.flow, 40.0)
def test_dynamic_factors(model): model.timestepper.end = Timestamp("2016-01-03") A = Input(model, "A", max_flow=10.0) B = Input(model, "B", max_flow=10.0) C = Input(model, "C", max_flow=10.0) Z = Output(model, "Z", cost=-10) agg = AggregatedNode(model, "agg", [A, B, C]) agg.max_flow = 10.0 factor1 = DailyProfileParameter( model, np.append(np.array([0.8, 0.3]), np.ones(364))) factor2 = DailyProfileParameter( model, np.append(np.array([0.1, 0.3]), np.ones(364))) factor3 = DailyProfileParameter( model, np.append(np.array([0.1, 0.4]), np.ones(364))) agg.factors = [factor1, factor2, factor3] A.connect(Z) B.connect(Z) C.connect(Z) model.step() assert_allclose(A.flow, 8) assert_allclose(B.flow, 1) assert_allclose(C.flow, 1) model.step() assert_allclose(A.flow, 3) assert_allclose(B.flow, 3) assert_allclose(C.flow, 4)
def test_aggregated_node_two_factors(model): """Nodes constrained by a fixed ratio between flows (2 nodes)""" A = Input(model, "A") B = Input(model, "B", max_flow=40.0) Z = Output(model, "Z", max_flow=100, cost=-10) agg = AggregatedNode(model, "agg", [A, B]) agg.factors = [0.5, 0.5] assert_allclose(agg.factors, [0.5, 0.5]) A.connect(Z) B.connect(Z) model.run() assert_allclose(agg.flow, 80.0) assert_allclose(A.flow, 40.0) assert_allclose(B.flow, 40.0)
def test_piecewise_constraint(model, flow): """Test using an aggregated node constraint in combination with a piecewise link in order to create a minimum flow constraint of the form y = mx + c, where y is the MRF, x is the upstream flow and m and c are constants. Flows are tested at 100, 200 and 300 to ensure the aggregated ratio works when there is too much to route entirely through to node 'D'. :: / -->-- X0 -->-- \ A -->-- Xo -->-- X1 -->-- Xi -->-- C \\ -->-- X2 -->-- / | Bo -->-- Bi --> D """ A = Input(model, "A", min_flow=flow, max_flow=flow) X = PiecewiseLink(model, name="X", nsteps=3, costs=[-500.0, 0, 0], max_flows=[40.0, None, None]) C = Output(model, "C") A.connect(X) X.connect(C) # create a new input inside the piecewise link which only has access # to flow travelling via the last sublink (X2) Bo = Output(model, "Bo", domain=X.sub_domain) Bi = Input(model, "Bi") D = Output(model, "D", max_flow=50, cost=-100) Bo.connect(Bi) Bi.connect(D) X.sublinks[-1].connect(Bo) agg = AggregatedNode(model, "agg", X.sublinks[1:]) agg.factors = [3.0, 1.0] model.step() assert_allclose(D.flow, min((flow - 40) * 0.25, 50.0))
def test_aggregated_node_two_factors(model): """Nodes constrained by a fixed ratio between flows (2 nodes)""" A = Input(model, "A") B = Input(model, "B", max_flow=40.0) Z = Output(model, "Z", max_flow=100, cost=-10) agg = AggregatedNode(model, "agg", [A, B]) agg.factors = [0.5, 0.5] for f in agg.factors: assert isinstance(f, ConstantParameter) assert_allclose(f.get_double_variables(), 0.5) A.connect(Z) B.connect(Z) model.run() assert_allclose(agg.flow, 80.0) assert_allclose(A.flow, 40.0) assert_allclose(B.flow, 40.0)
def test_aggregated_node_three_factors(model): """Nodes constrained by a fixed ratio between flows (3 nodes)""" A = Input(model, "A") B = Input(model, "B", max_flow=10.0) C = Input(model, "C") Z = Output(model, "Z", max_flow=100, cost=-10) agg = AggregatedNode(model, "agg", [A, B, C]) agg.factors = [0.5, 1.0, 2.0] assert_allclose(agg.factors, [0.5, 1.0, 2.0]) A.connect(Z) B.connect(Z) C.connect(Z) model.run() assert_allclose(agg.flow, 35.0) assert_allclose(A.flow, 5.0) assert_allclose(B.flow, 10.0) assert_allclose(C.flow, 20.0)
def test_aggregated_node_three_factors(model): """Nodes constrained by a fixed ratio between flows (3 nodes)""" A = Input(model, "A") B = Input(model, "B", max_flow=10.0) C = Input(model, "C") Z = Output(model, "Z", max_flow=100, cost=-10) agg = AggregatedNode(model, "agg", [A, B, C]) agg.factors = [0.5, 1.0, 2.0] for f, v in zip(agg.factors, [0.5, 1.0, 2.0]): assert isinstance(f, ConstantParameter) assert_allclose(f.get_double_variables(), v) A.connect(Z) B.connect(Z) C.connect(Z) model.run() assert_allclose(agg.flow, 35.0) assert_allclose(A.flow, 5.0) assert_allclose(B.flow, 10.0) assert_allclose(C.flow, 20.0)