from SDDP.SDDP_utils import report_stats

if __name__ == '__main__':
    '''
    Implementation of Wasserstein uncertainty set based on Philpott et al.
    Inner worst-case expectation problem is solved in the backward pass to
    compute the cuts. This approach is regarded as Primal.
    '''
    load_algorithm_options()
    T, model_builder, random_builder, rnd_container_data, rnd_container_oos, r_dro, instance_name, instance_name_gen = load_hydro_data(
        'PRIMAL', 'DW')
    #options['cut_selector'] = SLACK_BASED_CUT_SELECTOR
    algo = SDDP(T,
                model_builder,
                random_builder,
                risk_measure=DistRobust,
                dro_inner_solver=DiscreteWassersteinInnerSolver,
                radius=0,
                norm=1,
                data_random_container=rnd_container_data)
    lbs = algo.run(instance_name=instance_name)
    sim_result = algo.simulate_policy(rnd_container_oos)
    report_stats(sim_result.sims_ub)
    for r_DRO in dro_radii:
        instance_name = instance_name_gen(r_DRO)
        algo.change_dro_radius(r_DRO)
        lbs = algo.run(instance_name=instance_name)

        save_path = hydro_path + '/Output/DW_Primal/%s_LBS.pickle' % (
            instance_name)
        write_object_results(save_path, (algo.instance, lbs))
    sup_dim = rnd_container_data.support_dimension
    supp_ctrs = [{
        'innovations[%i]' % (reservoir): 1
    } for reservoir in range(sup_dim)]
    supp_ctrs.extend(({
        'innovations[%i]' % (r_id): -1
    }) for r_id in range(sup_dim))
    supp_rhs = rnd_container_data.get_noise_ub(
        [f'innovations[{r_id}]' for r_id in range(sup_dim)])
    supp_rhs.extend(
        rnd_container_data.get_noise_lb(
            [f'innovations[{r_id}]' for r_id in range(sup_dim)], True))
    algo = SDDP(T,
                model_builder,
                random_builder,
                risk_measure=DistRobustWassersteinCont,
                radius=r_dro,
                support_ctrs=supp_ctrs,
                support_rhs=supp_rhs)

    lbs = algo.run(instance_name=instance_name)

    save_path = hydro_path + '/Output/DW_Dual/%s_LBS.pickle' % (instance_name)
    write_object_results(save_path, (algo.instance, lbs))

    sim_result = algo.simulate_policy(rnd_container_oos)
    save_path = hydro_path + '/Output/DW_Dual/%s_OOS.pickle' % (instance_name)
    write_object_results(save_path, sim_result)
    report_stats(sim_result.sims_ub)

    del (algo)
示例#3
0
'''
Created on Jan 3, 2018

@author: dduque
'''
from SDDP import options, LAST_CUTS_SELECTOR, load_algorithm_options,\
    SLACK_BASED_CUT_SELECTOR
from SDDP.SDDP_Alg import SDDP
from SDDP.RiskMeasures import DistRobustWasserstein
from Utils.file_savers import write_object_results
from HydroModel import load_hydro_data, model_builder, random_builder, hydro_path
from InstanceGen.ReservoirChainGen import read_instance, HydroRndInstance  #Necessary to unpickle file!

if __name__ == '__main__':
    '''
    Implementation of SDDP solving EV problem.
    --T=12 --R=10 --max_iter=10000 --max_time=1800 --sim_iter=1000 --lines_freq=10 --dro_r=20 --lag=1 --N=10 --dynamic_sampling=False --multicut=True
    '''
    load_algorithm_options()
    T, r_dro, instance_name, out_of_sample_rnd_cont = load_hydro_data(
        'SDDP', 'SP')
    algo = SDDP(T, model_builder, random_builder)
    lbs = algo.run(instance_name=instance_name, ev=False)
    sim_result = algo.simulate_policy(options['sim_iter'],
                                      out_of_sample_rnd_cont)
 dro_trials.extend([r for r in range(100, 200, 20)])
 dro_trials.extend([r for r in range(200, 1000, 200)])
 dro_trials.extend([r for r in range(1000, 3001, 500)])
 dro_trials.extend([0.001, 0.005, 0.01, 0.05, 0.1, 0.5])
 dro_trials.sort()
 #dro_trials = [0.001, 0.01, 1, 5, 8, 10, 15, 20, 50, 100, 500, 1000, 5000]
 print(dro_trials)
 
 if False:  # solve
     for dro_r in dro_trials:
         instance_name = 'DW_CapExp_N%i_m%i_n%i_r%.3f' % (n_scenarios, m, n, dro_r)
         # algo_sp = SDDP(T, model_builder, random_builder)
         algo_dro = SDDP(T,
                         model_builder,
                         random_builder,
                         risk_measure=DistRobustWasserstein,
                         norm=1,
                         radius=dro_r,
                         data_random_container=random_builder())
         # algo_dro = SDDP(T,
         #                 model_builder,
         #                 random_builder,
         #                 risk_measure=DistRobust,
         #                 dro_inner_solver=DiscreteWassersteinInnerSolver,
         #                 radius=dro_r,
         #                 norm=1,
         #                 data_random_container=random_builder())
         algo = algo_dro
         lbs = algo.run(instance_name=instance_name)
         print(["%4.2f" % algo.stage_problems[0].model.getVarByName(f'x[{i}]').X for i in data.I])
         save_path = './Output/%s_LBS.pickle' % (instance_name)
示例#5
0
from Utils.file_savers import write_object_results
from HydroModel import load_hydro_data, hydro_path
from InstanceGen.ReservoirChainGen import read_instance, HydroRndInstance #Necessary to unpickle file!
from SDDP.SDDP_utils import report_stats



if __name__ == '__main__':
    '''
    Implementation of Wasserstein uncertainty set based on taking
    the dual problem of the inner max problem that represents the
    worst-case expectation.
    '''
    load_algorithm_options()
 
    T, model_builder, random_builder, rnd_container_data, rnd_container_oos, r_dro, instance_name = load_hydro_data('PRIMAL', 'PhiVar')
    #options['cut_selector'] = SLACK_BASED_CUT_SELECTOR#SLACK_BASED_CUT_SELECTOR#LAST_CUTS_SELECTOR
    algo = SDDP(T, model_builder, random_builder, risk_measure = DistRobust, dro_inner_solver=PhilpottInnerDROSolver, set_type = DistRobust.L1_NORM , radius = r_dro, data_random_container=rnd_container_data)
    lbs = algo.run(instance_name=instance_name, dynamic_sampling=options['dynamic_sampling'])                                                              
    
    save_path = hydro_path+'/Output/Phi_Primal/%s_LBS.pickle' %(instance_name)
    write_object_results(save_path, (algo.instance, lbs))
    
    sim_result = algo.simulate_policy(rnd_container_oos)
    save_path = hydro_path+'/Output/Phi_Primal/%s_OOS.pickle' %(instance_name)
    write_object_results(save_path, sim_result)
    report_stats(sim_result.sims_ub)
    del(algo)
    
    
if __name__ == '__main__':
    '''
    Implementation of Wasserstein uncertainty set based on taking
    the dual problem of the inner max problem that represents the
    worst-case expectation.
    '''
    load_algorithm_options()

    T, model_builder, random_builder, rnd_container_data, rnd_container_oos, r_dro, instance_name, _ = load_hydro_data(
        'DUAL', 'DW')
    #options['cut_selector'] = SLACK_BASED_CUT_SELECTOR#SLACK_BASED_CUT_SELECTOR#LAST_CUTS_SELECTOR
    algo = SDDP(T,
                model_builder,
                random_builder,
                risk_measure=DistRobustWasserstein,
                norm=1,
                radius=r_dro,
                data_random_container=rnd_container_data)

    oos_setup = {
        'when': [10, 30, 60, 120, 180, 300],
        'random_container': rnd_container_oos,
        'output': []
    }
    lbs = algo.run(instance_name=instance_name, out_of_sample_setup=oos_setup)

    save_path = hydro_path + '/Output/DW_Dual/%s_LBS.pickle' % (instance_name)
    write_object_results(save_path, (algo.instance, lbs))

    sim_result = algo.simulate_policy(rnd_container_oos)
from Utils.file_savers import write_object_results
from HydroModel import load_hydro_data, hydro_path
from InstanceGen.ReservoirChainGen import read_instance, HydroRndInstance #Necessary to unpickle file!
from SDDP.SDDP_utils import report_stats



if __name__ == '__main__':
    '''
    Implementation of Wasserstein uncertainty set based on taking
    the dual problem of the inner max problem that represents the
    worst-case expectation.
    '''
    load_algorithm_options()
 
    T, model_builder, random_builder, rnd_container_data, rnd_container_oos, r_dro, instance_name = load_hydro_data('DUAL', 'PhiVar')
    #options['cut_selector'] = SLACK_BASED_CUT_SELECTOR#SLACK_BASED_CUT_SELECTOR#LAST_CUTS_SELECTOR
    algo = SDDP(T, model_builder, random_builder, risk_measure = DistRobustDuality, set_type = DistRobustDuality.L1_NORM , radius = r_dro, data_random_container=rnd_container_data, cutting_planes =True)
    lbs = algo.run(instance_name=instance_name, dynamic_sampling=options['dynamic_sampling'])                                                              
    
    save_path = hydro_path+'/Output/Phi_Dual/%s_LBS.pickle' %(instance_name)
    write_object_results(save_path, (algo.instance, lbs))
    
    sim_result = algo.simulate_policy(rnd_container_oos)
    save_path = hydro_path+'/Output/Phi_Dual/%s_OOS.pickle' %(instance_name)
    write_object_results(save_path, sim_result)
    report_stats(sim_result.sims_ub)
    del(algo)
    
    
示例#8
0
    out_states = [var.VarName for var in [P, Q, W, C, M]]
    rhs_vars = [evatra.VarName, rainfall.VarName]
    return m, in_states, out_states, rhs_vars

    #print_model(m)


if __name__ == '__main__':
    load_algorithm_options()
    T = 52
    N_train = 20
    N_test = len(parameters["niwa_data"][0]) - N_train
    W = len(parameters["niwa_data"])
    Y = len(parameters["niwa_data"][0])
    O = [[parameters["niwa_data"][w][y] for y in range(N_train)]
         for w in range(W)]
    data_OOS = [[parameters["niwa_data"][w][y] for y in range(N_train, Y)]
                for w in range(W)]
    algo = SDDP(T,
                model_builder,
                random_builder,
                risk_measure=DistRobust,
                dro_solver=DiscreteWassersteinInnerSolver,
                dro_solver_params={
                    'norm': 1,
                    'radius': 0
                })
    #algo = SDDP(T, model_builder, random_builder,  risk_measure =DistRobustWasserstein,  radius = 10)
    lbs = algo.run(instance_name='MILK_52')
    out_of_sample_rnd_cont = random_builder_oos(data_OOS)
    sim_result = algo.simulate_policy(5000, out_of_sample_rnd_cont)
示例#9
0
    SLACK_BASED_CUT_SELECTOR
from SDDP.SDDP_Alg import SDDP
from Utils.file_savers import write_object_results
from HydroValley import load_hydro_data, hydro_path
from InstanceGen.ReservoirChainGen import read_instance, HydroRndInstance  # Necessary to unpickle file!
from SDDP.SDDP_utils import report_stats

if __name__ == '__main__':
    '''
    Implementation of Wasserstein uncertainty set based on taking
    the dual problem of the inner max problem that represents the
    worst-case expectation.
    '''
    load_algorithm_options()

    T, model_builder, random_builder, rnd_container_data, rnd_container_oos, r_dro, instance_name, _ = load_hydro_data(
        'SP', '')
    #options['cut_selector'] = SLACK_BASED_CUT_SELECTOR#SLACK_BASED_CUT_SELECTOR#LAST_CUTS_SELECTOR
    #options['expected_value_problem'] = False
    algo = SDDP(T, model_builder, random_builder, lower_bound=-1E10)
    lbs = algo.run(instance_name=instance_name)

    save_path = hydro_path + '/Output/DW_Dual/%s_LBS.pickle' % (instance_name)
    write_object_results(save_path, (algo.instance, lbs))

    sim_result = algo.simulate_policy(rnd_container_oos)
    save_path = hydro_path + '/Output/DW_Dual/%s_OOS.pickle' % (instance_name)
    write_object_results(save_path, sim_result)
    report_stats(sim_result.sims_ub)
    del (algo)