Skip to content
Snippets Groups Projects
test_esipp_network.py 78.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • # 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
    
    
    from src.topupopt.data.misc.utils import generate_pseudo_unique_key
    
    
    # *****************************************************************************
    # *****************************************************************************
    
    class TestNetwork:
    
        # *************************************************************************
        # *************************************************************************
    
        def test_arc_technologies_static_losses(self):
    
            number_time_intervals = 3
            number_scenarios = 2
            number_options = 4
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                (q, k): 0.95
    
                for q in range(number_scenarios)
                for k in range(number_time_intervals)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                (h, q, k): 1
    
                for h in range(number_options)
                for q in range(number_scenarios)
                for k in range(number_time_intervals)
    
            for capacity_is_instantaneous in (True, False):
                arc_tech = Arcs(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency=efficiency_dict,
    
    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,
                    static_loss=static_loss_dict,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    validate=True,
                )
    
    
                assert arc_tech.has_proportional_losses()
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency=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,
                    static_loss=static_loss_dict,
    
    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()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # create arc technology with only one option
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency=efficiency_dict,
    
                    efficiency_reverse=None,
                    capacity=(1,),
                    minimum_cost=(1,),
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    specific_capacity_cost=1,
    
                    capacity_is_instantaneous=capacity_is_instantaneous,
                    static_loss={
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        (0, q, k): 1
                        # for h in range(number_options)
    
                        for q in range(number_scenarios)
                        for k in range(number_time_intervals)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    },
                    validate=True,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # create arc technology for one time interval
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
    
                    efficiency={
                        (q, 0): 0.5
                        for q in range(number_scenarios)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        # for k in range(number_time_intervals)
                    },
    
    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,
                    static_loss={
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        (h, q, 0): 1
    
                        for h in range(number_options)
                        for q in range(number_scenarios)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        # for k in range(number_time_intervals)
                    },
                    validate=True,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # *********************************************************************
    
                # TypeError: The static losses should be given as a dict or None.
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="any",
                        efficiency=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,
                        static_loss=tuple(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            [k for k in range(number_time_intervals)]
                            for o in range(number_options)
                        ),
                        validate=True,
                    )
    
                except TypeError:
                    error_triggered = True
                assert error_triggered
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # ValueError('The static losses should be specified for each arc
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="any",
                        efficiency=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,
                        static_loss={
    
                            for h in range(number_options)
                            for q in range(number_scenarios)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        },
                        validate=True,
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
                # TypeError('The static losses must be specified via a list of lists.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="any",
                        efficiency=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,
                        static_loss=[
                            tuple(k for k in range(number_time_intervals))
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            for o in range(number_options)
                        ],
                        validate=True,
                    )
    
                except TypeError:
                    error_triggered = True
                assert error_triggered
    
                # ValueError('The static loss values are inconsistent with the number '
                # 'of options, scenarios and intervals.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="any",
                        efficiency=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,
                        static_loss={
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            (h, q, k): 1
    
                            for h in range(number_options)
                            for q in range(number_scenarios)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            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)
                        ],
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
                # TypeError('The static losses were not provided as numbers.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="any",
                        efficiency=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,
                        static_loss={
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            (h, q, k): str(3.54)
    
                            for h in range(number_options)
                            for q in range(number_scenarios)
                            for k in range(number_time_intervals)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        },
                        validate=True,
                    )
    
                except TypeError:
                    error_triggered = True
                assert error_triggered
    
                # ValueError('The static losses must be positive or zero.')
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="any",
                        efficiency=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,
                        static_loss={
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            (h, q, k): -random.randint(0, 1) * random.random()
    
                            for h in range(number_options)
                            for q in range(number_scenarios)
                            for k in range(number_time_intervals)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        },
                        validate=True,
                    )
    
                except ValueError:
                    error_triggered = True
                assert error_triggered
    
                # TypeError: The static loss dict keys must be tuples
    
    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
                        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,
    
                        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
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # ValueError( 'The static loss dict keys must be tuples of size 3.')
    
                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
                        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,
    
                        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(The staticl osses should be given as a dict or None.')
    
    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=None,
    
                        efficiency_reverse=None,
                        static_loss=[1 for k in range(number_time_intervals)],
    
    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(
                #     'No static loss values were provided. There should be one'+
                #     ' value per option, scenario and time interval.')
    
    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
                        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,
    
                        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
    
        # *************************************************************************
        # *************************************************************************
    
        def test_arc_technologies(self):
            # *********************************************************************
    
            # create arc technology using instantaneous capacities
    
            number_scenarios = 2
            number_options = 4
            number_time_intervals = 3
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                (q, k): 0.85
    
                for q in range(number_scenarios)
                for k in range(number_time_intervals)
    
            for capacity_is_instantaneous in (True, False):
                arc_tech = Arcs(
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    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,
    
                    capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    validate=True,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # create arc technology with only one option
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency=efficiency_dict,
                    efficiency_reverse=None,
    
                    static_loss=None,
                    capacity=(1,),
                    minimum_cost=(1,),
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    specific_capacity_cost=1,
    
                    capacity_is_instantaneous=capacity_is_instantaneous,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    validate=True,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # create arc technology for one time interval
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency={(0, 0): 0.95},
                    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,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # create arc technology for one time interval and isotropic
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency={(0, 0): 0.95},
                    efficiency_reverse={(0, 0): 0.95},
    
    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,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # create arc technology for one time interval and anisotropic
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency={(0, 0): 0.95},
                    efficiency_reverse={(0, 0): 1},
    
    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,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                assert not arc_tech.has_constant_efficiency()
    
                # create arc technology for one time interval and anisotropic
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency={(0, 0): 1},
                    efficiency_reverse={(0, 0): 0.95},
    
    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,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert not arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                assert not arc_tech.has_constant_efficiency()
    
                # create arc technology for one time interval and anisotropic
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="any",
                    efficiency={(0, 0): 0.95},
                    efficiency_reverse={(0, 0): 0.95},
    
    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,
                )
    
    
                assert not arc_tech.is_infinite_capacity()
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=True)
    
                assert arc_tech.is_isotropic(reverse_none_means_isotropic=False)
    
                # *****************************************************************
                # *****************************************************************
    
                # TypeError('The name attribute is not hashable.')
    
    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=[1, 2, 3],
                        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,
    
                        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
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # TypeError:The efficiency dict keys must be (scenario, interval) tuples
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
                        efficiency={k: 1 for k in range(number_time_intervals)},
                        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
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # ValueError( 'The efficiency dict keys must be tuples of size 2.')
    
                error_triggered = False
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        name="hey",
                        efficiency={(k, 3, 4): 1 for k in range(number_time_intervals)},
                        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(The efficiency should be given as a dict or None.')
    
    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=[1 for k in range(number_time_intervals)],
                        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
    
                # TypeError('The reverse efficiency has to match the nominal'+
                #     ' one when there are no proportional losses.')
    
    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=None,
                        efficiency_reverse={},
    
    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
    
                # TypeError:'The reverse efficiency should be given as a dict or None.'
    
    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=[1 for k in range(number_time_intervals)],
    
    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(
                #     'No efficiency values were provided. There should be '+
                #     'one value per scenario and time interval.')
    
    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={},
    
    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
    
                # ValueError: The keys for the efficiency dicts do not match.
    
    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,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            (key[1], key[0]): value
                            for key, value in efficiency_dict.items()
                        },
    
    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: 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=efficiency_dict,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            (key[0], key[1]): str(value)
                            for key, value in efficiency_dict.items()
                        },
    
    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=efficiency_dict,
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            (key[0], key[1]): -1 for key, value in efficiency_dict.items()
                        },
    
    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
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # TypeError('The capacity should be given as a list or tuple.')
    
                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={o: 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
    
                # TypeError: The minimum cost values should be given as a list or tuple
    
    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={o: 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
    
                # TypeError: The specific capacity cost was not given as a numeric type
    
    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],
    
                        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:The number of capacity and minimum cost entries must match
    
    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 + 1)),
                        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
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # ValueError: No entries for capacity and minimum cost were provided.
    
    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,
    
                        static_loss=None,
                        capacity=tuple(),
                        minimum_cost=tuple(),
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        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
    
                # ValueError: No entries for efficiency were provided. There should be
    
    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_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
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
    
                # ValueError('The number of efficiency values must match the number of
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                    name="hey",
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        (q, k): 0.85
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        for k in range(number_time_intervals + 1)
                    },
                    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,
                )
    
                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 number of efficiency values must match the number of
    
    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
                            (q, k): 0.85
    
                            for q in range(number_scenarios)
                            for k in range(number_time_intervals)
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                        },
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            (q, k): 0.85
    
    Pedro L. Magalhães's avatar
    Pedro L. Magalhães committed
                            for k in range(number_time_intervals - 1)
                        },
    
    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,
                    )
                    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