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_max_flow(model): """Nodes constrained by the max_flow of their AggregatedNode""" A = Input(model, "A", max_flow=20.0, cost=1) B = Input(model, "B", max_flow=20.0, cost=2) Z = Output(model, "Z", max_flow=100, cost=-10) A.connect(Z) B.connect(Z) agg = AggregatedNode(model, "agg", [A, B]) agg.max_flow = 30.0 model.run() assert_allclose(agg.flow, 30.0) assert_allclose(A.flow, 20.0) assert_allclose(B.flow, 10.0)
def test_aggregated_node_max_flow_same_route(model): """Unusual case where the aggregated nodes are in the same route""" A = Input(model, "A", max_flow=20.0, cost=1) B = Input(model, "B", max_flow=20.0, cost=2) C = Input(model, "C", max_flow=50.0, cost=0) Z = Output(model, "Z", max_flow=100, cost=-10) A.connect(B) B.connect(Z) C.connect(Z) agg = AggregatedNode(model, "agg", [A, B]) agg.max_flow = 30.0 model.run() assert_allclose(agg.flow, 30.0) assert_allclose(A.flow + B.flow, 30.0)
def test_aggregated_node_max_flow_with_weights(model, flow_weights, expected_agg_flow, expected_A_flow, expected_B_flow): """Nodes constrained by the weighted max_flow of their AggregatedNode""" A = Input(model, "A", max_flow=20.0, cost=1) B = Input(model, "B", max_flow=20.0, cost=8) Z = Output(model, "Z", max_flow=100, cost=-10) A.connect(Z) B.connect(Z) agg = AggregatedNode(model, "agg", [A, B]) agg.flow_weights = flow_weights agg.max_flow = 30.0 model.run() assert_allclose(agg.flow, expected_agg_flow) assert_allclose(A.flow, expected_A_flow) assert_allclose(B.flow, expected_B_flow)