void decifrar(char * mensagem, char * resultado) { int i, minDev, minI, dev; char order[26]; //vetor para a sequencia de frequencia int freq[26]; //vetor para a quantidade de cada letra char *temp = malloc((strlen(mensagem) + 1) * sizeof(char)); //testar todas as possibilidades for (i = 0; i < 26; i++) { //decifrar usando a chave atual transform(mensagem, temp, i); //calcular a frequencia de letras calculateFrequency(temp, order, freq); //calcular o desvio com relação à distribuição esperada dev = abs(getDeviation(order, freq)); if (!i || (dev < minDev && isValid(temp))) { //armazenar o menor desvio minDev = dev; minI = i; } if (!minDev) { //se a distancia for zero não é necessário //continuar a verificação break; } } free(temp); //usando o menor desvio, traduza a mensagem transform(mensagem, resultado, minI); }
void IntegrationTest::checkWithSpikes(const char* keyword){ int errorOccurrences = 0; size_t jvar = 0 ; bool spikePrev = false; bool spikeCurrent = false; Deviation deviation; for (size_t ivar = 0; ivar < referenceVec->size(); ivar++){ int errorOccurrencesPrev = errorOccurrences; spikePrev = spikeCurrent; getDeviation(ivar,jvar, deviation); errorOccurrences += checkDeviation(deviation); if (errorOccurrences != errorOccurrencesPrev){ spikeCurrent = true; } else{ spikeCurrent = false; } if(spikePrev&&spikeCurrent){ std::cout << "For keyword " << keyword << " at time step " << (*referenceVec)[ivar] <<std::endl; OPM_THROW(std::invalid_argument, "For keyword " << keyword << " at time step " << (*referenceVec)[ivar] << ", wwo deviations in a row exceed the limit. Not a spike value. Integration test fails." ); } if(errorOccurrences > this->spikeLimit){ std::cout << "For keyword " << keyword << std::endl; OPM_THROW(std::invalid_argument, "For keyword " << keyword << " too many spikes in the vector. Integration test fails."); } } }
void SummaryComparator::getDeviation(size_t refIndex, size_t &checkIndex, Deviation &dev){ if((*referenceVec)[refIndex] == (*checkVec)[checkIndex]){ dev = SummaryComparator::calculateDeviations((*referenceDataVec)[refIndex], (*checkDataVec)[checkIndex]); checkIndex++; return; } else if((*referenceVec)[refIndex]<(*checkVec)[checkIndex]){ double value = SummaryComparator::unitStep((*checkDataVec)[checkIndex]); /*Must be a little careful here. Flow writes out old value first, than changes value. Say there should be a change in production rate from A to B at timestep 300. Then the data of time step 300 is A and the next timestep will have value B. Must use the upper limit. */ dev = SummaryComparator::calculateDeviations((*referenceDataVec)[refIndex], value); checkIndex++; return; } else{ checkIndex++; getDeviation(refIndex, checkIndex , dev); } if(checkIndex == checkVec->size() -1 ){ return; } }