def test_persistent_basic(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 10 ph = mpisppy.opt.ph.PH( PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": 3}, ) conv, basic_obj, tbound = ph.ph_main() PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 10 PHoptions["solvername"] = persistentsolvername ph = mpisppy.opt.ph.PH( PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": 3}, ) conv, pobj, tbound = ph.ph_main() sig2basic = round_pos_sig(basic_obj, 2) sig2pobj = round_pos_sig(pobj, 2) self.assertEqual(sig2basic, sig2pobj)
def test_persistent_bundles(self): """ This excercises complicated code. """ PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 PHoptions["bundles_per_rank"] = 2 ph = mpisppy.opt.ph.PH(PHoptions, self.all10_scenario_names, scenario_creator, scenario_denouement, cb_data=10) conv, basic_obj, tbound = ph.ph_main() PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 PHoptions["bundles_per_rank"] = 2 PHoptions["solvername"] = persistentsolvername ph = mpisppy.opt.ph.PH(PHoptions, self.all10_scenario_names, scenario_creator, scenario_denouement, cb_data=10) conv, pbobj, tbound = ph.ph_main() sig2basic = round_pos_sig(basic_obj, 2) sig2pbobj = round_pos_sig(pbobj, 2) self.assertEqual(sig2basic, sig2pbobj)
def test_ph_basic(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 ph = mpisppy.opt.ph.PH(PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, cb_data=3) conv, obj, tbound = ph.ph_main()
def test_bundles(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 PHoptions["bundles_per_rank"] = 2 ph = mpisppy.opt.ph.PH(PHoptions, self.all10_scenario_names, scenario_creator, scenario_denouement, cb_data=10) conv, obj, tbound = ph.ph_main()
def test_ph_rhosetter(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 ph = mpisppy.opt.ph.PH(PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, cb_data=3, rho_setter=_rho_setter) conv, obj, tbound = ph.ph_main() sig2obj = round_pos_sig(obj, 2)
def test_ph_basic(self): options = self._copy_of_base_options() options["PHIterLimit"] = 2 ph = mpisppy.opt.ph.PH( options, self.all3_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": 3}, ) conv, obj, tbound = ph.ph_main()
def test_bundles(self): options = self._copy_of_base_options() options["PHIterLimit"] = 2 options["bundles_per_rank"] = 2 ph = mpisppy.opt.ph.PH( options, self.all10_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": 10}, ) conv, obj, tbound = ph.ph_main()
def test_fix_ph_basic(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 ph = mpisppy.opt.ph.PH(PHoptions, self.all3_scenario_names, self._fix_creator, scenario_denouement, cb_data=3) conv, obj, tbound = ph.ph_main() for k, s in ph.local_scenarios.items(): self.assertTrue(s.NumProducedFirstStage[5].is_fixed()) self.assertEqual(pyo.value(s.NumProducedFirstStage[5]), 1134)
def test_ph_rhosetter(self): options = self._copy_of_base_options() options["PHIterLimit"] = 2 ph = mpisppy.opt.ph.PH( options, self.all3_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": 3}, rho_setter=_rho_setter, ) conv, obj, tbound = ph.ph_main() sig2obj = round_pos_sig(obj, 2)
def test_ph_iter0(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 0 ph = mpisppy.opt.ph.PH( PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": 3}, ) conv, obj, tbound = ph.ph_main() sig2obj = round_pos_sig(obj, 2)
def test_ph_solve(self): PHoptions = self._copy_of_base_options() ph = mpisppy.opt.ph.PH(PHoptions, self.all_scenario_names, hydro.scenario_creator, hydro.scenario_denouement, all_nodenames=self.all_nodenames, cb_data=self.BFs) conv, obj, tbound = ph.ph_main() sig2tbnd = round_pos_sig(tbound, 2) self.assertEqual(180, sig2tbnd) ph._disable_W_and_prox() sig2eobj = round_pos_sig(ph.Eobjective(), 2) self.assertEqual(190, sig2eobj)
def test_fix_ph_iter0(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 0 ph = mpisppy.opt.ph.PH( PHoptions, self.all3_scenario_names, self._fix_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": 3}, ) conv, obj, tbound = ph.ph_main() # Actually, if it is still fixed for one scenario, probably fixed forall. for k, s in ph.local_scenarios.items(): self.assertEqual(pyo.value(s.NumProducedFirstStage[5]), 1134) self.assertTrue(s.NumProducedFirstStage[5].is_fixed())
def test_lagrangian_bound(self): """ Make sure the lagrangian bound is at least a bound """ from mpisppy.extensions.xhatlooper import XhatLooper PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 1 PHoptions["xhat_looper_options"] = {"xhat_solver_options":\ PHoptions["iterk_solver_options"], "scen_limit": 3} ph = mpisppy.opt.ph.PH(PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, cb_data=3, PH_extensions=XhatLooper) conv, basic_obj, tbound = ph.ph_main() xhatobj = ph.extobject._xhat_looper_obj_final dopts = sputils.option_string_to_dict("mipgap=0.0001") objbound = ph.post_solve_bound(solver_options=dopts, verbose=False) self.assertGreaterEqual(xhatobj, objbound)
def test_xhat_extension(self): """ Make sure least one of the xhat extensions runs. """ from mpisppy.extensions.xhatlooper import XhatLooper PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 1 PHoptions["xhat_looper_options"] = {"xhat_solver_options":\ PHoptions["iterk_solver_options"], "scen_limit": 3} ph = mpisppy.opt.ph.PH(PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, cb_data=3, PH_extensions=XhatLooper) conv, basic_obj, tbound = ph.ph_main() # in this particular case, the extobject is an xhatter xhatobj1 = round_pos_sig(ph.extobject._xhat_looper_obj_final, 1) self.assertEqual(xhatobj1, 200000)
def smoke_for_extensions(self): """ Make sure the example extensions can at least run. """ from mpisppy.extensions.extension import MultiPHExtension from mpisppy.extensions.fixer import Fixer from mpisppy.extensions.mipgapper import Gapper from mpisppy.extensions.xhatlooper import XhatLooper from mpisppy.extensions.xhatclosest import XhatClosest PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 ph = mpisppy.opt.ph.PH( PHoptions, self.all3_scenario_names, scenario_creator, scenario_denouement, PH_extensions=MultiPHExtension, PH_extension_kwargs=multi_ext, ) multi_ext = {"ext_classes": [Fixer, Gapper, XhatLooper, XhatClosest]} conv, basic_obj, tbound = ph.ph_main()
def test_fix_xhat_extension(self): """ Make sure that ph and xhat does not unfix a fixed Var """ from mpisppy.extensions.xhatlooper import XhatLooper PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 1 PHoptions["xhat_looper_options"] = {"xhat_solver_options":\ PHoptions["iterk_solver_options"], "scen_limit": 3} ph = mpisppy.opt.ph.PH(PHoptions, self.all3_scenario_names, self._fix_creator, scenario_denouement, cb_data=3, PH_extensions=XhatLooper) conv, basic_obj, tbound = ph.ph_main() for k, s in ph.local_scenarios.items(): self.assertTrue(s.NumProducedFirstStage[5].is_fixed()) self.assertEqual(pyo.value(s.NumProducedFirstStage[5]), 1134)
def test_ph_solve(self): options = self._copy_of_base_options() ph = mpisppy.opt.ph.PH( options, self.all_scenario_names, hydro.scenario_creator, hydro.scenario_denouement, all_nodenames=self.all_nodenames, scenario_creator_kwargs={ "branching_factors": self.branching_factors }, ) conv, obj, tbound = ph.ph_main() sig2tbnd = round_pos_sig(tbound, 2) self.assertEqual(180, sig2tbnd) ph.disable_W_and_prox() sig2eobj = round_pos_sig(ph.Eobjective(), 2) self.assertEqual(190, sig2eobj)
def test_ph_xhat(self): PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 10 # xhat is feasible PHoptions["xhat_specific_options"] = {"xhat_solver_options": PHoptions["iterk_solver_options"], "xhat_scenario_dict": \ {"ROOT": "Scen1", "ROOT_0": "Scen1", "ROOT_1": "Scen4", "ROOT_2": "Scen7"}, "csvname": "specific.csv"} ph = mpisppy.opt.ph.PH(PHoptions, self.all_scenario_names, hydro.scenario_creator, hydro.scenario_denouement, all_nodenames=self.all_nodenames, cb_data=self.BFs, PH_extensions=XhatSpecific) conv, obj, tbound = ph.ph_main() sig2xhatobj = round_pos_sig(ph.extobject._xhat_specific_obj_final, 2) self.assertEqual(190, sig2xhatobj)
def fix_for_extensions(self): """ Make sure the example extensions don't destroy fixedness """ from mpisppy.extensions.extensions import MultiPHExtension from mpisppy.extensions.fixer import Fixer from mpisppy.extensions.mipgapper import Gapper from mpisppy.extensions.xhatlooper import XhatLooper from mpisppy.extensions.xhatclosest import XhatClosest PHoptions = self._copy_of_base_options() PHoptions["PHIterLimit"] = 2 ph = mpisppy.opt.ph.PH( PHoptions, self.all3_scenario_names, self._fix_creator, scenario_denouement, PH_extensions=MultiPHExtension, PH_extension_kwargs=multi_ext, ) multi_ext = {"ext_classes": [Fixer, Gapper, XhatLooper, XhatClosest]} conv, basic_obj, tbound = ph.ph_main() for k, s in ph.local_scenarios.items(): self.assertTrue(s.NumProducedFirstStage[5].is_fixed()) self.assertEqual(pyo.value(s.NumProducedFirstStage[5]), 1134)
"ROOT_0": "Scen1", "ROOT_1": "Scen4", "ROOT_2": "Scen7"}, "csvname": "specific.csv"} # as of april 2020, we are not supporting xhat as an extension ph = mpisppy.opt.ph.PH( options, all_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"branching_factors": BFs}, all_nodenames=all_nodenames, ) conv, obj, tbound = ph.ph_main() if ph.cylinder_rank == 0: print("Trival bound =", tbound) ph._disable_W_and_prox() e_obj = ph.Eobjective() if ph.cylinder_rank == 0: print("unweighted e_obj={}".format(e_obj)) """ #******* APH ****** print ("APH") options["async_frac_needed"] = 1 options["async_sleep_secs"] = 1 aph = mpisppy.opt.aph.APH(options, all_scenario_names, scenario_creator, scenario_denouement,
#### first PH #### #####multi_ext = {"ext_classes": [Fixer, Gapper, XhatLooper, XhatClosest]} multi_ext = {"ext_classes": [Fixer, Gapper]} ph = mpisppy.opt.ph.PH( options, all_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": ScenCount}, rho_setter=_rho_setter, extensions=MultiExtension, extension_kwargs=multi_ext, ) conv, obj, tbound = ph.ph_main() if ph.cylinder_rank == 0: print("Trival bound =", tbound) print("Quitting early.") ############ test W and xbar writers and special joint reader ############ from mpisppy.utils.wxbarwriter import WXBarWriter newph = mpisppy.opt.ph.PH( options, all_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": ScenCount}, )
#### first PH #### #####multi_ext = {"ext_classes": [Fixer, Gapper, XhatLooper, XhatClosest]} multi_ext = {"ext_classes": [Fixer, Gapper]} ph = mpisppy.opt.ph.PH( options, all_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": ScenCount}, rho_setter=_rho_setter, extensions=MultiExtension, extension_kwargs=multi_ext, ) conv, obj, tbound = ph.ph_main() if ph.cylinder_rank == 0: print("Trival bound =", tbound) print("Quitting early.") ############ test W and xbar writers and special joint reader ############ from mpisppy.utils.wxbarwriter import WXBarWriter newph = mpisppy.opt.ph.PH( options, all_scenario_names, scenario_creator, scenario_denouement, scenario_creator_kwargs={"scenario_count": ScenCount}, )