void BAEvolutionModel::evolution_step(MultilayerNetwork& mnet, network_id net) {

	Random rand;

	std::set<intralayer_edge_id> universe;
	mnet.getVertexes(universe);
	std::set<intralayer_edge_id> choice;
	rand.getKElements(universe,choice,1);
	intralayer_edge_id new_global_vertex = *choice.begin();

	std::cout << "BA add " << new_global_vertex << std::endl;

    // Randomly select m nodes with probability proportional to their degree

	/*
	set<vertex_id> target_nodes;
	ba_choice(mnet->getNetwork(net),num_of_neighbors,target_nodes);

	// Add a new node to this network, taken from the Universe
	vertex_id new_vertex = mnet.getNetwork(net)->addVertex();
	mnet.map(global_vertex,new_vertex,net);
	//mnet->

	for (set<vertex_id>::iterator node=target_nodes.begin(); node!=target_nodes.end(); ++node) {
		mnet.getNetwork(layer)->addEdge(new_vertex,*node);
	}
	*/
}
예제 #2
0
// Only for named networks
void flatten(MultilayerNetwork& mnet, MNET_FLATTENING_ALGORITHM algorithm,
		Network& net) {

	std::set<intralayer_edge_id> vertexes;
	mnet.getVertexes(vertexes);
	std::set<intralayer_edge_id>::const_iterator v_it;
	for (v_it = vertexes.begin(); v_it != vertexes.end(); ++v_it) {
		net.addVertex(mnet.getVertexName(*v_it));
	}

	std::set<intralayer_edge_id> edges;
	mnet.getEdges(edges);
	std::set<intralayer_edge_id>::const_iterator e_it;
	for (e_it = edges.begin(); e_it != edges.end(); ++e_it) {
		if (! net.containsEdge(mnet.getVertexName((*e_it).v1),mnet.getVertexName((*e_it).v2)))
			net.addEdge(mnet.getVertexName((*e_it).v1),mnet.getVertexName((*e_it).v2));
	}
}
예제 #3
0
double modularity(MultilayerNetwork& mnet,
		 std::map<network_id,std::map<vertex_id,long> >& groups, double c) {
	double res = 0;
	double mu2 = 0;
	std::set<network_id> networks;
	mnet.getNetworks(networks);
	std::set<network_id>::iterator network_iterator;
	for (network_iterator=networks.begin(); network_iterator!=networks.end(); network_iterator++) {
		network_id net = *network_iterator;
		double m_net = 2*mnet.getNetwork(net)->getNumEdges();
		mu2 += m_net;
		// FIX TO THE ORIGINAL EQUATION WHEN THERE ARE NO EDGES
		if (m_net == 0)
			continue;
		std::set<vertex_id> vertexes;
		mnet.getNetwork(net)->getVertexes(vertexes);
		for (std::set<vertex_id>::iterator v_i = vertexes.begin();
				v_i != vertexes.end(); v_i++) {
			for (std::set<vertex_id>::iterator v_j = vertexes.begin();
					v_j != vertexes.end(); v_j++) {
				// if (*v_i==*v_j) continue; SEEMS REASONABLE, BUT NOT IN DEFINITION...
				vertex_id global_v_i = mnet.getGlobalVertexId(*v_i, net);
				vertex_id global_v_j = mnet.getGlobalVertexId(*v_j, net);
				//std::cout << global_v_i << " " << global_v_j << std::endl;

				if (groups[net][global_v_i] == groups[net][global_v_j]) {
					//std::cout << "Same group!" << std::endl;
					//if (mnet.getNetwork(net)->containsEdge(*v_i,*v_j))
					//	std::cout << "Edge" << std::endl;
					long k_i = degree(mnet, global_v_i, net);
					long k_j = degree(mnet, global_v_j, net);
					int a_ij =
							mnet.getNetwork(net)->containsEdge(
									*v_i,
									*v_j) ? 1.0 : 0.0;
					res += a_ij - k_i * k_j / (2 * m_net);
					//std::cout << global_v_i << " " << global_v_j << " " << (a_ij - k_i * k_j / (2 * m_net)) << std::endl;
					//std::cout << "->" << res << std::endl;
				}
			}
		}
		std::cout << "->" << m_net << std::endl;
	}

	double mod = res;

	std::set<network_id>::iterator network_iterator1, network_iterator2;
	std::set<vertex_id>::iterator vertex_iterator;
	std::set<vertex_id> vertexes;
	mnet.getVertexes(vertexes);
	for (network_iterator1=networks.begin(); network_iterator1!=networks.end(); ++network_iterator1) {
		network_id net1 = *network_iterator1;
		for (network_iterator2=networks.begin(); network_iterator2!=networks.end(); ++network_iterator2) {
			network_id net2 = *network_iterator2;
			if (net1==net2) continue;
			for (vertex_iterator=vertexes.begin(); vertex_iterator!=vertexes.end(); ++vertex_iterator) {
				 vertex_id v = *vertex_iterator;
				 if (mnet.containsVertex(v,net1) &&
					mnet.containsVertex(v,net2)) {
					 mu2+=c;
					if (groups[net1][v] == groups[net2][v]) {
					 	 res += c; // or omega
			 	}
				 }
			}
		}
	}

	std::cout << "->" << mod << " " << (res-mod) << "-" << mu2 << std::endl;

	return 1 / (mu2) * res;
}