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,383 @@
1
+ # coding: utf-8
2
+
3
+ require 'test_helper'
4
+ require 'rgraphum'
5
+
6
+ class MemeTrackerTest < MiniTest::Test
7
+ def setup
8
+ @meme_tracker = make_base_phrase_graph
9
+ @graph = make_sample_graph_for_cluster
10
+ @meme_tracker.graph = @graph
11
+ @vertices = @meme_tracker.graph.vertices
12
+ end
13
+
14
+ # some big method check
15
+ def test_make_edges
16
+ graph = Rgraphum::Graph.new
17
+ phrases = [
18
+ phrase_a = {id: 0, words: %w{私 は 山 が 好き}},
19
+ phrase_b = {id: 1, words: %w{君 は 山 が 好き かな}},
20
+ phrase_c = {id: 2, words: %w{僕 は 海 も 好き}}
21
+ ]
22
+ graph.vertices = phrases
23
+
24
+ meme_tracker = Rgraphum::Analyzer::MemeTracker.new
25
+ meme_tracker.make_edges(graph)
26
+
27
+ edge = graph.edges[0]
28
+ assert_equal 0, edge.id
29
+ rg_assert_equal phrase_a, edge.source
30
+ rg_assert_equal phrase_b, edge.target
31
+ assert_equal 1.0/3.0, edge.weight
32
+
33
+ edge = graph.edges[1]
34
+ assert_equal 1, edge.id
35
+ rg_assert_equal phrase_a, edge.source
36
+ rg_assert_equal phrase_c, edge.target
37
+ assert_equal 1.0/4.0, edge.weight
38
+
39
+ edge = graph.edges[2]
40
+ assert_equal 2, edge.id
41
+ rg_assert_equal phrase_b, edge.source
42
+ rg_assert_equal phrase_c, edge.target
43
+ assert_equal 1.0/5.0, edge.weight
44
+ end
45
+
46
+ def test_count_same_words_vertices
47
+ phrases = [
48
+ phrase_a = {id: 0, words: %w{山 が 好き}},
49
+ phrase_b = {id: 1, words: %w{山 が 好き}},
50
+ phrase_c = {id: 2, words: %w{海 が 好き}},
51
+ ]
52
+ graph = Rgraphum::Graph.new
53
+ graph.vertices = phrases
54
+
55
+ meme_tracker = Rgraphum::Analyzer::MemeTracker.new
56
+ meme_tracker.count_same_words_vertices(graph)
57
+
58
+ assert_equal 1, graph.vertices[0].count
59
+ assert_nil graph.vertices[1].count
60
+ assert_nil graph.vertices[2].count
61
+ end
62
+
63
+ def test_make_graph_some_of_functional
64
+ phrases = [
65
+ phrase_a = {words: %w{私 は 山 が 好き}},
66
+ phrase_b = {words: %w{君 は 山 が 好き かな}},
67
+ phrase_c = {words: %w{僕 は 海 も 好き}},
68
+ ]
69
+
70
+ meme_tracker = Rgraphum::Analyzer::MemeTracker.new
71
+ graph = meme_tracker.make_graph(phrases)
72
+ graph = make_sample_graph_for_cluster
73
+
74
+ #<Rgraphum::Graph:0x00000003bb5e88 @vertices=[{:words=>["私", "は", "山", "が", "好き"], :id=>0, :count=>1}, {:words=>["君", "は", "山", "が", "好き", "かな"], :id=>1, :count=>1}, {:words=>["僕", "は", "海", "も", "好き"], :id=>2, :count=>1}], @edges=[{:source=>{:words=>["私", "は", "山", "が", "好き"], :id=>0, :count=>1}, :target=>{:words=>["君", "は", "山", "が", "好き", "かな"], :id=>1, :count=>1}, :weight=>0.3333333333333333, :id=>0}, {:source=>{:words=>["私", "は", "山", "が", "好き"], :id=>0, :count=>1}, :target=>{:words=>["僕", "は", "海", "も", "好き"], :id=>2, :count=>1}, :weight=>0.25, :id=>1}, {:source=>{:words=>["君", "は", "山", "が", "好き", "かな"], :id=>1, :count=>1}, :target=>{:words=>["僕", "は", "海", "も", "好き"], :id=>2, :count=>1}, :weight=>0.2, :id=>2}], @aspect="real">
75
+ end
76
+
77
+ def test_distance
78
+ # distance of insert delete is 1
79
+ assert_equal 1, @meme_tracker.edit_distance(%w{hoge}, %w{hoge huga})
80
+ assert_equal 1, @meme_tracker.edit_distance(%w{hoge}, %w{huga hoge})
81
+ assert_equal 1, @meme_tracker.edit_distance(%w{hoge piyo}, %w{hoge huga piyo})
82
+ assert_equal 1, @meme_tracker.edit_distance(%w{hoge huga piyo}, %w{hoge piyo})
83
+
84
+ # distance of change is 1
85
+ assert_equal 1, @meme_tracker.edit_distance(%w{hoge huga piyo}, %w{hxge huga piyo})
86
+ assert_equal 1, @meme_tracker.edit_distance(%w{hoge huga piyo}, %w{hoge hxga piyo})
87
+ assert_equal 1, @meme_tracker.edit_distance(%w{hoge huga piyo}, %w{hoge huga pxyo})
88
+
89
+ # change of potion is 2
90
+ assert_equal 2, @meme_tracker.edit_distance(%w{hoge huga piyo}, %w{huga hoge piyo})
91
+ assert_equal 2, @meme_tracker.edit_distance(%w{hoge huga piyo}, %w{hoge piyo huga})
92
+ assert_equal 2, @meme_tracker.edit_distance(%w{hoge huga piyo}, %w{piyo huga hoge})
93
+
94
+ base_array = %w{hoge huga piyo puyo}
95
+ # distance of 2 insert
96
+ base_array.combination(2) do |pair|
97
+ assert_equal 2, @meme_tracker.edit_distance(pair, base_array)
98
+ end
99
+ # distance of 2 insert
100
+ base_array.combination(2) do |pair|
101
+ assert_equal 2, @meme_tracker.edit_distance(base_array, pair)
102
+ end
103
+
104
+ # complex test
105
+ assert_equal 1, @meme_tracker.edit_distance(%w{A B D D}, %w{A C B D D})
106
+ assert_equal 2, @meme_tracker.edit_distance(%w{A B D D D}, %w{A C D B D})
107
+ assert_equal 3, @meme_tracker.edit_distance(%w{A B A A A B A A A A A}, %w{B A A B A A A A})
108
+
109
+ # big diff test
110
+ assert_equal 4, @meme_tracker.edit_distance(%w{A C C C C}, %w{A D D D D})
111
+ assert_equal 4, @meme_tracker.edit_distance(%w{C A D C C}, %w{A D D D D})
112
+ assert_equal 4, @meme_tracker.edit_distance(%w{C C A D C}, %w{A D D D D})
113
+ assert_equal 4, @meme_tracker.edit_distance(%w{C C C A D}, %w{A D D D D})
114
+ assert_equal 4, @meme_tracker.edit_distance(%w{D D C C A}, %w{A D D D D})
115
+
116
+ # big diff test
117
+ assert_equal 5, @meme_tracker.edit_distance(%w{A C C C C C}, %w{A D D D D D})
118
+ assert_equal 5, @meme_tracker.edit_distance(%w{C A D C C C}, %w{A D D D D D})
119
+ assert_equal 5, @meme_tracker.edit_distance(%w{C C A D C C}, %w{A D D D D D})
120
+ assert_equal 5, @meme_tracker.edit_distance(%w{C C C A D C}, %w{A D D D D D})
121
+ assert_equal 5, @meme_tracker.edit_distance(%w{C C C C A D}, %w{A D D D D D})
122
+
123
+ assert_equal 2, @meme_tracker.edit_distance(%w{F A B C D E}, %w{A B C D E F})
124
+ end
125
+
126
+ # __(4)___(8)___
127
+ # / ___/ (13)
128
+ # (1)___ |____(9)__/
129
+ # (5)___
130
+ # ___/ (10)__
131
+ # (2)___ __/ __(14)
132
+ # / ___(6)___ /
133
+ # | (3)___ ___(11)
134
+ # \______(7)_________(15)
135
+ # (12)__/
136
+ #
137
+ #
138
+ # (3)/--(2) (1)
139
+ # / X / \ / \
140
+ # / / \ / \ / \
141
+ # (7) (6) (5) (4)
142
+ # / \ / \ / \ |
143
+ # (12) / (11) (10) (9) (8)
144
+ # \ / \ / \ /
145
+ # (15) (14) (13)
146
+ #
147
+ def test_phrase_clusters_1
148
+ #####################################
149
+ # test start_vertices and end_vertices
150
+ start_root_vertices = @meme_tracker.start_root_vertices
151
+ rg_assert_equal [{id: 1}, {id: 2}, {id: 3}, {id: 12}], start_root_vertices
152
+
153
+ end_root_vertices = @meme_tracker.end_root_vertices
154
+ rg_assert_equal [{id: 13}, {id: 14}, {id: 15}], end_root_vertices
155
+ end
156
+
157
+ def test_phrase_clusters_2
158
+ ###################################
159
+ # test for find path from start vertices
160
+ start_vertex = @graph.vertices.where(id: 8).first
161
+ cluster = @meme_tracker.build_cluster(start_vertex)
162
+ path = cluster.find_path(13)
163
+ rg_assert_equal({id: 13}, path.end_vertex)
164
+ rg_assert_equal([{id: 13}, {id: 8}], path.vertices)
165
+
166
+ start_vertex = @graph.vertices.where(id: 9).first
167
+ cluster = @meme_tracker.build_cluster(start_vertex)
168
+ path = cluster.find_path(13)
169
+ rg_assert_equal({id: 13}, path.end_vertex)
170
+ rg_assert_equal([{id: 13}, {id: 9}], path.vertices)
171
+
172
+ start_vertex = @graph.vertices.where(id: 4).first
173
+ cluster = @meme_tracker.build_cluster(start_vertex)
174
+ path = cluster.find_path(13)
175
+ rg_assert_equal({id: 13}, path.end_vertex)
176
+ rg_assert_equal([{id: 13}, {id: 8}, {id: 4}], path.vertices)
177
+
178
+ start_vertex = @graph.vertices.where(id: 5).first
179
+ cluster = @meme_tracker.build_cluster(start_vertex)
180
+ expected = {
181
+ 13 => [{id: 13}, {id: 8}, {id: 5}, {id: 9}],
182
+ 14 => [{id: 14}, {id: 10}, {id: 5}],
183
+ }
184
+ rg_assert_equal expected[13], cluster.find_path(13).vertices
185
+ rg_assert_equal expected[14], cluster.find_path(14).vertices
186
+
187
+ start_vertex = @graph.vertices.where(id: 1).first
188
+ cluster = @meme_tracker.build_cluster(start_vertex)
189
+ expected = {
190
+ 13 => [{id: 13}, {id: 8}, {id: 4}, {id: 1}, {id: 5}, {id: 9} ],
191
+ 14 => [{id: 14}, {id: 10}, {id: 5}, {id: 1}],
192
+ }
193
+ rg_assert_equal expected[13], cluster.find_path(13).vertices
194
+ rg_assert_equal expected[14], cluster.find_path(14).vertices
195
+ end
196
+
197
+ def test_phrase_clusters_3
198
+ # fail test
199
+ start_vertex = Rgraphum::Vertex.new
200
+ assert @meme_tracker.build_cluster(start_vertex).empty?
201
+ end
202
+
203
+ def test_phrase_clusters_4
204
+ ###################################
205
+ # test for one cluster make on graph
206
+
207
+ end_root_vertices = @meme_tracker.end_root_vertices
208
+ end_vertex = end_root_vertices[0] # (13)
209
+ start_vertex = @graph.vertices.where(id: 8).first
210
+ cluster = @meme_tracker.find_cluster(start_vertex, end_vertex)
211
+ rg_assert_equal [{id: 13}, {id: 8}], cluster
212
+
213
+ start_vertex = @graph.vertices.where(id: 9).first
214
+ cluster = @meme_tracker.find_cluster(start_vertex, end_vertex)
215
+ rg_assert_equal [{id: 13}, {id: 9}], cluster
216
+
217
+ start_vertex = @graph.vertices.where(id: 4).first
218
+ cluster = @meme_tracker.find_cluster(start_vertex, end_vertex)
219
+ rg_assert_equal [{id: 13}, {id: 8}, {id: 4}], cluster
220
+
221
+ start_vertex = @graph.vertices.where(id: 1).first
222
+ cluster = @meme_tracker.find_cluster(start_vertex, end_vertex)
223
+ rg_assert_equal [{id: 13}, {id: 8}, {id: 4}, {id: 9}, {id: 5}, {id: 1}], cluster
224
+ end
225
+
226
+ def test_phrase_clusters_5
227
+ ###################################
228
+ # test for multi cluster make on graph
229
+
230
+ # 1,2 -> 13 3 => 14, 12 -> 15
231
+ start_root_vertices = [ @vertices.where(id: 1).first, @vertices.where(id: 2).first, @vertices.where(id: 3).first, @vertices.where(id: 12).first ]
232
+ end_root_vertices = [ @vertices.where(id: 13).first, @vertices.where(id: 13).first, @vertices.where(id: 14).first, @vertices.where(id: 15).first ]
233
+ clusters_a = @meme_tracker.make_communities(start_root_vertices,end_root_vertices)
234
+ expected = [
235
+ [ {:id => 13}, {:id => 8}, {:id => 4}, {:id => 9}, {:id => 5}, {:id => 1}, {:id => 2} ],
236
+ [ {:id => 14}, {:id => 10}, {:id => 11}, {:id => 6}, {:id => 7}, {:id => 3} ],
237
+ [ {:id => 15}, {:id => 12} ],
238
+ ]
239
+ # rg_assert_equal expected, clusters_a
240
+ (0...expected.size).each do |i|
241
+ rg_assert_equal expected[i], clusters_a[i].vertices
242
+ end
243
+
244
+ # sum_sigma_in
245
+ assert_equal 16, @meme_tracker.sum_sigma_in(clusters_a)
246
+ end
247
+
248
+ def test_phrase_clusters_6
249
+ ##
250
+ # 1 -> 13 2,3 -> 14, 12 -> 15
251
+ start_root_vertices = [ @vertices.where(id: 1).first, @vertices.where(id: 2).first, @vertices.where(id: 3).first, @vertices.where(id: 12).first ]
252
+ end_root_vertices = [ @vertices.where(id: 13).first, @vertices.where(id: 14).first, @vertices.where(id: 14).first, @vertices.where(id: 15).first ]
253
+ clusters_b = @meme_tracker.make_communities(start_root_vertices, end_root_vertices)
254
+ expected = [
255
+ [ {:id => 13}, {:id => 8}, {:id => 4}, {:id => 9}, {:id => 5}, {:id => 1} ],
256
+ [ {:id => 14}, {:id => 10}, {:id => 11}, {:id => 6}, {:id => 7}, {:id => 2}, {:id => 3} ],
257
+ [ {:id => 15}, {:id => 12} ],
258
+ ]
259
+ (0...expected.size).each do |i|
260
+ rg_assert_equal expected[i], clusters_b[i].vertices
261
+ end
262
+
263
+ # sum_sigma_in
264
+ assert_equal 17, @meme_tracker.sum_sigma_in(clusters_b)
265
+
266
+ clusters = @meme_tracker.phrase_clusters
267
+ assert clusters
268
+ assert_equal 3, clusters.size
269
+ (0...clusters_b.size).each do |i|
270
+ rg_assert_equal clusters_b[i].vertices, clusters[i].vertices
271
+ end
272
+ end
273
+
274
+ def test_phrase_clusters_7
275
+ # 1 -> 13 2,3,12 -> 15
276
+ start_root_vertices = [ @vertices.where(id: 1).first, @vertices.where(id: 2).first, @vertices.where(id: 3).first, @vertices.where(id: 12).first ]
277
+ end_root_vertices = [ @vertices.where(id: 13).first, @vertices.where(id: 15).first, @vertices.where(id: 15).first, @vertices.where(id: 15).first ]
278
+ clusters_c = @meme_tracker.make_communities(start_root_vertices, end_root_vertices)
279
+ expected = [
280
+ [ {:id => 13}, {:id => 8}, {:id => 4}, {:id => 9}, {:id => 5}, {:id => 1} ],
281
+ [ {:id => 15}, {:id => 7}, {:id => 2}, {:id => 3}, {:id => 12} ],
282
+ ]
283
+ (0...expected.size).each do |i|
284
+ rg_assert_equal expected[i], clusters_c[i].vertices
285
+ end
286
+
287
+ # sum_sigma_in
288
+ assert_equal 11, @meme_tracker.sum_sigma_in(clusters_c)
289
+ end
290
+
291
+ def test_phrase_clusters_8
292
+ # 1 -> 13 2,3 -> 14, 12 => 15
293
+ start_root_vertices = [ @vertices.where(id: 1).first, @vertices.where(id: 2).first, @vertices.where(id: 3).first, @vertices.where(id: 12).first ]
294
+ end_root_vertices = [ @vertices.where(id: 13).first, @vertices.where(id: 14).first, @vertices.where(id: 14).first, @vertices.where(id: 15).first ]
295
+ clusters_d = @meme_tracker.make_communities(start_root_vertices, end_root_vertices)
296
+ expected = [
297
+ [ {:id => 13}, {:id => 8}, {:id => 4}, {:id => 9}, {:id => 5}, {:id => 1} ],
298
+ [ {:id => 14}, {:id => 10}, {:id => 11}, {:id => 6}, {:id => 7}, {:id => 2}, {:id => 3} ],
299
+ [ {:id => 15}, {:id => 12} ],
300
+ ]
301
+ (0...expected.size).each do |i|
302
+ rg_assert_equal expected[i], clusters_d[i].vertices
303
+ end
304
+ end
305
+
306
+ def test_path_graph
307
+ @graph.vertices.each { |vertex|
308
+ vertex.label == (vertex.label = vertex.id.to_s) # FIXME Why == is here?
309
+ }
310
+ meme_tracker = Rgraphum::Analyzer::MemeTracker.new
311
+
312
+ # please see under test of fint_path
313
+
314
+ graphes = meme_tracker.make_path_graph(@graph)
315
+
316
+ assert_equal 4, graphes.size
317
+
318
+ expected = [
319
+ {id: 13, label: "13"},
320
+ {id: 8, label: "8"},
321
+ {id: 4, label: "4"},
322
+ {id: 9, label: "9"},
323
+ {id: 14, label: "14"},
324
+ {id: 10, label: "10"},
325
+ {id: 5, label: "5"},
326
+ {id: 1, label: "1"},
327
+ ]
328
+ rg_assert_equal expected, graphes[0].vertices
329
+
330
+ expected = [
331
+ {id: 0, source: {id: 1, label: "1"}, target: {id: 4, label: "4"}, weight: 1},
332
+ {id: 1, source: {id: 1, label: "1"}, target: {id: 5, label: "5"}, weight: 1},
333
+ {id: 7, source: {id: 4, label: "4"}, target: {id: 8, label: "8"}, weight: 1},
334
+ {id: 9, source: {id: 5, label: "5"}, target: {id: 9, label: "9"}, weight: 1},
335
+ {id: 10, source: {id: 5, label: "5"}, target: {id: 10, label: "10"}, weight: 1},
336
+ {id: 15, source: {id: 8, label: "8"}, target: {id: 13, label: "13"}, weight: 1},
337
+ {id: 17, source: {id: 10, label: "10"},target: {id: 14, label: "14"}, weight: 1},
338
+ ]
339
+ rg_assert_equal expected, graphes[0].edges.sort_by(){|edge| edge.id}
340
+ end
341
+
342
+ def test_cut_edges_with_srn
343
+ @graph = Rgraphum::Analyzer::MemeTracker.new.cut_edges_with_srn(@graph)
344
+ @graph.edges.sort_by{|edge| edge.id }.each do |edge|
345
+ #p edge
346
+ end
347
+ end
348
+
349
+ private
350
+
351
+ def make_base_phrase_graph
352
+ phrase_array = [
353
+ { id: 1, words: %w{A} },
354
+ { id: 2, words: %w{A} },
355
+ ]
356
+ Rgraphum::Analyzer::MemeTracker.new(phrase_array)
357
+ end
358
+
359
+ def make_sample_graph_for_cluster
360
+ graph = Rgraphum::Graph.new
361
+ graph.vertices = [
362
+ {id: 1}, {id: 2}, {id: 3}, {id: 4}, {id: 5},
363
+ {id: 6}, {id: 7}, {id: 8}, {id: 9}, {id: 10},
364
+ {id: 11}, {id: 12}, {id: 13}, {id: 14}, {id: 15},
365
+ ]
366
+ graph.edges = [
367
+ {source: 1, target: 4}, {source: 1, target: 5},
368
+ {source: 2, target: 5}, {source: 2, target: 6}, {source: 2, target: 7},
369
+ {source: 3, target: 6}, {source: 3, target: 7},
370
+ {source: 4, target: 8},
371
+ {source: 5, target: 8}, {source: 5, target: 9}, {source: 5, target: 10},
372
+ {source: 6, target: 10}, {source: 6, target: 11},
373
+ {source: 7, target: 11}, {source: 7, target: 15},
374
+ {source: 8, target: 13},
375
+ {source: 9, target: 13},
376
+ {source: 10, target: 14},
377
+ {source: 11, target: 14},
378
+ {source: 12, target: 15},
379
+ ]
380
+ graph.edges.each { |edge| edge.weight = 1 }
381
+ graph
382
+ end
383
+ end
@@ -0,0 +1,120 @@
1
+ # coding: utf-8
2
+
3
+ require 'test_helper'
4
+ require 'rgraphum'
5
+ require 'csv'
6
+
7
+ class RTAtMarkTest < MiniTest::Test
8
+ def setup
9
+ twits
10
+ end
11
+
12
+ def test_make_graph
13
+ at = Rgraphum::Analyzer::RTAtMark.new
14
+ graph = at.make_graph(@twits)
15
+
16
+ assert_equal 4, graph.vertices.size
17
+
18
+ vertex = graph.vertices.detect { |vertex| vertex.id == 0 }
19
+ assert vertex
20
+ rg_assert_equal({id: 0, label: "piyo",
21
+ twits: [["221257277779353600", "piyo", "I remember it", "2013-04-04 15:30:00", "ja"],
22
+ ["221257277779353602", "piyo", "I like it", "2013-04-04 15:30:00", "ja"],
23
+ ["221257277779353605", "piyo", "I forget it", "2013-04-04 15:30:00", "ja"],
24
+ ["221257277779353605", "piyo", "@hura I forget it","2013-04-04 15:30:00", "ja"]]}, vertex )
25
+ vertex = graph.vertices.detect { |vertex| vertex.id == 1 }
26
+ assert vertex
27
+ rg_assert_equal({id: 1, label: "hoge",
28
+ twits: [["221257277779353601","hoge","@hoge remember me!","2013-01-01 12:00:00","ja"],
29
+ ["221257277779353604","hoge","Jast me @huga Do you mean @Hoge remember me!","2013-03-03 14:20:00","ja"]]}, vertex)
30
+
31
+ vertex = graph.vertices.detect { |vertex| vertex.id == 2 }
32
+ assert vertex
33
+ rg_assert_equal({id: 2, label: "huga",
34
+ twits: [["221257277779353603","huga","Do you mean @hoge remember me!","2013-02-02 13:10:00","ja"],
35
+ ["221257277779353604","huga","Do you mean @Hoge remember me!","2013-03-03 14:20:00","ja"]]}, vertex)
36
+
37
+ vertex = graph.vertices.detect { |vertex| vertex.id == 3 }
38
+ assert vertex
39
+ rg_assert_equal({id: 3, label: "hura"}, vertex)
40
+
41
+ assert_equal 5, graph.edges.size
42
+
43
+ edge = graph.edges.detect { |edge| edge.id == 0 }
44
+ assert edge
45
+ expected_edge = {id: 0, source: graph.vertices[1], target: graph.vertices[1], label: "@hoge remember me!", weight: 1}
46
+ assert_equal(expected_edge[:source].id, edge.source.id)
47
+ assert_equal(expected_edge[:target].id, edge.target.id)
48
+ assert_equal(expected_edge[:label], edge.label)
49
+ assert_equal(expected_edge[:weight], edge.weight)
50
+
51
+ edge = graph.edges.detect { |edge| edge.id == 1 }
52
+ assert edge
53
+ expected_edge = {id: 1, source: graph.vertices[1], target: graph.vertices[2], label: "Do you mean @hoge remember me!", weight: 1}
54
+ assert_equal(expected_edge[:source].id, edge.source.id)
55
+ assert_equal(expected_edge[:target].id, edge.target.id)
56
+ assert_equal(expected_edge[:label], edge.label)
57
+ assert_equal(expected_edge[:weight], edge.weight)
58
+
59
+ edge = graph.edges.detect { |edge| edge.id == 2 }
60
+ assert edge
61
+ expected_edge = {id: 2, source: graph.vertices[1], target: graph.vertices[2], label: "Do you mean @Hoge remember me!", weight: 1}
62
+ assert_equal(expected_edge[:source].id, edge.source.id)
63
+ assert_equal(expected_edge[:target].id, edge.target.id)
64
+ assert_equal(expected_edge[:label], edge.label)
65
+ assert_equal(expected_edge[:weight], edge.weight)
66
+
67
+ edge = graph.edges.detect { |edge| edge.id == 3 }
68
+ assert edge
69
+ expected_edge = {id: 3, source: graph.vertices[2], target: graph.vertices[1], label: "Jast me @huga Do you mean @Hoge remember me!", weight: 1}
70
+ assert_equal(expected_edge[:source].id, edge.source.id)
71
+ assert_equal(expected_edge[:target].id, edge.target.id)
72
+ assert_equal(expected_edge[:label], edge.label)
73
+ assert_equal(expected_edge[:weight], edge.weight)
74
+
75
+ edge = graph.edges.detect { |edge| edge.id == 4 }
76
+ assert edge
77
+ expected_edge = {id: 4, source: graph.vertices[3], target: graph.vertices[0], label: "@hura I forget it", weight: 1}
78
+ assert_equal(expected_edge[:source].id, edge.source.id)
79
+ assert_equal(expected_edge[:target].id, edge.target.id)
80
+ assert_equal(expected_edge[:label], edge.label)
81
+ assert_equal(expected_edge[:weight], edge.weight)
82
+ end
83
+
84
+ def test_pickup_screen_name
85
+ at = Rgraphum::Analyzer::RTAtMark.new
86
+ text = "@hoge huga"
87
+ assert_equal "hoge", at.pickup_screen_name(text)
88
+
89
+ text = " @hoge huga"
90
+ assert_equal "hoge", at.pickup_screen_name(text)
91
+
92
+ text = "huga @hoge"
93
+ assert_equal "hoge", at.pickup_screen_name(text)
94
+
95
+ text = "(@hoge) huga"
96
+ assert_equal "hoge", at.pickup_screen_name(text)
97
+
98
+ text = "@hoge: huga"
99
+ assert_equal "hoge", at.pickup_screen_name(text)
100
+
101
+ text = "@Hoge_Huga"
102
+ assert_equal "hoge_huga", at.pickup_screen_name(text)
103
+ end
104
+
105
+ private
106
+
107
+ def twits
108
+ @twits = [
109
+ ["221257277779353600",nil,nil,nil,nil,nil,nil,"piyo","I remember it" ,nil,nil,"2013-04-04 15:30:00","ja",nil],
110
+ ["221257277779353601",nil,nil,nil,nil,nil,nil,"hoge","@hoge remember me!" ,nil,nil,"2013-01-01 12:00:00","ja",nil],
111
+ ["221257277779353602",nil,nil,nil,nil,nil,nil,"piyo","I like it" ,nil,nil,"2013-04-04 15:30:00","ja",nil],
112
+ ["221257277779353603",nil,nil,nil,nil,nil,nil,"huga","Do you mean @hoge remember me!" ,nil,nil,"2013-02-02 13:10:00","ja",nil],
113
+ ["221257277779353604",nil,nil,nil,nil,nil,nil,"huga","Do you mean @Hoge remember me!" ,nil,nil,"2013-03-03 14:20:00","ja",nil],
114
+ ["221257277779353604",nil,nil,nil,nil,nil,nil,"hoge","Jast me @huga Do you mean @Hoge remember me!",nil,nil,"2013-03-03 14:20:00","ja",nil],
115
+ ["221257277779353605",nil,nil,nil,nil,nil,nil,"piyo","I forget it" ,nil,nil,"2013-04-04 15:30:00","ja",nil],
116
+ ["221257277779353605",nil,nil,nil,nil,nil,nil,"piyo","@hura I forget it" ,nil,nil,"2013-04-04 15:30:00","ja",nil]
117
+ ]
118
+ end
119
+
120
+ end
@@ -0,0 +1,95 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rgraphum'
4
+ require 'test_helper'
5
+
6
+ class RgraphumArrayTest < MiniTest::Test
7
+ def setup
8
+ @graph = Rgraphum::Graph.new
9
+ end
10
+
11
+ def test_vertex_in_E_in_outE_out
12
+ @graph.vertices = [
13
+ {:id => 1, :label => "hoge" },
14
+ {:id => 2, :label => "huga" },
15
+ ]
16
+ @graph.edges = [{id: 1, source: 1, target: 2}]
17
+
18
+ # rg_assert_equal [{id:1, source: {id:1, label:"hoge"}, target:{id: 2, label: "huga"}}], @graph.vertices[0].edges
19
+ assert_equal 1, @graph.vertices[0].edges.size
20
+ assert_equal 1, @graph.vertices[0].edges[0].id
21
+ rg_assert_equal({id: 1, label: "hoge"}, @graph.vertices[0].edges[0].source)
22
+ rg_assert_equal({id: 2, label: "huga"}, @graph.vertices[0].edges[0].target)
23
+
24
+ assert_empty @graph.vertices[0].inE
25
+ assert_empty @graph.vertices[0].in
26
+ # rg_assert_equal [{ id:1, source: {id:1,label:"hoge"}, target:{id:2,label:"huga"} }], @graph.vertices[0].outE
27
+ assert_equal 1, @graph.vertices[0].outE.size
28
+ assert_equal 1, @graph.vertices[0].outE[0].id
29
+ rg_assert_equal({id:1,label:"hoge"}, @graph.vertices[0].outE[0].source)
30
+ rg_assert_equal({id:2,label:"huga"}, @graph.vertices[0].outE[0].target)
31
+
32
+ rg_assert_equal [{id:2,label:"huga"}], @graph.vertices[0].out
33
+
34
+ assert_empty @graph.vertices[1].outE
35
+ assert_empty @graph.vertices[1].out
36
+ # rg_assert_equal [{id:1, source: {id:1,label:"hoge"}, target:{id:2,label:"huga"} }], @graph.vertices[1].inE
37
+ assert_equal 1, @graph.vertices[1].inE.size
38
+ assert_equal 1, @graph.vertices[1].inE[0].id
39
+ rg_assert_equal({id: 1,label: "hoge"}, @graph.vertices[1].inE[0].source)
40
+ rg_assert_equal({id: 2,label: "huga"}, @graph.vertices[1].inE[0].target)
41
+ rg_assert_equal [{id:1,label:"hoge"}], @graph.vertices[1].in
42
+ end
43
+
44
+ def test_start_root_vertices
45
+ @graph.vertices = [
46
+ { id: 1, label: "a" },
47
+ { id: 2, label: "b" },
48
+ { id: 3, label: "c" },
49
+ { id: 4, label: "d" },
50
+ { id: 5, label: "e" },
51
+ { id: 6, label: "f" },
52
+ { id: 7, label: "g" },
53
+ { id: 8, label: "h" },
54
+ { id: 9, label: "i" },
55
+ ]
56
+ @graph.edges = [
57
+ { source: 1, target: 2 }, # *1 "a"
58
+ { source: 2, target: 3 },
59
+ { source: 3, target: 4 },
60
+ { source: 5, target: 4 }, # *5 "e"
61
+ { source: 3, target: 6 },
62
+ { source: 7, target: 6 }, # *7 "g"
63
+ { source: 7, target: 8 },
64
+ # # *9 "i"
65
+ ]
66
+
67
+ assert_equal ["a", "e", "g", "i"], @graph.start_root_vertices.map(&:label)
68
+ end
69
+
70
+ def test_end_root_vertices
71
+ @graph.vertices = [
72
+ { id: 1, label: "a" },
73
+ { id: 2, label: "b" },
74
+ { id: 3, label: "c" },
75
+ { id: 4, label: "d" },
76
+ { id: 5, label: "e" },
77
+ { id: 6, label: "f" },
78
+ { id: 7, label: "g" },
79
+ { id: 8, label: "h" },
80
+ { id: 9, label: "i" },
81
+ ]
82
+ @graph.edges = [
83
+ { source: 1, target: 2 },
84
+ { source: 2, target: 3 },
85
+ { source: 3, target: 4 }, # *4 "d"
86
+ { source: 5, target: 4 },
87
+ { source: 3, target: 6 }, # *6 "f"
88
+ { source: 7, target: 6 },
89
+ { source: 7, target: 8 }, # *8 "h"
90
+ # # *9 "i"
91
+ ]
92
+
93
+ assert_equal ["d", "f", "h", "i"], @graph.end_root_vertices.map(&:label)
94
+ end
95
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class BubbleTest < MiniTest::Test
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+ require 'rgraphum'
5
+
6
+ class RgraphumCommunitiesTest < MiniTest::Test
7
+ def setup
8
+ end
9
+
10
+ def test_new_communities
11
+ communities = Rgraphum::Communities.new
12
+
13
+ assert_empty communities
14
+ end
15
+
16
+ def test_communities_with_1_community
17
+ communities = Rgraphum::Communities.new
18
+ community = communities.build({})
19
+
20
+ assert_equal 1, communities.size
21
+ assert_same community, communities[0]
22
+ end
23
+
24
+ def test_converter
25
+ communities = Rgraphum::Communities.new
26
+ communities2 = Rgraphum::Communities(communities)
27
+
28
+ assert_same communities, communities2
29
+ end
30
+
31
+ def test_delete
32
+ communities = Rgraphum::Communities.new
33
+ c1 = communities.build(id: 1)
34
+ c2 = communities.build(id: 2)
35
+ c3 = communities.build(id: 3)
36
+ c4 = communities.build(id: 4)
37
+ c5 = communities.build(id: 5)
38
+
39
+ assert_equal 5, communities.size
40
+ assert_equal [1,2,3,4,5], communities.map(&:id)
41
+
42
+ communities.delete c2
43
+
44
+ assert_equal 4, communities.size
45
+ assert_equal [1,3,4,5], communities.map(&:id)
46
+
47
+
48
+ communities.delete c5.id
49
+
50
+ assert_equal 3, communities.size
51
+ assert_equal [1,3,4], communities.map(&:id)
52
+ end
53
+ end
@@ -0,0 +1,18 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rgraphum'
4
+ require 'test_helper'
5
+
6
+ class CosineSimilarityTest < MiniTest::Test
7
+
8
+ def test_similarity
9
+ csm = CosineSimilarityMatrix.new
10
+ sim = csm.similarity( [[1,1],[1,-1],[-1,1],[-1,-1] ] )
11
+
12
+ assert_equal [
13
+ [ 1.0, 0.0, 0.0, -1.0],
14
+ [ 0.0, 1.0, -1.0, 0.0],
15
+ [ 0.0, -1.0, 1.0, 0.0],
16
+ [-1.0, 0.0, 0.0, 1.0]], sim
17
+ end
18
+ end