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)
''' 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)
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)
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)
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)