Newer
Older
Pedro L. Magalhães
committed
# imports
# standard
import random
from networkx import binomial_tree, MultiDiGraph
# local
from src.topupopt.problems.esipp.network import Arcs, Network
from src.topupopt.problems.esipp.network import ArcsWithoutLosses
from src.topupopt.problems.esipp.network import ArcsWithoutProportionalLosses
from src.topupopt.problems.esipp.network import ArcsWithoutStaticLosses
from src.topupopt.problems.esipp.resource import ResourcePrice
# *****************************************************************************
# *****************************************************************************
# TODO: add test for directed arcs between import and export nodes with static losses
# TODO: add test for undirected arcs involving import and export nodes
Pedro L. Magalhães
committed
class TestNetwork:
# *************************************************************************
# *************************************************************************
def test_tree_topology(self):
# create a network object with a tree topology
Pedro L. Magalhães
committed
tree_network = binomial_tree(3, create_using=MultiDiGraph)
Pedro L. Magalhães
committed
network = Network(tree_network)
Pedro L. Magalhães
committed
for edge_key in network.edges(keys=True):
arc = ArcsWithoutLosses(
name=str(edge_key),
capacity=[5, 10],
minimum_cost=[3, 6],
specific_capacity_cost=0,
capacity_is_instantaneous=False,
)
network.add_edge(*edge_key, **{Network.KEY_ARC_TECH: arc})
Pedro L. Magalhães
committed
# assert that it does not have a tree topology
Pedro L. Magalhães
committed
assert not network.has_tree_topology()
Pedro L. Magalhães
committed
# select all the nodes
Pedro L. Magalhães
committed
for edge_key in network.edges(keys=True):
network.edges[edge_key][Network.KEY_ARC_TECH].options_selected[0] = True
Pedro L. Magalhães
committed
# assert that it has a tree topology
Pedro L. Magalhães
committed
assert network.has_tree_topology()
Pedro L. Magalhães
committed
# *************************************************************************
# *************************************************************************
Pedro L. Magalhães
committed
def test_arc_technologies_static_losses(self):
# *********************************************************************
# *********************************************************************
Pedro L. Magalhães
committed
number_time_intervals = 3
number_scenarios = 2
number_options = 4
Pedro L. Magalhães
committed
efficiency_dict = {
Pedro L. Magalhães
committed
for q in range(number_scenarios)
for k in range(number_time_intervals)
Pedro L. Magalhães
committed
static_loss_dict = {
Pedro L. Magalhães
committed
for h in range(number_options)
for q in range(number_scenarios)
for k in range(number_time_intervals)
Pedro L. Magalhães
committed
for capacity_is_instantaneous in (True, False):
arc_tech = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss=static_loss_dict,
Pedro L. Magalhães
committed
assert 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 not arc_tech.has_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
# isotropic
Pedro L. Magalhães
committed
arc_tech = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss=static_loss_dict,
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 not arc_tech.has_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
# create arc technology with only one option
Pedro L. Magalhães
committed
arc_tech = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=None,
capacity=(1,),
minimum_cost=(1,),
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
static_loss={
Pedro L. Magalhães
committed
for q in range(number_scenarios)
for k in range(number_time_intervals)
Pedro L. Magalhães
committed
assert 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 not arc_tech.has_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
# create arc technology for one time interval
Pedro L. Magalhães
committed
arc_tech = Arcs(
Pedro L. Magalhães
committed
efficiency={
(q, 0): 0.5
for q in range(number_scenarios)
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss={
Pedro L. Magalhães
committed
for h in range(number_options)
for q in range(number_scenarios)
# for k in range(number_time_intervals)
},
validate=True,
)
Pedro L. Magalhães
committed
assert 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 not arc_tech.has_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# TypeError: The static losses should be given as a dict or None.
Pedro L. Magalhães
committed
error_triggered = False
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss=tuple(
[k for k in range(number_time_intervals)]
for o in range(number_options)
),
validate=True,
)
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
# ValueError('The static losses should be specified for each arc
Pedro L. Magalhães
committed
# option.')
Pedro L. Magalhães
committed
error_triggered = False
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss={
Pedro L. Magalhães
committed
for h in range(number_options)
for q in range(number_scenarios)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# TypeError('The static losses must be specified via a list of lists.')
Pedro L. Magalhães
committed
error_triggered = False
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss=[
tuple(k for k in range(number_time_intervals))
for o in range(number_options)
],
validate=True,
)
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# ValueError('The static loss values are inconsistent with the number '
# 'of options, scenarios and intervals.')
Pedro L. Magalhães
committed
error_triggered = False
try:
arc_tech = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss={
Pedro L. Magalhães
committed
for h in range(number_options)
for q in range(number_scenarios)
for k in range(number_time_intervals - 1)
},
validate=True,
)
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('The static losses were not provided as numbers.')
Pedro L. Magalhães
committed
error_triggered = False
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss={
Pedro L. Magalhães
committed
for h in range(number_options)
for q in range(number_scenarios)
for k in range(number_time_intervals)
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# ValueError('The static losses must be positive or zero.')
Pedro L. Magalhães
committed
error_triggered = False
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=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,
static_loss={
Pedro L. Magalhães
committed
for h in range(number_options)
for q in range(number_scenarios)
for k in range(number_time_intervals)
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# TypeError: The static loss dict keys must be tuples
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency=None,
efficiency_reverse=None,
static_loss={k: 1 for k in range(number_time_intervals)},
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
# ValueError( 'The static loss dict keys must be tuples of size 3.')
error_triggered = False
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency=None,
efficiency_reverse=None,
static_loss={(k, 3): 1 for k in range(number_time_intervals)},
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(The staticl osses should be given as a dict or None.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse=None,
static_loss=[1 for k in range(number_time_intervals)],
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(
# 'No static loss values were provided. There should be one'+
# ' value per option, scenario and time interval.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency=None,
efficiency_reverse=None,
static_loss={},
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
# *************************************************************************
# *************************************************************************
def test_arc_technologies(self):
# *********************************************************************
Pedro L. Magalhães
committed
# create arc technology using instantaneous capacities
Pedro L. Magalhães
committed
number_scenarios = 2
number_options = 4
number_time_intervals = 3
Pedro L. Magalhães
committed
efficiency_dict = {
Pedro L. Magalhães
committed
for q in range(number_scenarios)
for k in range(number_time_intervals)
Pedro L. Magalhães
committed
for capacity_is_instantaneous in (True, False):
arc_tech = Arcs(
name="any",
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=capacity_is_instantaneous,
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_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
assert arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# create arc technology with only one option
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="any",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity=(1,),
minimum_cost=(1,),
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
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_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
assert arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# create arc technology for one time interval
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="any",
efficiency={(0, 0): 0.95},
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
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_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
assert arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# create arc technology for one time interval and isotropic
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="any",
efficiency={(0, 0): 0.95},
efficiency_reverse={(0, 0): 0.95},
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
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_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
assert arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# create arc technology for one time interval and anisotropic
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="any",
efficiency={(0, 0): 0.95},
efficiency_reverse={(0, 0): 1},
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
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_been_selected()
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
assert not arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# create arc technology for one time interval and anisotropic
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="any",
efficiency={(0, 0): 1},
efficiency_reverse={(0, 0): 0.95},
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
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_been_selected()
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
assert not arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# create arc technology for one time interval and anisotropic
Pedro L. Magalhães
committed
arc_tech = Arcs(
name="any",
efficiency={(0, 0): 0.95},
efficiency_reverse={(0, 0): 0.95},
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
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_been_selected()
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
Pedro L. Magalhães
committed
assert arc_tech.is_isotropic(reverse_none_means_isotropic=False)
Pedro L. Magalhães
committed
assert arc_tech.has_constant_efficiency()
Pedro L. Magalhães
committed
# *****************************************************************
# *****************************************************************
Pedro L. Magalhães
committed
# trigger errors
Pedro L. Magalhães
committed
# TypeError('The name attribute is not hashable.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name=[1, 2, 3],
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=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
# TypeError:The efficiency dict keys must be (scenario, interval) tuples
error_triggered = False
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency={k: 1 for k in range(number_time_intervals)},
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
# ValueError( 'The efficiency dict keys must be tuples of size 2.')
error_triggered = False
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency={(k, 3, 4): 1 for k in range(number_time_intervals)},
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(The efficiency should be given as a dict or None.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=[1 for k in range(number_time_intervals)],
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
# TypeError('The reverse efficiency has to match the nominal'+
# ' one when there are no proportional losses.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=None,
efficiency_reverse={},
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
# TypeError:'The reverse efficiency should be given as a dict or None.'
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse=[1 for k in range(number_time_intervals)],
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(
# 'No efficiency values were provided. There should be '+
# 'one value per scenario and time interval.')
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse={},
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
# ValueError: The keys for the efficiency dicts do not match.
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse={
(key[1], key[0]): value
for key, value in efficiency_dict.items()
},
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: Efficiency values must be provided as numeric types.
Pedro L. Magalhães
committed
try:
_ = Arcs(
Pedro L. Magalhães
committed
efficiency_reverse={
(key[0], key[1]): str(value)
for key, value in efficiency_dict.items()
},
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(
Pedro L. Magalhães
committed
efficiency_reverse={
(key[0], key[1]): -1 for key, value in efficiency_dict.items()
},
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
# TypeError('The capacity should be given as a list or tuple.')
error_triggered = False
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency=efficiency_dict,
efficiency_reverse=None,
Pedro L. Magalhães
committed
static_loss=None,
capacity={o: 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
# TypeError: The minimum cost values should be given as a list or tuple
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={o: 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
# TypeError: The specific capacity cost was not given as a numeric type
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=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except TypeError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# ValueError:The number of capacity and minimum cost entries must match
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 + 1)),
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
# ValueError: No entries for capacity and minimum cost were provided.
Pedro L. Magalhães
committed
# At least one option should be provided.
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(),
minimum_cost=tuple(),
Pedro L. Magalhães
committed
capacity_is_instantaneous=capacity_is_instantaneous,
Pedro L. Magalhães
committed
except ValueError:
error_triggered = True
assert error_triggered
# ValueError: No entries for efficiency were provided. There should be
Pedro L. Magalhães
committed
# one entry per time interval.
Pedro L. Magalhães
committed
try:
_ = Arcs(
name="hey",
efficiency={},
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
# ValueError('The number of efficiency values must match the number of
Pedro L. Magalhães
committed
# time intervals.')
Pedro L. Magalhães
committed
arc_tech = Arcs(
Pedro L. Magalhães
committed
efficiency={
Pedro L. Magalhães
committed
for q in range(number_scenarios)
for k in range(number_time_intervals + 1)
},
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,
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 number of efficiency values must match the number of
Pedro L. Magalhães
committed
# time intervals.')
Pedro L. Magalhães
committed
try:
arc_tech = Arcs(
Pedro L. Magalhães
committed
efficiency={
Pedro L. Magalhães
committed
for q in range(number_scenarios)
for k in range(number_time_intervals)
Pedro L. Magalhães
committed
efficiency_reverse={
Pedro L. Magalhães
committed
for q in range(number_scenarios)
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,
validate=True,
)
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 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
Pedro L. Magalhães
committed
# *********************************************************************
# *********************************************************************
Pedro L. Magalhães
committed
# trigger errors using non-identified nodes
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# create a new export node
net.add_export_node(node_key="E1", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# create an arc starting in that export node
Pedro L. Magalhães
committed
error_triggered = False
try:
net.add_directed_arc(node_key_a="E1", node_key_b="B", arcs=lossless_arcs)
Pedro L. Magalhães
committed
net.identify_node_types()
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# remove the troublesome arc
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# create a new import node
net.add_import_node(node_key="I1", prices={(0, 0, 0): resource_price})
Pedro L. Magalhães
committed
# create an arc ending in that import node
Pedro L. Magalhães
committed
error_triggered = False
try:
net.add_directed_arc(node_key_a="A", node_key_b="I1", arcs=lossless_arcs)
Pedro L. Magalhães
committed
net.identify_node_types()
except ValueError:
error_triggered = True
assert error_triggered
Pedro L. Magalhães
committed
# remove the troublesome arc
Pedro L. Magalhães
committed
# *********************************************************************
Pedro L. Magalhães
committed
# check non-existent arc
Pedro L. Magalhães
committed
# *************************************************************************
# *************************************************************************
Pedro L. Magalhães
committed
def test_pseudo_unique_key_generation(self):
# create network
Pedro L. Magalhães
committed
network = Network()
Pedro L. Magalhães
committed
# add node A
Pedro L. Magalhães
committed
# add node B
Pedro L. Magalhães
committed
# identify nodes
Pedro L. Magalhães
committed
network.identify_node_types()
Pedro L. Magalhães
committed
# add arcs
key_list = [
"3e225573-4e78-48c8-bb08-efbeeb795c22",
"f6d30428-15d1-41e9-a952-0742eaaa5a31",
"8c29b906-2518-41c5-ada8-07b83508b5b8",
"f9a72a39-1422-4a02-af97-906ce79c32a3",
"b6941a48-10cc-465d-bf53-178bd2939bd1",
]
Pedro L. Magalhães
committed
for key in key_list:
network.add_edge(
Pedro L. Magalhães
committed
key=key,
**{network.KEY_ARC_UND: False, network.KEY_ARC_TECH: None}
)
Pedro L. Magalhães
committed
# use a seed number to trigger more iterations
Pedro L. Magalhães
committed
import uuid
Pedro L. Magalhães
committed
rand = random.Random()
rand.seed(360)
uuid.uuid4 = lambda: uuid.UUID(int=rand.getrandbits(128), version=4)
Pedro L. Magalhães
committed
error_triggered = False
try:
_ = network.get_pseudo_unique_arc_key(
node_key_start="A", node_key_end="B", max_iterations=len(key_list) - 1
)
Pedro L. Magalhães
committed
except Exception:
error_triggered = True
assert error_triggered
# *****************************************************************************
Pedro L. Magalhães
committed
# *****************************************************************************