package org.freehep.math.minuit; import java.util.ArrayList; import java.util.List; /** Performs a minimization using the simplex method of Nelder and Mead * (ref. Comp. J. 7, 308 (1965)). * @version $Id: ScanBuilder.java 8584 2006-08-10 23:06:37Z duns $ */ class ScanBuilder implements MinimumBuilder { public FunctionMinimum minimum(MnFcn mfcn, GradientCalculator gc, MinimumSeed seed, MnStrategy stra, int maxfcn, double toler) { MnAlgebraicVector x = seed.parameters().vec().clone(); MnUserParameterState upst = new MnUserParameterState(seed.state(), mfcn.errorDef(), seed.trafo()); MnParameterScan scan = new MnParameterScan(mfcn.fcn(), upst.parameters(), seed.fval()); double amin = scan.fval(); int n = seed.trafo().variableParameters(); MnAlgebraicVector dirin = new MnAlgebraicVector(n); for(int i = 0; i < n; i++) { int ext = seed.trafo().extOfInt(i); scan.scan(ext); if(scan.fval() < amin) { amin = scan.fval(); x.set(i,seed.trafo().ext2int(ext, scan.parameters().value(ext))); } dirin.set(i, Math.sqrt(2.*mfcn.errorDef()*seed.error().invHessian().get(i,i))); } MinimumParameters mp = new MinimumParameters(x, dirin, amin); MinimumState st = new MinimumState(mp, 0., mfcn.numOfCalls()); List<MinimumState> states = new ArrayList<MinimumState>(1); states.add(st); return new FunctionMinimum(seed, states, mfcn.errorDef()); } }