diff --git a/tests/topfarm/test_drivers.py b/tests/topfarm/test_drivers.py index 8708d6308ce6ef67f1fbe9154157b06b01f9d9c6..38fdc0f325cee474b44adcda6fcf7bec5cfd1dfd 100644 --- a/tests/topfarm/test_drivers.py +++ b/tests/topfarm/test_drivers.py @@ -9,7 +9,7 @@ import numpy as np import pytest from topfarm.cost_models.dummy import DummyCost, DummyCostPlotComp from topfarm.plotting import NoPlot -from topfarm.easy_drivers import EasyScipyOptimizeDriver, EasySimpleGADriver,\ +from topfarm.easy_drivers import EasyScipyOptimizeDriver,\ EasyPyOptSparseSLSQP, EasyPyOptSparseIPOPT @@ -28,53 +28,25 @@ def topfarm_generator(): return _topfarm_obj - - -# # CONMIN-specific Settings -# self.driver.itmax = 30 -# self.driver.fdch = 0.00001 -# self.driver.fdchm = 0.000001 -# self.driver.ctlmin = 0.01 -# self.driver.delfun = 0.001 -# -# # NEWSUMT-specific Settings -# #self.driver.itmax = 10 -# -# # COBYLA-specific Settings -# #self.driver.rhobeg = 1.0 -# #self.driver.rhoend = 1.0e-4 -# #self.driver.maxfun = 1000 -# -# # SLSQP-specific Settings -# #self.driver.accuracy = 1.0e-6 -# #self.driver.maxiter = 50 -# -# # Genetic-specific Settings -# #self.driver.population_size = 90 -# #self.driver.crossover_rate = 0.9 -# #self.driver.mutation_rate = 0.02 -# #self.selection_method = 'rank' - - -@pytest.mark.parametrize('driver,tol',[(EasyScipyOptimizeDriver(), 1e-4), - #(EasyScipyOptimizeDriver(tol=1e-3), 1e-2), - #(EasyScipyOptimizeDriver(maxiter=13), 1e-1), - (EasyScipyOptimizeDriver(optimizer='COBYLA', tol=1e-3), 1e-2), - #(EasyPyOptSparseSLSQP(),1e-4), - (EasyPyOptSparseIPOPT(),1e-4), - #(EasySimpleGADriver(), 1e-4) - ][:]) +@pytest.mark.parametrize('driver,tol', [(EasyScipyOptimizeDriver(), 1e-4), + (EasyScipyOptimizeDriver(tol=1e-3), 1e-2), + (EasyScipyOptimizeDriver(maxiter=13), 1e-1), + (EasyScipyOptimizeDriver(optimizer='COBYLA', tol=1e-3), 1e-2), + (EasyPyOptSparseSLSQP(), 1e-4), + (EasyPyOptSparseIPOPT(), 1e-4), + #(EasySimpleGADriver(), 1e-4) + ][:]) def test_optimizers(driver, tol, topfarm_generator): - if isinstance(driver, str): + if driver.__class__.__name__=="PyOptSparseMissingDriver": pytest.xfail("reason") tf = topfarm_generator(driver) tf.evaluate() - print (driver.__class__.__name__) + print(driver.__class__.__name__) tf.optimize() tb_pos = tf.turbine_positions - #tf.plot_comp.show() + # tf.plot_comp.show() assert sum((tb_pos[2] - tb_pos[0])**2) > 2**2 - tol # check min spacing - assert tb_pos[1][0]< 6 + tol # check within border + assert tb_pos[1][0] < 6 + tol # check within border np.testing.assert_array_almost_equal(tb_pos, optimal, -int(np.log10(tol))) #print (tb_pos - optimal) diff --git a/topfarm/easy_drivers.py b/topfarm/easy_drivers.py index 60d5756af5e0d8ae30df6a3e778bf4d5052e4801..4d61f43af774be0402a44783c8f3b190c3094704 100644 --- a/topfarm/easy_drivers.py +++ b/topfarm/easy_drivers.py @@ -1,18 +1,14 @@ from openmdao.drivers.scipy_optimizer import ScipyOptimizeDriver -from openmdao.drivers.genetic_algorithm_driver import SimpleGADriver class EasyScipyOptimizeDriver(ScipyOptimizeDriver): def __init__(self, optimizer='SLSQP', maxiter=200, tol=1e-6, disp=True): - """ + """ Parameters ---------- - optimizer : {'Nelder-Mead', 'Powell', 'CG', 'BFGS', 'Newton-CG', 'L-BFGS-B', - 'TNC', 'COBYLA', 'SLSQP'} - Inequality constraints are supported by COBYLA and SLSQP, - but equality constraints are only supported by SLSQP. None of the other - optimizers support constraints. + optimizer : {'COBYLA', 'SLSQP'} + Gradients are only supported by SLSQP maxiter : int Maximum number of iterations. tol : float @@ -26,51 +22,60 @@ class EasyScipyOptimizeDriver(ScipyOptimizeDriver): try: from openmdao.drivers.pyoptsparse_driver import pyOptSparseDriver - class EasyPyOptSparseSLSQP(pyOptSparseDriver): - def __init__(self, maxit=200, acc=1e-6): - pyOptSparseDriver.__init__(self) - self.options.update({'optimizer': 'SLSQP'}) - #self.opt_settings.update({'maxit': maxit, 'acc': acc}) - + +# Not working: +# capi_return is NULL +# Call-back cb_slfunc_in_slsqp__user__routines failed. +# +# class EasyPyOptSparseSLSQP(pyOptSparseDriver): +# def __init__(self, maxit=200, acc=1e-6): +# pyOptSparseDriver.__init__(self) +# self.options.update({'optimizer': 'SLSQP'}) +# self.opt_settings.update({'MAXIT': maxit, 'ACC': acc}) + class EasyPyOptSparseIPOPT(pyOptSparseDriver): def __init__(self, max_iter=200): pyOptSparseDriver.__init__(self) self.options.update({'optimizer': 'IPOPT'}) self.opt_settings.update({'linear_solver': 'ma27', 'max_iter': max_iter}) - - -except: - EasyPyOptSparseSLSQP = "Importing PyOptSparse failed" -class EasySimpleGADriver(SimpleGADriver): - def __init__(self, elitism=True, max_gen=100): - """Simple Genetic Algorithm Driver with argument +except ModuleNotFoundError: + class PyOptSparseMissingDriver(object): + options = {} - Parameters - ---------- - bits : dict - Number of bits of resolution. Default is an empty dict, where every unspecified variable is assumed to be integer, and the number of bits is calculated automatically. If you have a continuous var, you should set a bits value as a key in this dictionary. - NotImplemented - debug_print : list - List of what type of Driver variables to print at each iteration. Valid items in list are 'desvars', 'ln_cons', 'nl_cons', 'objs', 'totals' - NotImplemented - elitism : bool - If True, replace worst performing point with best from previous generation each iteration. - max_gen : int - Number of generations before termination. - pop_size : - Number of points in the GA. Set to 0 and it will be computed as four times the number of bits. - NotImplemented - procs_per_model : int - Number of processors to give each model under MPI. - NotImplemented - run_parallel : bool - Set to True to execute the points in a generation in parallel. - NotImplemented - """ - SimpleGADriver.__init__(self) - self.options.update({'elitism': elitism, 'max_gen': max_gen}) + EasyPyOptSparseSLSQP = PyOptSparseMissingDriver + EasyPyOptSparseIPOPT = PyOptSparseMissingDriver + + +# class EasySimpleGADriver(SimpleGADriver): +# def __init__(self, elitism=True, max_gen=100): +# """Simple Genetic Algorithm Driver with argument +# +# Parameters +# ---------- +# bits : dict +# Number of bits of resolution. Default is an empty dict, where every unspecified variable is assumed to be integer, and the number of bits is calculated automatically. If you have a continuous var, you should set a bits value as a key in this dictionary. +# NotImplemented +# debug_print : list +# List of what type of Driver variables to print at each iteration. Valid items in list are 'desvars', 'ln_cons', 'nl_cons', 'objs', 'totals' +# NotImplemented +# elitism : bool +# If True, replace worst performing point with best from previous generation each iteration. +# max_gen : int +# Number of generations before termination. +# pop_size : +# Number of points in the GA. Set to 0 and it will be computed as four times the number of bits. +# NotImplemented +# procs_per_model : int +# Number of processors to give each model under MPI. +# NotImplemented +# run_parallel : bool +# Set to True to execute the points in a generation in parallel. +# NotImplemented +# """ +# SimpleGADriver.__init__(self) +# self.options.update({'elitism': elitism, 'max_gen': max_gen}) # # class COBYLADriverWrapper(CONMINdriver):