# Abstract Module
###### tags: `others`
[TOC]
## Initializaion Module
- node attribute(person)
- age(int)
- group: $\{community_i, household_i, highschool_i, \ldots \}$(array of int)
- group_day
- group_night
- state(char) + counter(int, cycle)
- 1 day = 2 cycles(day&night)
- location on day(int)
- table lookup
- location on night(int)
- table lookup
- edge attribute(redundant)
- weight
- infectious probability(double)
- tables
- location table
- population generating flow
- load data
- 鄉鎮地區list
- age distribution
- group structure
- community, neighborhood, and so on
- number of people each
- worker info
- % of worker with diff day and night?
- distribution to assign location of day and night?
- contact matrix
- init infectors
- number of people in each 鄉鎮市區
- age?
- for each鄉鎮市區
- 建人數的node
- 根據年齡分布給age
- 根據contact group給group attribute
- 根據contact matrix給contact group內的node建邊
- 鄉鎮市區間的worker
- day night不同的人的比例
- day night分別的位置
- assign state
- initial infectors
- suspected, otherwise
:::spoiler template
```python=
class _base_initialization_module:
def __init__(self, fname):
self.data = load_data()
pass
def load_data(self, fname):
'''
'''
pass
def build_graph(self):
''' Build the graph.
Return: the graph
'''
G = nx.DiGraph()
_assign_attr_in_each_tract(G)
_assign_worker_edge_between_tract(G)
_assign_initial_infectors(G)
return G
def _assign_attr_in_each_tract(self, G):
'''
- 建人數的node
- 根據年齡分布給age
- 根據contact group給group attribute
- 根據contact matrix給contact group內的node建邊
pseudo code:
for tract in tracts:
for contact_group in tract:
K = nx.complete_graph(contact_group.population, nx.DiGraph())
for age, ratio in tracts.ages:
age_population = contact_group.population*ratio
for _ in range(age_population):
K.nodes[cnt]['age'] = age
cnt += 1
'''
pass
def _assign_worker_edge_between_tract(self, G):
'''
- % of worker with diff day and night?
- distribution to assign location of day and night?
'''
pass
def _assign_initial_infectors(self, G):
pass
```
:::
## Simulation Module
- param
- 初始的graph
- simulation
- 天數
- 必要的access function
### Pseudo code of simulation
#### Naive algorithm
```
for each day d:
for each time period p:
for each I individual u:
for each contact group g of u at p:
for each S v in g:
let x be trial among U(0, 1)
let p_uv be contact probability from u to v
if trial of x < p_uv:
update v
```
#### Improved algorithm
- 原理
- naive algorithm
- iterate all candidates
- $u$ 傳給 $v$ 的機率為 $p_{uv}$
- $O(N)$
- Sieve algorithm
- $u$ 傳給 $v$ 的機率為 被選為$K\times$判定成功
- $\frac{K}{N}\times\frac{p_{uv}}{p_{max}}=p_{max}\times\frac{p_{uv}}{p_{max}}=p_{uv}$
- 誤差在$K$要ceiling成整數
- $O(K)=O(p_{max}*N)$
- 需要維護$p_{max}$和$N$
- how?
```python
for each day d:
for each time period p:
for each infectious individual u:
for each contact group g of u at p:
let p_max be max([p_uv for v be S in g])
let N be size([v for v be S in g])
let K be p_max*N
choose K candidates among N
for each v among K:
let x be a trail among U(0, 1)
let p_uv be contact probability from u to v
if trial of x < p_uv/p_max:
update v
```
## Visualization Module
Python Map Visualization libraries
* Plotly
* Folium
```python
```