Skip to content
Snippets Groups Projects
test_esipp_network.py 78.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                # ValueError('The number of capacity values must match the number of
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="hey",
                    efficiency=efficiency_dict,
                    efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    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,
    
                    capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    validate=True,
                )
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    arc_tech.validate_sizes(
                        number_options=number_options,
                        number_scenarios=number_scenarios,
                        number_intervals=[
                            number_time_intervals for _ in range(number_scenarios)
                        ],
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # ValueError: The minimum cost values are inconsistent with the number
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="hey",
                    efficiency=efficiency_dict,
                    efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    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,
    
                    capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    validate=True,
                )
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    arc_tech.validate_sizes(
                        number_options=number_options,
                        number_scenarios=number_scenarios,
                        number_intervals=[
                            number_time_intervals for _ in range(number_scenarios)
                        ],
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
                # TypeError('Efficiency values must be provided as numeric types.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
                        efficiency={
                            key: str(value) for key, value in efficiency_dict.items()
                        },
                        efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        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,
    
                        capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        validate=True,
                    )
    
                except TypeError:
                    error_triggered = True
                assert error_triggered
    
                # ValueError('Efficiency values must be positive.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
                        efficiency={
                            key: -value * random.randint(0, 1)
                            for key, value in efficiency_dict.items()
                        },
                        efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        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,
    
                        capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        validate=True,
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
                # TypeError('Capacity values must be provided as numeric types.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        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,
    
                        capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        validate=True,
                    )
    
                except TypeError:
                    error_triggered = True
                assert error_triggered
    
                # ValueError('Capacity values must be positive.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
                        efficiency=efficiency_dict,
                        efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        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,
    
                        capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        validate=True,
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
                # TypeError('Minimum cost values must be provided as numeric types.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        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,
    
                        capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        validate=True,
                    )
    
                except TypeError:
                    error_triggered = True
                assert error_triggered
    
                # ValueError('Minimum cost values must be positive or zero.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
                        efficiency=efficiency_dict,
                        efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        capacity=tuple(1 + o for o in range(number_options)),
                        minimum_cost=tuple(-1 for o in range(number_options)),
                        specific_capacity_cost=1,
    
                        capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        validate=True,
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            # TypeError('The information about capacities being instantaneous or not
    
            # should be given as a boolean variable.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="hey",
                    efficiency=efficiency_dict,
                    efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    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's avatar
    Pedro L. Magalhães committed
                    validate=True,
                )
    
            except TypeError:
                error_triggered = True
            assert error_triggered
    
            # *********************************************************************
            # *********************************************************************
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                name="AB",
                efficiency=efficiency_dict,
                efficiency_reverse=None,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                validate=True,
            )
    
    
            assert arc_tech_AB.number_options() == number_options
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_undirected_arc(node_key_a="A", node_key_b="B", arcs=arc_tech_AB)
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_directed_arc(node_key_a="A", node_key_b="B", arcs=arc_tech_AB)
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key_a="E",
                node_key_b="F",
                efficiency=efficiency_dict,
                static_loss=None,
                capacity=3,
                capacity_is_instantaneous=True,
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="Y", node_data={net.KEY_NODE_BASE_FLOW: base_flow}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            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
    
    
        # *************************************************************************
        # *************************************************************************
    
        def test_arcs_without_losses(self):
            # test arc without (static and proportional) losses
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                name="AB",
                capacity=(1, 2, 3),
                minimum_cost=(4, 5, 6),
                specific_capacity_cost=6,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                validate=True,
            )
    
    
            assert not arc_tech.has_proportional_losses()
    
            assert not arc_tech.is_infinite_capacity()
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                validate=True,
            )
    
    
            assert not arc_tech.is_infinite_capacity()
    
            assert not arc_tech.has_constant_efficiency()
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                validate=True,
            )
    
    
            assert not arc_tech.has_proportional_losses()
    
            assert not arc_tech.is_infinite_capacity()
    
        # *************************************************************************
        # *************************************************************************
    
        def test_modifying_nodes(self):
            # *********************************************************************
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                name="hello",
                capacity=[5],
                minimum_cost=[3],
                specific_capacity_cost=3,
                capacity_is_instantaneous=False,
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_import_node(node_key="I_iso", prices={(0, 0, 0): resource_price})
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_import_node(node_key="I", prices={(0, 0, 0): resource_price})
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_import_node(node_key="E_iso", prices={(0, 0, 0): resource_price})
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_export_node(node_key="E", prices={(0, 0, 0): resource_price})
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_source_sink_node(node_key="A_iso", base_flow=base_flow)
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_source_sink_node(node_key="A_in", base_flow=base_flow)
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_source_sink_node(node_key="A_out", base_flow=base_flow)
    
    
            # add normal node with incoming and outgoing arcs
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_source_sink_node(node_key="A", base_flow=base_flow)
    
    
            # *********************************************************************
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="I_iso", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="E_iso", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="A_iso", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="I",
                node_data={
                    net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
                    net.KEY_NODE_PRICES: resource_price,
                },
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                node_key="I", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                node_key="I",
                node_data={
                    net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
                    net.KEY_NODE_PRICES: resource_price,
                },
            )
    
    
            # *********************************************************************
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="E",
                node_data={
                    net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
                    net.KEY_NODE_PRICES: resource_price,
                },
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                node_key="E", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                node_key="E",
                node_data={
                    net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
                    net.KEY_NODE_PRICES: resource_price,
                },
            )
    
    
            # *********************************************************************
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="A_in", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                node_key="A_out", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                node_key="A_out",
                node_data={
                    net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_SOURCE_SINK,
                    net.KEY_NODE_BASE_FLOW: base_flow,
                },
            )
    
    
            # *********************************************************************
    
            error_triggered = False
            try:
                net.modify_network_node(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    node_key="I",
                    node_data={
                        net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
                        net.KEY_NODE_PRICES: resource_price,
                    },
                )
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            error_triggered = False
            try:
                net.modify_network_node(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    node_key="E",
                    node_data={
                        net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
                        net.KEY_NODE_PRICES: resource_price,
                    },
                )
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            error_triggered = False
            try:
                net.modify_network_node(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    node_key="A_out",
                    node_data={
                        net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
                        net.KEY_NODE_PRICES: resource_price,
                    },
                )
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            error_triggered = False
            try:
                net.modify_network_node(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    node_key="A_in",
                    node_data={
                        net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
                        net.KEY_NODE_PRICES: resource_price,
                    },
                )
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            error_triggered = False
            try:
                net.modify_network_node(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    node_key="A",
                    node_data={
                        net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_EXP,
                        net.KEY_NODE_PRICES: resource_price,
                    },
                )
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            error_triggered = False
            try:
                net.modify_network_node(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    node_key="A",
                    node_data={
                        net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_IMP,
                        net.KEY_NODE_PRICES: resource_price,
                    },
                )
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            # *********************************************************************
    
            error_triggered = False
            try:
                net.modify_network_node(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    node_key="ABCD", node_data={net.KEY_NODE_TYPE: net.KEY_NODE_TYPE_WAY}
                )
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            # *********************************************************************
    
        # *************************************************************************
        # *************************************************************************
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                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's avatar
    Pedro L. Magalhães committed
                name="hello",
                capacity=[5],
                minimum_cost=[3],
                specific_capacity_cost=3,
                capacity_is_instantaneous=False,
            )
    
    
            lossy_arcs = ArcsWithoutProportionalLosses(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                name="hello back",
                static_loss={(0, 0, k): random.random() for k in range(number_intervals)},
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                minimum_cost=(5,),
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                capacity_is_instantaneous=False,
            )
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_import_node(node_key="I", prices={(0, 0, 0): resource_price})
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_export_node(node_key="E", prices={(0, 0, 0): resource_price})
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_source_sink_node(node_key="A", base_flow=base_flow)
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_source_sink_node(node_key="B", base_flow=base_flow)
    
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
            net.add_directed_arc(node_key_a="I", node_key_b="E", arcs=lossless_arcs)
    
    
            # *********************************************************************
            # *********************************************************************
    
            # trigger errors using pre-identified nodes
    
            # directed arcs cannot start in an export node: E -> B
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                net.add_directed_arc(node_key_a="E", node_key_b="B", arcs=lossless_arcs)
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            # directed arcs cannot end on an import node: A -> I
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                net.add_directed_arc(node_key_a="A", node_key_b="I", arcs=lossless_arcs)
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            # import-export nodes cannot have static losses
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                net.add_directed_arc(node_key_a="I", node_key_b="E", arcs=lossy_arcs)
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            # undirected arcs cannot involve import nor export nodes
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                net.add_undirected_arc(node_key_a="I", node_key_b="A", arcs=lossless_arcs)
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            # undirected arcs cannot involve import nor export nodes
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                net.add_undirected_arc(node_key_a="B", node_key_b="E", arcs=lossless_arcs)
    
            except ValueError:
                error_triggered = True
            assert error_triggered
    
            # undirected arcs cannot involve import nor export nodes