runFitter method
Map<String, dynamic>
runFitter
()
Implementation
Map<String, dynamic> runFitter() {
List<double> paramEstimate = params, oldParams;
double oldSSR, converge, ssr1 = ssr(paramEstimate);
int t1 = DateTime.now().millisecondsSinceEpoch;
//reset lambda each time a new fit is called?
lambda = 0.01;
params = initialParams;
iterationNumber = 0;
int maxIt = int.parse(fitterOptions[MAX_ITERATIONS][0]);
double ftol = double.parse(fitterOptions[FIT_OPT_TOLERANCE][0]);
for (int i = 0; i < maxIt; i++) {
//print("jsfit 3000=${fitterOptions.runtimeType}");
//print("jsfit 3001=${fitterOptions}");
iterationNumber++;
//print("jsfit 3002=${iterationNumber}");
oldParams = params;
//print("jsfit 3003=${oldParams}");
oldSSR = ssr(oldParams);
//print("jsfit 3004=${oldSSR}");
params = iterate(oldParams);
//print("jsfit 3005=${params}");
ssr1 = ssr(params);
//print("jsfit 3006=${ssr1}");
//print("jsfit 3011=${fitterOptions[FIT_OPT_TOLERANCE].runtimeType}");
//print("jsfit 3012=${fitterOptions[FIT_OPT_TOLERANCE]}");
//If the SSR is really small, that means we are getting a perfect fit, so stop
if (ssr1 < ftol) {
stopReason = FIT_OPT_TOLERANCE;
//print("jsfit 3013=${stopReason}");
break;
}
//print("jsfit 3014=${stopReason}");
//check for convergence based on change in SSR over last iterations
converge = ((ssr1 - oldSSR) / ssr1).abs();
if (converge < ftol) {
stopReason = "convergence";
break;
}
}
if (iterationNumber == int.parse(fitterOptions[MAX_ITERATIONS][0])) {
stopReason = MAX_ITERATIONS;
}
//print("jsfit 1000=$params");
return {
PARAMS: params,
PARAMETER_ERRORS: parameterErrors(),
"parInfo": fitterOptions["parInfo"],
"hessian": hessian(params),
"jac": jacobian(params),
"covar": covar(params),
CHI2: chi2(params),
CHI2RED: chi2(params) / dof,
"dof": dof,
ITERATIONS: iterationNumber,
STOP_REASON: stopReason,
INITIAL_PARAMS: initialParams,
"xvals": xvals,
"yvals": yvals,
"residuals": residuals(params),
"numJac": numJac,
TIME: DateTime.now().millisecondsSinceEpoch - t1,
"warnings": warnings
};
}