AnnealingAmoeba

 
AnnealingAmoeba = class AnnealingAmoeba(builtins.object)
    AnnealingAmoeba(func, xini, size=1, seed=4567, temp=0,
         limits=None, maxiter=1000, reltol=0.0001, abstol=0.0001, cooling=0.95,
         steps=10, verbose=0, callback=None)

 
Simulated annealing simplex finding minimum.
 
AnnealingAmoeba can be used in two modes: with simulated annealing on or off.
The simulated annealing mode is invoked by setting the temperature to
some value. By default it is off: temperature at zero.
 
When the temperature is set at zero (default), AnnealingAmoeba acts as a
simple Nelder-Mead downhill simplex method. With two advantages and one
disadvantage. The pro's are that it is reasonably fast and that it does not
need partial derivatives. The con is that it will fall into the first local
minimum it encounters. No guarantee that this minimum has anything to do
with the absolute minimum. This T=0 modus can only be used in mono-modal
problems.
 
In the other modus, when the temperature is set at some value the
simplex sometimes takes a uphill step, depending on the temperature at
that moment. Steps downhill are always taken. In that way it is possible
to climb out of local minima to find better ones. Meanwhile the temperature
is steadily lowered, concentrating the search on the by now hopefully found
absolute minimum. Of course this takes much more iterations and still there
is *no guarantee* that the best value is found. But a better chance.
The initial temperature which suggests itself is of the order of the
humps found in the minimizable lanscape.
 
At each temperature level a number of moves is made. This number is set by
the keyword steps=10, by default. After these steps the temperature is lowered
with a factor set by cooling=0.95, by default.
 
Iteration continues until the relative difference between the low and high
points within the simplex is less than reltol
    |yhi - ylo| / ( |yhi| + |ylo| ) < reltol
and/or the absolute difference is less than abstol
    |yhi - ylo| < abstol.
 
AnnealingAmoeba can be used with limits set to one or more of the input values.
 
The original version stems from Numerical Recipes with some additions of my own.
 
Author       Do Kester
 
Attributes
----------
func : callable
    function to be minimized of form : y = func( x )
lolimits : array_like
    lower limits on x. -inf is allowed to indicate no lower limit
hilimits : array_like
    upper limits on x. +inf is allowed to indicate no upper limit
fopt : float
    the best of the above values
xopt : ndarray
    copy of the simplex point that has the best value (nx)
 
rng : RandomState
    random number generator
seed : int
    seed of rng
 
reltol : float
    Relative tolerance. Program stops when ( |yhi-ylo| / (|yhi|+|ylo|) ) < reltol
abstol : float
    Absolute tolerance. Program stops when |yhi-ylo| < abstol
maxiter : int
    maximum number of iterations
iter : int (read only)
    iteration counter
ncalls : int (read only)
    numbers of calls to func
 
temp : float
    annealing temperature (default: 0)
cooling : float (non existent when temp=0)
    cooling factor (default: 0.95)
steps : int (non existent when temp=0)
    number of steps per cooling cycle (default: 10)
 
verbose : int
    0  : silent
    1 : print results to output
    2 : print some info every 100 iterations and plot results
    3 : print some info every iteration
callback : callable
    function to be called every iteration of form :
    xopt = callback( xopt )
 
simplex : ndarray
    the simplex has shape = (nx+1, nx); nx is the size of x
values : ndarray
    the values of the function attained at the simplex points (nx+1).
sum : ndarray
    sum over the corners of the simplex (nx)
 
  Constructor:
AnnealingAmoeba( func, xini, size=1, seed=4567, temp=0,
         limits=None, maxiter=1000, reltol=0.0001, abstol=0.0001, cooling=0.95,
         steps=10, verbose=0, callback=None)

Create a new AnnealingAmoeba class to minimize the function
 
Parameters
----------
func : callable
    the function to be minimized
xini : array_like
    initial values of the function
size : float or array_like
    step size of the simplex
seed : int
    for random number generator
temp : float
    temperature of annealing (0 is no annealing)
limits : None or list of 2 floats or list of 2 array_like
    None : no limits applied
    [lo,hi] : low and high limits for all values
    [la,ha] : low array and high array limits for the values
maxiter : int
    max number of iterations
reltol : float, None
    Relative tolerance. Program stops when ( |hi-lo| / (|hi|+|lo|) ) < reltol
abstol : float, None
    Absolute tolerance. Program stops when |hi-lo| < abstol
    when abstol has a (float) value, reltol might be None.
cooling : float
    cooling factor when annealing
steps : int
    number of cycles in each cooling step.
verbose : int
    0 : silent
    1 : print results to output
    2 : print some info every 100 iterations and plot results
    3 : print some info every iteration
callback : callable
    is called each iteration as
    val = callback( val )
    where val is the minimizable array
 
Raises
------
ValueError
    1. When func is not callable
    2. When both tolerances are None
    3. When callback is not callable
Methods defined here:
checkSimplex( simplex )
Check for degeneracy: all points on same location.
 
Parameters
----------
simplex : matrix
    the simplex of amoeba
doVerbose( name, chisq, par, verbose=0)
hasHighLimits( k )
Return True if it has high limits < inf.
hasLowLimits( k )
Return True if it has low limits > -inf.
inflateSimplex( ilo, factor )
Inflate/deflate simplex around the (lowest) point (ilo).
 
inflate if factor > 1
deflate if factor < 1
mirror  if factor < 0
 
Parameters
----------
ilo : int
    lowest point in the simplex
factor : float
    inflation factor
logRanTemp()
makeSimplex( xini, step )
Make a simplex for the given set of parameters.
 
Parameters
----------
xini : array_like
    initial (parameter) array
step : float
    size of the simplex
minimize()
Converge the simplex.
 
Returns
-------
ndarray : the optimal x values.
 
Raises
------
ConvergenceError when too many iterations are needed.
randomRange( factor )
setValues()
Calculate the function values a simplex's corners
stayInLimits( oldpar, trypar )
Keep the parameters within the limits.
 
Parameters
----------
oldpar : array_like
    previous set of parameters (assumed to be within limits)
trypar : array_like
    new parameters, possibly out of limits
 
Returns
-------
newpar : array_like
    new parameters, within limits
temperatureStep()
Perform simplex moves in the right direction.
 
Returns
-------
int : number of transforms.
trialStep( ihi, yhi, factor )
Do a trial step to improve the worst (highest) point.
 
Parameters
----------
ihi : int
    index of the high point
yhi :  int
    value at the high point
factor : int
    step size