Exemple #1
0
    def myfdjac( myx, myfvec, myfjac, myxmax, myiflag, myepsfcn ):

        eps = numpy.sqrt( max( [ EPSILON, myepsfcn ] ) )
        n = len( myx )

        def fdjac( xxx, origxxx, fvec, upbound, iflag, epsilon ):
            myn = len( xxx )
            diffs = []
            for jj in xrange( myn ):
                temp = xxx[ jj ]
                h = epsilon * abs( xxx[ jj ] )
                if 0.0 == h:
                    h = eps
                if xxx[ jj ] + h > upbound[ jj ]:
                    h = - h
                xxx[ jj ] = temp + h
                wa, iflag = fcn( origxxx, iflag )
                xxx[ jj ] = temp
                diff = ( wa - fvec ) / h
                diff = numpy.append( diff, iflag )
                diffs.append( diff )
            return diffs

        diffs = divide_run_parallel( fdjac, myx, myx, myfvec, myxmax, myiflag, eps )

        for jj in range( n ):
            myfjac[ 0:, jj ] = diffs[ jj ][:-1].copy()
            if diffs[ jj ][ -1 ] < 0:
                myiflag = diffs[ jj ][ -1 ]
        return myiflag, myfjac
Exemple #2
0
    def __call__(self, x, xmin, xmax, maxfev, tol, step, initsimplex, finalsimplex, multicore, verbose):

        try:

            def optimize(bad_index, fcn, npar, aflatarray):

                rho_chi = self.reflection_coef * self.expansion_coef
                rho_gamma = self.reflection_coef * self.contraction_coef

                result = []
                for badindex in bad_index:

                    begin_nfev = self.nfev[0]

                    simplex = classicSimplex(fcn, npar, aflatarray, xmin, xmax)

                    shrinkme = False

                    centroid = simplex.calc_centroid(badindex)

                    reflection_pt = simplex.move_vertex(centroid, self.reflection_coef, badindex)

                    if simplex[0, -1] <= reflection_pt[-1] and reflection_pt[-1] < simplex[badindex - 1, -1]:
                        # simplex[ badindex ] = reflection_pt[ : ]
                        simplex.replace_vertex(badindex, reflection_pt)
                        if verbose:
                            print "\taccept reflection point"

                    elif reflection_pt[-1] < simplex[0, -1]:

                        # calculate the expansion point
                        expansion_pt = simplex.move_vertex(centroid, rho_chi, badindex)

                        if expansion_pt[-1] < reflection_pt[-1]:
                            # simplex[ badindex ] = expansion_pt[ : ]
                            simplex.replace_vertex(badindex, expansion_pt)
                            if verbose:
                                print "\taccept expansion point"
                        else:
                            # simplex[ badindex ] = reflection_pt[ : ]
                            simplex.replace_vertex(badindex, reflection_pt)
                            if verbose:
                                print "\taccept reflection point"

                    else:

                        shrinkme = simplex.contract_in_out(
                            centroid, reflection_pt, rho_gamma, self.contraction_coef, badindex, verbose
                        )
                    if shrinkme is False:
                        shrinkme = 0
                    else:
                        skrinkme = 1
                    result.append(
                        numpy.append(simplex.polytope.ravel(), [self.nfev[0] - begin_nfev, shrinkme, badindex])
                    )

                return numpy.asarray(result)

            x, xmin, xmax = self.check_args(x, xmin, xmax)

            polytope = Polytope(self.fcn, x, xmin, xmax, step, initsimplex)

            npar = len(x)
            bad_vertices = [npar]
            mynfev = 0

            while self.nfev[0] < maxfev:

                polytope.order_simplex()

                if verbose:
                    print "f%s=%f" % (polytope[0, :-1], polytope[0, -1])

                if polytope.check_convergence(tol, finalsimplex):
                    break

                if multicore:
                    badindex = multiprocessing.cpu_count()
                    if badindex == npar:
                        badindex = 1
                    bad_vertices = range(npar, npar - badindex, -1)

                    results = divide_run_parallel(optimize, bad_vertices, polytope.fcn, npar, polytope.polytope.ravel())
                else:
                    results = optimize(bad_vertices, polytope.fcn, npar, polytope.polytope.ravel())

                datasize = npar * (npar + 2) + 4
                nrow = results.size / datasize
                ncol = results.size / nrow
                results = results.reshape(nrow, ncol)

                num_not_modified = 0
                for result in results:
                    mynfev += int(result[-3])
                    shrinkme = int(result[-2])
                    index = int(result[-1])
                    aflatarray = result[:-3]
                    if shrinkme:
                        num_not_modified += 1
                    else:
                        aflatarray.shape = (npar + 1, npar + 1)
                        # print index, polytope[ index, -1 ], aflatarray[ index, -1 ]
                        polytope[index] = numpy.array(aflatarray[index], copy=True)

                if num_not_modified == len(bad_vertices):
                    polytope.shrink(self.shrink_coef, npar)
                    if verbose:
                        print "\tshrink"

            ierr = 0
            if mynfev >= maxfev:
                ierr = 3

            vertex = polytope[0]
            bestpar = vertex[:-1]
            bestval = vertex[-1]
            return ierr, bestpar, bestval, mynfev
        except InputErr:
            vertex = polytope.get_vertex(0)
            bestpar = vertex[:-1]
            bestval = vertex[-1]
            return 1, bestpar, bestval, mynfev
        except OutOfBoundErr:
            return 2, x, numpy.nan, mynfev
Exemple #3
0
    def __call__(self, x, xmin, xmax, maxfev, tol, step, initsimplex,
                 finalsimplex, multicore, verbose):

        try:

            def optimize(bad_index, fcn, npar, aflatarray):

                rho_chi = self.reflection_coef * self.expansion_coef
                rho_gamma = self.reflection_coef * self.contraction_coef

                result = []
                for badindex in bad_index:

                    begin_nfev = self.nfev[0]

                    simplex = classicSimplex(fcn, npar, aflatarray, xmin, xmax)

                    shrinkme = False

                    centroid = simplex.calc_centroid(badindex)

                    reflection_pt = simplex.move_vertex(
                        centroid, self.reflection_coef, badindex)

                    if simplex[ 0, -1 ] <= reflection_pt[ -1 ] and \
                           reflection_pt[ -1 ] < simplex[ badindex - 1, -1 ]:
                        #simplex[ badindex ] = reflection_pt[ : ]
                        simplex.replace_vertex(badindex, reflection_pt)
                        if verbose:
                            print '\taccept reflection point'

                    elif reflection_pt[-1] < simplex[0, -1]:

                        # calculate the expansion point
                        expansion_pt = simplex.move_vertex(
                            centroid, rho_chi, badindex)

                        if expansion_pt[-1] < reflection_pt[-1]:
                            #simplex[ badindex ] = expansion_pt[ : ]
                            simplex.replace_vertex(badindex, expansion_pt)
                            if verbose:
                                print '\taccept expansion point'
                        else:
                            #simplex[ badindex ] = reflection_pt[ : ]
                            simplex.replace_vertex(badindex, reflection_pt)
                            if verbose:
                                print '\taccept reflection point'

                    else:

                        shrinkme = simplex.contract_in_out(
                            centroid, reflection_pt, rho_gamma,
                            self.contraction_coef, badindex, verbose)
                    if shrinkme is False:
                        shrinkme = 0
                    else:
                        skrinkme = 1
                    result.append(
                        numpy.append(
                            simplex.polytope.ravel(),
                            [self.nfev[0] - begin_nfev, shrinkme, badindex]))

                return numpy.asarray(result)

            x, xmin, xmax = self.check_args(x, xmin, xmax)

            polytope = Polytope(self.fcn, x, xmin, xmax, step, initsimplex)

            npar = len(x)
            bad_vertices = [npar]
            mynfev = 0

            while (self.nfev[0] < maxfev):

                polytope.order_simplex()

                if verbose:
                    print 'f%s=%f' % (polytope[0, :-1], polytope[0, -1])

                if polytope.check_convergence(tol, finalsimplex):
                    break

                if multicore:
                    badindex = multiprocessing.cpu_count()
                    if badindex == npar:
                        badindex = 1
                    bad_vertices = range(npar, npar - badindex, -1)

                    results = divide_run_parallel(optimize, bad_vertices,
                                                  polytope.fcn, npar,
                                                  polytope.polytope.ravel())
                else:
                    results = optimize(bad_vertices, polytope.fcn, npar,
                                       polytope.polytope.ravel())

                datasize = npar * (npar + 2) + 4
                nrow = results.size / datasize
                ncol = results.size / nrow
                results = results.reshape(nrow, ncol)

                num_not_modified = 0
                for result in results:
                    mynfev += int(result[-3])
                    shrinkme = int(result[-2])
                    index = int(result[-1])
                    aflatarray = result[:-3]
                    if shrinkme:
                        num_not_modified += 1
                    else:
                        aflatarray.shape = (npar + 1, npar + 1)
                        #print index, polytope[ index, -1 ], aflatarray[ index, -1 ]
                        polytope[index] = numpy.array(aflatarray[index],
                                                      copy=True)

                if num_not_modified == len(bad_vertices):
                    polytope.shrink(self.shrink_coef, npar)
                    if verbose:
                        print '\tshrink'

            ierr = 0
            if mynfev >= maxfev:
                ierr = 3

            vertex = polytope[0]
            bestpar = vertex[:-1]
            bestval = vertex[-1]
            return ierr, bestpar, bestval, mynfev
        except InputErr:
            vertex = polytope.get_vertex(0)
            bestpar = vertex[:-1]
            bestval = vertex[-1]
            return 1, bestpar, bestval, mynfev
        except OutOfBoundErr:
            return 2, x, numpy.nan, mynfev