Skip to content

Commit

Permalink
Save epf iterations with separate counter in filenames
Browse files Browse the repository at this point in the history
  • Loading branch information
rolfjl committed Jul 9, 2024
1 parent b8f5562 commit dc32ce4
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 8 deletions.
2 changes: 1 addition & 1 deletion popt/cost_functions/epf.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ def epf(r, c_eq=0, c_iq=0):
r"""
The external penalty function, given as
.. math::
0.5r(\sum_i(c_{eq}^2) + \sum(\max(c_{iq},0)^2)
0.5r(\sum_i c_{eq}^2 + \sum(\max(c_{iq},0)^2)
"""

return r*0.5*( np.sum(c_eq**2) + np.sum(np.maximum(-c_iq,0)**2) )
10 changes: 5 additions & 5 deletions popt/loop/optimize.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ def __set__variable(var_name=None, defalut=None):

# Optimze with external penalty function for constraints, provide r_0 as input
self.epf = __set__variable('epf', {})
self.epf_iteration = 1

# Initialize variables (set in subclasses)
self.options = None
Expand Down Expand Up @@ -143,11 +144,10 @@ def run_loop(self):

# Check if external penalty function (epf) for handling constraints should be used
epf_not_converged = True
epf_iteration = 1
previous_state = None
if self.epf:
previous_state = self.mean_state
logger.info(f' -----> EPF-EnOpt: {epf_iteration}, {self.epf["r"]} (outer iteration, penalty factor)') # print epf info
logger.info(f' -----> EPF-EnOpt: {self.epf_iteration}, {self.epf["r"]} (outer iteration, penalty factor)') # print epf info

while epf_not_converged: # outer loop using epf

Expand Down Expand Up @@ -182,7 +182,7 @@ def run_loop(self):
# Test for convergence of outer epf loop
epf_not_converged = False
if self.epf:
if epf_iteration > self.epf['max_epf_iter']: # max epf_iterations set to 10
if self.epf_iteration > self.epf['max_epf_iter']: # max epf_iterations set to 10
logger.info(
f' -----> EPF-EnOpt: maximum epf iterations reached') # print epf info
break
Expand All @@ -196,9 +196,9 @@ def run_loop(self):
self.obj_func_values = self.fun(self.mean_state, **self.epf)
self.nfev += 1
self.iteration = 1
epf_iteration += 1
self.epf_iteration += 1
r = self.epf['r']
logger.info(f' -----> EPF-EnOpt: {epf_iteration}, {r} (outer iteration, penalty factor)') # print epf info
logger.info(f' -----> EPF-EnOpt: {self.epf_iteration}, {r} (outer iteration, penalty factor)') # print epf info
else:
logger.info(f' -----> EPF-EnOpt: converged, no variables changed more than {conv_crit*100} %') # print epf info
final_obj_no_penalty = str(round(self.fun(self.mean_state)[0],4))
Expand Down
10 changes: 8 additions & 2 deletions popt/misc_tools/optim_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,14 +258,17 @@ def get_optimize_result(obj):
# Initialize dictionary of variables to save
save_dict = OptimizeResult({'success': True, 'x': obj.mean_state, 'fun': np.mean(obj.obj_func_values),
'nit': obj.iteration, 'nfev': obj.nfev, 'njev': obj.njev})
if hasattr(obj, 'epf'):
save_dict['epf_iteration'] = obj.epf_iteration

if 'savedata' in obj.options:

# Make sure "SAVEDATA" gives a list
if isinstance( obj.options['savedata'], list):
savedata = obj.options['savedata']
else:
savedata = [ obj.options['savedata']]

# Loop over variables to store in save list
for save_typ in savedata:
if 'mean_state' in save_typ:
Expand Down Expand Up @@ -311,4 +314,7 @@ def save_optimize_results(intermediate_result):
suffix = now.strftime("%m_%d_%Y_%H_%M_%S")

# Save the variables
np.savez(save_folder + '/optimize_result_{0}'.format(suffix), **intermediate_result)
if 'epf_iteration' in intermediate_result:
np.savez(save_folder + '/optimize_result_{0}_{1}'.format(suffix, str(intermediate_result['epf_iteration'])), **intermediate_result)
else:
np.savez(save_folder + '/optimize_result_{0}'.format(suffix), **intermediate_result)

0 comments on commit dc32ce4

Please sign in to comment.