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