void MultiplexNetwork::mapIdentity(global_identity gvid, vertex_id lvid, int nid) { if (!containsGlobalIdentity(gvid)) throw ElementNotFoundException("global identity " + std::to_string(gvid)); if (!containsNetwork(nid)) throw ElementNotFoundException("network " + std::to_string(nid)); if (!getNetwork(nid).containsVertex(lvid)) throw ElementNotFoundException("local vertex " + std::to_string(lvid)); if (global_to_local_id[gvid].count(nid)>0) throw DuplicateElementException("global vertex " + std::to_string(gvid) + " in network " + std::to_string(nid)); // We update the references between global and local identifiers global_to_local_id[gvid][nid] = lvid; local_to_global_id[global_vertex_id(lvid,nid)] = gvid; }
simulationStats SIRModel::start(bool enableSeedLayerSelection, network_id seedLayer){ //Resetting clock, queue, initial stats and initial vertexStatus reset(); Random r; //Infecting the seed node and inserting initial events of queue global_vertex_id tmpVert; if(!enableSeedLayerSelection){ tmpVert = seedSelection(); }else{ tmpVert = seedSelection(seedLayer); } network_id randomNetworkID = tmpVert.network; vertex_id randomVertexID = tmpVert.vid; vertexesStatus[randomNetworkID].erase(randomVertexID); stat.S--; stat.SinLayer[randomNetworkID]--; vertexesStatus[randomNetworkID].insert(std::pair<vertex_id,SIRVertexStatus>(randomVertexID,INFECTED)); stat.I++; stat.IinLayer[randomNetworkID]++; queue.push(SIREvent(SPREAD,clock,global_vertex_id(randomVertexID,randomNetworkID))); queue.push(SIREvent(REMOVE,clock+infection_timespan,global_vertex_id(randomVertexID,randomNetworkID))); while(!queue.empty()){ SIREvent imminentEvent = queue.top(); if(imminentEvent.getStartTime() > clock) GatherInfo(); clock = imminentEvent.getStartTime(); if(imminentEvent.getType() == INFECT){ eventHandlerINFECT(imminentEvent); }else if(imminentEvent.getType() == REMOVE){ eventHandlerREMOVE(imminentEvent); }else if(imminentEvent.getType() == SPREAD){ eventHandlerSPREAD(imminentEvent); } queue.pop(); } GatherInfo(); return stat; }
void SIRModel::eventHandlerSPREAD(SIREvent e){ Random r; double tmpRandom = r.getRandomDouble(); if(vertexesStatus[e.getVertexID().network][e.getVertexID().vid] != REMOVED){ //Finding intralayer neighbors std::set<vertex_id> intraNeighs; mnet.getNetwork(e.getVertexID().network).getOutNeighbors(e.getVertexID().vid, intraNeighs); // std::cout << "IntraNeighs: " ; for (std::set<vertex_id>::iterator itNeigh=intraNeighs.begin(); itNeigh!=intraNeighs.end(); ++itNeigh){ // std::cout << *itNeigh; if(vertexesStatus[e.getVertexID().network][*itNeigh] == SUSCEPTIBLE){ if(tmpRandom < intra_diffusion_rate){ queue.push(SIREvent(INFECT,clock+1,global_vertex_id(*itNeigh,e.getVertexID().network))); // std::cout << "I"; } } // std::cout << " "; } // std::cout << "\n" ; // std::cout << "InterNeighs: " ; std::set<global_vertex_id> interNeighs; mnet.getOutInterlayerNeighbors(e.getVertexID(), interNeighs); for (std::set<global_vertex_id>::iterator itNeigh=interNeighs.begin(); itNeigh!=interNeighs.end(); ++itNeigh){ // std::cout << (*itNeigh).vid << "-" << (*itNeigh).network; if(vertexesStatus[(*itNeigh).network][(*itNeigh).vid] == SUSCEPTIBLE){ if(tmpRandom < inter_diffusion_rate){ queue.push(SIREvent(INFECT,clock+1,*itNeigh)); // std::cout << "I"; } } // std::cout << " "; } // std::cout << "\n"; queue.push(SIREvent(SPREAD,clock+1,e.getVertexID())); } }
global_identity MultiplexNetwork::getGlobalIdentity(vertex_id lvid, network_id nid) const { if (!getNetwork(nid).containsVertex(lvid)) throw ElementNotFoundException("local vertex " + std::to_string(lvid) + " in network " + std::to_string(nid)); return local_to_global_id.at(global_vertex_id(lvid,nid)); }
global_vertex_id SIRModel::seedSelection(network_id layer){ Random r; if(!mnet.containsNetwork(layer)) throw ElementNotFoundException("Network ID " + std::to_string(layer)); return global_vertex_id(r.getRandomInt(mnet.getNetwork(layer).getNumVertexes()),layer); }
global_vertex_id SIRModel::seedSelection(){ Random r; network_id randNet = r.getRandomInt(mnet.getNumNetworks()); return global_vertex_id(r.getRandomInt(mnet.getNetwork(randNet).getNumVertexes()),randNet); }