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
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
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