Example #1
0
////---------------------
/// 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;
}
Example #2
0
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;
}