Mathematical and Minischeme Appendix

Correspondence between the Time-Dependent Quantities and the Simulator's Agents

At each moment in time, certain amounts of people leave one state and enter another, which is modeled by the rival sharing of these amounts between the corresponding agents. For example, every day a certain number of untraced-susceptible individuals become infected, i.e. enter the first stage of the disease. In the model, this corresponds to subtracting this amount from state `S0`, and adding it to `I01`.

These dependencies are described by a system of 17 first-order ordinary differential equations. For instance,

[1]
describes the change in the number of people in state S0. It tells us that if time is measured in days, then in time dt the number of susceptible-untraced individuals in the society decreases by the value on the right-hand side. A disadvantage of this representation is that it obscures where these people actually go. In order to translate these equations into sharing functions, we have to use a law of conservation of population to infer where population should be added to. Equation
[2]
describes the change in the number of people in state I01. It is similar to equation [1], and tells us by how much the number of infected, untraced individuals in the first stage of the disease changes in the amount of time dt. Positive terms in the right-hand side of the equation tell us the number of people that enter the state, and negative terms - the number of people that leave it.

Note that the first term of equation [1] is a negation of the first term of equation [2]. It equals the number of people that leave state S0, and enter state I01, i.e. the number of susceptible-untraced individuals that become infected in some small unit of time dt. This term is proportional to the number of currently infectious individuals - I3, who are responsible for new infections. It's also proportional to beta - a constant that is defined in "Smallpox Attack," and depends on the number of people that receive the disease from each infectious individual in a day.

Similarly, all the other terms in the 17 differential equations that describe this model can be interpreted as numbers of people leaving one state and entering another. Here are the rest of the equations:

[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]

We translated the above equations into our agent-based computational model. The model has 17 agents, each one corresponding to one of the time-dependent quantities, segments of the population. Two agents are connected as partners if and only if they are "connected" by a term in the differential equations. In other words, they are connected if at every moment in time there are people who travel between the segments of the population that these agents represent.

We chose to represent the exchange between these agents using a Multiple Types Model, in which each agent has a one-dimensional state vector associated with it. We used the state vector to hold the value of the agent's associated population. The Learning Functions for this component of the state vector are set to 0, enforcing conservation of population. All the computational work gets done in the Sharing Functions: for each agent, its sharing function evaluates to the number of people that leave this state to join a particular partner state. Very importantly, we turn on rival sharing, so that each time an agent shares a particular amount with her partner, the same amount is subtracted from her own state vector. Rival sharing would be inappropriate for modeling an exchange of non-rival goods, such as information, but is necessary for modeling an exchange of people under this model.

For example, here is the Sharing Production Function for Agent 0, which corresponds to the quantity S0 above, in the case of trace vaccination (TV). It corresponds almost exactly to equation [1] above.

Agent 0 (S0) sharing production function:
(* (cond (= (getpartnerid) 2)
(* beta (I-3) (self))
(and (= (getpartnerid) 6) (>= (gettime) (/ tau time-step)))
(* (CPRN) (self) r3 (I-3))
1 0)
time-step)

In other words, if the current partner is Agent 2 (state I01), then Agent 0 gives it the amount of population equal to the term shared by their differential equations, as discussed above. Similarly, if the current partner is Agent 6 (Q0), and we've reached the response time for the governmental services, Agent 0 gives some of its population to Agent 6, as some susceptible people are put on the vaccination queue. This corresponds to the second term on the right hand side of equation [1], which is also the first term on the right hand side of equation [5].

In case of mass vaccination (MV), Agent 0's sharing production function looks quite different:

(* (cond (and (= (getpartnerid) 2) (< (gettime) (/ tau time-step)))
(* beta (I-3) (self))
(and (= (getpartnerid) 6) (>= (gettime) (/ tau time-step)))
(/ (self) time-step)
1 0)
time-step)

In the few days between the onset of the infection and the start of vaccination, Agent 0 gives a number of infected individuals to Agent 2, as discussed above. However, in the case of MV, when the vaccination starts, the entire untraced population is transferred onto the vaccination queue, which means that Agent 0 (S0) gives everything to Agent 6.