lmfit method

Future<Map<String, List<String>>> lmfit (FitFunction fitFunction, List<double> xvals, List<double> yvals, List<double> initialPars, Map<String, List<String>> fitOptions)

See fit function for a description of the parameters. This method is an async version of fit on the one hand, and returns the fit result stringified, on the other, rather than as dynamic values.

Implementation

Future<Map<String, List<String>>> lmfit(
    FitFunction fitFunction,
    List<double> xvals,
    List<double> yvals,
    List<double> initialPars,
    Map<String, List<String>> fitOptions) async {
  Completer<Map<String, List<String>>> cpl = new Completer();

  LMfit lmfit = LMfit();
  Map<String, List<String>> fitResult = {};
  List<String> li;
  List<double> userWeights; // no non-null such weights for now
  try {
    //print("fitcurve 1000=$initialPars");
    Map<String, dynamic> fitResultSD = lmfit.fit(
        fitFunction, xvals, yvals, userWeights, initialPars, fitOptions);
    //print("fitcurve 1010=$fitResultSD");
    // Here we must convert all needed dynamic result values to List<String> type
    // so that tey can be accessed in a type-secure manner.
    li = [];
    for (int i = 0; i < fitResultSD["params"].length; i++)
      li.add(fitResultSD["params"][i].toString());
    fitResult[LMfit.PARAMS] = li;
    li = [];
    for (int i = 0; i < fitResultSD["parameterErrors"].length; i++)
      li.add(fitResultSD["parameterErrors"][i].toString());
    fitResult[LMfit.PARAMETER_ERRORS] = li;
    fitResult[LMfit.CHI2] = <String>[fitResultSD["chi2"].toString()];
    fitResult[LMfit.CHI2RED] = <String>[fitResultSD["chi2red"].toString()];
    fitResult[LMfit.ITERATIONS] = <String>[
      fitResultSD["iterations"].toString()
    ];
    fitResult[LMfit.STOP_REASON] = <String>[
      fitResultSD["stopReason"].toString()
    ];
    li = [];
    for (int i = 0; i < fitResultSD["initialParams"].length; i++)
      li.add(fitResultSD["initialParams"][i].toString());
    fitResult[LMfit.INITIAL_PARAMS] = li;
    li = [];
    li.add(fitResultSD["time"].toString());
    fitResult[LMfit.TIME] = li;
  } catch (e) {
    //print("LMfit: fitcurve 1000error=${e}");
    fitResult = {
      FIT_ERROR: ["LMfit: 1000 error=<br>" + "${e}"]
    };
  }
  cpl.complete(fitResult);
  return new Future.value(fitResult);
}