private static async Task LocalOptimize(IReadOnlyCollection <Tuning> tuningObjects) { var bestErrorLocal = await CalculateErrorMultiThreaded(); _orgError = bestErrorLocal; var improved = true; var run = 1; while (improved) { Console.WriteLine("Run " + run++); improved = false; foreach (var tuningObject in tuningObjects) { for (var i = 0; i < tuningObject.NumberOfParameters(); i++) { if (tuningObject.Skip(i)) { continue; } tuningObject.AddStep(i); EvalConstants.InitMgEg(); ThreadData.ClearCaches(); var newError = await CalculateErrorMultiThreaded(); if (newError < bestErrorLocal - 0.00000001) { bestErrorLocal = newError; Console.WriteLine($"{bestErrorLocal} - {tuningObject}"); improved = true; } else { tuningObject.RemoveStep(i); tuningObject.RemoveStep(i); EvalConstants.InitMgEg(); ThreadData.ClearCaches(); newError = await CalculateErrorMultiThreaded(); if (newError < bestErrorLocal - 0.00000001) { bestErrorLocal = newError; Console.WriteLine($"{bestErrorLocal} - {tuningObject}"); improved = true; } else { tuningObject.AddStep(i); } } } } PrintAll(tuningObjects); } _bestError = bestErrorLocal; }