Skip to content

Commit

Permalink
Merge pull request #185 from suavecode/feature-optimizers_from_MF
Browse files Browse the repository at this point in the history
Mulfi-fidelity Optimizers
  • Loading branch information
planes committed Jul 27, 2017
2 parents 0bc4d45 + 4eac198 commit 5860c78
Show file tree
Hide file tree
Showing 8 changed files with 945 additions and 11 deletions.
9 changes: 7 additions & 2 deletions trunk/SUAVE/Methods/Utilities/latin_hypercube_sampling.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# latin_hypercube_sampling.py
#
# Created: Jul 2016, R. Fenrich (outside of SUAVE code)
# Modified: Mar 2017, T. MacDonald
# Modified: Apr 2017, T. MacDonald


# ----------------------------------------------------------------------
Expand All @@ -18,7 +18,7 @@
# Latin Hypercube Sampling
# ----------------------------------------------------------------------

def latin_hypercube_sampling(num_dimensions,num_samples,criterion='random'):
def latin_hypercube_sampling(num_dimensions,num_samples,bounds=None,criterion='random'):

n = num_dimensions
samples = num_samples
Expand All @@ -43,6 +43,11 @@ def latin_hypercube_sampling(num_dimensions,num_samples,criterion='random'):

## Map samples to the standard normal distribution (if needed for future functionality)
#lhd = norm(loc=0,scale=1).ppf(lhd)

if bounds != None:
lower_bounds = bounds[0]
upper_bounds = bounds[1]
lhd = lhd*(upper_bounds-lower_bounds) + lower_bounds

return lhd

Expand Down
22 changes: 14 additions & 8 deletions trunk/SUAVE/Optimization/Nexus.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Nexus.py
#
# Created: Jul 2015, E. Botero
# Modified: Feb 2015, M. Vegh
# Modified: Feb 2016, M. Vegh
# Apr 2017, T. MacDonald

# ----------------------------------------------------------------------
# Imports
Expand Down Expand Up @@ -29,14 +30,18 @@ def __defaults__(self):
self.results = SUAVE.Analyses.Results()
self.summary = Data()
self.optimization_problem = None
self.fidelity_level = 1
self.last_inputs = None
self.last_fidelity = None
self.evaluation_count = 0

def evaluate(self,x = None):

self.unpack_inputs(x)
# This function calls really_evaluate
if np.all(self.optimization_problem.inputs==self.last_inputs):

# Check if last call was the same
if np.all(self.optimization_problem.inputs==self.last_inputs) \
and self.last_fidelity == self.fidelity_level:
pass
else:
self._really_evaluate()
Expand All @@ -56,7 +61,8 @@ def _really_evaluate(self):
self = nexus

# Store to cache
self.last_inputs = deepcopy(self.optimization_problem.inputs)
self.last_inputs = deepcopy(self.optimization_problem.inputs)
self.last_fidelity = self.fidelity_level


def objective(self,x = None):
Expand Down Expand Up @@ -155,7 +161,7 @@ def unpack_inputs(self,x = None):
def constraints_individual(self,x = None):
pass

def finite_difference(self,x):
def finite_difference(self,x,diff_interval=1e-8):

obj = self.objective(x)
con = self.all_constraints(x)
Expand All @@ -173,14 +179,14 @@ def finite_difference(self,x):

for ii in xrange(0,inplen):
newx = np.asarray(x)*1.0
newx[ii] = newx[ii]+ 1e-8
newx[ii] = newx[ii] + diff_interval

grad_obj[ii] = self.objective(newx)
jac_con[ii,:] = self.all_constraints(newx)

grad_obj = (grad_obj - obj)/(1e-8)
grad_obj = (grad_obj - obj)/diff_interval

jac_con = (jac_con - con2).T/(1e-8)
jac_con = (jac_con - con2).T/diff_interval

grad_obj = grad_obj.astype(float)
jac_con = jac_con.astype(float)
Expand Down
31 changes: 31 additions & 0 deletions trunk/SUAVE/Optimization/Package_Setups/TRMM/TRMM_setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# TRMM_setup.py
#
# Created: Apr 2017, T. MacDonald
# Modified:

# ----------------------------------------------------------------------
# Imports
# ----------------------------------------------------------------------

# suave imports
import numpy as np
from SUAVE.Optimization import helper_functions as help_fun
from SUAVE.Optimization.Package_Setups.TRMM import Trust_Region_Optimization as tro
from SUAVE.Optimization.Package_Setups.TRMM.Trust_Region import Trust_Region

# ----------------------------------------------------------------------
# TRMM_Solve
# ----------------------------------------------------------------------

def TRMM_Solve(problem,tr=None,tr_opt=None,print_output=False):

if tr == None:
tr = Trust_Region()
problem.trust_region = tr
if tr_opt == None:
TRM_opt = tro.Trust_Region_Optimization()
else:
TRM_opt = tr_opt
TRM_opt.optimize(problem,print_output=print_output)

return
32 changes: 32 additions & 0 deletions trunk/SUAVE/Optimization/Package_Setups/TRMM/Trust_Region.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Trust_Region.py
#
# Created: Apr 2017, T. MacDonald
# Modified: Jun 2017, T. MacDonald

# ----------------------------------------------------------------------
# Imports
# ----------------------------------------------------------------------

import SUAVE
from SUAVE.Core import Data

# ----------------------------------------------------------------------
# Trust Region Class
# ----------------------------------------------------------------------

class Trust_Region(Data):

def __defaults__(self):

self.initial_size = 0.05
self.size = 0.05
self.minimum_size = 1e-15
self.contract_threshold = 0.25
self.expand_threshold = 0.75
self.contraction_factor = 0.25
self.expansion_factor = 1.5


def evaluate_function(self,f,gviol):
phi = f + gviol**2
return phi

0 comments on commit 5860c78

Please sign in to comment.