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,178 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # SIR Model
4
+ # Susceptible Infected Recovered(Removed) Model
5
+ #
6
+ class Rgraphum::Simulator::SIRModel
7
+ attr_reader :graph
8
+ attr_reader :recovery_rate, :infection_rate
9
+
10
+ # options: Options Hash
11
+ # graph: Graph instance
12
+ # sir_map: Array of symbol(:s, :i or :r)
13
+ # infection_rate: λ 0 <= λ <= 1
14
+ # recovery_rate: μ 0 <= μ <= 1
15
+ # periods: 0 <=
16
+ # t_per_period: increase t for each period
17
+ #
18
+ def initialize(options={})
19
+ @graph = options[:graph]
20
+
21
+ @t_map = Hash.new(0)
22
+
23
+ @sir_map = {}
24
+ if options[:sir_map]
25
+ if @graph.vertices.size != options[:sir_map].size
26
+ raise ArgumentError, ":sir_map should be same size with graph.vertices"
27
+ end
28
+ options[:sir_map].each_with_index do |si, index|
29
+ vertex = @graph.vertices[index]
30
+ unless [:s, :i, :r].include?(si)
31
+ raise ArgumentError, ":sir_map can only have :s, :i or :r"
32
+ end
33
+ @sir_map[vertex.id] = si
34
+ end
35
+ else
36
+ @graph.vertices.each do |vertex|
37
+ @sir_map[vertex.id] = :s
38
+ end
39
+ end
40
+
41
+ if options[:infection_rate]
42
+ @infection_rate = options[:infection_rate].to_f
43
+ if @infection_rate < 0 || 1 < @infection_rate
44
+ raise ArgumentError, ":infection_rate should be between 0 and 1"
45
+ end
46
+ else
47
+ # raise ArgumentError, ":infection_rate is required"
48
+ end
49
+
50
+ if options[:recovery_rate]
51
+ @recovery_rate = options[:recovery_rate].to_f
52
+ if @recovery_rate < 0 || 1 < @recovery_rate
53
+ raise ArgumentError, ":recovery_rate should be between 0 and 1"
54
+ end
55
+ else
56
+ # raise ArgumentError, ":recovery_rate is required"
57
+ end
58
+
59
+ if options[:periods]
60
+ @periods = options[:periods].to_i
61
+ if 0 > @periods
62
+ raise ArgumentError, ":periods should be greater than equal 0"
63
+ end
64
+ end
65
+
66
+ if options[:t_per_period]
67
+ @t_per_period = options[:t_per_period].to_f
68
+ if 0 > @t_per_period
69
+ raise ArgumentError, ":t_per_period should be greater than equal 0"
70
+ end
71
+ else
72
+ @t_per_period = 1
73
+ end
74
+ end
75
+
76
+ # Simurate SIR Model
77
+ def simulate(options={})
78
+ periods = options[:periods].to_i
79
+ yield 0, self if block_given?
80
+ periods.times do |n|
81
+ next_period
82
+ yield n+1, self if block_given?
83
+ end
84
+ end
85
+
86
+ def vertices
87
+ @graph.vertices
88
+ end
89
+
90
+ def edges
91
+ @graph.edges
92
+ end
93
+
94
+ def next_period
95
+ new_sir_map = {}
96
+ new_t_map = {}
97
+
98
+ @graph.vertices.each do |vertex|
99
+ vertex_id = vertex.id
100
+ case @sir_map[vertex_id]
101
+ when :i
102
+ if recovered?(vertex, 1)
103
+ new_sir_map[vertex_id] = :r
104
+ new_t_map[vertex_id] = 0
105
+ else
106
+ new_sir_map[vertex_id] = :i
107
+ new_t_map[vertex_id] = @t_map[vertex_id] + @t_per_period
108
+ end
109
+ when :s
110
+ if infected?(vertex, 1)
111
+ new_sir_map[vertex_id] = :i
112
+ new_t_map[vertex_id] = 0
113
+ else
114
+ new_sir_map[vertex_id] = :s
115
+ new_t_map[vertex_id] = @t_map[vertex_id] + @t_per_period
116
+ end
117
+ when :r
118
+ new_sir_map[vertex_id] = :r
119
+ new_t_map[vertex_id] = 0
120
+ end
121
+ end
122
+
123
+ @sir_map = new_sir_map
124
+ @t_map = new_t_map
125
+ end
126
+
127
+ def infected?(vertex, periods=0)
128
+ return false if @sir_map[vertex.id] == :r
129
+ return true if @sir_map[vertex.id] == :i
130
+ return false if periods.zero?
131
+
132
+ t = @t_map[vertex.id] + @t_per_period * periods
133
+
134
+ num_infected = vertex.both.inject(0) { |num_infected, v|
135
+ num_infected + (@sir_map[v.id] == :i ? 1 : 0)
136
+ }
137
+
138
+ if 1 <= num_infected * infection_rate * t
139
+ true
140
+ else
141
+ false
142
+ end
143
+ end
144
+
145
+ # def susceptible?(vertex, periods=0)
146
+ # return true if @sir_map[vertex.id] == :s
147
+ # return false if @sir_map[vertex.id] == :r
148
+ # return false if periods.zero?
149
+
150
+ # t = @t_map[vertex.id] + @t_per_period * periods
151
+
152
+ # if 1 <= recovery_rate * t
153
+ # true
154
+ # else
155
+ # false
156
+ # end
157
+ # end
158
+
159
+ def recovered?(vertex, periods=0)
160
+ return true if @sir_map[vertex.id] == :r
161
+ return false if @sir_map[vertex.id] == :s
162
+ return false if periods.zero?
163
+
164
+ t = @t_map[vertex.id] + @t_per_period * periods
165
+
166
+ if 1 <= recovery_rate * t
167
+ true
168
+ else
169
+ false
170
+ end
171
+ end
172
+ alias :removed? :recovered?
173
+
174
+ # SIR(:s, :i or :r) array, order is the same as vertices
175
+ def sir_map
176
+ @sir_map.values
177
+ end
178
+ end
@@ -0,0 +1,158 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # SIS Model
4
+ # Susceptible Infected Susceptible Model
5
+ #
6
+ class Rgraphum::Simulator::SISModel
7
+ attr_reader :graph
8
+ attr_reader :recovery_rate, :infection_rate
9
+
10
+ # options: Options Hash
11
+ # graph: Graph instance
12
+ # si_map: Array of symbol(:s or :i)
13
+ # infection_rate: λ 0 <= λ <= 1
14
+ # recovery_rate: μ 0 <= μ <= 1
15
+ # periods: 0 <=
16
+ # t_per_period: increase t for each period
17
+ #
18
+ def initialize(options={})
19
+ @graph = options[:graph]
20
+
21
+ @t_map = Hash.new(0)
22
+
23
+ @si_map = {}
24
+ if options[:si_map]
25
+ if @graph.vertices.size != options[:si_map].size
26
+ raise ArgumentError, ":si_map should be same size with graph.vertices"
27
+ end
28
+ options[:si_map].each_with_index do |si, index|
29
+ vertex = @graph.vertices[index]
30
+ unless [:s, :i].include?(si)
31
+ raise ArgumentError, ":si_map can only have :s or :i"
32
+ end
33
+ @si_map[vertex.id] = si
34
+ end
35
+ else
36
+ @graph.vertices.each do |vertex|
37
+ @si_map[vertex.id] = :s
38
+ end
39
+ end
40
+
41
+ if options[:infection_rate]
42
+ @infection_rate = options[:infection_rate].to_f
43
+ if @infection_rate < 0 || 1 < @infection_rate
44
+ raise ArgumentError, ":infection_rate should be between 0 and 1"
45
+ end
46
+ else
47
+ # raise ArgumentError, ":infection_rate is required"
48
+ end
49
+
50
+ if options[:recovery_rate]
51
+ @recovery_rate = options[:recovery_rate].to_f
52
+ if @recovery_rate < 0 || 1 < @recovery_rate
53
+ raise ArgumentError, ":recovery_rate should be between 0 and 1"
54
+ end
55
+ else
56
+ # raise ArgumentError, ":recovery_rate is required"
57
+ end
58
+
59
+ if options[:periods]
60
+ @periods = options[:periods].to_i
61
+ if 0 > @periods
62
+ raise ArgumentError, ":periods should be greater than equal 0"
63
+ end
64
+ end
65
+
66
+ if options[:t_per_period]
67
+ @t_per_period = options[:t_per_period].to_f
68
+ if 0 > @t_per_period
69
+ raise ArgumentError, ":t_per_period should be greater than equal 0"
70
+ end
71
+ else
72
+ @t_per_period = 1
73
+ end
74
+ end
75
+
76
+ # Simurate SIS Model
77
+ def simulate(options={})
78
+ periods = options[:periods].to_i
79
+ yield 0, self if block_given?
80
+ periods.times do |n|
81
+ next_period
82
+ yield n+1, self if block_given?
83
+ end
84
+ end
85
+
86
+ def vertices
87
+ @graph.vertices
88
+ end
89
+
90
+ def edges
91
+ @graph.edges
92
+ end
93
+
94
+ def next_period
95
+ new_si_map = {}
96
+ new_t_map = {}
97
+
98
+ @graph.vertices.each do |vertex|
99
+ vertex_id = vertex.id
100
+ case @si_map[vertex_id]
101
+ when :i
102
+ if susceptible?(vertex, 1)
103
+ new_si_map[vertex_id] = :s
104
+ new_t_map[vertex_id] = 0
105
+ else
106
+ new_si_map[vertex_id] = :i
107
+ new_t_map[vertex_id] = @t_map[vertex_id] + @t_per_period
108
+ end
109
+ when :s
110
+ if infected?(vertex, 1)
111
+ new_si_map[vertex_id] = :i
112
+ new_t_map[vertex_id] = 0
113
+ else
114
+ new_si_map[vertex_id] = :s
115
+ new_t_map[vertex_id] = @t_map[vertex_id] + @t_per_period
116
+ end
117
+ end
118
+ end
119
+
120
+ @si_map = new_si_map
121
+ @t_map = new_t_map
122
+ end
123
+
124
+ def infected?(vertex, periods=0)
125
+ return true if @si_map[vertex.id] == :i
126
+ return false if periods.zero?
127
+
128
+ t = @t_map[vertex.id] + @t_per_period * periods
129
+
130
+ num_infected = vertex.both.inject(0) { |num_infected, v|
131
+ num_infected + (@si_map[v.id] == :i ? 1 : 0)
132
+ }
133
+
134
+ if 1 <= num_infected * infection_rate * t
135
+ true
136
+ else
137
+ false
138
+ end
139
+ end
140
+
141
+ def susceptible?(vertex, periods=0)
142
+ return true if @si_map[vertex.id] == :s
143
+ return false if periods.zero?
144
+
145
+ t = @t_map[vertex.id] + @t_per_period * periods
146
+
147
+ if 1 <= recovery_rate * t
148
+ true
149
+ else
150
+ false
151
+ end
152
+ end
153
+
154
+ # SI(:s or :i) array, order is the same as vertices
155
+ def si_map
156
+ @si_map.values
157
+ end
158
+ end
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Rgraphum::Simulator
4
+ require_relative 'simulator/ba_model'
5
+ require_relative 'simulator/sis_model'
6
+ require_relative 'simulator/sir_model'
7
+
8
+ MODEL_NAME_MODEL_MAP = {
9
+ "bamodel" => Rgraphum::Simulator::BAModel,
10
+ "sismodel" => Rgraphum::Simulator::SISModel,
11
+ "sirmodel" => Rgraphum::Simulator::SIRModel,
12
+ }
13
+
14
+ def simulate(model_name, options={})
15
+ model_class = guess_model_class(model_name)
16
+ new_options = options.merge(graph: self)
17
+ simulator = model_class.new(new_options)
18
+ simulator.simulate(options)
19
+ end
20
+
21
+ private
22
+
23
+ def guess_model_class(model_name)
24
+ name = model_name.dup.downcase.gsub(/[^a-z0-9]/, "")
25
+ model = MODEL_NAME_MODEL_MAP[name]
26
+ return model if model
27
+ raise ArgumentError, "Simulator model not found: '#{model_name}'"
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ module Rgraphum::Statistic
2
+ class PowerLaw
3
+ end
4
+
5
+ def power_low_rand(max,min,exponent)
6
+ ( (max^exponent-min^exponent)*rand() + min^exponent )^( 1.0/exponent )
7
+ end
8
+ end
9
+
data/lib/rgraphum/t.rb ADDED
@@ -0,0 +1,12 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Rgraphum::T
4
+ class << self
5
+ def gt; :>; end
6
+ def gte; :>=; end
7
+ def eq; :==; end
8
+ def neq; :!=; end
9
+ def lte; :<=; end
10
+ def lt; :<; end
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+
3
+ #require 'matrix'
4
+ #require 'inline'
5
+
6
+ class TfIdf
7
+ def tf_idf(matrix)
8
+ row_size = matrix.size.to_f
9
+
10
+ idf = matrix.transpose.map do |col_array|
11
+ df = col_array.select{|n| n > 0 }.size.to_f
12
+ Math.log( row_size / df )
13
+ end
14
+
15
+ matrix.map do |row_array|
16
+ row_sum = row_array.inject(&:+).to_f
17
+
18
+ tmp = []
19
+ row_array.each_with_index do |n,i|
20
+ tmp << ( n / row_sum ) * idf[i]
21
+ end
22
+ tmp
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,3 @@
1
+ module Rgraphum
2
+ VERSION = "0.0.1.alpha"
3
+ end