public static double[] SolveInverse( IForwardSolver forwardSolver, IOptimizer optimizer, SolutionDomainType solutionDomainType, double[] dependentValues, double[] standardDeviationValues, InverseFitType inverseFitType, object[] independentValues) { //var opticalPropertyGuess = ((OpticalProperties[]) (independentValues[0])).First(); //var fitParameters = new double[4] { opticalPropertyGuess.Mua, opticalPropertyGuess.Musp, opticalPropertyGuess.G, opticalPropertyGuess.N }; var parametersToFit = GetParametersToFit(inverseFitType); var opticalPropertyGuess = (OpticalProperties[])(independentValues[0]); var fitParametersArray = opticalPropertyGuess.SelectMany(opgi => new[] { opgi.Mua, opgi.Musp, opgi.G, opgi.N }).ToArray(); var parametersToFitArray = Enumerable.Range(0, opticalPropertyGuess.Count()).SelectMany(_ => parametersToFit).ToArray(); Func <double[], object[], double[]> func = GetForwardReflectanceFuncForOptimization(forwardSolver, solutionDomainType); //var fit = optimizer.Solve(fitParameters, parametersToFit, dependentValues.ToArray(), // standardDeviationValues.ToArray(), func, independentValues.ToArray()); var fit = optimizer.Solve(fitParametersArray, parametersToFitArray, dependentValues.ToArray(), standardDeviationValues.ToArray(), func, independentValues.ToArray()); return(fit); }