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); } */ }
// 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)); } }
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; }