Newer
Older
# ValueError('The number of capacity values must match the number of
Pedro L. Magalhães
committed
# options.')
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(1 + o for o in range(number_options + 1)),
minimum_cost=tuple(1 + o for o in range(number_options + 1)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
validate=True,
)
error_triggered = False
Pedro L. Magalhães
committed
try:
arc_tech.validate_sizes(
number_options=number_options,
number_scenarios=number_scenarios,
number_intervals=[
number_time_intervals for _ in range(number_scenarios)
],
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
# ValueError: The minimum cost values are inconsistent with the number
Pedro L. Magalhães
committed
# of options.
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(1 + o for o in range(number_options + 1)),
minimum_cost=tuple(1 + o for o in range(number_options + 1)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
validate=True,
)
error_triggered = False
Pedro L. Magalhães
committed
try:
arc_tech.validate_sizes(
number_options=number_options,
number_scenarios=number_scenarios,
number_intervals=[
number_time_intervals for _ in range(number_scenarios)
],
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# TypeError('Efficiency values must be provided as numeric types.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency={
key: str(value) for key, value in efficiency_dict.items()
},
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(1 + o for o in range(number_options)),
minimum_cost=tuple(1 + o for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# ValueError('Efficiency values must be positive.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency={
key: -value * random.randint(0, 1)
for key, value in efficiency_dict.items()
},
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(1 + o for o in range(number_options)),
minimum_cost=tuple(1 + o for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# TypeError('Capacity values must be provided as numeric types.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency=efficiency_dict,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(str(1 + o) for o in range(number_options)),
minimum_cost=tuple(1 + o for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# ValueError('Capacity values must be positive.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(
-random.randint(0, 1) for o in range(number_options)
),
minimum_cost=tuple(1 + o for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# TypeError('Minimum cost values must be provided as numeric types.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency=efficiency_dict,
efficiency_reverse=None,
static_loss=None,
capacity=tuple(1 + o for o in range(number_options)),
minimum_cost=tuple(str(1 + o) for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# ValueError('Minimum cost values must be positive or zero.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(1 + o for o in range(number_options)),
minimum_cost=tuple(-1 for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
# TypeError('The information about capacities being instantaneous or not
Pedro L. Magalhães
committed
# should be given as a boolean variable.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(1 + o for o in range(number_options)),
minimum_cost=tuple(1 + o for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=1,
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# *********************************************************************
# *********************************************************************
Pedro L. Magalhães
committed
# Network
Pedro L. Magalhães
committed
arc_tech_AB = Arcs(
name="AB",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=tuple(1 + o for o in range(number_options)),
minimum_cost=tuple(1 + o for o in range(number_options)),
specific_capacity_cost=1,
Pedro L. Magalhães
committed
capacity_is_instantaneous=False,
Pedro L. Magalhães
committed
arc_tech_AB.options_selected[0] = True
Pedro L. Magalhães
committed
assert arc_tech_AB.number_options() == number_options
Pedro L. Magalhães
committed
net = Network()
Pedro L. Magalhães
committed
# add undirected arc
net.add_undirected_arc(node_key_a="A", node_key_b="B", arcs=arc_tech_AB)
Pedro L. Magalhães
committed
# add directed arc
net.add_directed_arc(node_key_a="A", node_key_b="B", arcs=arc_tech_AB)
Pedro L. Magalhães
committed
# add infinite capacity arc
Pedro L. Magalhães
committed
net.add_infinite_capacity_arc(
node_key_a="C",
node_key_b="D",
efficiency={(i, j): 1 for i in range(3) for j in range(4)},
static_loss=None,
)
Pedro L. Magalhães
committed
# add pre-existing directed arc
Pedro L. Magalhães
committed
net.add_preexisting_directed_arc(
node_key_a="E",
node_key_b="F",
efficiency=efficiency_dict,
static_loss=None,
capacity=3,
capacity_is_instantaneous=True,
)
Pedro L. Magalhães
committed
# add pre-existing undirected arc
Pedro L. Magalhães
committed
net.add_preexisting_undirected_arc(
node_key_a="A",
node_key_b="C",
efficiency=efficiency_dict,
efficiency_reverse=efficiency_dict,
static_loss=None,
capacity=3,
capacity_is_instantaneous=True,
)
Pedro L. Magalhães
committed
net.modify_network_arc(
node_key_a="A",
node_key_b="C",
arc_key_ab="AC",
data_dict={net.KEY_ARC_TECH: arc_tech_AB, net.KEY_ARC_UND: False},
)
Pedro L. Magalhães
committed
# *********************************************************************
# *********************************************************************
Pedro L. Magalhães
committed
# add import node
Pedro L. Magalhães
committed
imp_resource_price = ResourcePrice(
prices=[random.random() for k in range(number_time_intervals)],
volumes=[
*[random.random() for k in range(number_time_intervals - 1)],
None,
],
)
net.add_import_node(node_key="G", prices={(0, 0, 0): imp_resource_price})
Pedro L. Magalhães
committed
# add export node
Pedro L. Magalhães
committed
exp_resource_price = ResourcePrice(
prices=[random.random() for k in range(number_time_intervals)],
volumes=[
*[random.random() for k in range(number_time_intervals - 1)],
None,
],
)
net.add_export_node(node_key="H", prices={(0, 0, 0): exp_resource_price})
net.add_waypoint_node(node_key="Z")
base_flow = {(i, j): random.random() for i in range(3) for j in range(4)}
net.add_source_sink_node(node_key="Y", base_flow=base_flow)
base_flow[(2, 3)] = random.random()
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="Y", node_data={net.KEY_NODE_BASE_FLOW: base_flow}
)
Pedro L. Magalhães
committed
net.identify_node_types()
assert "Z" in net.waypoint_nodes
assert "G" in net.import_nodes
assert "H" in net.export_nodes
assert "Y" in net.source_sink_nodes
Pedro L. Magalhães
committed
# *************************************************************************
# *************************************************************************
def test_arcs_without_losses(self):
# test arc without (static and proportional) losses
Pedro L. Magalhães
committed
arc_tech = ArcsWithoutLosses(
name="AB",
capacity=(1, 2, 3),
minimum_cost=(4, 5, 6),
specific_capacity_cost=6,
Pedro L. Magalhães
committed
capacity_is_instantaneous=False,
Pedro L. Magalhães
committed
assert not arc_tech.has_proportional_losses()
Pedro L. Magalhães
committed
assert not arc_tech.has_static_losses()
Pedro L. Magalhães
committed
assert not arc_tech.is_infinite_capacity()
Pedro L. Magalhães
committed
assert arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# test arc without static losses
Pedro L. Magalhães
committed
arc_tech = ArcsWithoutStaticLosses(
name="AB",
efficiency={(0, 0): 1, (0, 1): 0.9, (0, 2): 0.8},
efficiency_reverse=None,
capacity=(1, 2, 3),
minimum_cost=(4, 5, 6),
specific_capacity_cost=6,
Pedro L. Magalhães
committed
capacity_is_instantaneous=False,
Pedro L. Magalhães
committed
assert arc_tech.has_proportional_losses()
Pedro L. Magalhães
committed
assert not arc_tech.has_static_losses()
Pedro L. Magalhães
committed
assert not arc_tech.is_infinite_capacity()
Pedro L. Magalhães
committed
assert not arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# test arc without proportional losses
Pedro L. Magalhães
committed
arc_tech = ArcsWithoutProportionalLosses(
name="AB",
static_loss={
(0, 0, 0): 0.1,
(0, 0, 1): 0.2,
(0, 0, 2): 0.3,
(1, 0, 0): 0.15,
(1, 0, 1): 0.25,
(1, 0, 2): 0.35,
(2, 0, 0): 0.16,
(2, 0, 1): 0.26,
(2, 0, 2): 0.36,
},
capacity=(1, 2, 3),
minimum_cost=(4, 5, 6),
specific_capacity_cost=6,
Pedro L. Magalhães
committed
capacity_is_instantaneous=False,
Pedro L. Magalhães
committed
assert not arc_tech.has_proportional_losses()
Pedro L. Magalhães
committed
assert arc_tech.has_static_losses()
Pedro L. Magalhães
committed
assert not arc_tech.is_infinite_capacity()
Pedro L. Magalhães
committed
assert arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# *************************************************************************
# *************************************************************************
Pedro L. Magalhães
committed
def test_modifying_nodes(self):
# *********************************************************************
Pedro L. Magalhães
committed
net = Network()
Pedro L. Magalhães
committed
number_intervals = 3
Pedro L. Magalhães
committed
resource_price = ResourcePrice(
prices=[random.random() for k in range(number_intervals)],
volumes=[*[random.random() for k in range(number_intervals - 1)], None],
)
base_flow = {(0, k): random.random() for k in range(number_intervals)}
Pedro L. Magalhães
committed
arc_tech = ArcsWithoutLosses(
name="hello",
capacity=[5],
minimum_cost=[3],
specific_capacity_cost=3,
capacity_is_instantaneous=False,
)
Pedro L. Magalhães
committed
# add isolated import node
net.add_import_node(node_key="I_iso", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# add import node with outgoing arcs
net.add_import_node(node_key="I", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# add isolated export node
net.add_import_node(node_key="E_iso", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# add export node with incoming arcs
net.add_export_node(node_key="E", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# add isolated normal node
net.add_source_sink_node(node_key="A_iso", base_flow=base_flow)
Pedro L. Magalhães
committed
# add normal node with incoming arcs
net.add_source_sink_node(node_key="A_in", base_flow=base_flow)
Pedro L. Magalhães
committed
# add normal node with outgoing arcs
net.add_source_sink_node(node_key="A_out", base_flow=base_flow)
Pedro L. Magalhães
committed
# add normal node with incoming and outgoing arcs
net.add_source_sink_node(node_key="A", base_flow=base_flow)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# arcs
net.add_directed_arc(node_key_a="I", node_key_b="A_in", arcs=arc_tech)
net.add_directed_arc(node_key_a="I", node_key_b="A", arcs=arc_tech)
net.add_directed_arc(node_key_a="A_out", node_key_b="E", arcs=arc_tech)
net.add_directed_arc(node_key_a="A", node_key_b="E", arcs=arc_tech)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change I_iso to regular: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# change I_iso to export: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# change I_iso to waypoint: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I_iso", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change E_iso to regular: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# change E_iso to import: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# change E_iso to waypoint: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E_iso", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change A_iso to export: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# change A_iso to import: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# change A_iso to waypoint: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_iso", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_iso",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change I to regular: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# change I to waypoint: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="I",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change E to regular: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# change E to waypoint: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="E",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change A_in to export: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_in",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_in",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# change A_in to waypoint: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_in", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_in",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change A_out to import: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_out",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_out",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# change A_out to waypoint: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_out", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
# reverse: okay
Pedro L. Magalhães
committed
net.modify_network_node(
node_key="A_out",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
net.KEY_NODE_BASE_FLOW: base_flow,
},
)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# change I to export: fail
Pedro L. Magalhães
committed
error_triggered = False
try:
net.modify_network_node(
node_key="I",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# change E to import: fail
Pedro L. Magalhães
committed
error_triggered = False
try:
net.modify_network_node(
node_key="E",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# change A_out to export: fail
Pedro L. Magalhães
committed
error_triggered = False
try:
net.modify_network_node(
node_key="A_out",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# change A_in to import: fail
Pedro L. Magalhães
committed
error_triggered = False
try:
net.modify_network_node(
node_key="A_in",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# change A to export: fail
Pedro L. Magalhães
committed
error_triggered = False
try:
net.modify_network_node(
node_key="A",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# change A to import: fail
Pedro L. Magalhães
committed
error_triggered = False
try:
net.modify_network_node(
node_key="A",
node_data={
net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
net.KEY_NODE_PRICES: resource_price,
},
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# try to modify a non-existent node
Pedro L. Magalhães
committed
error_triggered = False
try:
net.modify_network_node(
node_key="ABCD", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# *************************************************************************
# *************************************************************************
Pedro L. Magalhães
committed
def test_network_disallowed_cases(self):
Pedro L. Magalhães
committed
net = Network()
Pedro L. Magalhães
committed
number_intervals = 3
Pedro L. Magalhães
committed
resource_price = ResourcePrice(
prices=[random.random() for k in range(number_intervals)],
volumes=[*[random.random() for k in range(number_intervals - 1)], None],
)
base_flow = {(0, k): random.random() for k in range(number_intervals)}
Pedro L. Magalhães
committed
lossless_arcs = ArcsWithoutLosses(
name="hello",
capacity=[5],
minimum_cost=[3],
specific_capacity_cost=3,
capacity_is_instantaneous=False,
)
Pedro L. Magalhães
committed
lossy_arcs = ArcsWithoutProportionalLosses(
name="hello back",
static_loss={(0, 0, k): random.random() for k in range(number_intervals)},
Pedro L. Magalhães
committed
capacity=(1,),
Pedro L. Magalhães
committed
specific_capacity_cost=0,
Pedro L. Magalhães
committed
# add import node I
net.add_import_node(node_key="I", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# add export node E
net.add_export_node(node_key="E", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# add regular node A
net.add_source_sink_node(node_key="A", base_flow=base_flow)
Pedro L. Magalhães
committed
# add regular node B
net.add_source_sink_node(node_key="B", base_flow=base_flow)
Pedro L. Magalhães
committed
# add a valid import-export arc
net.add_directed_arc(node_key_a="I", node_key_b="E", arcs=lossless_arcs)
Pedro L. Magalhães
committed
# identify the nodes and validate
Pedro L. Magalhães
committed
net.identify_node_types()
Pedro L. Magalhães
committed
# *********************************************************************
# *********************************************************************
Pedro L. Magalhães
committed
# trigger errors using pre-identified nodes
Pedro L. Magalhães
committed
# directed arcs cannot start in an export node: E -> B
Pedro L. Magalhães
committed
error_triggered = False
try:
net.add_directed_arc(node_key_a="E", node_key_b="B", arcs=lossless_arcs)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# directed arcs cannot end on an import node: A -> I
Pedro L. Magalhães
committed
error_triggered = False
try:
net.add_directed_arc(node_key_a="A", node_key_b="I", arcs=lossless_arcs)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# import-export nodes cannot have static losses
Pedro L. Magalhães
committed
error_triggered = False
try:
net.add_directed_arc(node_key_a="I", node_key_b="E", arcs=lossy_arcs)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# undirected arcs cannot involve import nor export nodes
Pedro L. Magalhães
committed
error_triggered = False
try:
net.add_undirected_arc(node_key_a="I", node_key_b="A", arcs=lossless_arcs)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# undirected arcs cannot involve import nor export nodes
Pedro L. Magalhães
committed
error_triggered = False
try:
net.add_undirected_arc(node_key_a="B", node_key_b="E", arcs=lossless_arcs)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
# undirected arcs cannot involve import nor export nodes