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.
Files changed (106) hide show
  1. data/.gitignore +26 -0
  2. data/GLOSSARIES.md +108 -0
  3. data/GREMLIN.md +1398 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +136 -0
  7. data/Rakefile +16 -0
  8. data/bin/.irbrc +41 -0
  9. data/bin/rgraphum_console +61 -0
  10. data/bin/rgraphum_runner +57 -0
  11. data/examples/ba_model/make.rb +19 -0
  12. data/examples/ba_model/make_dummy_twitter_rt_data.rb +0 -0
  13. data/examples/basic/check_modularity.rb +27 -0
  14. data/examples/basic/make_graph.rb +12 -0
  15. data/examples/parser/dot.rb +28 -0
  16. data/examples/sis_model/lifegame.rb +161 -0
  17. data/graph_struct.jpg +0 -0
  18. data/lib/rgraphum/analyzer/linear_regression.rb +31 -0
  19. data/lib/rgraphum/analyzer/meme_tracker.rb +296 -0
  20. data/lib/rgraphum/analyzer/twitter/rt_at_mark.rb +45 -0
  21. data/lib/rgraphum/analyzer.rb +8 -0
  22. data/lib/rgraphum/cluster.rb +67 -0
  23. data/lib/rgraphum/communities.rb +65 -0
  24. data/lib/rgraphum/community.rb +86 -0
  25. data/lib/rgraphum/cosine_similarity_matrix.rb +40 -0
  26. data/lib/rgraphum/edge.rb +194 -0
  27. data/lib/rgraphum/edges.rb +161 -0
  28. data/lib/rgraphum/ext/cosine_similarity_matrix.rb +79 -0
  29. data/lib/rgraphum/ext/linear_regression.rb +22 -0
  30. data/lib/rgraphum/ext/tf_idf.rb +52 -0
  31. data/lib/rgraphum/graph/gremlin.rb +193 -0
  32. data/lib/rgraphum/graph/math/clustering_coefficient.rb +53 -0
  33. data/lib/rgraphum/graph/math/community_detection.rb +141 -0
  34. data/lib/rgraphum/graph/math/degree_distribution.rb +50 -0
  35. data/lib/rgraphum/graph/math/dijkstra.rb +331 -0
  36. data/lib/rgraphum/graph/math.rb +45 -0
  37. data/lib/rgraphum/graph.rb +267 -0
  38. data/lib/rgraphum/importer.rb +97 -0
  39. data/lib/rgraphum/marshal.rb +26 -0
  40. data/lib/rgraphum/motifs.rb +8 -0
  41. data/lib/rgraphum/parsers/flare.rb +42 -0
  42. data/lib/rgraphum/parsers/gephi.rb +193 -0
  43. data/lib/rgraphum/parsers/graphviz.rb +78 -0
  44. data/lib/rgraphum/parsers/miserables.rb +54 -0
  45. data/lib/rgraphum/parsers.rb +32 -0
  46. data/lib/rgraphum/path.rb +37 -0
  47. data/lib/rgraphum/query.rb +130 -0
  48. data/lib/rgraphum/rgraphum_array.rb +159 -0
  49. data/lib/rgraphum/rgraphum_array_dividers.rb +43 -0
  50. data/lib/rgraphum/rgraphum_random.rb +5 -0
  51. data/lib/rgraphum/simulator/ba_model.rb +140 -0
  52. data/lib/rgraphum/simulator/sir_model.rb +178 -0
  53. data/lib/rgraphum/simulator/sis_model.rb +158 -0
  54. data/lib/rgraphum/simulator.rb +29 -0
  55. data/lib/rgraphum/statistic/power_law.rb +9 -0
  56. data/lib/rgraphum/t.rb +12 -0
  57. data/lib/rgraphum/tf_idf.rb +27 -0
  58. data/lib/rgraphum/version.rb +3 -0
  59. data/lib/rgraphum/vertex.rb +354 -0
  60. data/lib/rgraphum/vertices.rb +97 -0
  61. data/lib/rgraphum.rb +38 -0
  62. data/performance/add-vertices-edges.rb +20 -0
  63. data/performance/add-vertices.rb +12 -0
  64. data/performance/build-graph.rb +19 -0
  65. data/performance/delete-graph.rb +24 -0
  66. data/performance/delete-vertices.rb +25 -0
  67. data/performance/refer-graph.rb +23 -0
  68. data/rgraphum.gemspec +30 -0
  69. data/test/lib/rgraphum/analyzer/linear_regression_test.rb +20 -0
  70. data/test/lib/rgraphum/analyzer/meme_tracker_test.rb +383 -0
  71. data/test/lib/rgraphum/analyzer/twitter/rt_at_mark_test.rb +120 -0
  72. data/test/lib/rgraphum/array_test.rb +95 -0
  73. data/test/lib/rgraphum/bubble_test.rb +7 -0
  74. data/test/lib/rgraphum/communities_test.rb +53 -0
  75. data/test/lib/rgraphum/cosine_similarity_test.rb +18 -0
  76. data/test/lib/rgraphum/edge_test.rb +89 -0
  77. data/test/lib/rgraphum/edges_test.rb +178 -0
  78. data/test/lib/rgraphum/graph_builder_test.rb +64 -0
  79. data/test/lib/rgraphum/graph_dup_test.rb +199 -0
  80. data/test/lib/rgraphum/graph_plus_test.rb +80 -0
  81. data/test/lib/rgraphum/graph_test.rb +512 -0
  82. data/test/lib/rgraphum/gremlin_test.rb +145 -0
  83. data/test/lib/rgraphum/importers/idg_json_edges.json +20 -0
  84. data/test/lib/rgraphum/importers/idg_json_test.rb +207 -0
  85. data/test/lib/rgraphum/importers/idg_json_vertices.json +46 -0
  86. data/test/lib/rgraphum/math/average_distance_matrix_test.rb +142 -0
  87. data/test/lib/rgraphum/math/clustering_coefficient_test.rb +219 -0
  88. data/test/lib/rgraphum/math/community_test.rb +78 -0
  89. data/test/lib/rgraphum/math/degree_distribution_test.rb +40 -0
  90. data/test/lib/rgraphum/math/dijkstra_test.rb +146 -0
  91. data/test/lib/rgraphum/math/modularity_test.rb +154 -0
  92. data/test/lib/rgraphum/math/quick_average_distance_matrix_test.rb +84 -0
  93. data/test/lib/rgraphum/path_test.rb +44 -0
  94. data/test/lib/rgraphum/query/enumerable_test.rb +42 -0
  95. data/test/lib/rgraphum/query/where_operators_test.rb +75 -0
  96. data/test/lib/rgraphum/query/where_test.rb +59 -0
  97. data/test/lib/rgraphum/simulator/ba_model_test.rb +75 -0
  98. data/test/lib/rgraphum/simulator/sir_model_test.rb +513 -0
  99. data/test/lib/rgraphum/simulator/sis_model_test.rb +478 -0
  100. data/test/lib/rgraphum/simulator_test.rb +22 -0
  101. data/test/lib/rgraphum/tf_idf_test.rb +30 -0
  102. data/test/lib/rgraphum/vertex_test.rb +50 -0
  103. data/test/lib/rgraphum/vertices_test.rb +180 -0
  104. data/test/test_helper.rb +98 -0
  105. data/tmp/.gitkeep +0 -0
  106. metadata +254 -0
@@ -0,0 +1,478 @@
1
+ # coding: utf-8
2
+
3
+ require 'test_helper'
4
+ require 'rgraphum'
5
+
6
+ class SISModelTest < 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_si_map
40
+ sis = Rgraphum::Simulator::SISModel.new(graph: @graph)
41
+
42
+ assert_equal %w(A B C D E F G H I), sis.vertices.map(&:label)
43
+ assert_equal %w(s s s s s s s s s).map(&:to_sym), sis.si_map
44
+ end
45
+
46
+ def test_set_si_map
47
+ si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
48
+ sis = Rgraphum::Simulator::SISModel.new(graph: @graph, si_map: si_map)
49
+
50
+ assert_equal %w(A B C D E F G H I), sis.vertices.map(&:label)
51
+ assert_equal %w(s i s i s i s i s).map(&:to_sym), sis.si_map
52
+ end
53
+
54
+ def test_infection_rate
55
+ sis = Rgraphum::Simulator::SISModel.new(graph: @graph, infection_rate: 0.5)
56
+ assert_equal 0.5, sis.infection_rate
57
+
58
+ assert_raises(ArgumentError) do
59
+ Rgraphum::Simulator::SISModel.new(graph: @graph, infection_rate: -0.1)
60
+ end
61
+
62
+ assert_raises(ArgumentError) do
63
+ Rgraphum::Simulator::SISModel.new(graph: @graph, infection_rate: 1.1)
64
+ end
65
+ end
66
+
67
+ def test_recovery_rate
68
+ sis = Rgraphum::Simulator::SISModel.new(graph: @graph, recovery_rate: 0.5)
69
+ assert_equal 0.5, sis.recovery_rate
70
+
71
+ assert_raises(ArgumentError) do
72
+ Rgraphum::Simulator::SISModel.new(graph: @graph, recovery_rate: -0.1)
73
+ end
74
+
75
+ assert_raises(ArgumentError) do
76
+ Rgraphum::Simulator::SISModel.new(graph: @graph, recovery_rate: 1.1)
77
+ end
78
+ end
79
+
80
+ def test_zero_periods_simulate
81
+ initial_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
82
+ sis = Rgraphum::Simulator::SISModel.new(graph: @graph, si_map: initial_si_map)
83
+
84
+ sis.simulate periods: 0
85
+
86
+ expected_si_map = initial_si_map
87
+ assert_equal expected_si_map, sis.si_map, "si_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
+ si_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
99
+ infection_rate: 1.0,
100
+ recovery_rate: 0.0,
101
+ }
102
+ sis = Rgraphum::Simulator::SISModel.new(options)
103
+
104
+ v1 = sis.vertices[0]
105
+ assert_equal false, sis.infected?(v1)
106
+ assert_equal false, sis.infected?(v1, 0)
107
+ assert_equal true, sis.infected?(v1, 1)
108
+
109
+ v2 = sis.vertices[1]
110
+ assert_equal true, sis.infected?(v2)
111
+ assert_equal true, sis.infected?(v2, 0)
112
+ assert_equal true, sis.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
+ si_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
+ sis = Rgraphum::Simulator::SISModel.new(options)
129
+
130
+ v1 = sis.vertices[0]
131
+ assert_equal false, sis.infected?(v1, 0)
132
+ assert_equal false, sis.infected?(v1, 1)
133
+ assert_equal false, sis.infected?(v1, 2)
134
+ assert_equal false, sis.infected?(v1, 3)
135
+ assert_equal false, sis.infected?(v1, 9)
136
+ assert_equal true, sis.infected?(v1, 10)
137
+ end
138
+
139
+ def test_susceptible?
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
+ si_map: [:i, :i, :i, :i, :i, :i, :i, :i, :i],
148
+ infection_rate: 0.0,
149
+ recovery_rate: 1.0,
150
+ }
151
+ sis = Rgraphum::Simulator::SISModel.new(options)
152
+
153
+ v1 = sis.vertices[0]
154
+ assert_equal false, sis.susceptible?(v1)
155
+ assert_equal false, sis.susceptible?(v1, 0)
156
+ assert_equal true, sis.susceptible?(v1, 1)
157
+ end
158
+
159
+ def test_next_period_only_with_infection_rate
160
+ # A -- B -- C S -- I -- S
161
+ # | | | | | |
162
+ # D -- E -- F I -- S -- I
163
+ # | | | | | |
164
+ # G -- H -- I S -- I -- S
165
+ options = {
166
+ graph: @graph,
167
+ si_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
168
+ infection_rate: 0.2,
169
+ recovery_rate: 0.0,
170
+ t_per_period: 1,
171
+ }
172
+ sis = Rgraphum::Simulator::SISModel.new(options)
173
+
174
+ # initial state
175
+ # A -- B -- C S -- I -- S 0 I 0
176
+ # | | | | | |
177
+ # D -- E -- F I -- S -- I I 0 I
178
+ # | | | | | |
179
+ # G -- H -- I S -- I -- S 0 I 0
180
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
181
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
182
+
183
+ # 1st period
184
+ # A -- B -- C S -- I -- S 0.4 I 0.4
185
+ # | | | | | |
186
+ # D -- E -- F I -- S -- I I 0.8 I
187
+ # | | | | | |
188
+ # G -- H -- I S -- I -- S 0.4 I 0.4
189
+ sis.next_period
190
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
191
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
192
+
193
+ # 2nd period
194
+ # A -- B -- C S -- I -- S 0.8 I 0.8
195
+ # | | | | | |
196
+ # D -- E -- F I -- S -- I I I I
197
+ # | | | | | |
198
+ # G -- H -- I S -- I -- S 0.8 I 0.8
199
+ sis.next_period
200
+ expected_si_map = [:s, :i, :s, :i, :i, :i, :s, :i, :s]
201
+ assert_equal expected_si_map, sis.si_map, "si_map should change"
202
+
203
+ # 3rd period
204
+ # A -- B -- C S -- I -- S I I I
205
+ # | | | | | |
206
+ # D -- E -- F I -- S -- I I I I
207
+ # | | | | | |
208
+ # G -- H -- I S -- I -- S I I I
209
+ sis.next_period
210
+ expected_si_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
211
+ assert_equal expected_si_map, sis.si_map, "si_map should only contain I"
212
+
213
+ # 4th period
214
+ # A -- B -- C S -- I -- S I I I
215
+ # | | | | | |
216
+ # D -- E -- F I -- S -- I I I I
217
+ # | | | | | |
218
+ # G -- H -- I S -- I -- S I I I
219
+ sis.next_period
220
+ expected_si_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
221
+ assert_equal expected_si_map, sis.si_map, "si_map should only contain I"
222
+ end
223
+
224
+ def test_next_period_only_with_recovery_rate
225
+ # A -- B -- C S -- I -- S
226
+ # | | | | | |
227
+ # D -- E -- F I -- S -- I
228
+ # | | | | | |
229
+ # G -- H -- I S -- I -- S
230
+ options = {
231
+ graph: @graph,
232
+ si_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
233
+ infection_rate: 0,
234
+ recovery_rate: 0.3,
235
+ t_per_period: 1,
236
+ }
237
+ sis = Rgraphum::Simulator::SISModel.new(options)
238
+
239
+ # initial state
240
+ # A -- B -- C S -- I -- S S 0 S
241
+ # | | | | | |
242
+ # D -- E -- F I -- S -- I 0 S 0
243
+ # | | | | | |
244
+ # G -- H -- I S -- I -- S S 0 S
245
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
246
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
247
+
248
+ # 1st period
249
+ # A -- B -- C S -- I -- S S 0.3 S
250
+ # | | | | | |
251
+ # D -- E -- F I -- S -- I 0.3 S 0.3
252
+ # | | | | | |
253
+ # G -- H -- I S -- I -- S S 0.3 S
254
+ sis.next_period
255
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
256
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
257
+
258
+ # 2nd period
259
+ # A -- B -- C S -- I -- S S 0.6 S
260
+ # | | | | | |
261
+ # D -- E -- F I -- S -- I 0.6 S 0.6
262
+ # | | | | | |
263
+ # G -- H -- I S -- I -- S S 0.6 S
264
+ sis.next_period
265
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
266
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
267
+
268
+ # 3rd period
269
+ # A -- B -- C S -- I -- S S 0.9 S
270
+ # | | | | | |
271
+ # D -- E -- F I -- S -- I 0.9 S 0.9
272
+ # | | | | | |
273
+ # G -- H -- I S -- I -- S S 0.9 S
274
+ sis.next_period
275
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
276
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
277
+
278
+ # 4th period
279
+ # A -- B -- C S -- I -- S S S S
280
+ # | | | | | |
281
+ # D -- E -- F I -- S -- I S S S
282
+ # | | | | | |
283
+ # G -- H -- I S -- I -- S S S S
284
+ sis.next_period
285
+ expected_si_map = [:s, :s, :s, :s, :s, :s, :s, :s, :s]
286
+ assert_equal expected_si_map, sis.si_map, "si_map should only contain S"
287
+ end
288
+
289
+ def test_next_period_1
290
+ # A -- B -- C I -- I -- S
291
+ # | | | | | |
292
+ # D -- E -- F I -- S -- I
293
+ # | | | | | |
294
+ # G -- H -- I S -- I -- S
295
+ options = {
296
+ graph: @graph,
297
+ si_map: [:i, :i, :s, :i, :s, :i, :s, :i, :s],
298
+ infection_rate: 0.2, # S -> I
299
+ recovery_rate: 0.3, # I -> S
300
+ t_per_period: 1,
301
+ }
302
+ sis = Rgraphum::Simulator::SISModel.new(options)
303
+
304
+ # initial state
305
+ # A -- B -- C I -- I -- S I0 I0 S0
306
+ # | | | | | |
307
+ # D -- E -- F I -- S -- I I0 S0 I0
308
+ # | | | | | |
309
+ # G -- H -- I S -- I -- S S0 I0 S0
310
+ expected_si_map = [:i, :i, :s, :i, :s, :i, :s, :i, :s]
311
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
312
+
313
+ # 1st period
314
+ # A -- B -- C I -- I -- S I0.3 I0.3 S0.4
315
+ # | | | | | |
316
+ # D -- E -- F I -- S -- I I0.3 S0.8 I0.3
317
+ # | | | | | |
318
+ # G -- H -- I S -- I -- S S0.4 I0.3 S0.4
319
+ sis.next_period
320
+ expected_si_map = [:i, :i, :s, :i, :s, :i, :s, :i, :s]
321
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
322
+
323
+ # 2nd period
324
+ # A -- B -- C I -- I -- S I0.6 I0.6 S0.8
325
+ # | | | | | |
326
+ # D -- E -- F I -- I -- I I0.6 I0 I0.6
327
+ # | | | | | |
328
+ # G -- H -- I S -- I -- S S0.8 I0.6 S0.8
329
+ sis.next_period
330
+ expected_si_map = [:i, :i, :s, :i, :i, :i, :s, :i, :s]
331
+ assert_equal expected_si_map, sis.si_map
332
+
333
+ # 3rd period
334
+ # A -- B -- C I -- I -- I I0.9 I0.9 I0
335
+ # | | | | | |
336
+ # D -- E -- F I -- I -- I I0.9 I0.3 I0.9
337
+ # | | | | | |
338
+ # G -- H -- I I -- I -- I I0 I0.9 I0
339
+ sis.next_period
340
+ expected_si_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
341
+ assert_equal expected_si_map, sis.si_map
342
+
343
+ # 4th period
344
+ # A -- B -- C S -- S -- I S0 S0 I0.3
345
+ # | | | | | |
346
+ # D -- E -- F S -- I -- S S0 I0.6 S0
347
+ # | | | | | |
348
+ # G -- H -- I I -- S -- I I0.3 S0 I0.3
349
+ sis.next_period
350
+ expected_si_map = [:s, :s, :i, :s, :i, :s, :i, :s, :i]
351
+ assert_equal expected_si_map, sis.si_map
352
+
353
+ # 5th period
354
+ # A -- B -- C S -- S -- S S0 S0.4 I0.6
355
+ # | | | | | |
356
+ # D -- E -- F S -- I -- S S0.4 I0.9 S0.6
357
+ # | | | | | |
358
+ # G -- H -- I I -- S -- I I0.6 S0.6 I0.6
359
+ sis.next_period
360
+ expected_si_map = [:s, :s, :i, :s, :i, :s, :i, :s, :i]
361
+ assert_equal expected_si_map, sis.si_map
362
+
363
+ # 6th period
364
+ # A -- B -- C S -- S -- I S0 S0.8 I0.9
365
+ # | | | | | |
366
+ # D -- E -- F S -- S -- I S0.8 S0 I0
367
+ # | | | | | |
368
+ # G -- H -- I I -- I -- I I0.9 I0 I0.9
369
+ sis.next_period
370
+ expected_si_map = [:s, :s, :i, :s, :s, :i, :i, :i, :i]
371
+ assert_equal expected_si_map, sis.si_map
372
+ end
373
+
374
+ def test_simulate_only_with_infection_rate
375
+ # A -- B -- C S -- I -- S
376
+ # | | | | | |
377
+ # D -- E -- F I -- S -- I
378
+ # | | | | | |
379
+ # G -- H -- I S -- I -- S
380
+ options = {
381
+ graph: @graph,
382
+ si_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
383
+ infection_rate: 0.2,
384
+ recovery_rate: 0.0,
385
+ t_per_period: 1,
386
+ }
387
+ sis = Rgraphum::Simulator::SISModel.new(options)
388
+
389
+ # initial state
390
+ # A -- B -- C S -- I -- S 0.4 I 0.4
391
+ # | | | | | |
392
+ # D -- E -- F I -- S -- I I 0.8 I
393
+ # | | | | | |
394
+ # G -- H -- I S -- I -- S 0.4 I 0.4
395
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
396
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
397
+
398
+ # 3rd period
399
+ # A -- B -- C S -- I -- S I I I
400
+ # | | | | | |
401
+ # D -- E -- F I -- S -- I I I I
402
+ # | | | | | |
403
+ # G -- H -- I S -- I -- S I I I
404
+ sis.simulate periods: 3
405
+ expected_si_map = [:i, :i, :i, :i, :i, :i, :i, :i, :i]
406
+ assert_equal expected_si_map, sis.si_map, "si_map should only contain I"
407
+ end
408
+
409
+ def test_simulate_only_with_recovery_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
+ si_map: [:s, :i, :s, :i, :s, :i, :s, :i, :s],
418
+ infection_rate: 0,
419
+ recovery_rate: 0.3,
420
+ t_per_period: 1,
421
+ }
422
+ sis = Rgraphum::Simulator::SISModel.new(options)
423
+
424
+ # initial state
425
+ # A -- B -- C S -- I -- S S 0 S
426
+ # | | | | | |
427
+ # D -- E -- F I -- S -- I 0 S 0
428
+ # | | | | | |
429
+ # G -- H -- I S -- I -- S S 0 S
430
+ expected_si_map = [:s, :i, :s, :i, :s, :i, :s, :i, :s]
431
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
432
+
433
+ # 4th period
434
+ # A -- B -- C S -- I -- S S S S
435
+ # | | | | | |
436
+ # D -- E -- F I -- S -- I S S S
437
+ # | | | | | |
438
+ # G -- H -- I S -- I -- S S S S
439
+ sis.simulate periods: 4
440
+ expected_si_map = [:s, :s, :s, :s, :s, :s, :s, :s, :s]
441
+ assert_equal expected_si_map, sis.si_map, "si_map should only contain S"
442
+ end
443
+
444
+ def test_simulate
445
+ # A -- B -- C I -- I -- S
446
+ # | | | | | |
447
+ # D -- E -- F I -- S -- I
448
+ # | | | | | |
449
+ # G -- H -- I S -- I -- S
450
+ options = {
451
+ graph: @graph,
452
+ si_map: [:i, :i, :s, :i, :s, :i, :s, :i, :s],
453
+ infection_rate: 0.2, # S -> I
454
+ recovery_rate: 0.3, # I -> S
455
+ t_per_period: 1,
456
+ }
457
+ sis = Rgraphum::Simulator::SISModel.new(options)
458
+
459
+ # initial state
460
+ # A -- B -- C I -- I -- S I0 I0 S0
461
+ # | | | | | |
462
+ # D -- E -- F I -- S -- I I0 S0 I0
463
+ # | | | | | |
464
+ # G -- H -- I S -- I -- S S0 I0 S0
465
+ expected_si_map = [:i, :i, :s, :i, :s, :i, :s, :i, :s]
466
+ assert_equal expected_si_map, sis.si_map, "si_map should not change"
467
+
468
+ # 6th period
469
+ # A -- B -- C S -- S -- I S0 S0.8 I0.9
470
+ # | | | | | |
471
+ # D -- E -- F S -- S -- I S0.8 S0 I0
472
+ # | | | | | |
473
+ # G -- H -- I I -- I -- I I0.9 I0 I0.9
474
+ sis.simulate periods: 6
475
+ expected_si_map = [:s, :s, :i, :s, :s, :i, :i, :i, :i]
476
+ assert_equal expected_si_map, sis.si_map
477
+ end
478
+ end
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+ require 'rgraphum'
5
+
6
+ class RgraphumSimulatorTest < MiniTest::Test
7
+ include Rgraphum::Simulator
8
+
9
+ def setup
10
+ end
11
+
12
+ def test_guess_model_class
13
+ assert_equal Rgraphum::Simulator::BAModel, guess_model_class("BAModel")
14
+ assert_equal Rgraphum::Simulator::BAModel, guess_model_class("ba_model")
15
+ assert_equal Rgraphum::Simulator::BAModel, guess_model_class("BAmodel")
16
+
17
+ assert_equal Rgraphum::Simulator::SISModel, guess_model_class("SISmodel")
18
+ assert_equal Rgraphum::Simulator::SISModel, guess_model_class("SIS Model")
19
+ assert_equal Rgraphum::Simulator::SISModel, guess_model_class("SISModel")
20
+ assert_equal Rgraphum::Simulator::SISModel, guess_model_class("sismodel")
21
+ end
22
+ end
@@ -0,0 +1,30 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rgraphum'
4
+ require 'test_helper'
5
+
6
+ class TfIdfTest < MiniTest::Test
7
+
8
+ def test_tf_idf_c
9
+ labels = [ "A", "B", "C", "D", "E" ]
10
+ matrix = [ [2.0, 1.0, 1.0, 0.0, 0.0],
11
+ [0.0, 2.0, 1.0, 1.0, 0.0],
12
+ [1.0, 1.0, 1.0, 0.0, 0.0],
13
+ [0.0, 0.0, 0.0, 1.0, 1.0]]
14
+
15
+
16
+ tf_idf_object = TfIdf.new
17
+ tf_idf = tf_idf_object.tf_idf( matrix )
18
+
19
+ tf_idf_ans_lib = [ [0.34657359027997264, 0.07192051811294521, 0.07192051811294521, 0.0, 0.0],
20
+ [0.0, 0.14384103622589042, 0.07192051811294521, 0.17328679513998632, 0.0],
21
+ [0.23104906018664842, 0.09589402415059362, 0.09589402415059362, 0.0, 0.0],
22
+ [0.0, 0.0, 0.0, 0.34657359027997264, 0.6931471805599453] ]
23
+
24
+ tf_idf_ans_lib.flatten.each_with_index do |ans_tmp,i|
25
+ assert_equal ans_tmp.round(5), tf_idf.flatten[i].round(5)
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rgraphum'
4
+ require 'test_helper'
5
+
6
+ class RgraphumVertexTest < MiniTest::Test
7
+ def setup
8
+ @graph = Rgraphum::Graph.new
9
+ @graph.vertices = [
10
+ { id: 1, label: "hoge" },
11
+ { id: 2, label: "huga" },
12
+ ]
13
+
14
+ @vertex0 = @graph.vertices[0]
15
+ @vertex1 = @graph.vertices[1]
16
+ end
17
+
18
+ def test_vertex_within_term
19
+ t = Time.now
20
+ vertex_a = Rgraphum::Vertex.new
21
+ vertex_a.start = t
22
+ vertex_a.end = t + 2
23
+
24
+ vertex_b = Rgraphum::Vertex.new
25
+ vertex_b.start = t + 1
26
+ vertex_b.end = t + 3
27
+
28
+ assert_equal true, vertex_a.within_term(vertex_b)
29
+ assert_equal false, vertex_b.within_term(vertex_a)
30
+ end
31
+
32
+ def test_vertex_dump_and_load
33
+ vertex = Rgraphum::Vertex.new(id: 1, label: "vertex 1")
34
+
35
+ data = Marshal.dump(vertex)
36
+ vertex_dash = Marshal.load(data)
37
+
38
+ rg_assert_equal vertex, vertex_dash
39
+ end
40
+
41
+ def test_invalid_field
42
+ assert_raises(ArgumentError) do
43
+ Rgraphum::Vertex.new(labeeeeeeeeeeeeeeeeeeeel: "label")
44
+ end
45
+
46
+ assert_raises(ArgumentError) do
47
+ Rgraphum::Vertex.new(label: "label", labeeeeeeeeeeeeeeeeeeeel: "label")
48
+ end
49
+ end
50
+ end