@@ -106,6 +106,9 @@ def __init__(self, model, bc_solver, **kwargs):
106
106
self .maxiter = kwargs .get ("maxiter" ,
107
107
100 * self .model .model .original_n )
108
108
109
+ # Maximum run time
110
+ self .maxtime = kwargs .get ("maxtime" , 1800. )
111
+
109
112
self .update_on_rejected_step = False
110
113
111
114
self .inner_fail_count = 0
@@ -292,6 +295,7 @@ def solve(self, **kwargs):
292
295
infeas_iter = 0
293
296
294
297
exitIter = False
298
+ exitTime = False
295
299
# Convergence check
296
300
exitOptimal = (Pmax <= self .omega_opt and max_cons <= self .eta_opt )
297
301
if exitOptimal :
@@ -306,7 +310,7 @@ def solve(self, **kwargs):
306
310
self .cons0 , al_model .penalty , "" , "" , self .omega ,
307
311
self .eta )
308
312
309
- while not (exitOptimal or exitIter ):
313
+ while not (exitOptimal or exitIter or exitTime ):
310
314
self .iter += 1
311
315
312
316
# Perform bound-constrained minimization
@@ -399,6 +403,8 @@ def solve(self, **kwargs):
399
403
400
404
exitIter = self .niter_total > self .maxiter
401
405
406
+ exitTime = (cputime () - tick ) > self .maxtime
407
+
402
408
self .tsolve = cputime () - tick # Solve time
403
409
if slack_model .m != 0 :
404
410
self .pi_max = np .max (np .abs (al_model .pi ))
@@ -411,7 +417,10 @@ def solve(self, **kwargs):
411
417
if exitOptimal :
412
418
self .status = "opt"
413
419
self .log .debug ("optimal solution found" )
414
- elif not exitOptimal and self .status is None :
420
+ elif not exitOptimal and exitTime :
421
+ self .status = "time"
422
+ self .log .debug ("maximum run time exceeded" )
423
+ elif not exitOptimal and exitIter :
415
424
self .status = "iter"
416
425
self .log .debug ("maximum number of iterations reached" )
417
426
0 commit comments