예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
 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()
예제 #4
0
 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()
예제 #5
0
 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)
예제 #6
0
 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()
예제 #7
0
 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()
예제 #8
0
 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)
예제 #9
0
 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)
예제 #10
0
    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)
예제 #11
0
    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)
예제 #12
0
    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())
예제 #13
0
 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)
예제 #14
0
    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)
예제 #15
0
    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()
예제 #16
0
    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)
예제 #17
0
    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)
예제 #18
0
    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)
예제 #19
0
 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)
예제 #20
0
                                           "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,
예제 #21
0
    #### 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},
    )
예제 #22
0
    #### 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},
    )