See
<project-file type=“source”/> <content> #include “node.h” #include <simprocess.h> #include <genrand2.h> #include <iostream>
Node::Node(SimID nodeid, bool has_immunity)
: SimEMIndividual(nodeid, has_immunity?new SimInfectionHistory():NULL)
{
Infected = false;
}
Node::~Node() { }
bool Node::isNeighbor(Node *node) const {
int n = Links.size(), i; for (i = 0; i < n && Links[i]->neighbor() != node; i++); return (i < n);
}
void Node::link(Node *node, float current_time, double contact_rate) {
if (node == NULL || isNeighbor(node) || node == this) return; Link *link = new Link(node, contact_rate); Links.push_back(link); schedule(link); link->updateEvent(current_time); link->neighbor()->checkLink(this, current_time);
}
void Node::unlink(Node *node) {
int n = Links.size(), i; for (i = 0; i < n && Links[i]->neighbor() != node; i++); if (i < n) { delete Links[i]; Links[i] = Links[n - 1]; Links.pop_back(); }
}
void Node::reset() {
int n = Infections.size(), i; for (i = 0; i < n; i++) delete Infections[i]; Infections.clear(); if (ImmuneSystem != NULL) { delete ImmuneSystem; ImmuneSystem = new SimInfectionHistory(); } n = Links.size(); for (i = 0; i < n; i++) Links[i]->updateEvent(SIM_INFINITY); Infected = false;
}
void Node::checkLink(Node *node, float CurrentTime) {
int n = Links.size(), i; for (i = 0; i < n && Links[i]->neighbor() != node; i++); // only wake up if the link is not scheduled if (i < n) Links[i]->updateEvent(CurrentTime);
}
void Node::infectionStateChanged(float CurrentTime, SimInfectionState *State) {
SimEMIndividual::infectionStateChanged(CurrentTime, State); if (infectious() && ! Infected) Infected = true; int n = Links.size(); Link *link; for (int i = 0; i < n; i++) { link = Links[i]; link->updateEvent(CurrentTime); link->neighbor()->checkLink(this, CurrentTime); }
} </content> <use name=“node.h”/>