#principle index
principle_index = 1

nfe = 50000

if __name__ == "__main__":
    print("uncertainty analysis started for: " +
          principles_list[principle_index] + " case for " + str(nfe) +
          " scenario's")

    model = PyRICE(model_specification="EMA", welfare_function="prioritarian")
    RICE = Model('RICE', function=model)

    RICE.uncertainties = [
        IntegerParameter('fdamage', 0, 2),
        IntegerParameter('t2xco2_index', 0, 999),
        IntegerParameter('t2xco2_dist', 0, 2),
        RealParameter('fosslim', 4000, 13649),
        IntegerParameter('scenario_pop_gdp', 0, 5),
        IntegerParameter('scenario_sigma', 0, 2),
        IntegerParameter('scenario_cback', 0, 1),
        IntegerParameter('scenario_elasticity_of_damages', 0, 2),
        IntegerParameter('scenario_limmiu', 0, 1)
    ]

    #same for all formulations
    RICE.outcomes = get_all_model_outcomes_uncertainty_search(
        optimization_formulation="utilitarian")

    ema_logging.log_to_stderr(ema_logging.INFO)
Пример #2
0
    largest_cc = max(nx.connected_components(er), key=len)
    Sf = len(largest_cc)
    gd = nx.density(er)
    return {'density': gd}


if __name__ == '__main__':
    ema_logging.LOG_FORMAT = '[%(name)s/%(levelname)s/%(processName)s] %(message)s'
    ema_logging.log_to_stderr(ema_logging.INFO)

    mapper = {0: 'n', 1: 'p'}
    model = Model('SimulateER', function=simulate)  # instantiate the model
    # specify uncertainties
    model.uncertainties = [RealParameter("p", 0.1, 1.0)]

    model.levers = [IntegerParameter("n", 10, 100)]

    # specify outcomes
    model.outcomes = [ScalarOutcome('density')]

    model.constants = [Constant('replications', 10)]

    n_scenarios = 10
    n_policies = 10

    res = perform_experiments(model, n_scenarios, n_policies)
    """ 
        with MultiprocessingEvaluator(model) as evaluator:
            res = evaluator.perform_experiments(n_scenarios, n_policies,
                                             levers_sampling=MC)
    """
Пример #3
0
ema_logging.log_to_stderr(ema_logging.INFO)

# %%

if __name__ == '__main__':
    ema_logging.log_to_stderr(ema_logging.INFO)

    model = PyDICE()
    dice_sm = Model('dicesmEMA', function=model)

    dice_sm.uncertainties = [
        RealParameter('tfp_gr', 0.07, 0.09),
        RealParameter('sigma_gr', -0.012, -0.008),
        RealParameter('pop_gr', 0.1, 0.15),
        RealParameter('fosslim', 4000.0, 13649),
        IntegerParameter('cback', 100, 600),
        RealParameter('emdd', -1, 0.99),
        IntegerParameter('vd_switch', 0, 1),
    ]

    dice_sm.levers = [
        RealParameter('sr', 0.1, 0.5),
        RealParameter('prtp_con', 0.001, 0.015),
        RealParameter('emuc', 1.01, 2.00),
        #   IntegerParameter('vd_switch', 0, 1),
        IntegerParameter('periodfullpart', 10, 58),
        IntegerParameter('miu_period', 10, 58)
    ]

    dice_sm.outcomes = [
        TimeSeriesOutcome('Atmospheric Temperature'),
Пример #4
0
def get_model_for_problem_formulation(problem_formulation_id):
    ''' Prepare DikeNetwork in a way it can be input in the EMA-workbench.
    Specify uncertainties, levers and problem formulation.
    '''
    # Load the model:
    function = DikeNetwork()
    # workbench model:
    dike_model = Model('dikesnet', function=function)

    # Uncertainties and Levers:
    # Specify uncertainties range:
    Real_uncert = {'Bmax': [30, 350], 'pfail': [0, 1]}  # m and [.]
    # breach growth rate [m/day]
    cat_uncert_loc = {'Brate': (1, 1.5, 10)}

    cat_uncert = {
        'discount rate {}'.format(n): (1.5, 2.5, 3.5, 4.5)
        for n in function.planning_steps
    }

    Int_uncert = {'A.0_ID flood wave shape': [0, 132]}
    # Range of dike heightening:
    dike_lev = {'DikeIncrease': [0, 10]}  # dm

    # Series of five Room for the River projects:
    rfr_lev = ['{}_RfR'.format(project_id) for project_id in range(0, 5)]

    # Time of warning: 0, 1, 2, 3, 4 days ahead from the flood
    EWS_lev = {'EWS_DaysToThreat': [0, 4]}  # days

    uncertainties = []
    levers = []

    for uncert_name in cat_uncert.keys():
        categories = cat_uncert[uncert_name]
        uncertainties.append(CategoricalParameter(uncert_name, categories))

    for uncert_name in Int_uncert.keys():
        uncertainties.append(
            IntegerParameter(uncert_name, Int_uncert[uncert_name][0],
                             Int_uncert[uncert_name][1]))

    # RfR levers can be either 0 (not implemented) or 1 (implemented)
    for lev_name in rfr_lev:
        for n in function.planning_steps:
            lev_name_ = '{} {}'.format(lev_name, n)
            levers.append(IntegerParameter(lev_name_, 0, 1))

    # Early Warning System lever
    for lev_name in EWS_lev.keys():
        levers.append(
            IntegerParameter(lev_name, EWS_lev[lev_name][0],
                             EWS_lev[lev_name][1]))

    for dike in function.dikelist:
        # uncertainties in the form: locationName_uncertaintyName
        for uncert_name in Real_uncert.keys():
            name = "{}_{}".format(dike, uncert_name)
            lower, upper = Real_uncert[uncert_name]
            uncertainties.append(RealParameter(name, lower, upper))

        for uncert_name in cat_uncert_loc.keys():
            name = "{}_{}".format(dike, uncert_name)
            categories = cat_uncert_loc[uncert_name]
            uncertainties.append(CategoricalParameter(name, categories))

        # location-related levers in the form: locationName_leversName
        for lev_name in dike_lev.keys():
            for n in function.planning_steps:
                name = "{}_{} {}".format(dike, lev_name, n)
                levers.append(
                    IntegerParameter(name, dike_lev[lev_name][0],
                                     dike_lev[lev_name][1]))

    # load uncertainties and levers in dike_model:
    dike_model.uncertainties = uncertainties
    dike_model.levers = levers

    # Problem formulations:
    # Outcomes are all costs, thus they have to minimized:
    direction = ScalarOutcome.MINIMIZE

    # 2-objective PF:
    if problem_formulation_id == 0:
        variable_names = []
        variable_names_ = []

        for n in function.planning_steps:

            variable_names.extend([
                '{}_{} {}'.format(dike, e, n)
                for e in ['Expected Annual Damage', 'Dike Investment Costs']
                for dike in function.dikelist
            ])

            variable_names_.extend([
                '{}_{} {}'.format(dike, e, n)
                for e in ['Expected Number of Deaths']
                for dike in function.dikelist
            ])

            variable_names.extend(['RfR Total Costs {}'.format(n)])
            variable_names.extend(['Expected Evacuation Costs {}'.format(n)])

        dike_model.outcomes = [
            ScalarOutcome('All Costs',
                          variable_name=[var for var in variable_names],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[var for var in variable_names_],
                          function=sum_over,
                          kind=direction)
        ]

    # 3-objectives PF:
    elif problem_formulation_id == 1:
        variable_names = []
        variable_names_ = []
        variable_names__ = []

        for n in function.planning_steps:
            variable_names.extend([
                '{}_Expected Annual Damage {}'.format(dike, n)
                for dike in function.dikelist
            ])

            variable_names_.extend([
                '{}_Dike Investment Costs {}'.format(dike, n)
                for dike in function.dikelist
            ] + ['RfR Total Costs {}'.format(n)] +
                                   ['Expected Evacuation Costs {}'.format(n)])

            variable_names__.extend([
                '{}_Expected Number of Deaths {}'.format(dike, n)
                for dike in function.dikelist
            ])

        dike_model.outcomes = [
            ScalarOutcome('Expected Annual Damage',
                          variable_name=[var for var in variable_names],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Total Investment Costs',
                          variable_name=[var for var in variable_names_],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[var for var in variable_names__],
                          function=sum_over,
                          kind=direction)
        ]

    # 5-objectives PF:
    elif problem_formulation_id == 2:
        variable_names = []
        variable_names_ = []
        variable_names__ = []
        variable_names___ = []
        variable_names____ = []

        for n in function.planning_steps:
            variable_names.extend([
                '{}_Expected Annual Damage {}'.format(dike, n)
                for dike in function.dikelist
            ])
            variable_names_.extend([
                '{}_Dike Investment Costs {}'.format(dike, n)
                for dike in function.dikelist
            ])
            variable_names__.extend(['RfR Total Costs {}'.format(n)])
            variable_names___.extend(
                ['Expected Evacuation Costs {}'.format(n)])
            variable_names____.extend([
                '{}_Expected Number of Deaths {}'.format(dike, n)
                for dike in function.dikelist
            ])

        dike_model.outcomes = [
            ScalarOutcome('Expected Annual Damage',
                          variable_name=[var for var in variable_names],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Dike Investment Costs',
                          variable_name=[var for var in variable_names_],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('RfR Investment Costs',
                          variable_name=[var for var in variable_names__],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Evacuation Costs',
                          variable_name=[var for var in variable_names___],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[var for var in variable_names____],
                          function=sum_over,
                          kind=direction)
        ]

    # Disaggregate over locations:
    elif problem_formulation_id == 3:
        outcomes = []

        for dike in function.dikelist:
            variable_name = []
            for e in ['Expected Annual Damage', 'Dike Investment Costs']:
                variable_name.extend([
                    '{}_{} {}'.format(dike, e, n)
                    for n in function.planning_steps
                ])

            outcomes.append(
                ScalarOutcome('{} Total Costs'.format(dike),
                              variable_name=[var for var in variable_name],
                              function=sum_over,
                              kind=direction))

            outcomes.append(
                ScalarOutcome('{}_Expected Number of Deaths'.format(dike),
                              variable_name=[
                                  '{}_Expected Number of Deaths {}'.format(
                                      dike, n) for n in function.planning_steps
                              ],
                              function=sum_over,
                              kind=direction))

        outcomes.append(
            ScalarOutcome('RfR Total Costs',
                          variable_name=[
                              'RfR Total Costs {}'.format(n)
                              for n in function.planning_steps
                          ],
                          function=sum_over,
                          kind=direction))
        outcomes.append(
            ScalarOutcome('Expected Evacuation Costs',
                          variable_name=[
                              'Expected Evacuation Costs {}'.format(n)
                              for n in function.planning_steps
                          ],
                          function=sum_over,
                          kind=direction))

        dike_model.outcomes = outcomes

    # Disaggregate over time:
    elif problem_formulation_id == 4:
        outcomes = []

        for n in function.planning_steps:
            for dike in function.dikelist:

                outcomes.append(
                    ScalarOutcome('Expected Annual Damage {}'.format(n),
                                  variable_name=[
                                      '{}_Expected Annual Damage {}'.format(
                                          dike, n)
                                      for dike in function.dikelist
                                  ],
                                  function=sum_over,
                                  kind=direction))

                outcomes.append(
                    ScalarOutcome('Dike Investment Costs {}'.format(n),
                                  variable_name=[
                                      '{}_Dike Investment Costs {}'.format(
                                          dike, n)
                                      for dike in function.dikelist
                                  ],
                                  function=sum_over,
                                  kind=direction))

                outcomes.append(
                    ScalarOutcome('Expected Number of Deaths {}'.format(n),
                                  variable_name=[
                                      '{}_Expected Number of Deaths {}'.format(
                                          dike, n)
                                      for dike in function.dikelist
                                  ],
                                  function=sum_over,
                                  kind=direction))

            outcomes.append(
                ScalarOutcome('RfR Total Costs {}'.format(n), kind=direction))
            outcomes.append(
                ScalarOutcome('Expected Evacuation Costs {}'.format(n),
                              kind=direction))

        dike_model.outcomes = outcomes

    # Fully disaggregated:
    elif problem_formulation_id == 5:
        outcomes = []

        for n in function.planning_steps:
            for dike in function.dikelist:
                for entry in [
                        'Expected Annual Damage', 'Dike Investment Costs',
                        'Expected Number of Deaths'
                ]:

                    o = ScalarOutcome('{}_{} {}'.format(dike, entry, n),
                                      kind=direction)
                    outcomes.append(o)

            outcomes.append(
                ScalarOutcome('RfR Total Costs {}'.format(n), kind=direction))
            outcomes.append(
                ScalarOutcome('Expected Evacuation Costs {}'.format(n),
                              kind=direction))
        dike_model.outcomes = outcomes

    # OWN PROBLEM FORMULATION:
    elif problem_formulation_id == 6:
        outcomes = []

        function.gelderland_dikelist = function.dikelist[:
                                                         -2]  #Cut the dikelist by removing the last two dike rings
        function.ring12_dikelist = function.dikelist[:-3]
        function.ring3_dikelist = function.dikelist[2:-2]
        variable_names_1 = []
        variable_names_2 = []
        variable_names_3 = []
        variable_names_4 = []
        variable_names_5 = []

        for n in function.planning_steps:
            for dike in function.ring12_dikelist:
                variable_names_1.extend(
                    ['{}_Expected Annual Damage {}'.format(dike, n)])
                variable_names_2.extend(
                    ['{}_Expected Number of Deaths {}'.format(dike, n)])
            for dike in function.ring3_dikelist:
                variable_names_3.extend(
                    ['{}_Expected Annual Damage {}'.format(dike, n)])
                variable_names_4.extend(
                    ['{}_Expected Number of Deaths {}'.format(dike, n)])
            for dike in function.gelderland_dikelist:
                variable_names_5.extend(
                    ['{}_Dike Investment Costs {}'.format(dike, n)])
            variable_names_5.extend(['RfR Total Costs {}'.format(n)])

        outcomes.append(
            ScalarOutcome(
                'A1/2_EAD',  #Expected Annual Cost
                variable_name=[var for var in variable_names_1],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'A1/2_END',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_2],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'A3_EAD',  #Expected Annual Cost
                variable_name=[var for var in variable_names_3],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'A3_END',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_4],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        outcomes.append(
            ScalarOutcome(
                'G_TIC',  #Gelderland Total Investment Cost
                variable_name=[var for var in variable_names_5],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'EEC',  #Expected Evacuation Cost
                variable_name=[
                    'Expected Evacuation Costs {}'.format(n)
                    for n in function.planning_steps
                ],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        dike_model.outcomes = outcomes

    elif problem_formulation_id == 7:
        outcomes = []

        variable_names_1 = []
        variable_names_2 = []
        variable_names_3 = []
        variable_names_4 = []

        for n in function.planning_steps:
            for dike in function.dikelist:
                variable_names_1.extend(
                    ['{}_Expected Annual Damage {}'.format(dike, n)])
                variable_names_2.extend(
                    ['{}_Expected Number of Deaths {}'.format(dike, n)])
                variable_names_4.extend(
                    ['{}_Dike Investment Costs {}'.format(dike, n)])
#             variable_names_3.extend(['Expected Evacuation Costs {}'.format(n)])
            variable_names_4.extend(['RfR Total Costs {}'.format(n)])

        outcomes.append(
            ScalarOutcome(
                'EAD',  #Expected Annual Cost
                variable_name=[var for var in variable_names_1],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'END',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_2],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        outcomes.append(
            ScalarOutcome(
                'TIC',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_4],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'EEC',  #Expected Evacuation Cost
                variable_name=[
                    'Expected Evacuation Costs {}'.format(n)
                    for n in function.planning_steps
                ],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        dike_model.outcomes = outcomes

    elif problem_formulation_id == 9:
        outcomes = []

        variable_names_1 = []
        variable_names_2 = []
        variable_names_3 = []
        variable_names_4 = []

        for n in function.planning_steps:
            for dike in function.dikelist:
                variable_names_1.extend(
                    ['{}_Expected Annual Damage {}'.format(dike, n)])
                variable_names_2.extend(
                    ['{}_Expected Number of Deaths {}'.format(dike, n)])
                variable_names_4.extend(
                    ['{}_Dike Investment Costs {}'.format(dike, n)])


#             variable_names_3.extend(['Expected Evacuation Costs {}'.format(n)])
            variable_names_4.extend(['RfR Total Costs {}'.format(n)])

        outcomes.append(
            ScalarOutcome(
                'EAD',  #Expected Annual Cost
                variable_name=[var for var in variable_names_1],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'END',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_2],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        outcomes.append(
            ScalarOutcome(
                'TIC',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_4],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'EEC',  #Expected Evacuation Cost
                variable_name=[
                    'Expected Evacuation Costs {}'.format(n)
                    for n in function.planning_steps
                ],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        function.gelderland_dikelist = function.dikelist[:
                                                         -2]  #Cut the dikelist by removing the last two dike rings
        function.ring12_dikelist = function.dikelist[:-3]
        function.ring3_dikelist = function.dikelist[2:-2]
        variable_names_11 = []
        variable_names_12 = []
        variable_names_13 = []
        variable_names_14 = []
        variable_names_15 = []

        for n in function.planning_steps:
            for dike in function.ring12_dikelist:
                variable_names_11.extend(
                    ['{}_Expected Annual Damage {}'.format(dike, n)])
                variable_names_12.extend(
                    ['{}_Expected Number of Deaths {}'.format(dike, n)])
            for dike in function.ring3_dikelist:
                variable_names_13.extend(
                    ['{}_Expected Annual Damage {}'.format(dike, n)])
                variable_names_14.extend(
                    ['{}_Expected Number of Deaths {}'.format(dike, n)])
            for dike in function.gelderland_dikelist:
                variable_names_15.extend(
                    ['{}_Dike Investment Costs {}'.format(dike, n)])
            variable_names_15.extend(['RfR Total Costs {}'.format(n)])

        outcomes.append(
            ScalarOutcome(
                'A1/2_EAD',  #Expected Annual Cost
                variable_name=[var for var in variable_names_11],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'A1/2_END',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_12],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'A3_EAD',  #Expected Annual Cost
                variable_name=[var for var in variable_names_13],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))
        outcomes.append(
            ScalarOutcome(
                'A3_END',  #Expected Number of Deaths
                variable_name=[var for var in variable_names_14],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        outcomes.append(
            ScalarOutcome(
                'G_TIC',  #Gelderland Total Investment Cost
                variable_name=[var for var in variable_names_15],
                function=sum_over,
                kind=ScalarOutcome.MINIMIZE))

        for dike in function.dikelist:
            variable_name = []
            for e in ['Expected Annual Damage', 'Dike Investment Costs']:
                variable_name.extend([
                    '{}_{} {}'.format(dike, e, n)
                    for n in function.planning_steps
                ])

            outcomes.append(
                ScalarOutcome('{} Total Costs'.format(dike),
                              variable_name=[var for var in variable_name],
                              function=sum_over,
                              kind=direction))

            outcomes.append(
                ScalarOutcome('{}_Expected Number of Deaths'.format(dike),
                              variable_name=[
                                  '{}_Expected Number of Deaths {}'.format(
                                      dike, n) for n in function.planning_steps
                              ],
                              function=sum_over,
                              kind=direction))

        dike_model.outcomes = outcomes

    else:
        raise TypeError('unknownx identifier')

    return dike_model, function.planning_steps
Пример #5
0
    'name': 'no policy'
}, {
    'params': {
        'AlarmEdu': 1
    },
    'name': 'Alarm Education'
}]

if __name__ == '__main__':
    ema_logging.log_to_stderr(ema_logging.INFO)

    waas_model = WaasModel("waasmodel", wd='./model')
    waas_model.uncertainties = [
        IntegerParameter("climate scenarios",
                         1,
                         30,
                         pff=True,
                         resolution=[x for x in range(1, 31)]),
        RealParameter("fragility dikes", -0.1, 0.1),
        RealParameter("DamFunctTbl", -0.1, 0.1),
        RealParameter("ShipTbl1", -0.1, 0.1),
        RealParameter("ShipTbl2", -0.1, 0.1),
        RealParameter("ShipTbl3", -0.1, 0.1),
        RealParameter("collaboration", 1, 1.6),
        CategoricalParameter("land use scenarios", [
            "NoChange", "moreNature", "Deurbanization", "sustainableGrowth",
            "urbanizationDeurbanization", "urbanizationLargeAndFast",
            "urbanizationLargeSteady"
        ],
                             pff=True)
    ]
        indices.plot.bar(yerr=err.values.T, ax=ax)
        fig.set_size_inches(8, 6)
        fig.subplots_adjust(bottom=0.3)
        plt.ylim([0, 1])
        plt.grid()

    plt.show()

    #%%

    # Generate random dike heightening policy with early warning system and RfR set to 0

    # First comment out line 56-65 in problem_formulation file

    my_lever = [
        IntegerParameter('A.1_DikeIncrease 0', 0, 10),
        IntegerParameter('A.1_DikeIncrease 1', 0, 10),
        IntegerParameter('A.1_DikeIncrease 2', 0, 10),
        IntegerParameter('A.2_DikeIncrease 0', 0, 10),
        IntegerParameter('A.2_DikeIncrease 2', 0, 10),
        IntegerParameter('A.3_DikeIncrease 0', 0, 10),
        IntegerParameter('A.3_DikeIncrease 1', 0, 10),
        IntegerParameter('A.3_DikeIncrease 2', 0, 10),
        IntegerParameter('A.4_DikeIncrease 0', 0, 10),
        IntegerParameter('A.4_DikeIncrease 1', 0, 10),
        IntegerParameter('A.4_DikeIncrease 2', 0, 10),
        IntegerParameter('A.5_DikeIncrease 0', 0, 10),
        IntegerParameter('A.5_DikeIncrease 1', 0, 10),
        IntegerParameter('A.5_DikeIncrease 2', 0, 10)
    ]
Пример #7
0
    edge_dict = {}
    for key, val in d.iteritems():
        keyn = str(key[0]) + str(key[1])
        edge_dict.update({keyn: val})

    return edge_dict

from ema_workbench import (Model, RealParameter, ScalarOutcome, Constant,
                           IntegerParameter)

#instantiate the model
criticality_model = Model('criticality', function=ema_criticality)

#specify uncertainties
criticality_model.uncertainties = [
    IntegerParameter('det_idx', 1, 3),
    RealParameter('od_exp', 0.75, 1.5),
    RealParameter('od_loc1', 0.75, 1.5),
    RealParameter('od_loc2', 0.75, 1.5),
    RealParameter('od_loc3', 0.75, 1.5),
    RealParameter('od_loc4', 0.75, 1.5),
    RealParameter('theta', 30, 70),
    RealParameter('beta', 0.25, 0.75),
    RealParameter('cutoff', 0.025, 0.075),
    RealParameter('m10_buffer', 0.0025, 0.0075),
    RealParameter('penalty', 1, 1.5)
]

#specify outcomes
criticality_model.outcomes = [
    ScalarOutcome(key) for key, val in edge_dict.iteritems()
Пример #8
0
def get_model_for_problem_formulation(problem_formulation_id):
    ''' Prepare DikeNetwork in a way it can be input in the EMA-workbench.
    Specify uncertainties, levers and problem formulation.
    '''
    # Load the model:
    function = DikeNetwork()
    # workbench model:
    dike_model = Model('dikesnet', function=function)

    # Uncertainties and Levers:
    # Specify uncertainties range:
    Real_uncert = {'Bmax': [30, 350], 'pfail': [0, 1]}  # m and [.]
    # breach growth rate [m/day]
    cat_uncert_loc = {'Brate': (0.9, 1.5, 1000)}

    cat_uncert = {'discount rate': (1.5, 2.5, 3.5, 4.5)}
    Int_uncert = {'A.0_ID flood wave shape': [0, 132]}

    # Range of dike heightening:
    dike_lev = {'DikeIncrease': [0, 10]}  # dm

    # Series of five Room for the River projects:
    rfr_lev = ['{}_RfR'.format(project_id) for project_id in range(0, 5)]

    # Time of warning: 0, 1, 2, 3, 4 days ahead from the flood
    EWS_lev = {'EWS_DaysToThreat': [0, 4]}  # days

    uncertainties = []
    levers = []
    for dike in function.dikelist:
        # uncertainties in the form: locationName_uncertaintyName
        for uncert_name in Real_uncert.keys():
            name = "{}_{}".format(dike, uncert_name)
            lower, upper = Real_uncert[uncert_name]
            uncertainties.append(RealParameter(name, lower, upper))

        for uncert_name in cat_uncert_loc.keys():
            name = "{}_{}".format(dike, uncert_name)
            categories = cat_uncert_loc[uncert_name]
            uncertainties.append(CategoricalParameter(name, categories))

        # location-related levers in the form: locationName_leversName
        for lev_name in dike_lev.keys():
            name = "{}_{}".format(dike, lev_name)
            levers.append(
                IntegerParameter(name, dike_lev[lev_name][0],
                                 dike_lev[lev_name][1]))

    for uncert_name in cat_uncert.keys():
        categories = cat_uncert[uncert_name]
        uncertainties.append(CategoricalParameter(uncert_name, categories))

    # project-related levers can be either 0 (not implemented) or 1
    # (implemented)
    for uncert_name in Int_uncert.keys():
        uncertainties.append(
            IntegerParameter(uncert_name, Int_uncert[uncert_name][0],
                             Int_uncert[uncert_name][1]))

    # RfR levers can be either 0 (not implemented) or 1 (implemented)
    for lev_name in rfr_lev:
        levers.append(IntegerParameter(lev_name, 0, 1))

    # Early Warning System lever
    for lev_name in EWS_lev.keys():
        levers.append(
            IntegerParameter(lev_name, EWS_lev[lev_name][0],
                             EWS_lev[lev_name][1]))

    # load uncertainties and levers in dike_model:
    dike_model.uncertainties = uncertainties
    dike_model.levers = levers

    # Problem formulations:
    # Outcomes are all costs, thus they have to minimized:
    direction = ScalarOutcome.MINIMIZE

    # 2-objective PF:
    if problem_formulation_id == 0:
        dikes_variable_names = []

        for dike in function.dikelist:
            dikes_variable_names.extend([
                '{}_{}'.format(dike, e)
                for e in ['Expected Annual Damage', 'Dike Investment Costs']
            ])
        dikes_variable_names.extend(['RfR Total Costs'])
        dikes_variable_names.extend(['Expected Evacuation Costs'])

        dike_model.outcomes = [
            ScalarOutcome('All Costs',
                          variable_name=[var for var in dikes_variable_names],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[
                              '{}_Expected Number of Deaths'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction)
        ]
    # 3-objectives PF:
    elif problem_formulation_id == 1:
        dike_model.outcomes = [
            ScalarOutcome('Expected Annual Damage',
                          variable_name=[
                              '{}_Expected Annual Damage'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Total Investment Costs',
                          variable_name=[
                              '{}_Dike Investment Costs'.format(dike)
                              for dike in function.dikelist
                          ] + ['RfR Total Costs'] +
                          ['Expected Evacuation Costs'],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[
                              '{}_Expected Number of Deaths'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction)
        ]

    # 12-objectives PF:
    elif problem_formulation_id == 2:
        outcomes = []

        for dike in function.dikelist:
            outcomes.append(
                ScalarOutcome(
                    '{} Total Costs'.format(dike),
                    variable_name=[
                        '{}_{}'.format(dike, e) for e in
                        ['Expected Annual Damage', 'Dike Investment Costs']
                    ],
                    function=sum_over,
                    kind=direction))

            outcomes.append(
                ScalarOutcome('{}_Expected Number of Deaths'.format(dike),
                              kind=direction))

        outcomes.append(ScalarOutcome('RfR Total Costs', kind=direction))
        outcomes.append(
            ScalarOutcome('Expected Evacuation Costs', kind=direction))

        dike_model.outcomes = outcomes

    # 17-objectives PF:
    elif problem_formulation_id == 3:
        outcomes = []

        for dike in function.dikelist:
            for entry in [
                    'Expected Annual Damage', 'Dike Investment Costs',
                    'Expected Number of Deaths'
            ]:
                o = ScalarOutcome('{}_{}'.format(dike, entry), kind=direction)
                outcomes.append(o)

        outcomes.append(ScalarOutcome('RfR Total Costs', kind=direction))
        outcomes.append(
            ScalarOutcome('Expected Evacuation Costs', kind=direction))
        dike_model.outcomes = outcomes

    # 8-objectives PF:
    elif problem_formulation_id == 4:
        outcomes = []
        dikeDeventer = function.dikelist[len(function.dikelist) - 1]

        outcomes.append(
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[
                              '{}_Expected Number of Deaths'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction))

        outcomes.append(ScalarOutcome('RfR Total Costs', kind=direction))
        outcomes.append(
            ScalarOutcome('Expected Evacuation Costs', kind=direction))

        outcomes.append(
            ScalarOutcome(
                'Gelderland Dike Investment Costs',
                variable_name=[
                    '{}_Dike Investment Costs'.format(dike)
                    for dike in function.dikelist[0:len(function.dikelist) - 1]
                ],
                function=sum_over,
                kind=direction))

        outcomes.append(
            ScalarOutcome('OverIjsel Dike Investment Costs',
                          variable_name=[
                              '{}_Dike Investment Costs'.format(dikeDeventer)
                          ],
                          kind=direction))

        outcomes.append(
            ScalarOutcome(
                'GelderlandUpstream Expected Annual Damage',
                variable_name=[
                    '{}_Expected Annual Damage'.format(dike)
                    for dike in function.dikelist[0:len(function.dikelist) - 3]
                ],
                function=sum_over,
                kind=direction))

        outcomes.append(
            ScalarOutcome(
                'GelderlandDownstream Expected Annual Damage',
                variable_name=[
                    '{}_Expected Annual Damage'.format(dike)
                    for dike in function.dikelist[2:len(function.dikelist) - 1]
                ],
                function=sum_over,
                kind=direction))

        outcomes.append(
            ScalarOutcome('OverIjsel Expected Annual Damage',
                          variable_name=[
                              '{}_Expected Annual Damage'.format(dikeDeventer)
                          ],
                          kind=direction))

        dike_model.outcomes = outcomes
    else:
        raise TypeError('unknonw identifier')
    return dike_model
from ema_workbench.em_framework.evaluators import BaseEvaluator
from ema_workbench.em_framework.optimization import (EpsilonProgress,
                                                     HyperVolume)

ema_logging.log_to_stderr(ema_logging.INFO)
BaseEvaluator.reporting_frequency = 0.1
# ema_logging.log_to_stderr(ema_logging.DEBUG)

from PyRICE_V8 import PyRICE

model = PyRICE(model_specification="EMA", welfare_function="utilitarian")
RICE = Model('RICE', function=model)

RICE.uncertainties = [
    IntegerParameter('fdamage', 0, 1),
    IntegerParameter('scenario_pop_tfp', 0, 5),
    IntegerParameter('scenario_sigma', 0, 5),
    IntegerParameter('scenario_cback', 0, 2),
    IntegerParameter('cback_to_zero', 0, 1),
    RealParameter('fosslim', 4000.0, 13649),
    RealParameter('limmiu', 0.8, 1.2)
]

RICE.levers = [
    RealParameter('sr', 0.1, 0.5),
    IntegerParameter('miu_period', 5, 30)
]

RICE.outcomes = [
    ScalarOutcome('Utility 2055', ScalarOutcome.MAXIMIZE),
Пример #10
0
def main():

    hybridmodel = Model('hybridmodel', function=hybridloop)

    hybridmodel.uncertainties = [
        IntegerParameter("inputpowerfactor", 15, 25),  #7 13
        IntegerParameter("inputLNGprice", 200, 1000),
        IntegerParameter("inputtransferprice", 50, 300),
        IntegerParameter("inputCapincrease", 1000, 3000),
        IntegerParameter("inputCapincreasetime", 1, 2),
        IntegerParameter("inputLNGCapincrease", 1000, 3000),
        IntegerParameter("inputLNGCapincreasetime", 1, 2),
        RealParameter("DemandBalanceSupplyEnergyPrice", 0.4, 0.7),
        RealParameter("SupplyElasticityGas", 0.06, 0.07),
        RealParameter("SupplyElasticityOil", 0.1, 0.2),
        RealParameter("SupplyElasticityCoal", 0.1, 0.2),
        RealParameter("SupplyElasticityNuclear", 0.007, 0.017),
        RealParameter("SupplyElasticityBiofuel", 0.1, 0.2),
        RealParameter("SupplyElasticityOR", 0.15, 0.3),
        IntegerParameter("EconomicGrowthScenario", 1, 3),
        IntegerParameter("EnergyIntensityScenario", 1, 3),
        RealParameter("CO2coal", 95, 105),
        RealParameter("CO2oil", 65, 95),
        RealParameter("Variancepower", -5.0, -0.1),
        RealParameter("AutonomousEnergyIntensityDecrease", 0, 0.02)
    ]

    #                             IntegerParameter("POil", 8900, 9100),
    #                             IntegerParameter("PCoal", 2800, 3100),
    #                             IntegerParameter("PBio", 29000, 32000),
    #                             IntegerParameter("PNuc", 16000, 17000),
    #                             IntegerParameter("POR", 19000, 22000),
    #                             IntegerParameter("PGasE", 6500, 7000),
    #                             IntegerParameter("PGasNA", 2500, 2700),
    #                             IntegerParameter("PGasSCA", 2500, 2700),
    #                             IntegerParameter("PGasCIS", 6500, 7000),
    #                             IntegerParameter("PGasME", 7000, 8000),
    #                             IntegerParameter("PGasAF", 7000, 8000),
    #                             IntegerParameter("PGasAP", 7000, 8000)]

    hybridmodel.outcomes = [
        TimeSeriesOutcome("EU_GasSup"),
        #                         TimeSeriesOutcome("EU_GasDem"),
        #                         TimeSeriesOutcome("EU_GasCon"),
        TimeSeriesOutcome("EU_OilSup"),
        #                         TimeSeriesOutcome("EU_OilDem"),
        #                         TimeSeriesOutcome("EU_OilCon"),
        TimeSeriesOutcome("EU_CoalSup"),
        #                         TimeSeriesOutcome("EU_CoalDem"),
        #                         TimeSeriesOutcome("EU_CoalCon"),
        TimeSeriesOutcome("EU_NucSup"),
        #                         TimeSeriesOutcome("EU_NucDem"),
        #                         TimeSeriesOutcome("EU_NucCon"),
        TimeSeriesOutcome("EU_BioSup"),
        #                         TimeSeriesOutcome("EU_BioDem"),
        #                         TimeSeriesOutcome("EU_BioCon"),
        TimeSeriesOutcome("EU_ORSup"),
        #                         TimeSeriesOutcome("EU_ORDem"),
        #                         TimeSeriesOutcome("EU_ORCon"),
        TimeSeriesOutcome("EU_EDem"),
        TimeSeriesOutcome("EU_ESup"),
        TimeSeriesOutcome("EU_GDP"),
        TimeSeriesOutcome("EU_CO2"),
        TimeSeriesOutcome("EU_RusGas"),
        TimeSeriesOutcome("EU_EUGI"),
        TimeSeriesOutcome("EU_GIC"),
        #                         TimeSeriesOutcome("EU_RGperAG"),
        #                         TimeSeriesOutcome("EU_RGperTES"),
        #                         TimeSeriesOutcome("EU_RGperGC"),
        #                         TimeSeriesOutcome("EU_GICperBBTU"),
        TimeSeriesOutcome("Oil_Price"),
        TimeSeriesOutcome("Coal_Price"),
        TimeSeriesOutcome("Bio_Price"),
        TimeSeriesOutcome("Gas_PriceE"),
        TimeSeriesOutcome("Nuc_PriceE"),
        TimeSeriesOutcome("OR_PriceE"),
        #                         TimeSeriesOutcome("FuncpriceGas"),
        #                         TimeSeriesOutcome("FuncpriceOil"),
        #                         TimeSeriesOutcome("FuncpriceCoal"),
        TimeSeriesOutcome("Gas_PriceCIS")
    ]

    hybridmodel.levers = [
        IntegerParameter("EnergyUnion", 0, 1),
        IntegerParameter("CO2Cost", 0, 2)
    ]

    ema_logging.log_to_stderr(ema_logging.INFO)
    with MultiprocessingEvaluator(hybridmodel, n_processes=24) as evaluator:
        results = evaluator.perform_experiments(scenarios=200,
                                                policies=6,
                                                levers_sampling='ff')

    save_results(results, './results/1200 runs V40.tar.gz')
Пример #11
0
    for i in range(0,len(policies)):
        policy_dict = policies.iloc[i].to_dict()
        policy_list_principle.append(Policy(policies.index[i], **policy_dict)) 
    total_policy_list.append(policy_list_principle)

nfe = 25000
principle_index =0

if __name__ == "__main__":
    for principle in principles_list:
        print("uncertainty analysis started for: " + principles_list[principle_index] + " case for " + str(nfe) + " scenario's")

        model = PyRICE(model_specification="EMA", welfare_function = principle)
        RICE = Model('RICE', function = model)

        RICE.uncertainties =[IntegerParameter('fdamage',0,2),
                             IntegerParameter('t2xco2_index',0,999),
                             IntegerParameter('t2xco2_dist',0,2),
                             RealParameter('fosslim', 4000, 13649),
                     
                             RealParameter('long_run_nordhaus_tfp_gr', 0.85, 1.15),
                             RealParameter('long_run_nordhaus_sigma', 0.75, 1.25),
                             RealParameter('long_run_nordhaus_pop_gr', 0.75, 1.25),

                             IntegerParameter('scenario_cback',0,1),
                             IntegerParameter('scenario_elasticity_of_damages',0,2),
                             IntegerParameter('scenario_limmiu',0,1)] 
        
        #same for all formulations
        RICE.outcomes = get_all_model_outcomes_uncertainty_search(optimization_formulation = "utilitarian",horizon=2305,precision = 20)
def get_model_for_problem_formulation(problem_formulation_id=2,
                                      Bmax_low=30,
                                      Bmax_high=350,
                                      pfail_low=0,
                                      pfail_high=1,
                                      Brate=(0.9, 1.5, 1000),
                                      disc=(1.5, 2.5, 3.5, 4.5),
                                      wave_shape_low=0,
                                      wave_shape_high=132,
                                      dike_low=0,
                                      dike_high=10,
                                      EWS_low=0,
                                      EWS_high=4):
    ''' Prepare DikeNetwork in a way it can be input in the EMA-workbench.
    Specify uncertainties, levers and problem formulation.
    '''
    # Load the model:
    function = DikeNetwork()
    # workbench model:
    dike_model = Model('dikesnet', function=function)

    # Uncertainties and Levers:
    # Specify uncertainties range:
    #Real_uncert = {'Bmax': [30, 350], 'pfail': [0, 1]}  # m and [.]
    Real_uncert_changed = {
        'Bmax': [Bmax_low, Bmax_high],
        'pfail': [pfail_low, pfail_high]
    }  # m and [.]

    # breach growth rate [m/day]
    #cat_uncert_loc = {'Brate': (0.9, 1.5, 1000)}
    cat_uncert_loc_changed = {'Brate': Brate}

    #cat_uncert = {'discount rate': (1.5, 2.5, 3.5, 4.5)}
    cat_uncert_changed = {'discount rate': disc}

    #Int_uncert = {'A.0_ID flood wave shape': [0, 132]}
    Int_uncert_changed = {
        'A.0_ID flood wave shape': [wave_shape_low, wave_shape_high]
    }

    # Range of dike heightening:
    #dike_lev = {'DikeIncrease': [0, 10]}     # dm
    dike_lev_changed = {'DikeIncrease': [dike_low, dike_high]}  # dm

    # Series of five Room for the River projects:
    rfr_lev = ['{}_RfR'.format(project_id) for project_id in range(0, 5)]

    # Time of warning: 0, 1, 2, 3, 4 days ahead from the flood
    #EWS_lev = {'EWS_DaysToThreat': [0, 4]}  # days
    EWS_lev_changed = {'EWS_DaysToThreat': [EWS_low, EWS_high]}  # days

    uncertainties = []
    levers = []

    for dike in function.dikelist:

        # uncertainties in the form: locationName_uncertaintyName
        for uncert_name in Real_uncert_changed.keys():
            name = "{}_{}".format(dike, uncert_name)
            lower, upper = Real_uncert_changed[uncert_name]
            uncertainties.append(RealParameter(name, lower, upper))

        for uncert_name in cat_uncert_loc_changed.keys():
            name = "{}_{}".format(dike, uncert_name)
            categories = cat_uncert_loc_changed[uncert_name]
            uncertainties.append(CategoricalParameter(name, categories))

        for lev_name in dike_lev_changed.keys():
            name = "{}_{}".format(dike, lev_name)
            levers.append(
                IntegerParameter(name, dike_lev_changed[lev_name][0],
                                 dike_lev_changed[lev_name][1]))

    # (can be changed)
    for uncert_name in cat_uncert_changed.keys():
        categories = cat_uncert_changed[uncert_name]
        uncertainties.append(CategoricalParameter(uncert_name, categories))

    # (can be changed)
    for uncert_name in Int_uncert_changed.keys():
        uncertainties.append(
            IntegerParameter(uncert_name, Int_uncert_changed[uncert_name][0],
                             Int_uncert_changed[uncert_name][1]))

    # project-related levers can be either 0 (not implemented) or 1
    # (implemented)

    #(can be changed)
    # Early Warning System lever
    for lev_name in EWS_lev_changed.keys():
        levers.append(
            IntegerParameter(lev_name, EWS_lev_changed[lev_name][0],
                             EWS_lev_changed[lev_name][1]))

    # RfR levers can be either 0 (not implemented) or 1 (implemented)
    for lev_name in rfr_lev:
        levers.append(IntegerParameter(lev_name, 0, 1))

#     # RfR levers Off
#     constants = []
#     for lev_name in rfr_lev:
#         constants.append(Constant(lev_name, 0))

# load uncertainties and levers in dike_model:
    dike_model.uncertainties = uncertainties
    dike_model.levers = levers
    #     dike_model.constants = constants

    # Problem formulations:
    # Outcomes are all costs, thus they have to minimized:
    direction = ScalarOutcome.MINIMIZE

    # 2-objective PF:
    if problem_formulation_id == 0:
        dikes_variable_names = []

        for dike in function.dikelist:
            dikes_variable_names.extend([
                '{}_{}'.format(dike, e)
                for e in ['Expected Annual Damage', 'Dike Investment Costs']
            ])
        dikes_variable_names.extend(['RfR Total Costs'])
        dikes_variable_names.extend(['Expected Evacuation Costs'])

        dike_model.outcomes = [
            ScalarOutcome('All Costs',
                          variable_name=[var for var in dikes_variable_names],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[
                              '{}_Expected Number of Deaths'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction)
        ]

    # 4-objectives PF:
    elif problem_formulation_id == 1:
        dikes_variable_names = []
        for dike in function.dikelist:
            dikes_variable_names.extend([
                '{}_{}'.format(dike, e)
                for e in ['Expected Annual Damage', 'Dike Investment Costs']
            ])

        dikes_variable_names.extend(['RfR Total Costs'])
        dikes_variable_names.extend(['Expected Evacuation Costs'])

        dike_model.outcomes = [
            ScalarOutcome('Expected Annual Damage',
                          variable_name=[
                              '{}_Expected Annual Damage'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Total Investment Costs',
                          variable_name=[
                              '{}_Dike Investment Costs'.format(dike)
                              for dike in function.dikelist
                          ] + ['RfR Total Costs'] +
                          ['Expected Evacuation Costs'],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[
                              '{}_Expected Number of Deaths'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('All Costs',
                          variable_name=[var for var in dikes_variable_names],
                          function=sum_over,
                          kind=direction)
        ]

    # 4-objectives PF:
    elif problem_formulation_id == 2:
        dikes_variable_names = []
        for dike in function.dikelist:
            dikes_variable_names.extend([
                '{}_{}'.format(dike, e)
                for e in ['Expected Annual Damage', 'Dike Investment Costs']
            ])

        dikes_variable_names.extend(['RfR Total Costs'])
        dikes_variable_names.extend(['Expected Evacuation Costs'])

        dike_model.outcomes = [
            ScalarOutcome('Expected Number of Deaths',
                          variable_name=[
                              '{}_Expected Number of Deaths'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Expected Evacuation Costs', kind=direction),
            ScalarOutcome('Expected Annual Damage',
                          variable_name=[
                              '{}_Expected Annual Damage'.format(dike)
                              for dike in function.dikelist
                          ],
                          function=sum_over,
                          kind=direction),
            ScalarOutcome('Total Construction Costs',
                          variable_name=[
                              '{}_Dike Investment Costs'.format(dike)
                              for dike in function.dikelist
                          ] + ['RfR Total Costs'],
                          function=sum_over,
                          kind=direction)
        ]

    # 12-objectives PF:
    elif problem_formulation_id == 3:
        outcomes = []

        for dike in function.dikelist:
            outcomes.append(
                ScalarOutcome(
                    '{} Total Costs'.format(dike),
                    variable_name=[
                        '{}_{}'.format(dike, e) for e in
                        ['Expected Annual Damage', 'Dike Investment Costs']
                    ],
                    function=sum_over,
                    kind=direction))

            outcomes.append(
                ScalarOutcome('{}_Expected Number of Deaths'.format(dike),
                              kind=direction))

        outcomes.append(ScalarOutcome('RfR Total Costs', kind=direction))
        outcomes.append(
            ScalarOutcome('Expected Evacuation Costs', kind=direction))

        dike_model.outcomes = outcomes

    # 17-objectives PF:
    elif problem_formulation_id == 4:
        outcomes = []

        for dike in function.dikelist:
            for entry in [
                    'Expected Annual Damage', 'Dike Investment Costs',
                    'Expected Number of Deaths'
            ]:
                o = ScalarOutcome('{}_{}'.format(dike, entry), kind=direction)
                outcomes.append(o)

        outcomes.append(ScalarOutcome('RfR Total Costs', kind=direction))
        outcomes.append(
            ScalarOutcome('Expected Evacuation Costs', kind=direction))
        dike_model.outcomes = outcomes

    elif problem_formulation_id == 5:

        # All possible Objectives
        dikes_variable_names = []
        outcomes = []

        for dike in function.dikelist:

            dikes_variable_names.extend([
                '{}_{}'.format(dike, e)
                for e in ['Expected Annual Damage', 'Dike Investment Costs']
            ])
            dikes_variable_names.extend(['RfR Total Costs'])
            dikes_variable_names.extend(['Expected Evacuation Costs'])

            outcomes.append(
                ScalarOutcome(
                    '{} Total Costs'.format(dike),
                    variable_name=[
                        '{}_{}'.format(dike, e) for e in
                        ['Expected Annual Damage', 'Dike Investment Costs']
                    ],
                    function=sum_over,
                    kind=direction))

            outcomes.append(
                ScalarOutcome('{}_Expected Number of Deaths'.format(dike),
                              kind=direction))

            #                outcomes.append(ScalarOutcome('Expected Annual Damage',
            #                                              variable_name=['{}_Expected Annual Damage'.format(dike)
            #                                                             for dike in function.dikelist],
            #                                              function=sum_over, kind=direction))

            outcomes.append(
                ScalarOutcome('Expected Investment Costs',
                              variable_name=[
                                  '{}_Dike Investment Costs'.format(dike)
                                  for dike in function.dikelist
                              ] + ['RfR Total Costs'] +
                              ['Expected Evacuation Costs'],
                              function=sum_over,
                              kind=direction))
            #                outcomes.append(ScalarOutcome('RfR Total Costs', kind=direction))
            #                outcomes.append(ScalarOutcome('Expected Evacuation Costs', kind=direction))

            outcomes.append(
                ScalarOutcome('Expected Number of Deaths',
                              variable_name=[
                                  '{}_Expected Number of Deaths'.format(dike)
                                  for dike in function.dikelist
                              ],
                              function=sum_over,
                              kind=direction))

            outcomes.append(
                ScalarOutcome(
                    'Total Costs',
                    variable_name=[var for var in dikes_variable_names],
                    function=sum_over,
                    kind=direction))

        dike_model.outcomes = outcomes

    else:
        raise TypeError('unknonw identifier')
    return dike_model