bool LocalFrequencies::runOnFunction(Function &F) { std::map<Edge, float> BackEdgeProbabilities; SeansLLVM::BranchProbabilities &P = getAnalysis<SeansLLVM::BranchProbabilities>(); // foreach edge do back_edge_probability(edge) = prob(edge) for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) { BasicBlock *BB = &*I; for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB); SI != SE; ++SI) { BasicBlock *Successor = *SI; BackEdgeProbabilities[Edge(BB, Successor)] = P.getProb(BB, Successor); } } // foreach loop from inner-most to out-most do LoopInfo &LI = getAnalysis<LoopInfo>(); for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) { processLoop(*I, BackEdgeProbabilities); } calculateFrequencies(&F.getEntryBlock(), BackEdgeProbabilities); return false; }
void LocalFrequencies::processLoop(Loop *L, std::map<Edge, float> &BackEdgeProbabilities) { // Process from inner-most to out-most for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) { processLoop(*I, BackEdgeProbabilities); } calculateFrequencies(L->getHeader(), BackEdgeProbabilities); }
void* doWork(WorkerThread* thread) { WorkItem* item; do { if (item = workList) { if (__sync_bool_compare_and_swap(&workList, item, item->next)) { switch (item->length) { case 1: calculateFrequencies(item->data, thread->hash1, item->first, item->last); break; case 2: calculateFrequencies(item->data, thread->hash2, item->first, item->last); break; case 3: calculateFrequencies(item->data, thread->hash3, item->first, item->last); break; case 4: calculateFrequencies(item->data, thread->hash4, item->first, item->last); break; case 6: calculateFrequencies(item->data, thread->hash6, item->first, item->last); break; case 12: calculateFrequencies(item->data, thread->hash12, item->first, item->last); break; case 18: calculateFrequencies(item->data, thread->hash18, item->first, item->last); break; default: exit(666); break; } delete item; } } else { if (moreWorkIsPossible) usleep(1000); } } while (workList || moreWorkIsPossible); return NULL; }
double GeneticAlgorithm::calculateResidual(Parameters::fitParameters * parameters, int threadID){ double total = 0; double * paramPointer = &(parameters->c11); for(int i = 0; i < nParams; i++){ _paramArray[threadID][i] = *paramPointer; paramPointer++; } double * frequencies = calculateFrequencies(_paramArray[threadID]); if(_nMissing > 0){ std::vector<double> freqVect(0); for(int i = 0; i < _dataSetLength; i ++){ freqVect.push_back(_dataSet[i]); } std::vector<double>::iterator iter; double resTemp = INFINITY; int totalLength = _nMissing + _dataSetLength; long * missInd = new long[_nMissing]; bool * flag = new bool; *flag = false; long combs = nCombs(totalLength, _nMissing); for(int i = 0; i < _nMissing; i++){ missInd[i] = i; } for(int i = 0; i < combs; i ++){ total = 0; std::vector<double> freqVectTemp(freqVect); iter = freqVectTemp.begin(); for(int j = 0; j < _nMissing; j ++){ iter += missInd[j]; freqVectTemp.insert(iter, 0); iter = freqVectTemp.begin(); } for(int m = 0; m < totalLength; m++){ if(freqVectTemp[m] != 0){ _residualArray[threadID][m] = (frequencies[m] - freqVectTemp[m]); } else{ _residualArray[threadID][m] = 0; } } for(int m = 0; m < totalLength; m++){ total += _residualArray[threadID][m]*_residualArray[threadID][m]; } if(total < resTemp){ resTemp = total; for(int p = 0 ; p < _nMissing; p++){ parameters->missFreq[p] = missInd[p]; } } shiftInd(missInd, _nMissing -1, _nMissing, totalLength, flag); } total = resTemp; delete[] missInd; delete flag; } else{ for(int i = 0; i < _dataSetLength; i++){ if(_dataSet[i]!= 0){ _residualArray[threadID][i] = (frequencies[i] - _dataSet[i]); } else{ _residualArray[threadID][i] = 0; } } for(int i = 0; i < _dataSetLength; i++){ total += _residualArray[threadID][i]*_residualArray[threadID][i]; } } delete[] frequencies; return total; }
void GeneticAlgorithm::printMinimumParameters(){ std::cout<<std::left<<std::setfill(' ')<<std::setw(10)<<"c11"<<std::setw(10)<<"c22"<<std::setw(10)<<"c33"<<std::setw(10)<<"c13"<<std::setw(10)<<"c23"<<std::setw(10)<<"c12"<<std::setw(10)<<"c44"<<std::setw(10)<<"c55"<<std::setw(10)<<"c66"<<std::endl; std::cout<<std::left<<std::setfill(' ')<<std::setw(10)<<_minimumParameters.c11/(pow(10,9))<<std::setw(10)<<_minimumParameters.c22/(pow(10,9))<<std::setw(10)<<_minimumParameters.c33/(pow(10,9))<<std::setw(10)<<_minimumParameters.c13/(pow(10,9))<<std::setw(10)<<_minimumParameters.c23/(pow(10,9))<<std::setw(10)<<_minimumParameters.c12/(pow(10,9))<<std::setw(10)<<_minimumParameters.c44/(pow(10,9))<<std::setw(10)<<_minimumParameters.c55/(pow(10,9))<<std::setw(10)<<_minimumParameters.c66/(pow(10,9))<<std::endl<<"Residual: "<<_minimumParameters.chiSq<<std::endl<<std::endl; //std::cout<<"c11: "<<_minimumParameters.c11<<" "<<"c22: "<<_minimumParameters.c22<<" "<<"c33: "<<_minimumParameters.c33<<std::endl<<"c44: "<<_minimumParameters.c44<<" "<<"c55: "<<_minimumParameters.c55<<" "<<"c66: "<<_minimumParameters.c66<<"c12: "<<_minimumParameters.c12<<" "<<"c13: "<<_minimumParameters.c13<<" "<<"c23: "<<_minimumParameters.c23<<std::endl<<"Residual: "<<_minimumParameters.chiSq<<std::endl<<std::endl; std::ofstream out; out.open("output.dat"); out.precision(15); out<<_minimumParameters.c11<<'\t'<<_minimumParameters.c22<<'\t'<<_minimumParameters.c33<<'\t'<<_minimumParameters.c44<<'\t'<<_minimumParameters.c55<<'\t'<<_minimumParameters.c66<<'\t'<<_minimumParameters.c12<<'\t'<<_minimumParameters.c13<<'\t'<<_minimumParameters.c23; out.close(); double *frequencies = calculateFrequencies(&(_minimumParameters.c11)); if(_nMissing > 0){ std::vector<double> freqVect(0); for(int i = 0; i < _dataSetLength; i ++){ freqVect.push_back(_dataSet[i]); } std::vector<double>::iterator iter = freqVect.begin(); for(int j = 0; j < _nMissing; j ++){ iter += _minimumParameters.missFreq[j]; freqVect.insert(iter, 0); iter = freqVect.begin(); } std::cout<<std::left<<std::setfill(' ')<<std::setw(20)<<"Measured"<<std::setw(20)<<"Calculated"<<std::setw(20)<<"%diff"<<std::endl; for(int i = 0; i < _dataSetLength+_nMissing; i ++){ std::cout<<std::setw(20)<<freqVect[i]<<std::setw(20)<<frequencies[i]<<std::setw(20)<<(freqVect[i] - frequencies[i])/(frequencies[i]) * 100<<std::endl; } for(int i = _dataSetLength+_nMissing; i < _dataSetLength+_nMissing+ 30; i ++){ std::cout<<std::setw(20)<<' '<<frequencies[i]<<std::endl; } } else{ std::cout<<std::left<<std::setfill(' ')<<std::setw(20)<<"Measured"<<std::setw(20)<<"Calculated"<<std::setw(20)<<"%diff"<<std::endl; for(int i = 0; i < _dataSetLength; i ++){ std::cout<<std::setw(20)<<_dataSet[i]<<std::setw(20)<<frequencies[i]<<std::setw(20)<<(_dataSet[i] - frequencies[i])/(frequencies[i]) * 100<<std::endl; } for(int i = _dataSetLength+_nMissing; i < _dataSetLength+_nMissing+ 30; i ++){ std::cout<<std::setw(20)<<' '<<frequencies[i]<<std::endl; } } std::ofstream fout; fout.open("freqoutput.dat"); fout.precision(15); for(int i = 0; i < _R; i ++){ fout<<frequencies[i]<<std::endl; } fout.close(); delete[] frequencies; }