Example #1
0
def minimize_f(fi, method = None, wantrestarts = None):
    """
    Minimize the ``fi`` function instance.  Returns the number of minimization
    iterations performed.
    """
    f = fi.f
    n_restarts = -1
    n_iters = 0

    mm = MinimizeMethod(method, fi)
    mmdata = SteppingData(fi)

    # independent restarts until maxfunevals or ftarget is reached
    while not ((f.evaluations > 1 and f.fbest < f.ftarget)
               or f.evaluations > fi.maxfunevals):
        n_restarts += 1
        if n_restarts > 0:
            f.restart('independent restart')  # additional info
        maxfevals = fi.maxfunevals / (wantrestarts + 1)

        x0 = 10. * np.random.rand(fi.dim) - 5.

        class MMCallback:
            def __init__(self, fi, f, maxfevals, mm, data, n_iters):
                self.restarts = 0
                self.fi = fi
                self.f = f
                self.maxfevals = maxfevals
                self.basefevals = self.f.evaluations
                self.mm = mm
                self.data = data
                self.n_iters = n_iters
            def __call__(self, x):
                self.n_iters += 1
                y = self.fi.evalfun(x)
                self.data.record(0, self.mm.name, self.n_iters, y - self.fi.f.fopt, x)

                if y < self.f.ftarget:
                    raise MMCancel()
                elif self.f.evaluations - self.basefevals > self.maxfevals:
                    raise MMCancel()
                elif self.f.evaluations > self.fi.maxfunevals:
                    raise MMCancel()
        cb = MMCallback(fi, f, maxfevals, mm, mmdata, n_iters)

        try:
            warnings.simplefilter("ignore") # ignore warnings about unused/ignored options
            mm(f.evalfun, x0, inner_cb = cb)
        except MMCancel:
            pass # Ok.

        n_iters = cb.n_iters

    return n_restarts
Example #2
0
    def __init__(self, fi, K, methods):
        self.fi = fi
        self.K = K
        self.methods = methods

        # A population of solution x points
        self.points = 10. * np.random.rand(self.K, self.fi.dim) - 5.
        # A population of solution y points
        self.values = np.zeros(self.K) + 1e10
        # A population of minimizers
        self.minimizers = [self._minimizer_make(i) for i in range(self.K)]
        # A population of iteration counters
        self.iters = np.zeros(self.K, dtype=np.int)

        self.total_steps = 0
        self.total_iters = 0
        self.data = SteppingData(self.fi)