public Tuple<int, int> ProcessTypos(string original, string entered)
{
// get LCS
var alignments = LongestCommonSubsequence.LeftAlignedLCS(original, entered);
// find all character additions
var additions = LongestCommonSubsequence.GetAddedCharIndices(entered, alignments);
// find all character omissions
var omissions = LongestCommonSubsequence.GetMissingCharIndices(original, alignments);
// find all transpositions
var outputs = LongestCommonSubsequence.FixTranspositions(alignments, additions, omissions, original, entered);
// new string
string entered2 = outputs.Item1;
// new alignments
var alignments2 = outputs.Item2;
// new additions
var additions2 = outputs.Item3;
// new omissions
var omissions2 = outputs.Item4;
// deltas
var deltas = outputs.Item5;
// get typos
var typos = LongestCommonSubsequence.GetTypos(alignments2, original, entered2);
int count_deltas = 0;
int count_typos = 0;
// train the model for all non-transpositions
foreach (var alignment in alignments)
{
AddTranspositionError(0);
}
// train the model for all actual transpositions
foreach (var delta in deltas)
{
AddTranspositionError(delta);
count_deltas += 1;
}
// train the model for each "typo", including non-typos
foreach (var typo in typos)
{
OptChar c = typo.Item1;
string s = typo.Item2;
AddTypoError(c, s);
// non-empty string
if (OptChar.get_IsSome(c))
{
count_typos += c.Value.ToString().Equals(s) ? 0 : 1;
}
// empty string
else
{
count_typos += s.Equals("") ? 0 : 1;
}
}
return new Tuple<int,int>(count_deltas, count_typos);
}