private ResponseBase getResponse(ParsedUtterance utterance) { var responses = new List <ModifiableResponse>(); var originalUtterance = utterance.OriginalSentence; _context.StartTurn(originalUtterance); var edgeInput = new EdgeInput(originalUtterance); do { _context.EdgeReset(); var scores = edgeInput.GetScore(_currentState); Trigger trigger; if (scores.Any()) { var bestHypothesis = scores.First(); var score = bestHypothesis.Score; var nonPatternQuestion = getBestNonPattern(scores); if (score < 0.5) { trigger = _currentState.DefaultTrigger; } else if (nonPatternQuestion != null && nonPatternQuestion.Score < 0.9 && _currentState == QuestionRouting) { _context.SetValue(EquivalenceQuestion.QueriedQuestion, originalUtterance); var substitution = substitute(nonPatternQuestion.ParsedSentence, utterance); _context.SetValue(EquivalenceQuestion.PatternQuestion, substitution); edgeInput = new EdgeInput(EquivalenceQuestion.EquivalenceEdge); continue; } else if (score < 0.9) { trigger = _currentState.DefaultTrigger; } else { var substitution = bestHypothesis.Substitution; trigger = bestHypothesis.Value; _context.AddSubstitution(substitution); } } else { trigger = _currentState.DefaultTrigger; } if (trigger == null) { throw new NullReferenceException("Cannot handle null trigger"); } var response = fireTrigger(trigger); if (response != null) { responses.Add(response); } edgeInput = _context.CurrentOutput; } while (edgeInput != null); var concatenation = from response in responses select response.CreateResponse().ToString(); return(new SimpleResponse(string.Join(".", concatenation))); }