Exemple #1
0
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;
}
Exemple #3
0
int DFA::extendedTransitionFunction(int from, const char* word) {
	for (int i = 0; i < (int) strlen(word); i++)
		from = transitionFunction(from, word[i]);
	return from;
}
Exemple #4
0
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);
}