rgraphum 0.0.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
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