public void ApplyPunishment() { float t = 1; Transition marked = markedDistributions.Pop(); while (marked != null) { OutputDistribution distribution = marked.GetOutputDistribution(); foreach (string name in markedSymbols) { float change = parameters [3] * t *curSymbol.GetValue() / marked.GetConfidence(); distribution.UpdateSymbolProbabilityForAllBut(name, change); marked.AddToConfidence(parameters [3] * t * curSymbol.GetValue()); foreach (State state in states) { Transition nextTransition = state.GetTransitionOn(new Symbol(marked.GetSymbolName(), 0.0f)); if (nextTransition != null) { nextTransition.GetOutputDistribution().UpdateSymbolProbabilityForAllBut(name, change); nextTransition.AddToConfidence(parameters [6] * parameters [3] * t * curSymbol.GetValue()); } } } t *= parameters [7]; if (markedDistributions.Count > 0) { marked = markedDistributions.Pop(); } else { marked = null; } } markedSymbols = new List <String> (); }