////--------------------- /// FFConfigParser::Parse //------------------------- // // // Parameters: // // Returns: // qboolean FFConfigParser::Parse( void *file ) { qboolean result = qboolean( file != NULL ); if ( file ) { const char *token = 0, *pos = (const char*)file; for ( token = COM_ParseExt( &pos, qtrue ) ; token[ 0 ] && result // fail if any problem ; token = COM_ParseExt( &pos, qtrue ) ){ if ( !stricmp( token, "ffdefaults" ) ) { result &= ParseDefaults( &pos ); } else if ( !stricmp( token, "ffsets" ) ) { result &= ParseSets( &pos ); } else { // unexpected field result = qfalse; } } FS_FreeFile( file ); } return result; }
int main(int argc, char ** argv) { if(argc < 3){ std::cout << "Wrong number of arguments. Usage: F1Score <partitionA> <partitionB>" << std::endl; exit(0); } std::ifstream inputFileA; inputFileA.open(argv[1]); if(!inputFileA.is_open()) { std::cout << "PARTITION FILE A NOT FOUND" << std::endl; exit(1); } std::ifstream inputFileB; inputFileB.open(argv[2]); if(!inputFileB.is_open()){ std::cout << "PARTITION FILE B NOT FOUND" << std::endl; exit(1); } std::cout << "Parsing Input Files"<< std::endl; partitionA = ParseSets(inputFileA); inputFileA.close(); partitionB = ParseSets(inputFileB); inputFileB.close(); std::map<unsigned int, std::set<unsigned int> > nodePartitionA; std::map<unsigned int, std::set<unsigned int> > nodePartitionB; std::cout << "Partition A size: " << partitionA->size() << std::endl; std::cout << "Partition B size: " << partitionB->size() << std::endl; double maxSetsF1Scores = 0.0f; double maxTagsF1Scores = 0.0f; std::cout << "Creating Indexes of Partition A" << std::endl; for( unsigned int i = 0; i < partitionA->size(); i++){ std::set<unsigned int>* community = (*partitionA)[i]; for( auto it = community->begin(); it != community->end(); it++ ){ unsigned int node = *it; auto it2 = nodePartitionA.find(node); nodePartitionA[node].insert(i); } } std::cout << "Creating Indexes of Partition B" << std::endl; for( unsigned int i = 0; i < partitionB->size(); i++){ std::set<unsigned int>* community = (*partitionB)[i]; for( auto it = community->begin(); it != community->end(); it++ ){ unsigned int node = *it; auto it2 = nodePartitionB.find(node); nodePartitionB[node].insert(i); } } double* f1ScorePartitionA = new double[partitionA->size()]; double* f1ScorePartitionB = new double[partitionB->size()]; double* precisionPartitionA = new double[partitionA->size()]; double* precisionPartitionB = new double[partitionB->size()]; double* recallPartitionA = new double[partitionA->size()]; double* recallPartitionB = new double[partitionB->size()]; /** Initializing arrays to 0 **/ std::memset(f1ScorePartitionA,0,sizeof(double)*partitionA->size()); std::memset(precisionPartitionA,0,sizeof(double)*partitionA->size()); std::memset(recallPartitionA,0,sizeof(double)*partitionA->size()); std::memset(f1ScorePartitionB,0,sizeof(double)*partitionB->size()); std::memset(precisionPartitionB,0,sizeof(double)*partitionB->size()); std::memset(recallPartitionB,0,sizeof(double)*partitionB->size()); std::cout << "Computing F1Score of partition A" << std::endl; for( unsigned int i = 0; i < partitionA->size(); i++){ std::set<unsigned int>* community = (*partitionA)[i]; std::set<unsigned int> communities; // Selecting candidate communities to compare with. for( auto it = community->begin(); it != community->end(); it++ ) { auto it2 = nodePartitionB.find(*it); if(it2 != nodePartitionB.end()) { for( auto it3 = (*it2).second.begin(); it3 != (*it2).second.end(); it3++ ) { communities.insert(*it3); } } } for( auto it = communities.begin(); it != communities.end(); it++){ std::set<unsigned int>* community2 = (*partitionB)[*it]; double precision; double recall; double f1Score = F1Score(*community,*community2, &precision, &recall ); f1ScorePartitionA[i] = f1Score > f1ScorePartitionA[i] ? f1Score : f1ScorePartitionA[i]; precisionPartitionA[i] = precision > precisionPartitionA[i] ? precision : precisionPartitionA[i]; recallPartitionA[i] = recall > recallPartitionA[i] ? recall : recallPartitionA[i]; } } std::cout << "Computing F1Score of partition B" << std::endl; for( unsigned int i = 0; i < partitionB->size(); i++){ std::set<unsigned int>* community = (*partitionB)[i]; std::set<unsigned int> communities; // Selecting candidate communities to compare with. for( auto it = community->begin(); it != community->end(); it++ ) { auto it2 = nodePartitionA.find(*it); if(it2 != nodePartitionA.end()) { for( auto it3 = (*it2).second.begin(); it3 != (*it2).second.end(); it3++ ) { communities.insert(*it3); } } } for( auto it = communities.begin(); it != communities.end(); it++){ std::set<unsigned int>* community2 = (*partitionA)[*it]; double precision; double recall; double f1Score = F1Score(*community,*community2, &precision, &recall ); f1ScorePartitionB[i] = f1Score > f1ScorePartitionB[i] ? f1Score : f1ScorePartitionB[i]; precisionPartitionB[i] = precision > precisionPartitionB[i] ? precision : precisionPartitionB[i]; recallPartitionB[i] = recall > recallPartitionB[i] ? recall : recallPartitionB[i]; } } std::cout << "Average precision partition A: " << Average(precisionPartitionA, partitionA->size() ) << std::endl; std::cout << "Average recall partition A: " << Average(recallPartitionA, partitionA->size() ) << std::endl; std::cout << "Average precision partition B: " << Average(precisionPartitionB, partitionB->size() ) << std::endl; std::cout << "Average recall partition B: " << Average(recallPartitionB, partitionB->size() ) << std::endl; std::cout << "F1Score: " << (Average( f1ScorePartitionA, partitionA->size() ) + Average( f1ScorePartitionB, partitionB->size() )) / 2 << std::endl; delete [] f1ScorePartitionA; delete [] f1ScorePartitionB; delete [] precisionPartitionA; delete [] precisionPartitionB; delete [] recallPartitionA; delete [] recallPartitionB; return 0; }