@@ -1364,12 +1364,16 @@ def plot_recursion_dag(self, ax):
13641364 # partition_ratios.grad.zero_()
13651365 # return val.item(), grad
13661366
1367- def get_npartition_bounds (self ) -> Array :
1367+ def get_npartition_bounds (self , total_cost : float ) -> Array :
13681368 nunknowns = self ._npartitions - 1
1369+ # tighter bounds helps global optimizer so insted of using inf,
1370+ # set upperbounds to be maximum number of samples if all samples
1371+ # were allocated to a single model, for each model
13691372 bounds = self ._bkd .stack (
13701373 (
13711374 self ._bkd .full ((nunknowns ,), self ._npartitions_lower_bound ),
1372- self ._bkd .full ((nunknowns ,), np .inf ),
1375+ # self._bkd.full((nunknowns,), np.inf),
1376+ total_cost / self ._costs [1 :],
13731377 ),
13741378 axis = 1 ,
13751379 )
@@ -1384,9 +1388,17 @@ def get_default_optimizer(self) -> Optimizer:
13841388 # init_gen.set_bounds(self.get_npartition_bounds())
13851389 # optimizer = ConstrainedMultiStartOptimizer(local_optimizer)
13861390 # optimizer.set_initial_iterate_generator(init_gen)
1387- global_optimizer = ScipyConstrainedNelderMeadOptimizer (
1388- opts = {"maxiter" : 500 }
1391+ # global_optimizer = ScipyConstrainedNelderMeadOptimizer(
1392+ # opts={"maxiter": 500}
1393+ # )
1394+ from pyapprox .optimization .scipy import (
1395+ ScipyConstrainedDifferentialEvolutionOptimizer ,
1396+ )
1397+
1398+ global_optimizer = ScipyConstrainedDifferentialEvolutionOptimizer (
1399+ opts = {"maxiter" : 3 }
13891400 )
1401+
13901402 local_optimizer = ScipyConstrainedOptimizer ()
13911403 optimizer = ChainedOptimizer (global_optimizer , local_optimizer )
13921404 optimizer .set_verbosity (0 )
@@ -1415,7 +1427,7 @@ def _allocate_samples_minimize(
14151427 self ._optimizer .set_objective_function (objective )
14161428 constraints = [ACVPartitionConstraint (self , target_cost )]
14171429 self ._optimizer .set_constraints (constraints )
1418- self ._optimizer .set_bounds (self .get_npartition_bounds ())
1430+ self ._optimizer .set_bounds (self .get_npartition_bounds (target_cost ))
14191431 init_iterate = self ._bkd .full ((self ._nmodels - 1 , 1 ), 1.0 )
14201432 result = self ._optimizer .minimize (init_iterate )
14211433 return result
0 commit comments