Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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()));
	}
}
Example #4
0
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));
}
Example #5
0
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);
}
Example #6
0
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);
}