示例#1
0
def test_basinhopping():
    """Test basinhopping in lmfit versus scipy."""

    # SciPy
    def func(x):
        return np.cos(14.5 * x - 0.3) + (x + 0.2) * x

    minimizer_kwargs = {'method': 'L-BFGS-B'}
    x0 = [1.]

    # FIXME - remove after requirement for scipy >= 0.19
    major, minor, micro = scipy_version.split('.', 2)
    if int(major) < 1 and int(minor) < 19:
        ret = basinhopping(func, x0, minimizer_kwargs=minimizer_kwargs)
    else:
        ret = basinhopping(func, x0, minimizer_kwargs=minimizer_kwargs, seed=7)

    # lmfit
    def residual(params):
        x = params['x'].value
        return np.cos(14.5 * x - 0.3) + (x + 0.2) * x

    pars = lmfit.Parameters()
    pars.add_many(('x', 1.))
    kws = {'minimizer_kwargs': {'method': 'L-BFGS-B'}, 'seed': 7}
    mini = lmfit.Minimizer(residual, pars)
    out = mini.minimize(method='basinhopping', **kws)

    assert_allclose(out.residual, ret.fun)
    assert_allclose(out.params['x'].value, ret.x)
示例#2
0
def test_basinhopping_2d():
    """Test basinhopping in lmfit versus scipy."""

    # SciPy
    def func2d(x):
        return np.cos(14.5*x[0] - 0.3) + (x[1]+0.2) * x[1] + (x[0]+0.2) * x[0]

    minimizer_kwargs = {'method': 'L-BFGS-B'}
    x0 = [1.0, 1.0]

    # FIXME - remove after requirement for scipy >= 0.19
    major, minor, micro = scipy_version.split('.', 2)
    if int(major) < 1 and int(minor) < 19:
        ret = basinhopping(func2d, x0, minimizer_kwargs=minimizer_kwargs)
    else:
        ret = basinhopping(func2d, x0, minimizer_kwargs=minimizer_kwargs,
                           seed=7)

    # lmfit
    def residual_2d(params):
        x0 = params['x0'].value
        x1 = params['x1'].value
        return np.cos(14.5*x0 - 0.3) + (x1+0.2) * x1 + (x0+0.2) * x0

    pars = lmfit.Parameters()
    pars.add_many(('x0', 1.), ('x1', 1.))

    mini = lmfit.Minimizer(residual_2d, pars)
    kws = {'minimizer_kwargs': {'method': 'L-BFGS-B'}, 'seed': 7}
    out = mini.minimize(method='basinhopping', **kws)

    assert_allclose(out.residual, ret.fun)
    assert_allclose(out.params['x0'].value, ret.x[0])
    assert_allclose(out.params['x1'].value, ret.x[1], rtol=1e-5)
示例#3
0
def test_basinhopping_Alpine02():
    """Test basinhopping on Alpine02 function."""

    global_optimum = [7.91705268, 4.81584232]
    fglob = -6.12950

    # SciPy
    def Alpine02(x):
        x0 = x[0]
        x1 = x[1]
        return np.prod(np.sqrt(x0) * np.sin(x0)) * np.prod(np.sqrt(x1) *
                                                           np.sin(x1))

    def basinhopping_accept(f_new, f_old, x_new, x_old):
        """Does the new candidate vector lie inbetween the bounds?

        Returns
        -------
        accept_test : bool
            The candidate vector lies inbetween the bounds
        """
        if np.any(x_new < np.array([0.0, 0.0])):
            return False
        if np.any(x_new > np.array([10.0, 10.0])):
            return False
        return True

    minimizer_kwargs = {'method': 'L-BFGS-B', 'bounds': [(0.0, 10.0),
                                                         (0.0, 10.0)]}
    x0 = [1.0, 1.0]

    # FIXME - remove after requirement for scipy >= 0.19
    major, minor, micro = scipy_version.split('.', 2)
    if int(major) < 1 and int(minor) < 19:
        ret = basinhopping(Alpine02, x0, minimizer_kwargs=minimizer_kwargs,
                           accept_test=basinhopping_accept)
    else:
        ret = basinhopping(Alpine02, x0, minimizer_kwargs=minimizer_kwargs,
                           accept_test=basinhopping_accept, seed=7)

    # lmfit
    def residual_Alpine02(params):
        x0 = params['x0'].value
        x1 = params['x1'].value
        return np.prod(np.sqrt(x0) * np.sin(x0)) * np.prod(np.sqrt(x1) *
                                                           np.sin(x1))

    pars = lmfit.Parameters()
    pars.add_many(('x0', 1., True, 0.0, 10.0),
                  ('x1', 1., True, 0.0, 10.0))

    mini = lmfit.Minimizer(residual_Alpine02, pars)
    kws = {'minimizer_kwargs': {'method': 'L-BFGS-B'}, 'seed': 7}
    out = mini.minimize(method='basinhopping', **kws)
    out_x = np.array([out.params['x0'].value, out.params['x1'].value])

    assert_allclose(out.residual, fglob, rtol=1e-5)
    assert_allclose(min(out_x), min(global_optimum))
    assert_allclose(max(out_x), max(global_optimum))
示例#4
0
  def testNetcdfSupport(self):

    from scipy.version import version as SciPyVersion

    if tuple(int(x) for x in SciPyVersion.split('.')) < (0, 9, 0):
        import Scientific.IO.NetCDF
    else:
        import scipy.io.netcdf

    return
示例#5
0
    def testNetcdfSupport(self):

        from scipy.version import version as SciPyVersion

        if tuple(int(x) for x in SciPyVersion.split('.')) < (0, 9, 0):
            import Scientific.IO.NetCDF
        else:
            import scipy.io.netcdf

        return
示例#6
0
    def test_nan_policy(self):
        # check that an error is raised if there are nan in
        # the data returned by userfcn
        self.data[0] = np.nan

        major, minor, _micro = scipy_version.split('.', 2)
        for method in SCALAR_METHODS:
            if (method == 'differential_evolution' and int(major) > 0 and
                    int(minor) >= 2):
                pytest.raises(RuntimeError, self.mini.scalar_minimize,
                              SCALAR_METHODS[method])
            else:
                pytest.raises(ValueError, self.mini.scalar_minimize,
                              SCALAR_METHODS[method])

        pytest.raises(ValueError, self.mini.minimize)

        # now check that the fit proceeds if nan_policy is 'omit'
        self.mini.nan_policy = 'omit'
        res = self.mini.minimize()
        assert_equal(res.ndata, np.size(self.data, 0) - 1)

        for para, true_para in zip(res.params.values(), self.p_true.values()):
            check_wo_stderr(para, true_para.value, sig=0.15)
示例#7
0
#!/usr/bin/env python

from scipy.version import version as SciPyVersion

if tuple(int(x) for x in SciPyVersion.split('.')) < (0, 9, 0):
    from Scientific.IO.NetCDF import NetCDFFile as netcdf_file
else:
    from scipy.io.netcdf import netcdf_file

from numpy import arange, zeros


def create(missingdata=False,
           missingdimension=False,
           missingvariable=False,
           incorrectdimension=False,
           incorrectvariable=False):

    if (missingdata):
        filename = 'missingdata.nc'
        description = ', with missing data.'
    elif (missingdimension):
        filename = 'missingdimension.nc'
        description = ', with a missing dimension.'
    elif (missingvariable):
        filename = 'missingvariable.nc'
        description = ', with a missing variable.'
    elif (incorrectdimension):
        filename = 'incorrectdimension.nc'
        description = ', with an incorrect dimension label.'
    elif (incorrectvariable):
示例#8
0
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

"""
ERA data set handling routines
"""

import datetime
import math
import os
import unittest

import fluidity.diagnostics.debug as debug

from scipy.version import version as SciPyVersion

if tuple(int(x) for x in SciPyVersion.split('.')) < (0, 9, 0):
  try:
    import Scientific.IO.NetCDF as netcdf
  except:
    debug.deprint("Warning: Your SciPy version is too old (<0.9.0) and \nthe Scientific.IO.NetCDF module failed to import")
else:
  try:
    import scipy.io.netcdf as netcdf
  except:
    debug.deprint("Warning: Failed to import scipy.io.netcdf module")




import fluidity.diagnostics.calc as calc
import fluidity.diagnostics.filehandling as filehandling