Skip to content
Snippets Groups Projects
test_esipp_problem.py 269 KiB
Newer Older
# imports

# standard
import math

# local
# import numpy as np
# import networkx as nx
import pyomo.environ as pyo
# import src.topupopt.problems.esipp.utils as utils
from src.topupopt.data.misc.utils import generate_pseudo_unique_key
from src.topupopt.problems.esipp.problem import InfrastructurePlanningProblem
from src.topupopt.problems.esipp.network import Arcs, Network
from src.topupopt.problems.esipp.network import ArcsWithoutStaticLosses
from src.topupopt.problems.esipp.resource import ResourcePrice
# from src.topupopt.problems.esipp.utils import compute_cost_volume_metrics
from src.topupopt.problems.esipp.utils import statistics
from src.topupopt.problems.esipp.time import EconomicTimeFrame
# from src.topupopt.problems.esipp.converter import Converter

# *****************************************************************************
# *****************************************************************************

Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
class TestESIPPProblem:
    
    solver = 'glpk'
    # solver = 'scip'
    # solver = 'cbc'
    
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
        self,
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
        solver_options: dict = None,
        use_sos_arcs: bool = False,
        arc_sos_weight_key: str = (InfrastructurePlanningProblem.SOS1_ARC_WEIGHTS_NONE),
        arc_use_real_variables_if_possible: bool = False,
        use_sos_sense: bool = False,
        sense_sos_weight_key: int = (
            InfrastructurePlanningProblem.SOS1_SENSE_WEIGHT_NOMINAL_HIGHER
        ),
        sense_use_real_variables_if_possible: bool = False,
        sense_use_arc_interfaces: bool = False,
        perform_analysis: bool = False,
        plot_results: bool = False,
        print_solver_output: bool = False,
        time_frame: EconomicTimeFrame = None,
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
        networks: dict = None,
        converters: dict = None,
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
        static_losses_mode=None,
        mandatory_arcs: list = None,
        max_number_parallel_arcs: dict = None,
        arc_groups_dict: dict = None,
        init_aux_sets: bool = False,
        # discount_rates: dict = None,
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
        assessment_weights: dict = None,
        simplify_problem: bool = False,
    ):
        if type(solver) == type(None):
            solver = self.solver
        if type(assessment_weights) != dict:
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
            assessment_weights = {}  # default

        if type(converters) != dict:
            converters = {}
        # one interval twice as long as the average is worth twice
        # one interval half as long as the average is worth half
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
        #     [time_period_duration/average_time_interval_duration
        #       for time_period_duration in intraperiod_time_interval_duration]
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed

        time_weights = None  # nothing yet

        normalised_time_interval_duration = None  # nothing yet

        ipp = InfrastructurePlanningProblem(
            # discount_rates=discount_rates,
            time_frame=time_frame,
            # reporting_periods=time_frame.reporting_periods,
            # time_intervals=time_frame.time_interval_durations,
            time_weights=time_weights,
            normalised_time_interval_duration=normalised_time_interval_duration,
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
            assessment_weights=assessment_weights,
        )

        for netkey, net in networks.items():
            ipp.add_network(network_key=netkey, network=net)
        # add converters

        for cvtkey, cvt in converters.items():
            ipp.add_converter(converter_key=cvtkey, converter=cvt)

        if type(mandatory_arcs) == list:
            for full_arc_key in mandatory_arcs:
                ipp.make_arc_mandatory(full_arc_key[0], full_arc_key[1:])
        #         for arc_key in ipp.networks[network_key].edges(keys=True):
        #             if ipp.networks[network_key].edges[arc_key][
        #                     Network.KEY_ARC_TECH].has_been_selected():
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed

        #                 continue

        #             ipp.make_arc_mandatory(network_key, arc_key)
        # set up the use of sos for arc selection
        if use_sos_arcs:
            for network_key in ipp.networks:
                for arc_key in ipp.networks[network_key].edges(keys=True):
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                    if (
                        ipp.networks[network_key]
                        .edges[arc_key][Network.KEY_ARC_TECH]
                        .has_been_selected()
                    ):
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                        network_key,
                        arc_key,
                        use_real_variables_if_possible=(
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                            arc_use_real_variables_if_possible
                        ),
                        sos1_weight_method=arc_sos_weight_key,
                    )

        # set up the use of sos for flow sense determination
        if use_sos_sense:
            for network_key in ipp.networks:
                for arc_key in ipp.networks[network_key].edges(keys=True):
                    if not ipp.networks[network_key].edges[arc_key][
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                        Network.KEY_ARC_UND
                    ]:
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                        network_key,
                        arc_key,
                        use_real_variables_if_possible=(
                            sense_use_real_variables_if_possible
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                        ),
                        use_interface_variables=sense_use_arc_interfaces,
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                        sos1_weight_method=sense_sos_weight_key,
                    )

        elif sense_use_arc_interfaces:  # set up the use of arc interfaces w/o sos1
            for network_key in ipp.networks:
                for arc_key in ipp.networks[network_key].edges(keys=True):
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
                    if (
                        ipp.networks[network_key]
                        .edges[arc_key][Network.KEY_ARC_TECH]
                        .has_been_selected()
                    ):
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed

                    ipp.use_interface_variables_for_arc_selection(network_key, arc_key)

        if static_losses_mode == ipp.STATIC_LOSS_MODE_ARR:
            ipp.place_static_losses_arrival_node()
        elif static_losses_mode == ipp.STATIC_LOSS_MODE_DEP:
            ipp.place_static_losses_departure_node()
        elif static_losses_mode == ipp.STATIC_LOSS_MODE_US:
            ipp.place_static_losses_upstream()
        elif static_losses_mode == ipp.STATIC_LOSS_MODE_DS:
            ipp.place_static_losses_downstream()
Pedro L. Magalhães's avatar
Pedro L. Magalhães committed
            raise ValueError("Unknown static loss modelling mode.")

        # *********************************************************************
Loading
Loading full blame…