/// <summary> /// The dynamic table generation. /// </summary> /// <param name="first">The first sequence.</param> /// <param name="second">The second sequence.</param> /// <returns>The dynamic table.</returns> private ProfileTableItem GenerateDynamicTable(Profile first, Profile second) { var length1 = first.Count + 1; var length2 = second.Count + 1; var dynamicTable = new ProfileTableItem(first, second) { { new Index(0, 0), new DynamicTableItem(0, new List<Index>()) } }; // first row set for (var i = 1; i < length2; i++) { var ii = i - 1; // in sequence dynamicTable.Add(new Index(0, i), new DynamicTableItem(i * this.Estimator.ProfileItemNucleotideDistance(second[ii], Nucleotide._), new List<Index> { new Index(0, i - 1) })); } // first column set for (var i = 1; i < length1; i++) { var ii = i - 1; // in sequence dynamicTable.Add(new Index(i, 0), new DynamicTableItem(i * this.Estimator.ProfileItemNucleotideDistance(first[ii], Nucleotide._), new List<Index> { new Index(i - 1, 0) })); } for (var i = 1; i < length1; i++) { for (var j = 1; j < length2; j++) { var pj = new Index(i - 1, j); // same column var pi = new Index(i, j - 1); // same row var pij = new Index(i - 1, j - 1); var ii = i - 1; // in sequence var jj = j - 1; // in sequence var estimates = new Dictionary<Index, double> { { pj, dynamicTable[pj].Distance + this.Estimator.ProfileItemNucleotideDistance(first[ii], Nucleotide._) }, { pi, dynamicTable[pi].Distance + this.Estimator.ProfileItemNucleotideDistance(Nucleotide._, second[jj]) }, { pij, dynamicTable[pij].Distance + this.Estimator.ProfileItemsDistance(first[ii], second[jj]) } }; var d = estimates.Values.Min(); var dynamicTableItem = new DynamicTableItem(d, estimates.Where(e => e.Value.IsEqualTo(d)).Select(e => e.Key).ToList()); dynamicTable.Add(new Index(i, j), dynamicTableItem); } } return dynamicTable; }