public TrafficLightDigits[] Predict(Models.TrafficLight trafficLight, Observation[] previous) { Validate(trafficLight, previous); var predictedDigits = predictor .Predict(trafficLight, previous) .ToArray(); var solutions = predictedDigits; if (previous.Length == 0) { return(predictedDigits); } if (IsSolutionFound(solutions)) { solutions[0] += previous.Length; if (!previous[0].PredictedDigits.Contains(solutions[0])) { Throws.NoSolutionFound(); } return(solutions); } for (var i = previous.Length - 1; i >= 0; i--) { var prev = previous[i]; var incremented = IncrementAllDigits(solutions); solutions = prev.PredictedDigits.Intersect(incremented).ToArray(); if (solutions.Length == 0) { Throws.NoSolutionFound(); } } return(solutions); }