I am refactoring my source code, which previously used List<T>
, to make it memoryless by introducing IEnumerable<T>
and yield return
so that my source code can handle bigdata.
Suppose I have the following function, which is already refactored in favor of IEnumerable<T>
:
static class MyClass
{
public static (IEnumerable<double> XFit, IEnumerable<double> YFit, IEnumerable<double> MinimizingPoint)
Fit(IEnumerable<double> xData, IEnumerable<double> yData, int minIterations = 100000)
{
var xDataDense = new DenseVector(xData.ToArray());
var yDataDense = new DenseVector(yData.ToArray());
Vector<double> Model(Vector<double> parameters, Vector<double> x)
{
var y = CreateVector.Dense<double>(x.Count);
for (int i = 0; i < x.Count; i++)
{
y[i] = parameters[0] * Math.Exp(parameters[1] * x[i]);
}
return y;
}
var start = new DenseVector(new double[] { 1.0, 0.1 });
var objective = ObjectiveFunction.NonlinearModel(Model, xDataDense, yDataDense);
var solver = new LevenbergMarquardtMinimizer(maximumIterations: minIterations);
var result = solver.FindMinimum(objective, start);
var points = result.MinimizedValues.ToArray();
var minimizing = result.MinimizingPoint.ToArray();
return (xData, points, minimizing);
}
}
This function is called in another function:
class MyClass2
{
public static (double A0, double Tau0) GetA0Tau0ForVec3(IEnumerable<Vec3MemoryLess> rEndVecs, int numLags = 1000, bool isLog = false)
{
var autocorr = TimeSeriesAnalysisMemoryLess.GetAutoCorrelationPoints(rEndVecs, numLags);
var TauListX = autocorr.lags;//Error: doesn't work
var AutoCorrelationListY = autocorr.;//Error: doesn't work
var fittedCurve = NonLinearRegressionCurveFittingMemoryLess.Fit(autocorr.lags, autocorr.autocorrs);
IEnumerable<double> xExpDecayList = fittedCurve.XFit;
IEnumerable<double> yExpDecayList = fittedCurve.YFit;
IEnumerable<double> results = fittedCurve.MinimizingPoint;
double A0Value = 0;
if (isLog)
{
A0Value = Math.Exp(results.First());
}
else
{
A0Value = results.First();
}
double Tau0Value = 1.0 / ((-1.0) * results.Skip(1).First());
return (A0Value, Tau0Value);
}
}
How can I apply yield return
in these functions?
There is also a problem with tuple splitting in the second function.