Source code for pyleecan.Functions.Optimization.evaluate

# -*- coding: utf-8 -*-
from logging import WARNING
import traceback
import sys

if sys.version_info > (3, 0):
    from io import StringIO
else:
    from StringIO import StringIO

from os import stat, remove
from datetime import datetime
from numpy import nan
import numpy as np


[docs]def evaluate(solver, indiv): """Evaluate the individual according to the solver method Parameters ---------- solver : Solver optimization solver indiv : individual individual to evaluate Returns ------- evaluation_failure : bool failure of the evaluation """ # Get solver logger logger = solver.get_logger() tb = StringIO() # to store the traceback in case of error logger.debug("Design variables :") for i, design_variable in enumerate(indiv.design_var_name_list): logger.debug(design_variable + " : " + str(indiv[i])) try: # Run the preprocessing if solver.problem.preprocessing is not None: solver.problem.preprocessing(indiv.output.simu) if solver.problem.eval_func == None: indiv.output.simu.run() else: solver.problem.eval_func(indiv.output) # Add the fitness values, handle exception for each fitness fitness = [] for obj_func in solver.problem.obj_func: try: fitness.append(float(obj_func.keeper(indiv.output))) # Raise KeyboardInterrupt to stop optimization except KeyboardInterrupt: raise KeyboardInterrupt # Except error and try to compute the error_keeper except Exception as err: logger.warning( "Objectiv computation " + obj_func.name + " failed:" + str(err) ) if obj_func.error_keeper is None: # Set fitness value as infinity fitness.append(float("inf")) else: try: fitness.append(float(obj_func.error_keeper(indiv.output))) # Raise KeyboardInterrupt to stop optimization except KeyboardInterrupt: raise KeyboardInterrupt # Set the fitness value as infinity except Exception as err: logger.warning( "Objectiv error computation " + obj_func.name + " failed:" + str(err) ) fitness.append(float("inf")) # Add fitness values to indiv object indiv.fitness.values = fitness # Execute the DataKeepers for datakeeper in solver.problem.datakeeper_list: try: datakeeper.result.append(datakeeper.keeper(indiv.output)) except KeyboardInterrupt: raise KeyboardInterrupt("Stopped by the user.") except Exception as err: logger.warning( "DataKeeper" + datakeeper.name + ".keeper execution failed:" + str(err) ) if datakeeper.error_keeper: try: datakeeper.result.append( datakeeper.error_keeper(indiv.output.simu) ) except KeyboardInterrupt: raise KeyboardInterrupt("Stopped by the user.") except Exception as err: logger.warning( "DataKeeper" + datakeeper.name + ".error_keeper execution failed:" + str(err) ) datakeeper.result.append(nan) else: datakeeper.result.append(nan) indiv.is_simu_valid = True evaluation_failure = False # Evaluation succeed except KeyboardInterrupt: raise KeyboardInterrupt("Stopped by the user.") except: # Logging print("The following simulation failed :", file=tb) if logger.level > 10: # Log design variables values if it is not already done print("Design variables :", file=tb) for i, design_variable in enumerate(indiv.design_var_name_list): print(design_variable + " : " + str(indiv[i]), file=tb) # Log the simulation error traceback.print_exc(file=tb) logger.warning(tb.getvalue()) # Set fitness as inf indiv.fitness.values = [float("inf") for _ in solver.problem.obj_func] indiv.is_simu_valid = False # Execute the DataKeepers for datakeeper in solver.problem.datakeeper_list: if datakeeper.error_keeper: try: datakeeper.result.append(datakeeper.error_keeper(indiv.output.simu)) except KeyboardInterrupt: raise KeyboardInterrupt("Stopped by the user.") except Exception as err: logger.warning( "DataKeeper" + datakeeper.name + ".error_keeper execution failed:" + str(err) ) datakeeper.result.append(nan) else: datakeeper.result.append(nan) # Reset standard output and error evaluation_failure = True # Evaluation failed return evaluation_failure