benders_2stage_mt.py File Reference

This example demonstrates a parallel implementation of a simple Benders decomposition method for a stochastic linear program. More...

Go to the source code of this file.

Functions

def benders_2stage_mt.scen_solve (i, subi, cutconst, cutcoeff, dem_queue, objsub, queue_lock, io_lock)
 
def benders_2stage_mt.get_data_text ()
 
def benders_2stage_mt.get_master_text ()
 
def benders_2stage_mt.get_sub_text ()
 

Variables

 benders_2stage_mt.ws = GamsWorkspace(system_directory = sys.argv[1])
 
 benders_2stage_mt.data = ws.add_job_from_string(get_data_text())
 
 benders_2stage_mt.opt_data = ws.add_options()
 
 benders_2stage_mt.scenario_data = data.out_db.get_parameter("ScenarioData")
 
 benders_2stage_mt.opt = ws.add_options()
 
int benders_2stage_mt.maxiter = 40
 
 benders_2stage_mt.all_model_types
 
 benders_2stage_mt.cp_master = ws.add_checkpoint()
 
 benders_2stage_mt.cp_sub = ws.add_checkpoint()
 
 benders_2stage_mt.master = ws.add_job_from_string(get_master_text())
 
 benders_2stage_mt.databases
 
 benders_2stage_mt.masteri = cp_master.add_modelinstance()
 
 benders_2stage_mt.cutconst = masteri.sync_db.add_parameter("cutconst", 1, "Benders optimality cut constant")
 
 benders_2stage_mt.cutcoeff = masteri.sync_db.add_parameter("cutcoeff", 2, "Benders optimality coefficients")
 
 benders_2stage_mt.theta = masteri.sync_db.add_variable("theta", 0, VarType.Free, "Future profit function variable")
 
 benders_2stage_mt.theta_fix = masteri.sync_db.add_parameter("thetaFix", 0, "")
 
int benders_2stage_mt.num_threads = 2
 
list benders_2stage_mt.subi = []
 
 benders_2stage_mt.dem_queue = queue.Queue()
 
list benders_2stage_mt.received = subi[0].sync_db.add_parameter("received", 1, "units received from first stage solution")
 
list benders_2stage_mt.demand = subi[0].sync_db.add_parameter("demand", 1, "stochastic demand")
 
 benders_2stage_mt.lowerbound = float('-inf')
 
 benders_2stage_mt.upperbound = float('inf')
 
 benders_2stage_mt.objmaster = float('inf')
 
int benders_2stage_mt.it = 1
 
 benders_2stage_mt.value
 
dictionary benders_2stage_mt.dem_dict = {}
 
float benders_2stage_mt.objsubsum = 0.0
 
 benders_2stage_mt.queue_lock = threading.Lock()
 
 benders_2stage_mt.io_lock = threading.Lock()
 
dictionary benders_2stage_mt.coef = {}
 
list benders_2stage_mt.objsub = []
 
list benders_2stage_mt.cons = []
 
dictionary benders_2stage_mt.threads = {}
 
 benders_2stage_mt.target
 
 benders_2stage_mt.scen_solve
 
 benders_2stage_mt.args
 

Detailed Description

This example demonstrates a parallel implementation of a simple Benders decomposition method for a stochastic linear program.

The underlying model implements a simple distribution system with stochastic demand data. This parallel version extends the benders_2stage.py example by solving the independent subproblems in parallel. For that we need to instantiate a separate GamsModelInstance for each parallel worker. We use the efficient GamsModelInstance.copy_modelinstance method to accomplish this in the most effective way. The number of demand scenarios can be larger than the number of parallel workers. The distribution of work is handled through a work queue. The parallel execution of the subproblems is done in separate threads (the mt in the name of the example stands for Multi Threading), so there is very little overhead from disk activity. Note that the CPython implementation will not run threads in parallel due to its Global Interpreter Lock.

Definition in file benders_2stage_mt.py.