예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #4
0
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;
}
예제 #5
0
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;

}