private static void FindAllPairs(SortedElement src, int sufStart, int sufLength, int v, int localPosition, Edge currentNode, int missmatch, int misslimit, int[,] overlapMatrix, int indexOverlap, ref int kmer, bool[] addedPatterns) { while (true) { if (sufLength == v) { for (int i = currentNode.StartIndex; i < currentNode.EndIndex + 1; i++) { if (overlapMatrix[indexOverlap, i] < v) { if (i != indexOverlap && !addedPatterns[i]) { overlapMatrix[indexOverlap, i] = v; kmer++; } } } return; } if (localPosition <= currentNode.LengthString - 1) { if (src.Chars[v + sufStart] != currentNode.Src.Chars[currentNode.StartString + localPosition]) { missmatch++; } if (missmatch > misslimit) { return; } localPosition++; v++; } else { for (int j = 0; j < 4; j++) { var mistemp = missmatch; if (src.CodeChars[sufStart + v] != j) { mistemp++; } if (currentNode.Childs[j] != null && mistemp <= misslimit) { var v1 = v + 1; FindAllPairs(src, sufStart, sufLength, v1, 1, currentNode.Childs[j], mistemp, misslimit, overlapMatrix, indexOverlap, ref kmer, addedPatterns); } } return; } } }
private static AllPairsSuffixPrefixResule AllPairsSuffixPrefix(SortedElement[] sortedElements, Edge root) { var patternsCount = sortedElements.Length; var overlapMatrix = new int[patternsCount, patternsCount]; var addedPatterns = new bool[sortedElements.Length]; var startIndex = 0; var currentIndex = startIndex; addedPatterns[startIndex] = true; var patternQueue = new int[patternsCount]; var overlapQueue = new int[patternsCount]; var kmer = 0; var kmerMax = 1; var localValue = -1; var localIndex = -1; for (int i = 0; i < sortedElements.Length - 1; i++) { patternQueue[i] = currentIndex; kmer = 0; for (int j = 0; j < sortedElements[0].Chars.Length; j++) { var sufStart = j; var sufLength = sortedElements[0].Chars.Length - j; var misslimit = (int)(sufLength * 0.05); FindAllPairs(sortedElements[currentIndex], sufStart, sufLength, 0, 0, root, 0, misslimit, overlapMatrix, currentIndex, ref kmer, addedPatterns); if (kmer >= kmerMax) { break; } } localValue = -1; localIndex = -1; for (int j = 0; j < patternsCount; j++) { if (overlapMatrix[currentIndex, j] > localValue && !addedPatterns[j]) { localIndex = j; localValue = overlapMatrix[currentIndex, j]; } } overlapQueue[i] = localValue; currentIndex = localIndex; addedPatterns[currentIndex] = true; } addedPatterns[startIndex] = false; localValue = -1; kmer = 0; for (int j = 0; j < sortedElements[0].Chars.Length; j++) { var sufStart = j; var sufLength = sortedElements[0].Chars.Length - j; var misslimit = (int)(sufLength * 0.05); FindAllPairs(sortedElements[currentIndex], sufStart, sufLength, 0, 0, root, 0, misslimit, overlapMatrix, currentIndex, ref kmer, addedPatterns); if (kmer >= kmerMax) { break; } } for (int j = 0; j < patternsCount; j++) { if (overlapMatrix[currentIndex, j] > localValue && !addedPatterns[j]) { localValue = overlapMatrix[currentIndex, j]; } } patternQueue[patternsCount - 1] = currentIndex; overlapQueue[patternsCount - 1] = localValue; overlapMatrix[currentIndex, startIndex] = localValue; return(new AllPairsSuffixPrefixResule() { OverlapMatrix = overlapMatrix, OverlapQueue = overlapQueue, PatternQueue = patternQueue }); }
private static void CreatePrefix(Edge root, SortedElement sortedElement) { var inputArr = sortedElement.Chars; var codes = sortedElement.CodeChars; var length = inputArr.Length; var curentEdge = root; for (int j = 0; j < length; j++) { Edge searchElement = null; var cCode = codes[j]; if (curentEdge.Childs[cCode] != null) { searchElement = curentEdge.Childs[cCode]; } if (searchElement == null) { var newEdge = new Edge(); newEdge.LengthString = length - j; newEdge.StartString = j; newEdge.StartIndex = sortedElement.PositionInList; newEdge.EndIndex = sortedElement.PositionInList; newEdge.Src = sortedElement; curentEdge.Childs[codes[j]] = newEdge; break; } else { var minL = Math.Min(searchElement.LengthString, length - j); var copyL = 1; var charsInEdge = searchElement.Src.Chars; var codesCharsInEdge = searchElement.Src.CodeChars; for (int k = 1; k < minL; k++) { if (charsInEdge[searchElement.StartString + k] == inputArr[j + k]) { copyL++; } else { break; } } if (copyL < searchElement.LengthString) { var newEdge = new Edge(); newEdge.StartString = searchElement.StartString + copyL; newEdge.LengthString = searchElement.LengthString - copyL; newEdge.CopyChilds(searchElement.Childs); newEdge.EndIndex = searchElement.EndIndex; newEdge.StartIndex = searchElement.StartIndex; newEdge.Src = searchElement.Src; searchElement.CleanChild(); searchElement.Childs[codesCharsInEdge[newEdge.StartString]] = newEdge; searchElement.LengthString = copyL; } searchElement.EndIndex = sortedElement.PositionInList; j = j + copyL - 1; curentEdge = searchElement; } } }