rgraphum 0.0.1.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +26 -0
- data/GLOSSARIES.md +108 -0
- data/GREMLIN.md +1398 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +136 -0
- data/Rakefile +16 -0
- data/bin/.irbrc +41 -0
- data/bin/rgraphum_console +61 -0
- data/bin/rgraphum_runner +57 -0
- data/examples/ba_model/make.rb +19 -0
- data/examples/ba_model/make_dummy_twitter_rt_data.rb +0 -0
- data/examples/basic/check_modularity.rb +27 -0
- data/examples/basic/make_graph.rb +12 -0
- data/examples/parser/dot.rb +28 -0
- data/examples/sis_model/lifegame.rb +161 -0
- data/graph_struct.jpg +0 -0
- data/lib/rgraphum/analyzer/linear_regression.rb +31 -0
- data/lib/rgraphum/analyzer/meme_tracker.rb +296 -0
- data/lib/rgraphum/analyzer/twitter/rt_at_mark.rb +45 -0
- data/lib/rgraphum/analyzer.rb +8 -0
- data/lib/rgraphum/cluster.rb +67 -0
- data/lib/rgraphum/communities.rb +65 -0
- data/lib/rgraphum/community.rb +86 -0
- data/lib/rgraphum/cosine_similarity_matrix.rb +40 -0
- data/lib/rgraphum/edge.rb +194 -0
- data/lib/rgraphum/edges.rb +161 -0
- data/lib/rgraphum/ext/cosine_similarity_matrix.rb +79 -0
- data/lib/rgraphum/ext/linear_regression.rb +22 -0
- data/lib/rgraphum/ext/tf_idf.rb +52 -0
- data/lib/rgraphum/graph/gremlin.rb +193 -0
- data/lib/rgraphum/graph/math/clustering_coefficient.rb +53 -0
- data/lib/rgraphum/graph/math/community_detection.rb +141 -0
- data/lib/rgraphum/graph/math/degree_distribution.rb +50 -0
- data/lib/rgraphum/graph/math/dijkstra.rb +331 -0
- data/lib/rgraphum/graph/math.rb +45 -0
- data/lib/rgraphum/graph.rb +267 -0
- data/lib/rgraphum/importer.rb +97 -0
- data/lib/rgraphum/marshal.rb +26 -0
- data/lib/rgraphum/motifs.rb +8 -0
- data/lib/rgraphum/parsers/flare.rb +42 -0
- data/lib/rgraphum/parsers/gephi.rb +193 -0
- data/lib/rgraphum/parsers/graphviz.rb +78 -0
- data/lib/rgraphum/parsers/miserables.rb +54 -0
- data/lib/rgraphum/parsers.rb +32 -0
- data/lib/rgraphum/path.rb +37 -0
- data/lib/rgraphum/query.rb +130 -0
- data/lib/rgraphum/rgraphum_array.rb +159 -0
- data/lib/rgraphum/rgraphum_array_dividers.rb +43 -0
- data/lib/rgraphum/rgraphum_random.rb +5 -0
- data/lib/rgraphum/simulator/ba_model.rb +140 -0
- data/lib/rgraphum/simulator/sir_model.rb +178 -0
- data/lib/rgraphum/simulator/sis_model.rb +158 -0
- data/lib/rgraphum/simulator.rb +29 -0
- data/lib/rgraphum/statistic/power_law.rb +9 -0
- data/lib/rgraphum/t.rb +12 -0
- data/lib/rgraphum/tf_idf.rb +27 -0
- data/lib/rgraphum/version.rb +3 -0
- data/lib/rgraphum/vertex.rb +354 -0
- data/lib/rgraphum/vertices.rb +97 -0
- data/lib/rgraphum.rb +38 -0
- data/performance/add-vertices-edges.rb +20 -0
- data/performance/add-vertices.rb +12 -0
- data/performance/build-graph.rb +19 -0
- data/performance/delete-graph.rb +24 -0
- data/performance/delete-vertices.rb +25 -0
- data/performance/refer-graph.rb +23 -0
- data/rgraphum.gemspec +30 -0
- data/test/lib/rgraphum/analyzer/linear_regression_test.rb +20 -0
- data/test/lib/rgraphum/analyzer/meme_tracker_test.rb +383 -0
- data/test/lib/rgraphum/analyzer/twitter/rt_at_mark_test.rb +120 -0
- data/test/lib/rgraphum/array_test.rb +95 -0
- data/test/lib/rgraphum/bubble_test.rb +7 -0
- data/test/lib/rgraphum/communities_test.rb +53 -0
- data/test/lib/rgraphum/cosine_similarity_test.rb +18 -0
- data/test/lib/rgraphum/edge_test.rb +89 -0
- data/test/lib/rgraphum/edges_test.rb +178 -0
- data/test/lib/rgraphum/graph_builder_test.rb +64 -0
- data/test/lib/rgraphum/graph_dup_test.rb +199 -0
- data/test/lib/rgraphum/graph_plus_test.rb +80 -0
- data/test/lib/rgraphum/graph_test.rb +512 -0
- data/test/lib/rgraphum/gremlin_test.rb +145 -0
- data/test/lib/rgraphum/importers/idg_json_edges.json +20 -0
- data/test/lib/rgraphum/importers/idg_json_test.rb +207 -0
- data/test/lib/rgraphum/importers/idg_json_vertices.json +46 -0
- data/test/lib/rgraphum/math/average_distance_matrix_test.rb +142 -0
- data/test/lib/rgraphum/math/clustering_coefficient_test.rb +219 -0
- data/test/lib/rgraphum/math/community_test.rb +78 -0
- data/test/lib/rgraphum/math/degree_distribution_test.rb +40 -0
- data/test/lib/rgraphum/math/dijkstra_test.rb +146 -0
- data/test/lib/rgraphum/math/modularity_test.rb +154 -0
- data/test/lib/rgraphum/math/quick_average_distance_matrix_test.rb +84 -0
- data/test/lib/rgraphum/path_test.rb +44 -0
- data/test/lib/rgraphum/query/enumerable_test.rb +42 -0
- data/test/lib/rgraphum/query/where_operators_test.rb +75 -0
- data/test/lib/rgraphum/query/where_test.rb +59 -0
- data/test/lib/rgraphum/simulator/ba_model_test.rb +75 -0
- data/test/lib/rgraphum/simulator/sir_model_test.rb +513 -0
- data/test/lib/rgraphum/simulator/sis_model_test.rb +478 -0
- data/test/lib/rgraphum/simulator_test.rb +22 -0
- data/test/lib/rgraphum/tf_idf_test.rb +30 -0
- data/test/lib/rgraphum/vertex_test.rb +50 -0
- data/test/lib/rgraphum/vertices_test.rb +180 -0
- data/test/test_helper.rb +98 -0
- data/tmp/.gitkeep +0 -0
- metadata +254 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
require 'rgraphum'
|
|
5
|
+
|
|
6
|
+
class BAModelTest < MiniTest::Test
|
|
7
|
+
def setup
|
|
8
|
+
make_graph
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_simurate
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_edges_per_min
|
|
16
|
+
# 99 * 99 * 20 - 20 = 196_000 sec
|
|
17
|
+
# 196_000 / 60 min
|
|
18
|
+
ba = Rgraphum::Simulator::BAModel.new
|
|
19
|
+
assert_equal 99 / ( 196_000 / 60.0 ) , ba.edges_per_min(@graph)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_vertices_per_min
|
|
23
|
+
# 99 * 99 * 20 = 196_020 sec
|
|
24
|
+
# 196_020 / 60 = 3_267 min
|
|
25
|
+
ba = Rgraphum::Simulator::BAModel.new
|
|
26
|
+
assert_equal 100.0 / 3_267 , ba.vertices_per_min(@graph)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_edges_size_array_per_interval
|
|
30
|
+
ba = Rgraphum::Simulator::BAModel.new
|
|
31
|
+
|
|
32
|
+
mini_graph = Rgraphum::Graph.new
|
|
33
|
+
base_time = ( Time.now.to_i / 60 ) * 60
|
|
34
|
+
mini_graph.vertices = [ {id: 1,start: Time.now},{id: 2,start: Time.now},{id: 3,start: Time.now}]
|
|
35
|
+
mini_graph.edges = [ {id: 1,start: base_time + 30, source: 1,target: 2 },
|
|
36
|
+
{id: 2,start: base_time + 90, source: 2,target: 3 },
|
|
37
|
+
{id: 3,start: base_time + 60 * 2, source: 3,target: 1 } ]
|
|
38
|
+
|
|
39
|
+
array = ba.edges_size_array_per_interval( mini_graph, 1 )
|
|
40
|
+
assert_equal [1,1,1], array
|
|
41
|
+
|
|
42
|
+
mini_graph.edges.delete(3)
|
|
43
|
+
array = ba.edges_size_array_per_interval( mini_graph, 1 )
|
|
44
|
+
assert_equal [1,1], array
|
|
45
|
+
|
|
46
|
+
array = ba.edges_size_array_per_interval( @graph, 1 )
|
|
47
|
+
|
|
48
|
+
assert_equal 3268, array.size
|
|
49
|
+
assert_equal 99, array.inject(:+)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
def make_graph
|
|
54
|
+
today = Time.at( ( Time.now.to_i/ ( 3600 * 24 ) ) * 3600 * 24 - Time.now.utc_offset )
|
|
55
|
+
|
|
56
|
+
@graph = Rgraphum::Graph.new
|
|
57
|
+
|
|
58
|
+
vertices = 100.times.map do |t|
|
|
59
|
+
{id: t, label: t.to_s, start: today + 20 * t * t }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
@graph.vertices = vertices
|
|
63
|
+
|
|
64
|
+
edges = @graph.vertices.map do |vertex|
|
|
65
|
+
{id: vertex.id,source: @graph.vertices[0], target: vertex, start: vertex.start, weight: 1}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
@graph.edges = edges
|
|
69
|
+
|
|
70
|
+
@graph.edges.delete(0)
|
|
71
|
+
|
|
72
|
+
@graph
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
require 'rgraphum'
|
|
5
|
+
|
|
6
|
+
class SIRModelTest < MiniTest::Test
|
|
7
|
+
def setup
|
|
8
|
+
# A -- B -- C
|
|
9
|
+
# | | |
|
|
10
|
+
# D -- E -- F
|
|
11
|
+
# | | |
|
|
12
|
+
# G -- H -- I
|
|
13
|
+
v = {}
|
|
14
|
+
@graph = Rgraphum::Graph.new
|
|
15
|
+
v[:a] = @graph.vertices.build(label: "A")
|
|
16
|
+
v[:b] = @graph.vertices.build(label: "B")
|
|
17
|
+
v[:c] = @graph.vertices.build(label: "C")
|
|
18
|
+
v[:d] = @graph.vertices.build(label: "D")
|
|
19
|
+
v[:e] = @graph.vertices.build(label: "E")
|
|
20
|
+
v[:f] = @graph.vertices.build(label: "F")
|
|
21
|
+
v[:g] = @graph.vertices.build(label: "G")
|
|
22
|
+
v[:h] = @graph.vertices.build(label: "H")
|
|
23
|
+
v[:i] = @graph.vertices.build(label: "I")
|
|
24
|
+
|
|
25
|
+
@graph.edges.build(source: v[:a], target: v[:b])
|
|
26
|
+
@graph.edges.build(source: v[:b], target: v[:c])
|
|
27
|
+
@graph.edges.build(source: v[:a], target: v[:d])
|
|
28
|
+
@graph.edges.build(source: v[:b], target: v[:e])
|
|
29
|
+
@graph.edges.build(source: v[:c], target: v[:f])
|
|
30
|
+
@graph.edges.build(source: v[:d], target: v[:e])
|
|
31
|
+
@graph.edges.build(source: v[:e], target: v[:f])
|
|
32
|
+
@graph.edges.build(source: v[:d], target: v[:g])
|
|
33
|
+
@graph.edges.build(source: v[:e], target: v[:h])
|
|
34
|
+
@graph.edges.build(source: v[:f], target: v[:i])
|
|
35
|
+
@graph.edges.build(source: v[:g], target: v[:h])
|
|
36
|
+
@graph.edges.build(source: v[:h], target: v[:i])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_initial_sir_map
|
|
40
|
+
sir = Rgraphum::Simulator::SIRModel.new(graph: @graph)
|
|
41
|
+
|
|
42
|
+
assert_equal %w(A B C D E F G H I), sir.vertices.map(&:label)
|
|
43
|
+
assert_equal %w(s s s s s s s s s).map(&:to_sym), sir.sir_map
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_set_sir_map
|
|
47
|
+
sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
48
|
+
sir = Rgraphum::Simulator::SIRModel.new(graph: @graph, sir_map: sir_map)
|
|
49
|
+
|
|
50
|
+
assert_equal %w(A B C D E F G H I), sir.vertices.map(&:label)
|
|
51
|
+
assert_equal %w(s i s i s i s i s).map(&:to_sym), sir.sir_map
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_infection_rate
|
|
55
|
+
sir = Rgraphum::Simulator::SIRModel.new(graph: @graph, infection_rate: 0.5)
|
|
56
|
+
assert_equal 0.5, sir.infection_rate
|
|
57
|
+
|
|
58
|
+
assert_raises(ArgumentError) do
|
|
59
|
+
Rgraphum::Simulator::SIRModel.new(graph: @graph, infection_rate: -0.1)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
assert_raises(ArgumentError) do
|
|
63
|
+
Rgraphum::Simulator::SIRModel.new(graph: @graph, infection_rate: 1.1)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_recovery_rate
|
|
68
|
+
sir = Rgraphum::Simulator::SIRModel.new(graph: @graph, recovery_rate: 0.5)
|
|
69
|
+
assert_equal 0.5, sir.recovery_rate
|
|
70
|
+
|
|
71
|
+
assert_raises(ArgumentError) do
|
|
72
|
+
Rgraphum::Simulator::SIRModel.new(graph: @graph, recovery_rate: -0.1)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
assert_raises(ArgumentError) do
|
|
76
|
+
Rgraphum::Simulator::SIRModel.new(graph: @graph, recovery_rate: 1.1)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_zero_periods_simulate
|
|
81
|
+
initial_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
82
|
+
sir = Rgraphum::Simulator::SIRModel.new(graph: @graph, sir_map: initial_sir_map)
|
|
83
|
+
|
|
84
|
+
sir.simulate periods: 0
|
|
85
|
+
|
|
86
|
+
expected_sir_map = initial_sir_map
|
|
87
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_infected_1?
|
|
91
|
+
# A -- B -- C S -- I -- S
|
|
92
|
+
# | | | | | |
|
|
93
|
+
# D -- E -- F I -- S -- I
|
|
94
|
+
# | | | | | |
|
|
95
|
+
# G -- H -- I S -- I -- S
|
|
96
|
+
options = {
|
|
97
|
+
graph: @graph,
|
|
98
|
+
sir_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
99
|
+
infection_rate: 1.0,
|
|
100
|
+
recovery_rate: 0.0,
|
|
101
|
+
}
|
|
102
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
103
|
+
|
|
104
|
+
v1 = sir.vertices[0]
|
|
105
|
+
assert_equal false, sir.infected?(v1)
|
|
106
|
+
assert_equal false, sir.infected?(v1, 0)
|
|
107
|
+
assert_equal true, sir.infected?(v1, 1)
|
|
108
|
+
|
|
109
|
+
v2 = sir.vertices[1]
|
|
110
|
+
assert_equal true, sir.infected?(v2)
|
|
111
|
+
assert_equal true, sir.infected?(v2, 0)
|
|
112
|
+
assert_equal true, sir.infected?(v2, 1)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def test_infected_2?
|
|
116
|
+
# A -- B -- C S -- I -- S
|
|
117
|
+
# | | | | | |
|
|
118
|
+
# D -- E -- F I -- S -- I
|
|
119
|
+
# | | | | | |
|
|
120
|
+
# G -- H -- I S -- I -- S
|
|
121
|
+
options = {
|
|
122
|
+
graph: @graph,
|
|
123
|
+
sir_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
124
|
+
infection_rate: 0.1,
|
|
125
|
+
recovery_rate: 0.0,
|
|
126
|
+
t_per_period: 0.5,
|
|
127
|
+
}
|
|
128
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
129
|
+
|
|
130
|
+
v1 = sir.vertices[0]
|
|
131
|
+
assert_equal false, sir.infected?(v1, 0)
|
|
132
|
+
assert_equal false, sir.infected?(v1, 1)
|
|
133
|
+
assert_equal false, sir.infected?(v1, 2)
|
|
134
|
+
assert_equal false, sir.infected?(v1, 3)
|
|
135
|
+
assert_equal false, sir.infected?(v1, 9)
|
|
136
|
+
assert_equal true, sir.infected?(v1, 10)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_recovered?
|
|
140
|
+
# A -- B -- C I -- I -- I
|
|
141
|
+
# | | | | | |
|
|
142
|
+
# D -- E -- F I -- I -- I
|
|
143
|
+
# | | | | | |
|
|
144
|
+
# G -- H -- I I -- I -- I
|
|
145
|
+
options = {
|
|
146
|
+
graph: @graph,
|
|
147
|
+
sir_map: [:i, :i, :i, :i, :i, :i, :i, :i, :i],
|
|
148
|
+
infection_rate: 0.0,
|
|
149
|
+
recovery_rate: 1.0,
|
|
150
|
+
}
|
|
151
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
152
|
+
|
|
153
|
+
v1 = sir.vertices[0]
|
|
154
|
+
assert_equal false, sir.recovered?(v1)
|
|
155
|
+
assert_equal false, sir.recovered?(v1, 0)
|
|
156
|
+
assert_equal true, sir.recovered?(v1, 1)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# def test_susceptible?
|
|
160
|
+
# # A -- B -- C S -- I -- I
|
|
161
|
+
# # | | | | | |
|
|
162
|
+
# # D -- E -- F I -- I -- I
|
|
163
|
+
# # | | | | | |
|
|
164
|
+
# # G -- H -- I I -- I -- I
|
|
165
|
+
# options = {
|
|
166
|
+
# graph: @graph,
|
|
167
|
+
# sir_map: [:s, :i, :i, :i, :i, :i, :i, :i, :i],
|
|
168
|
+
# infection_rate: 1.0,
|
|
169
|
+
# recovery_rate: 0.0,
|
|
170
|
+
# }
|
|
171
|
+
# sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
172
|
+
|
|
173
|
+
# v1 = sir.vertices[0]
|
|
174
|
+
# assert_equal true, sir.susceptible?(v1)
|
|
175
|
+
# assert_equal true, sir.susceptible?(v1, 0)
|
|
176
|
+
# assert_equal false, sir.susceptible?(v1, 1)
|
|
177
|
+
|
|
178
|
+
# v2 = sir.vertices[1]
|
|
179
|
+
# assert_equal false, sir.susceptible?(v2)
|
|
180
|
+
# assert_equal false, sir.susceptible?(v2, 0)
|
|
181
|
+
# assert_equal false, sir.susceptible?(v2, 1)
|
|
182
|
+
# end
|
|
183
|
+
|
|
184
|
+
def test_next_period_only_with_infection_rate
|
|
185
|
+
# A -- B -- C S -- I -- S
|
|
186
|
+
# | | | | | |
|
|
187
|
+
# D -- E -- F I -- S -- I
|
|
188
|
+
# | | | | | |
|
|
189
|
+
# G -- H -- I S -- I -- S
|
|
190
|
+
options = {
|
|
191
|
+
graph: @graph,
|
|
192
|
+
sir_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
193
|
+
infection_rate: 0.2,
|
|
194
|
+
recovery_rate: 0.0,
|
|
195
|
+
t_per_period: 1,
|
|
196
|
+
}
|
|
197
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
198
|
+
|
|
199
|
+
# initial state
|
|
200
|
+
# A -- B -- C S -- I -- S 0 I 0
|
|
201
|
+
# | | | | | |
|
|
202
|
+
# D -- E -- F I -- S -- I I 0 I
|
|
203
|
+
# | | | | | |
|
|
204
|
+
# G -- H -- I S -- I -- S 0 I 0
|
|
205
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
206
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
207
|
+
|
|
208
|
+
# 1st period
|
|
209
|
+
# A -- B -- C S -- I -- S 0.4 I 0.4
|
|
210
|
+
# | | | | | |
|
|
211
|
+
# D -- E -- F I -- S -- I I 0.8 I
|
|
212
|
+
# | | | | | |
|
|
213
|
+
# G -- H -- I S -- I -- S 0.4 I 0.4
|
|
214
|
+
sir.next_period
|
|
215
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
216
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
217
|
+
|
|
218
|
+
# 2nd period
|
|
219
|
+
# A -- B -- C S -- I -- S 0.8 I 0.8
|
|
220
|
+
# | | | | | |
|
|
221
|
+
# D -- E -- F I -- S -- I I I I
|
|
222
|
+
# | | | | | |
|
|
223
|
+
# G -- H -- I S -- I -- S 0.8 I 0.8
|
|
224
|
+
sir.next_period
|
|
225
|
+
expected_sir_map = [:s, :i, :s, :i, :i, :i, :s, :i, :s]
|
|
226
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should change"
|
|
227
|
+
|
|
228
|
+
# 3rd period
|
|
229
|
+
# A -- B -- C S -- I -- S I I I
|
|
230
|
+
# | | | | | |
|
|
231
|
+
# D -- E -- F I -- S -- I I I I
|
|
232
|
+
# | | | | | |
|
|
233
|
+
# G -- H -- I S -- I -- S I I I
|
|
234
|
+
sir.next_period
|
|
235
|
+
expected_sir_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
|
|
236
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should only contain I"
|
|
237
|
+
|
|
238
|
+
# 4th period
|
|
239
|
+
# A -- B -- C S -- I -- S I I I
|
|
240
|
+
# | | | | | |
|
|
241
|
+
# D -- E -- F I -- S -- I I I I
|
|
242
|
+
# | | | | | |
|
|
243
|
+
# G -- H -- I S -- I -- S I I I
|
|
244
|
+
sir.next_period
|
|
245
|
+
expected_sir_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
|
|
246
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should only contain I"
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def test_next_period_only_with_recovery_rate
|
|
250
|
+
# A -- B -- C S -- I -- S
|
|
251
|
+
# | | | | | |
|
|
252
|
+
# D -- E -- F I -- S -- I
|
|
253
|
+
# | | | | | |
|
|
254
|
+
# G -- H -- I S -- I -- S
|
|
255
|
+
options = {
|
|
256
|
+
graph: @graph,
|
|
257
|
+
sir_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
258
|
+
infection_rate: 0,
|
|
259
|
+
recovery_rate: 0.3,
|
|
260
|
+
t_per_period: 1,
|
|
261
|
+
}
|
|
262
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
263
|
+
|
|
264
|
+
# initial state
|
|
265
|
+
# A -- B -- C S -- I -- S S 0 S
|
|
266
|
+
# | | | | | |
|
|
267
|
+
# D -- E -- F I -- S -- I 0 S 0
|
|
268
|
+
# | | | | | |
|
|
269
|
+
# G -- H -- I S -- I -- S S 0 S
|
|
270
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
271
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
272
|
+
|
|
273
|
+
# 1st period
|
|
274
|
+
# A -- B -- C S -- I -- S S 0.3 S
|
|
275
|
+
# | | | | | |
|
|
276
|
+
# D -- E -- F I -- S -- I 0.3 S 0.3
|
|
277
|
+
# | | | | | |
|
|
278
|
+
# G -- H -- I S -- I -- S S 0.3 S
|
|
279
|
+
sir.next_period
|
|
280
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
281
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
282
|
+
|
|
283
|
+
# 2nd period
|
|
284
|
+
# A -- B -- C S -- I -- S S 0.6 S
|
|
285
|
+
# | | | | | |
|
|
286
|
+
# D -- E -- F I -- S -- I 0.6 S 0.6
|
|
287
|
+
# | | | | | |
|
|
288
|
+
# G -- H -- I S -- I -- S S 0.6 S
|
|
289
|
+
sir.next_period
|
|
290
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
291
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
292
|
+
|
|
293
|
+
# 3rd period
|
|
294
|
+
# A -- B -- C S -- I -- S S 0.9 S
|
|
295
|
+
# | | | | | |
|
|
296
|
+
# D -- E -- F I -- S -- I 0.9 S 0.9
|
|
297
|
+
# | | | | | |
|
|
298
|
+
# G -- H -- I S -- I -- S S 0.9 S
|
|
299
|
+
sir.next_period
|
|
300
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
301
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
302
|
+
|
|
303
|
+
# 4th period
|
|
304
|
+
# A -- B -- C S -- I -- S S R S
|
|
305
|
+
# | | | | | |
|
|
306
|
+
# D -- E -- F I -- S -- I R S R
|
|
307
|
+
# | | | | | |
|
|
308
|
+
# G -- H -- I S -- I -- S S R S
|
|
309
|
+
sir.next_period
|
|
310
|
+
expected_sir_map = [:s, :r, :s, :r, :s, :r, :s, :r, :s]
|
|
311
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should only contain S"
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def test_next_period_1
|
|
315
|
+
# A -- B -- C I -- I -- S
|
|
316
|
+
# | | | | | |
|
|
317
|
+
# D -- E -- F I -- S -- I
|
|
318
|
+
# | | | | | |
|
|
319
|
+
# G -- H -- I S -- I -- S
|
|
320
|
+
options = {
|
|
321
|
+
graph: @graph,
|
|
322
|
+
sir_map: [:i, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
323
|
+
infection_rate: 0.2, # S -> I
|
|
324
|
+
recovery_rate: 0.3, # I -> S
|
|
325
|
+
t_per_period: 1,
|
|
326
|
+
}
|
|
327
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
328
|
+
|
|
329
|
+
# initial state
|
|
330
|
+
# A -- B -- C I -- I -- S I0 I0 S0
|
|
331
|
+
# | | | | | |
|
|
332
|
+
# D -- E -- F I -- S -- I I0 S0 I0
|
|
333
|
+
# | | | | | |
|
|
334
|
+
# G -- H -- I S -- I -- S S0 I0 S0
|
|
335
|
+
expected_sir_map = [:i, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
336
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
337
|
+
|
|
338
|
+
# 1st period
|
|
339
|
+
# A -- B -- C I -- I -- S I0.3 I0.3 S0.4
|
|
340
|
+
# | | | | | |
|
|
341
|
+
# D -- E -- F I -- S -- I I0.3 S0.8 I0.3
|
|
342
|
+
# | | | | | |
|
|
343
|
+
# G -- H -- I S -- I -- S S0.4 I0.3 S0.4
|
|
344
|
+
sir.next_period
|
|
345
|
+
expected_sir_map = [:i, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
346
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
347
|
+
|
|
348
|
+
# 2nd period
|
|
349
|
+
# A -- B -- C I -- I -- S I0.6 I0.6 S0.8
|
|
350
|
+
# | | | | | |
|
|
351
|
+
# D -- E -- F I -- I -- I I0.6 I0 I0.6
|
|
352
|
+
# | | | | | |
|
|
353
|
+
# G -- H -- I S -- I -- S S0.8 I0.6 S0.8
|
|
354
|
+
sir.next_period
|
|
355
|
+
expected_sir_map = [:i, :i, :s, :i, :i, :i, :s, :i, :s]
|
|
356
|
+
assert_equal expected_sir_map, sir.sir_map
|
|
357
|
+
|
|
358
|
+
# 3rd period
|
|
359
|
+
# A -- B -- C I -- I -- I I0.9 I0.9 I0
|
|
360
|
+
# | | | | | |
|
|
361
|
+
# D -- E -- F I -- I -- I I0.9 I0.3 I0.9
|
|
362
|
+
# | | | | | |
|
|
363
|
+
# G -- H -- I I -- I -- I I0 I0.9 I0
|
|
364
|
+
sir.next_period
|
|
365
|
+
expected_sir_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
|
|
366
|
+
assert_equal expected_sir_map, sir.sir_map
|
|
367
|
+
|
|
368
|
+
# 4th period
|
|
369
|
+
# A -- B -- C S -- S -- I R R I0.3
|
|
370
|
+
# | | | | | |
|
|
371
|
+
# D -- E -- F S -- I -- S R I0.6 R
|
|
372
|
+
# | | | | | |
|
|
373
|
+
# G -- H -- I I -- S -- I I0.3 R I0.3
|
|
374
|
+
sir.next_period
|
|
375
|
+
expected_sir_map = [:r, :r, :i, :r, :i, :r, :i, :r, :i]
|
|
376
|
+
assert_equal expected_sir_map, sir.sir_map
|
|
377
|
+
|
|
378
|
+
# 5th period
|
|
379
|
+
# A -- B -- C S -- S -- S R R I0.6
|
|
380
|
+
# | | | | | |
|
|
381
|
+
# D -- E -- F S -- I -- S R I0.9 R
|
|
382
|
+
# | | | | | |
|
|
383
|
+
# G -- H -- I I -- S -- I I0.6 R I0.6
|
|
384
|
+
sir.next_period
|
|
385
|
+
expected_sir_map = [:r, :r, :i, :r, :i, :r, :i, :r, :i]
|
|
386
|
+
assert_equal expected_sir_map, sir.sir_map
|
|
387
|
+
|
|
388
|
+
# 6th period
|
|
389
|
+
# A -- B -- C S -- S -- I R R I0.9
|
|
390
|
+
# | | | | | |
|
|
391
|
+
# D -- E -- F S -- S -- I R R R
|
|
392
|
+
# | | | | | |
|
|
393
|
+
# G -- H -- I I -- I -- I I0.9 R I0.9
|
|
394
|
+
sir.next_period
|
|
395
|
+
expected_sir_map = [:r, :r, :i, :r, :r, :r, :i, :r, :i]
|
|
396
|
+
assert_equal expected_sir_map, sir.sir_map
|
|
397
|
+
|
|
398
|
+
# 7th period
|
|
399
|
+
# A -- B -- C S -- S -- I R R R
|
|
400
|
+
# | | | | | |
|
|
401
|
+
# D -- E -- F S -- S -- I R R R
|
|
402
|
+
# | | | | | |
|
|
403
|
+
# G -- H -- I I -- I -- I R R R
|
|
404
|
+
sir.next_period
|
|
405
|
+
expected_sir_map = [:r, :r, :r, :r, :r, :r, :r, :r, :r]
|
|
406
|
+
assert_equal expected_sir_map, sir.sir_map
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
def test_simulate_only_with_infection_rate
|
|
410
|
+
# A -- B -- C S -- I -- S
|
|
411
|
+
# | | | | | |
|
|
412
|
+
# D -- E -- F I -- S -- I
|
|
413
|
+
# | | | | | |
|
|
414
|
+
# G -- H -- I S -- I -- S
|
|
415
|
+
options = {
|
|
416
|
+
graph: @graph,
|
|
417
|
+
sir_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
418
|
+
infection_rate: 0.2,
|
|
419
|
+
recovery_rate: 0.0,
|
|
420
|
+
t_per_period: 1,
|
|
421
|
+
}
|
|
422
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
423
|
+
|
|
424
|
+
# initial state
|
|
425
|
+
# A -- B -- C S -- I -- S 0.4 I 0.4
|
|
426
|
+
# | | | | | |
|
|
427
|
+
# D -- E -- F I -- S -- I I 0.8 I
|
|
428
|
+
# | | | | | |
|
|
429
|
+
# G -- H -- I S -- I -- S 0.4 I 0.4
|
|
430
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
431
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
432
|
+
|
|
433
|
+
# 3rd period
|
|
434
|
+
# A -- B -- C S -- I -- S I I I
|
|
435
|
+
# | | | | | |
|
|
436
|
+
# D -- E -- F I -- S -- I I I I
|
|
437
|
+
# | | | | | |
|
|
438
|
+
# G -- H -- I S -- I -- S I I I
|
|
439
|
+
sir.simulate periods: 3
|
|
440
|
+
expected_sir_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
|
|
441
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should only contain I"
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
def test_simulate_only_with_recovery_rate
|
|
445
|
+
# A -- B -- C S -- I -- S
|
|
446
|
+
# | | | | | |
|
|
447
|
+
# D -- E -- F I -- S -- I
|
|
448
|
+
# | | | | | |
|
|
449
|
+
# G -- H -- I S -- I -- S
|
|
450
|
+
options = {
|
|
451
|
+
graph: @graph,
|
|
452
|
+
sir_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
453
|
+
infection_rate: 0,
|
|
454
|
+
recovery_rate: 0.3,
|
|
455
|
+
t_per_period: 1,
|
|
456
|
+
}
|
|
457
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
458
|
+
|
|
459
|
+
# initial state
|
|
460
|
+
# A -- B -- C S -- I -- S S I S
|
|
461
|
+
# | | | | | |
|
|
462
|
+
# D -- E -- F I -- S -- I I S I
|
|
463
|
+
# | | | | | |
|
|
464
|
+
# G -- H -- I S -- I -- S S I S
|
|
465
|
+
expected_sir_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
466
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
467
|
+
|
|
468
|
+
# 4th period
|
|
469
|
+
# A -- B -- C S -- I -- S S R S
|
|
470
|
+
# | | | | | |
|
|
471
|
+
# D -- E -- F I -- S -- I R S R
|
|
472
|
+
# | | | | | |
|
|
473
|
+
# G -- H -- I S -- I -- S S R S
|
|
474
|
+
sir.simulate periods: 4
|
|
475
|
+
expected_sir_map = [:s, :r, :s, :r, :s, :r, :s, :r, :s]
|
|
476
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should only contain S"
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
def test_simulate
|
|
480
|
+
# A -- B -- C I -- I -- S
|
|
481
|
+
# | | | | | |
|
|
482
|
+
# D -- E -- F I -- S -- I
|
|
483
|
+
# | | | | | |
|
|
484
|
+
# G -- H -- I S -- I -- S
|
|
485
|
+
options = {
|
|
486
|
+
graph: @graph,
|
|
487
|
+
sir_map: [:i, :i, :s, :i, :s, :i, :s, :i, :s],
|
|
488
|
+
infection_rate: 0.2, # S -> I
|
|
489
|
+
recovery_rate: 0.3, # I -> S
|
|
490
|
+
t_per_period: 1,
|
|
491
|
+
}
|
|
492
|
+
sir = Rgraphum::Simulator::SIRModel.new(options)
|
|
493
|
+
|
|
494
|
+
# initial state
|
|
495
|
+
# A -- B -- C I -- I -- S I0 I0 S0
|
|
496
|
+
# | | | | | |
|
|
497
|
+
# D -- E -- F I -- S -- I I0 S0 I0
|
|
498
|
+
# | | | | | |
|
|
499
|
+
# G -- H -- I S -- I -- S S0 I0 S0
|
|
500
|
+
expected_sir_map = [:i, :i, :s, :i, :s, :i, :s, :i, :s]
|
|
501
|
+
assert_equal expected_sir_map, sir.sir_map, "sir_map should not change"
|
|
502
|
+
|
|
503
|
+
# 6th period
|
|
504
|
+
# A -- B -- C S -- S -- I R R I
|
|
505
|
+
# | | | | | |
|
|
506
|
+
# D -- E -- F S -- S -- I R R R
|
|
507
|
+
# | | | | | |
|
|
508
|
+
# G -- H -- I I -- I -- I I R I
|
|
509
|
+
sir.simulate periods: 6
|
|
510
|
+
expected_sir_map = [:r, :r, :i, :r, :r, :r, :i, :r, :i]
|
|
511
|
+
assert_equal expected_sir_map, sir.sir_map
|
|
512
|
+
end
|
|
513
|
+
end
|