void DFA::changeAllStatesName(int start) { int newStates[countOfStates]; int k = 0, oldState, index; for (int i = 0; i < countOfStates; i++) { newStates[i] = start; if (isFinalState(states[i])) finalStates[k++] = start; start++; } for (int i = 0; i < countOfStates; i++) { // Презаписваме таблицата с новите състояния for (int j = 0; j < countOfAlphabet; j++) { if (transitionFunction(states[i], alphabet[j]) != -2 && transitionFunction(states[i], alphabet[j]) != -1) { oldState = table[states[i]][alphabet[j]]; //трябва да вземем индекса на oldState и да вземем новото име така newStates[индекс на oldState] for (int z = 0; z < countOfStates; z++) if (states[z] == oldState) index = z; table[newStates[i]][alphabet[j]] = newStates[index]; table[states[i]].erase(alphabet[j]); // Изтриваме старите състояния } } } for (int i = 0; i < countOfStates; i++) { if (startState == states[i]) startState = newStates[i]; states[i] = newStates[i]; } }
void transitionFunctionTime(){ unsigned int stateCount = 100; unsigned int symbolCount = 5; unsigned int wordLength = 200; std::vector<int> w_entries(wordLength); Word w(w_entries); TransitionFunction transitionFunction(stateCount, symbolCount); for(unsigned int i = 0; i < symbolCount; i++){ for(unsigned int j = 0; j < stateCount; j++){ transitionFunction.addTransition(j, i, 0); } } const int wordCount = 1000; double time; clk::startClock(); int count = 1; int iter = 0; while(iter++ < count) for(int i = 0; i < wordCount-1; i++){ for(int j = i; j < wordCount; j++){ compute(w, &transitionFunction); } } time = clk::stopClock(); std::cout << "Word Count: " << wordCount << " Time: " << time << std::endl; }
int DFA::extendedTransitionFunction(int from, const char* word) { for (int i = 0; i < (int) strlen(word); i++) from = transitionFunction(from, word[i]); return from; }
void mspManager::addHit_(char *genSeq, char *estSeq, int genLen, int estLen, int genPos, int estPos, mss_t &MSS) { char *genBeg = 0L; char *estBeg = 0L; char *genEnd = 0L; char *genTmp = 0L; char *estTmp = 0L; int right_sum = 0; int middle_sum = 0; int left_sum = 0; int sum = 0; int score = 0; #ifdef DEBUG_EXTENSION fprintf(stderr, "mspManager::addHit()-- extending hit from GEN %d to %d and EST %d to %d (length = %d)\n", genPos-W, genPos, estPos-W, estPos, W); #endif #ifdef DEBUG_EXTENSION { char L[41], M[41], R[41]; int x; if (genPos-MSS.seedLength > 20) genTmp = genSeq + 1 + genPos - MSS.seedLength - 20; else genTmp = genSeq + 1; x=0; while (genTmp < genSeq + 1 + genPos - MSS.seedLength) L[x++] = *genTmp++; L[x] = 0; x=0; while (genTmp < genSeq + 1 + genPos) M[x++] = *genTmp++; M[x] = 0; x=0; while (genTmp < genSeq + 1 + genPos + 20) R[x++] = *genTmp++; R[x] = 0; fprintf(stderr, "GEN=%8d %s:%s:%s\n", genPos, L, M, R); if (estPos-MSS.seedLength > 20) estTmp = estSeq + 1 + estPos - MSS.seedLength - 20; else estTmp = estSeq + 1; x=0; while (estTmp < estSeq + 1 + estPos - MSS.seedLength) L[x++] = *estTmp++; L[x] = 0; x=0; while (estTmp < estSeq + 1 + estPos) M[x++] = *estTmp++; M[x] = 0; x=0; while (estTmp < estSeq + 1 + estPos + 20) R[x++] = *estTmp++; R[x] = 0; fprintf(stderr, "EST=%8d %s:%s:%s\n", estPos, L, M, R); } #endif // We use diagonals directly -- original version offset the array of // diagonal positions by the constant value included below. // Extend to the right // left_sum = 0; sum = 0; genTmp = genSeq + 1 + genPos; estTmp = estSeq + 1 + estPos; genEnd = genTmp; while ((*genTmp) && (*estTmp) && (estTmp <= estSeq + estLen) && (genTmp <= genSeq + genLen) && (sum >= left_sum - _wordExtAllow)) { sum += _match; if (*estTmp != *genTmp) sum -= (transitionFunction(*estTmp, *genTmp) ? _imatchdiff : _vmatchdiff); estTmp++; genTmp++; if (sum > left_sum) { left_sum = sum; genEnd = genTmp; } } #ifdef TEST_SEEDS_IN_EXTENSION // Check the bases that the seed supposedly matched // middle_sum = 0; sum = 0; genTmp = genSeq + 1 + genPos - 1; estTmp = estSeq + 1 + estPos - 1; for (int x=0; x<MSS.seedLength; x++) { middle_sum += _match; if (*genTmp != *estTmp) middle_sum -= (transitionFunction(*estTmp, *genTmp) ? _imatchdiff : _vmatchdiff); //fprintf(stderr, "%c %c\n", *genTmp, *estTmp); estTmp--; genTmp--; } if (middle_sum != (MSS.matchesLegth/2))) { fprintf(stderr, "mspManager::addHit()-- ERROR: i didn't find an exact match for the seed you supplied!\n"); fprintf(stderr, "mspManager::addHit()-- ERROR: GEN=%40.40s\n", genTmp); fprintf(stderr, "mspManager::addHit()-- ERROR: EST=%40.40s\n", estTmp); exit(1); } #endif // Calculate the score of the seed match // middle_sum = 0; sum = 0; genTmp = genSeq + 1 + genPos - 1; estTmp = estSeq + 1 + estPos - 1; for (int x=0; x<MSS.seedLength; x++) { if (*genTmp == *estTmp) middle_sum += _match; estTmp--; genTmp--; } // Extend to the left // right_sum = 0; sum = 0; genTmp = genSeq + 1 + genPos - MSS.seedLength; estTmp = estSeq + 1 + estPos - MSS.seedLength; genBeg = genTmp; estBeg = estTmp; while ((estTmp > estSeq + 1) && (genTmp > genSeq + 1) && (sum >= right_sum - _wordExtAllow)) { estTmp--; genTmp--; sum += _match; if (*estTmp != *genTmp) sum -= (transitionFunction(*estTmp, *genTmp) ? _imatchdiff : _vmatchdiff); if (sum > right_sum) { right_sum = sum; estBeg = estTmp; genBeg = genTmp; } } score = middle_sum + left_sum + right_sum; #ifdef DEBUG_MSPS printf("TESTMSP: p1 = %7d p2 = %7d l = %7d sc = %7d (%d-%d-%d) ", (int)(genBeg - (genSeq + 1)), (int)(estBeg - (estSeq + 1)), (int)(genEnd - genBeg), score, left_sum, middle_sum, right_sum); printf("g: "); for (s=genBeg; s<genEnd; s++) printf("%c", *s); printf(" c: "); for (s=estBeg; s<estBeg+(int)(genEnd-genBeg); s++) printf("%c", *s); printf(" S: %7d W: %7d cutoff: %d", MSS.seedLength, (int)(MSS.matchedLength/2), _minMSPScore); printf("\n"); #endif // If this hit is significant, save it // if (score >= _minMSPScore) addMSP((int)(genEnd - genBeg), (int)(genBeg - (genSeq + 1)), (int)(estBeg - (estSeq + 1)), score); #ifdef DEBUG_EXTENSION fprintf(stderr, "mspManager::addHit()-- added from GEN %d to %d and EST %d to ? (length = %d) with score %d (needed %d) l,m,r sums %d %d %d\n", (int)(genBeg - (genSeq + 1)), (int)(genEnd - (genSeq + 1)) + W, (int)(estBeg - (estSeq + 1)), MSS.seedLength, score, _minMSPScore, left_sum, middle_sum, right_sum); #endif // Remember the highest point that this diagonal has been extended // to. We use this to short circuit useless mer extensions (if // we've already extended through it). // _diagExt[estLen + genPos - estPos - 1] = (int)(genEnd - genSeq - 1 + MSS.seedLength); }