package org.freehep.math.minuit; /** * * @version $Id: ModularFunctionMinimizer.java 8584 2006-08-10 23:06:37Z duns $ */ abstract class ModularFunctionMinimizer { FunctionMinimum minimize(FCNBase fcn, MnUserParameterState st, MnStrategy strategy, int maxfcn, double toler, double errorDef, boolean useAnalyticalGradient, boolean checkGradient) { MnUserFcn mfcn = new MnUserFcn(fcn, errorDef, st.trafo()); GradientCalculator gc; if (fcn instanceof FCNGradientBase && useAnalyticalGradient) gc = new AnalyticalGradientCalculator((FCNGradientBase) fcn, st.trafo(), checkGradient); else gc = new Numerical2PGradientCalculator(mfcn, st.trafo(), strategy); int npar = st.variableParameters(); if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar; MinimumSeed mnseeds = seedGenerator().generate(mfcn, gc, st, strategy); return minimize(mfcn, gc, mnseeds, strategy, maxfcn, toler); } abstract MinimumSeedGenerator seedGenerator(); abstract MinimumBuilder builder(); FunctionMinimum minimize(MnFcn mfcn, GradientCalculator gc, MinimumSeed seed, MnStrategy strategy, int maxfcn, double toler) { return builder().minimum(mfcn, gc, seed, strategy, maxfcn, toler*mfcn.errorDef()); } }