Ejemplo n.º 1
0
        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;
                }
            }
        }
Ejemplo n.º 2
0
        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
            });
        }
Ejemplo n.º 3
0
        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;
                }
            }
        }