public async Task <Prediction> PredictAsync(Guid sequenceId, Models.TrafficLight trafficLight) { var observations = (await storage.FindObservationAsync(sequenceId)).ToArray(); if (observations.Any(x => x.TrafficLight.Equals(trafficLight))) { Throws.DuplicateObservation(); } var predictedDigits = timePredictor.Predict(trafficLight, observations); var decrementedDigits = observations.Length == 0 ? predictedDigits : predictedDigits.Select(x => x - observations.Length); var faultySections = expert.IdentifyBrokenSections(trafficLight, decrementedDigits.ToArray(), observations); await storage.SaveObservationAsync(sequenceId, trafficLight, decrementedDigits); var starts = predictedDigits .Select(x => x.ToNumber()) .ToArray(); var missings = faultySections.ToBitString(); return(new Prediction(starts, missings)); }