Ejemplo n.º 1
0
double Community::one_level()
{
	bool improvement = false;
	int nb_pass_done = 0;
	double new_mod = modularity();
	double cur_mod = new_mod;

	// repeat while 
	//   there is an improvement of modularity
	//   or there is an improvement of modularity greater than a given epsilon 
	//   or a predefined number of pass have been done

	do
	{
		cur_mod = new_mod;
		improvement = false;
		nb_pass_done++;

		// for each node: remove the node from its community and insert it in the best community
		for (int node_tmp = 0; node_tmp < g->n; node_tmp++)
		{
			int node = node_tmp;
			int node_comm = n2c[node];

			// computation of all neighboring communities of current node
			map<int, double> ncomm = neigh_comm(node);

			// remove node from its current community
			remove(node, node_comm, ncomm[node_comm]);

			// compute the nearest community for node
			// default choice for future insertion is the former community
			int best_comm = node_comm;
			double best_nblinks = 0;
			double best_increase = 0;
			for (auto iter = ncomm.begin(); iter != ncomm.end(); iter++)
			{
				int new_comm = (*iter).first;
				double increase = gain_modularity(node, new_comm, ncomm[new_comm]);
				if (increase > best_increase + 1e-8)
				{
					best_comm = new_comm;
					best_nblinks = ncomm[new_comm];
					best_increase = increase;
				}
			}

			insert(node, best_comm, best_nblinks);

			if (best_comm != node_comm)
				improvement = true;
		}

		new_mod = modularity();
		//cerr << "pass number " << nb_pass_done << " of " << nb_pass << " : " << new_mod << " " << cur_mod << endl;
	} 
	while (improvement && new_mod - cur_mod > 1e-6);

	return new_mod;
}
double CommunitySpace::fast_unfolding_step(double epsilon_modularity, int lambda) {
    int iterations = 0;
    int actual_group;
    int best_community, best_nblinks;
    double best_increase, increase;
    bool improvement = false;
    double q = modularity();
    double actual_modularity = q;
    //cout << "Initial modularity: " << q << endl;
    do {
        actual_modularity = q;
        improvement = false;
        //First, go througout the nodes and change their groups
        Iterator<node>*nodes = theGraph->getNodes();
        map<int, int>::iterator it;
        while (nodes->hasNext()) {
            //The actual node
            node actual = nodes->next();
            actual_group = groups[actual.id];
            map<int, int> neighs_communities = neighbor_communities(actual);
            //Remove the node from its community
            remove_node(actual, actual_group, neighs_communities[actual_group]);
            //Actual state
            best_community = actual_group;
            best_nblinks = neighs_communities[actual_group];
            best_increase = 0;
            increase = 0;
            //Search through the neighbors
            for (it = neighs_communities.begin(); it != neighs_communities.end(); it++) {
                int neigh_community = 0;
                neigh_community = (*it).first;
                int nb_links = neighs_communities[neigh_community];
                increase = modularity_gain(actual, neigh_community, nb_links);
                if (increase > best_increase) {
                    best_increase = increase;
                    best_nblinks = nb_links;
                    best_community = neigh_community;
                }
            }
            //Now, move actual node to the community of each neighbor
            insert_node(actual, best_community, best_nblinks);
            if (best_community != actual_group) {
                improvement = true;
            }
            q = modularity();
        }
        q = modularity();
        iterations++;
        delete nodes;
    } while (improvement && q - actual_modularity > epsilon_modularity && iterations < lambda);
     //cout << "Step modularity " << q << endl;
    //q va a tener la mejor modularidad
    return q;
}
double CommunitySpace::execute_fast_unfolding(double epsilon_modularity, int lambda_step, int lambda_local) {
    int counter = 0;
    double actual_q = modularity();
    //long start_time,end_time;
    //start_time = clock();
    double q = fast_unfolding_step(epsilon_modularity, lambda_step);
    //end_time = clock();
    //cout << "The first step took "<< (float)(end_time-start_time)/(float)CLOCKS_PER_SEC << " seconds.\n";
    while (q - actual_q > epsilon_modularity && counter < lambda_local) {
        //Convert the partition to meta nodes and meta-edges
        //start_time = clock();
        compressTheGraph();
        //end_time = clock();
        //cout << "Compressing the graph took "<< (float)(end_time-start_time)/(float)CLOCKS_PER_SEC << " seconds.\n";
        //Redo the fast unfolding step with the new graph
        actual_q = q;
        //start_time = clock();
        q = fast_unfolding_step(epsilon_modularity, lambda_step);
        //end_time = clock();
        //cout << "Pass " << counter <<" took "<< (float)(end_time-start_time)/(float)CLOCKS_PER_SEC << " seconds.\n";
        counter++;
    }
    return q;
}
void testModularity() {

	// We need to read the network from a file: testIO() must have been passed
	log("TESTING measures");
	log("Reading the network...",false);
	// Creating an empty multiple network and initializing it
	MultipleNetwork mnet_toy;
	mnet_read_edgelist(mnet_toy, "test/toy.mnet");
	mnet_toy.getNetwork("l1")->addVertex("U4");
	mnet_toy.map("U4","U4","l1");

	MultipleNetwork mnet0;
	//mnet_read_edgelist(mnet, "test/toy.mnet");
	mnet_read_edgelist(mnet0, "/Users/matteomagnani/Dropbox/Research/13NetworkScience/code/fig6b.mnet");
	mnet0.getNetwork("l1")->addVertex("v8");
	mnet0.map("v8","v8","l1");
	mnet0.getNetwork("l3")->addVertex("v8");
	mnet0.map("v8","v8","l3");
	MultipleNetwork mnet;
	//mnet_read_edgelist(mnet, "test/toy.mnet");
	mnet_read_edgelist(mnet, "/Users/matteomagnani/Dropbox/Research/13NetworkScience/code/fig6b.mnet");
	mnet.getNetwork("l1")->addVertex("v8");
	mnet.map("v8","v8","l1");
	mnet.getNetwork("l3")->addVertex("v8");
	mnet.map("v8","v8","l3");

	log("done!");

	log("Computing modularity...");
	std::map<network_id,std::map<vertex_id,long> > groups_toy, groups1, groups2, groups3, groups4;

	groups_toy[0][0]=0;
	groups_toy[0][1]=0;
	groups_toy[0][2]=0;
	groups_toy[0][3]=1;
	groups_toy[0][4]=1;
	groups_toy[1][1]=1;
	groups_toy[1][3]=1;
	groups_toy[1][4]=1;

	groups1[0][0]=0;
	groups1[0][1]=0;
	groups1[0][2]=0;
	groups1[0][3]=1;
	groups1[0][4]=1;
	groups1[0][6]=1;
	groups1[0][7]=1;
	groups1[1][0]=0;
	groups1[1][1]=0;
	groups1[1][2]=0;
	groups1[1][3]=1;
	groups1[1][4]=1;
	groups1[1][5]=1;
	groups1[1][6]=1;
	groups1[1][7]=1;
	groups1[2][0]=0;
	groups1[2][1]=0;
	groups1[2][2]=0;
	groups1[2][3]=1;
	groups1[2][4]=1;
	groups1[2][5]=1;
	groups1[2][6]=1;
	groups1[2][7]=1;

	groups2[0][0]=0;
	groups2[0][1]=0;
	groups2[0][2]=0;
	groups2[0][3]=1;
	groups2[0][4]=0;
	groups2[0][6]=1;
	groups2[0][7]=1;
	groups2[1][0]=0;
	groups2[1][1]=0;
	groups2[1][2]=0;
	groups2[1][3]=1;
	groups2[1][4]=1;
	groups2[1][5]=1;
	groups2[1][6]=1;
	groups2[1][7]=1;
	groups2[2][0]=0;
	groups2[2][1]=0;
	groups2[2][2]=0;
	groups2[2][3]=0;
	groups2[2][4]=1;
	groups2[2][5]=1;
	groups2[2][6]=1;
	groups2[2][7]=1;

	groups3[0][0]=0;
	groups3[0][1]=1;
	groups3[0][2]=0;
	groups3[0][3]=1;
	groups3[0][4]=0;
	groups3[0][6]=0;
	groups3[0][7]=1;
	groups3[1][0]=0;
	groups3[1][1]=1;
	groups3[1][2]=0;
	groups3[1][3]=1;
	groups3[1][4]=0;
	groups3[1][5]=1;
	groups3[1][6]=0;
	groups3[1][7]=1;
	groups3[2][0]=0;
	groups3[2][1]=1;
	groups3[2][2]=0;
	groups3[2][3]=1;
	groups3[2][4]=0;
	groups3[2][5]=1;
	groups3[2][6]=0;
	groups3[2][7]=1;

	groups4[0][0]=0;
	groups4[0][1]=1;
	groups4[0][2]=0;
	groups4[0][3]=1;
	groups4[0][4]=0;
	groups4[0][6]=0;
	groups4[0][7]=1;
	groups4[1][0]=1;
	groups4[1][1]=0;
	groups4[1][2]=1;
	groups4[1][3]=0;
	groups4[1][4]=1;
	groups4[1][5]=0;
	groups4[1][6]=1;
	groups4[1][7]=0;
	groups4[2][0]=0;
	groups4[2][1]=1;
	groups4[2][2]=0;
	groups4[2][3]=1;
	groups4[2][4]=0;
	groups4[2][5]=1;
	groups4[2][6]=0;
	groups4[2][7]=1;

	double mod = modularity(mnet_toy,groups_toy,1);
	log(std::to_string(mod) + " ",false);
	log("done 1 - toy!");


	log("GR1!");
	mod = modularity(mnet0,groups1,0);
	log(std::to_string(mod) + " ",false);
	log("done 0!");
	mod = modularity(mnet0,groups1,.5);
	log(std::to_string(mod) + " ",false);
	log("done .5!");
	mod = modularity(mnet0,groups1,1);
	log(std::to_string(mod) + " ",false);
	log("done 1!");
	log("GR2!");
	mod = modularity(mnet,groups2,0);
	log(std::to_string(mod) + " ",false);
	log("done 0!");
	mod = modularity(mnet,groups2,.5);
	log(std::to_string(mod) + " ",false);
	log("done .5!");
	mod = modularity(mnet,groups2,1);
	log(std::to_string(mod) + " ",false);
	log("done 1!");
	log("GR3!");
	mod = modularity(mnet,groups3,0);
	log(std::to_string(mod) + " ",false);
	log("done 0!");
	mod = modularity(mnet,groups3,.5);
	log(std::to_string(mod) + " ",false);
	log("done .5!");
	mod = modularity(mnet,groups3,1);
	log(std::to_string(mod) + " ",false);
	log("done 1!");
	log("GR4!");
	mod = modularity(mnet,groups4,0);
	log(std::to_string(mod) + " ",false);
	log("done 0!");
	mod = modularity(mnet,groups4,.5);
	log(std::to_string(mod) + " ",false);
	log("done .5!");
	mod = modularity(mnet,groups4,1);
	log(std::to_string(mod) + " ",false);
	log("done 1!");

	log("TEST SUCCESSFULLY COMPLETED (modularity)");
}