silicium 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +3 -3
  3. data/.gitignore +13 -13
  4. data/.rakeTasks +8 -0
  5. data/.travis.yml +28 -25
  6. data/CODE_OF_CONDUCT.md +74 -74
  7. data/Gemfile +8 -8
  8. data/LICENSE.txt +21 -21
  9. data/Makefile +269 -269
  10. data/README.md +588 -46
  11. data/Rakefile +16 -16
  12. data/bin/console +14 -14
  13. data/bin/setup +8 -8
  14. data/docs/Object.html +117 -117
  15. data/docs/README_md.html +142 -142
  16. data/docs/Silicium/Combinatorics.html +270 -270
  17. data/docs/Silicium/Dice/Polyhedron.html +315 -315
  18. data/docs/Silicium/Dice/PolyhedronSet.html +321 -321
  19. data/docs/Silicium/Dice.html +99 -99
  20. data/docs/Silicium/Error.html +106 -106
  21. data/docs/Silicium/Geometry/Line2dCanon.html +243 -243
  22. data/docs/Silicium/Geometry/VariablesOrderException.html +106 -106
  23. data/docs/Silicium/Geometry.html +940 -940
  24. data/docs/Silicium/GraphVisualizer.html +226 -0
  25. data/docs/Silicium/Graphs/GraphError.html +106 -106
  26. data/docs/Silicium/Graphs/OrientedGraph.html +901 -775
  27. data/docs/Silicium/Graphs/UnorientedGraph.html +237 -284
  28. data/docs/Silicium/Graphs.html +374 -164
  29. data/docs/Silicium/IntegralDoesntExistError.html +106 -106
  30. data/docs/Silicium/NumericalIntegration.html +521 -521
  31. data/docs/Silicium/Optimization.html +629 -639
  32. data/docs/Silicium/Plotter/Image.html +297 -297
  33. data/docs/Silicium/Plotter.html +186 -186
  34. data/docs/Silicium.html +101 -101
  35. data/docs/created.rid +9 -9
  36. data/docs/css/fonts.css +167 -167
  37. data/docs/css/rdoc.css +619 -619
  38. data/docs/index.html +134 -132
  39. data/docs/js/darkfish.js +84 -84
  40. data/docs/js/navigation.js +105 -105
  41. data/docs/js/search.js +110 -110
  42. data/docs/js/search_index.js +1 -1
  43. data/docs/js/search_index.js.gz +0 -0
  44. data/docs/js/searcher.js +229 -229
  45. data/docs/table_of_contents.html +697 -608
  46. data/lib/algebra.rb +452 -0
  47. data/lib/algebra_diff.rb +258 -0
  48. data/lib/geometry/figure.rb +62 -0
  49. data/lib/geometry.rb +290 -236
  50. data/lib/geometry3d.rb +270 -0
  51. data/lib/graph/dfs.rb +42 -0
  52. data/lib/graph/kruskal.rb +36 -0
  53. data/lib/graph/scc.rb +97 -0
  54. data/lib/graph.rb +350 -164
  55. data/lib/graph_visualizer.rb +287 -0
  56. data/lib/ml_algorithms.rb +181 -0
  57. data/lib/numerical_integration.rb +184 -147
  58. data/lib/optimization.rb +209 -144
  59. data/lib/plotter.rb +256 -96
  60. data/lib/polynomial_division.rb +132 -0
  61. data/lib/polynomial_interpolation.rb +94 -0
  62. data/lib/regression.rb +120 -0
  63. data/lib/silicium/adding.rb +37 -0
  64. data/lib/silicium/conversions.rb +23 -0
  65. data/lib/silicium/multi.rb +82 -0
  66. data/lib/silicium/sparse.rb +76 -0
  67. data/lib/silicium/sugar.rb +37 -0
  68. data/lib/silicium/trans.rb +26 -0
  69. data/lib/silicium/version.rb +3 -3
  70. data/lib/silicium.rb +5 -5
  71. data/lib/theory_of_probability.rb +240 -226
  72. data/lib/topological_sort.rb +50 -0
  73. data/oriented_graph.png +0 -0
  74. data/plot.png +0 -0
  75. data/silicium.gemspec +38 -39
  76. metadata +38 -16
@@ -0,0 +1,26 @@
1
+ module Silicium
2
+ module Sparse
3
+ # here goes tha addition to SparseMatrix class
4
+ class SparseMatrix
5
+ ##
6
+ # Returns a transposed copy of matrix
7
+ def transpose
8
+ new = copy
9
+ new.triplets.each do |triplet|
10
+ triplet[0], triplet[1] = triplet[1], triplet[0]
11
+ end
12
+ new
13
+ end
14
+
15
+ ##
16
+ # Transposes matrix
17
+ def transpose!
18
+ triplets.each do |triplet|
19
+ triplet[0], triplet[1] = triplet[1], triplet[0]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+
@@ -1,3 +1,3 @@
1
- module Silicium
2
- VERSION = "0.0.20"
3
- end
1
+ module Silicium
2
+ VERSION = "0.0.21"
3
+ end
data/lib/silicium.rb CHANGED
@@ -1,5 +1,5 @@
1
- require "silicium/version"
2
-
3
- module Silicium
4
- class Error < StandardError; end
5
- end
1
+ require "silicium/version"
2
+
3
+ module Silicium
4
+ class Error < StandardError; end
5
+ end
@@ -1,227 +1,241 @@
1
- require 'silicium'
2
- require 'plotter'
3
- require 'chunky_png'
4
-
5
- include Silicium::Plotter
6
- module Silicium
7
-
8
- module Combinatorics
9
-
10
- def factorial(n)
11
- res = (1..n).inject(:*) || 1
12
- res
13
- end
14
-
15
- ##
16
- #Factorial for counting 3 parameters in one run
17
- def fact(n, k)
18
- res = [1,1,1]
19
- if n > 1
20
- fact_n_greater_1(n, k, res)
21
- end
22
- res
23
- end
24
-
25
- ##
26
- #Function C(n,k)
27
- def combination(n, k)
28
- f = fact(n, k)
29
- if n < k or k <= 0
30
- -1
31
- else
32
- f[0] / (f[2] * f[1])
33
- end
34
- end
35
-
36
- ##
37
- #Function A(n,k)
38
- def arrangement(n, k)
39
- f = fact(n, k)
40
- if n < k or k <= 0
41
- -1
42
- else
43
- f[0] / f[1]
44
- end
45
- end
46
-
47
- private
48
-
49
- def fact_n_greater_1(n,k, res)
50
- c = 1
51
- for i in 2..n
52
- c *= i
53
- determining_i([i, n, k, c], res)
54
- end
55
- res[0] = c
56
- end
57
-
58
- def determining_i(arr, res)
59
- if arr[0] == arr[1] - arr[2]
60
- res[1] = arr[3]
61
- end
62
- if arr[0] == arr[2]
63
- res[2] = arr[3]
64
- end
65
- end
66
-
67
- end
68
-
69
- module Dice
70
-
71
- ##
72
- # Class represents a polyhedron
73
- # csides - number or sides
74
- # sides - array of sides(unusual for custom polyhedrons)
75
- class Polyhedron
76
-
77
- def csides
78
- @csides
79
- end
80
-
81
- def sides
82
- @sides
83
- end
84
-
85
- def to_s
86
- sides
87
- end
88
-
89
- ##
90
- # initializing polyhedron's variables
91
- # there are two ways how to create it
92
- # 1: by number (6) - creates polyhedron with 6 sides [1,2,3,4,5,6]
93
- # 2: by array ([1,3,5]) - creates polyhedron with 3 sides [1,3,5]
94
- def initialize(sides)
95
- @csides = 1
96
- @sides = [1]
97
- if sides.class == Integer and sides > 1
98
- @csides = sides
99
- (2..sides).each {|i| @sides << i}
100
- elsif sides.class == Array and sides.size > 0
101
- @csides = sides.size
102
- @sides = sides.sort
103
- end
104
- end
105
-
106
- ##
107
- # ability to throw a polyhedron
108
- def throw
109
- @sides[rand(0..@csides-1)]
110
- end
111
- end
112
-
113
- ##
114
- # Class represents a PolyhedronsSet
115
- # percentage - hash with chances of getting definite score
116
- class PolyhedronSet
117
-
118
- def initialize(arr)
119
- @pons = parse_pons(arr).sort_by{|item| -item.csides}
120
- @percentage = count_chance_sum
121
- end
122
-
123
- def percentage
124
- @percentage
125
- end
126
-
127
- ##
128
- # returns array of polyhedrons
129
- def to_s
130
- res = @pons.map {|item| item.to_s}
131
- res
132
- end
133
-
134
- ##
135
- # ability to throw a polyhedron's set using hash of chances
136
- def throw
137
- sum = 0
138
- r = rand
139
- @percentage.each do |item|
140
- sum += item[1]
141
- if sum > r
142
- item[0]
143
- break
144
- end
145
- end
146
- end
147
-
148
- ##
149
- # creating a graph representing chances of getting points
150
- def make_graph_by_plotter(x = percentage.size * 10, y = percentage.size * 10)
151
- filename = 'tmp/percentage.png'
152
- File.delete(filename) if File.exist?(filename)
153
- plotter = Image.new(x, y)
154
- plotter.bar_chart(percentage, 1, color('red @ 1.0'))
155
- plotter.export(filename)
156
- end
157
-
158
- private
159
-
160
- def parse_pons(arr)
161
- res = []
162
- arr.each do |item|
163
- res << Polyhedron.new(item)
164
- end
165
- res
166
- end
167
-
168
- def count_chance_sum_chances_step(arr1, arr2, arr3, h)
169
- n = 0
170
- m = 0
171
- sum = 0
172
- q = Queue.new
173
- h1 = Hash.new
174
- while m < arr2.size
175
- sum = m_0([sum, n, m], q, h, arr1)
176
- if q.size > arr2.size or m > 0
177
- sum -= q.pop
178
- end
179
- h1[arr1[n] + arr2[m]] = sum
180
- arr3 << (arr1[n] + arr2[m])
181
- nmarr = n_less_arr1_size(n, arr1, m)
182
- n, m = nmarr[0], nmarr[1]
183
- end
184
- h1
185
- end
186
-
187
- def m_0(arr, q, h, arr1)
188
- if arr[2] == 0
189
- a = h[arr1[arr[1]]]
190
- q << a
191
- arr[0] += a
192
- end
193
- arr[0]
194
- end
195
-
196
- def n_less_arr1_size(n, arr1, m)
197
- if n < arr1.size - 1
198
- n += 1
199
- else
200
- m += 1
201
- end
202
- [n,m]
203
- end
204
-
205
- def count_chance_sum
206
- h = Hash.new
207
- @pons[0].sides.each do |item|
208
- h[item] = 1
209
- end
210
- arr3 = @pons[0].sides
211
- for i in 1..@pons.size - 1
212
- arr1 = arr3
213
- arr3 = Array.new
214
- arr2 = @pons[i].sides
215
- h1 = count_chance_sum_chances_step(arr1, arr2, arr3, h)
216
- h = h1
217
- h1 = Hash.new
218
- end
219
- res = Hash.new
220
- fchance = @pons.inject(1) { |mult, item| mult * item.csides }
221
- arr3.each {|item| res[item] = Float(h[item]) / fchance}
222
- res
223
- end
224
-
225
- end
226
- end
1
+ require 'silicium'
2
+ require 'plotter'
3
+ require 'chunky_png'
4
+
5
+ include Silicium::Plotter
6
+
7
+ module Combinatorics
8
+
9
+ def factorial(n)
10
+ (1..n).inject(:*) || 1
11
+ end
12
+
13
+ ##
14
+ #Function C(n,k)
15
+ def combination(n, k)
16
+ f = fact(n, k)
17
+ if n < k or k <= 0
18
+ -1
19
+ else
20
+ f[0] / (f[2] * f[1])
21
+ end
22
+ end
23
+
24
+ ##
25
+ #Function A(n,k)
26
+ def arrangement(n, k)
27
+ f = fact(n, k)
28
+ if n < k or k <= 0
29
+ -1
30
+ else
31
+ f[0] / f[1]
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def fact(n, k)
38
+ res = [1,1,1]
39
+ fact_n_greater_1(n, k, res) if n > 1
40
+ res
41
+ end
42
+
43
+ def fact_n_greater_1(n,k, res)
44
+ c = 1
45
+ for i in 2..n
46
+ c *= i
47
+ determining_i([i, n, k, c], res)
48
+ end
49
+ res[0] = c
50
+ end
51
+
52
+ def determining_i(arr, res)
53
+ res[1] = arr[3] if arr[0] == arr[1] - arr[2]
54
+ res[2] = arr[3] if arr[0] == arr[2]
55
+ end
56
+
57
+ end
58
+
59
+ module Dice
60
+
61
+ ##
62
+ # Class represents a polyhedron
63
+ # csides - number or sides
64
+ # sides - array of sides(unusual for custom polyhedrons)
65
+ class Polyhedron
66
+
67
+ def csides
68
+ @csides
69
+ end
70
+
71
+ def sides
72
+ @sides
73
+ end
74
+
75
+ def to_s
76
+ sides
77
+ end
78
+
79
+ ##
80
+ # initializing polyhedron's variables
81
+ # there are two ways how to create it
82
+ # 1: by number (6) - creates polyhedron with 6 sides [1,2,3,4,5,6]
83
+ # 2: by array ([1,3,5]) - creates polyhedron with 3 sides [1,3,5]
84
+ def initialize(sides)
85
+ @csides = 1
86
+ @sides = [1]
87
+ if sides.class == Integer and sides > 1
88
+ @csides = sides
89
+ (2..sides).each {|i| @sides << i}
90
+ elsif sides.class == Array and sides.size > 0
91
+ @csides = sides.size
92
+ @sides = sides.sort
93
+ end
94
+ end
95
+
96
+ ##
97
+ # ability to throw a polyhedron
98
+ def throw
99
+ @sides[rand(0..@csides-1)]
100
+ end
101
+ end
102
+
103
+ ##
104
+ # Class represents a PolyhedronsSet
105
+ class PolyhedronSet
106
+
107
+ def initialize(arr)
108
+ @pons = parse_pons(arr).sort_by{|item| -item.csides}
109
+ @percentage = count_chance_sum
110
+ end
111
+
112
+ # hash with chances of getting definite score
113
+ def percentage
114
+ @percentage
115
+ end
116
+
117
+ ##
118
+ # returns array of polyhedrons
119
+ def to_s
120
+ @pons.map {|item| item.to_s}
121
+ end
122
+
123
+ ##
124
+ # ability to throw a polyhedron set using hash of chances
125
+ def throw
126
+ sum = 0
127
+ r = rand
128
+ @percentage.each do |item|
129
+ sum += item[1]
130
+ if sum >= r
131
+ item[0]
132
+ break
133
+ end
134
+ end
135
+ end
136
+
137
+ ##
138
+ # creating a graph representing chances of getting points
139
+ def make_graph_by_plotter(x = percentage.size * 10, y = percentage.size * 10)
140
+ filename = 'tmp/percentage.png'
141
+ File.delete(filename) if File.exist?(filename)
142
+ plotter = Image.new(x, y)
143
+ plotter.bar_chart(percentage, 1, color('red @ 1.0'))
144
+ plotter.export(filename)
145
+ end
146
+
147
+ private
148
+
149
+ def parse_pons(arr)
150
+ res = []
151
+ arr.each do |item|
152
+ if item.is_a?(Integer) or item.is_a?(Array)
153
+ res << Polyhedron.new(item)
154
+ elsif item.is_a?(Polyhedron)
155
+ res << item
156
+ end
157
+ end
158
+ res
159
+ end
160
+
161
+ def count_chance_sum_chances_step(arr1, arr2, arr3, h)
162
+ n = 0
163
+ m = 0
164
+ sum = 0
165
+ q = Queue.new
166
+ h1 = {}
167
+ while m < arr2.size
168
+ sum = m_0([sum, n, m], q, h, arr1)
169
+ sum -= q.pop if q.size > arr2.size || m > 0
170
+ h1[arr1[n] + arr2[m]] = sum
171
+ arr3 << (arr1[n] + arr2[m])
172
+ nmarr = n_less_arr1_size(n, arr1, m)
173
+ n, m = nmarr[0], nmarr[1]
174
+ end
175
+ h1
176
+ end
177
+
178
+ def m_0(arr, q, h, arr1)
179
+ if arr[2] == 0
180
+ a = h[arr1[arr[1]]]
181
+ q << a
182
+ arr[0] += a
183
+ end
184
+ arr[0]
185
+ end
186
+
187
+ def n_less_arr1_size(n, arr1, m)
188
+ if n < arr1.size - 1
189
+ n += 1
190
+ else
191
+ m += 1
192
+ end
193
+ [n,m]
194
+ end
195
+
196
+ def count_chance_sum
197
+ h = {}
198
+ @pons[0].sides.each { |item| h[item] = 1 }
199
+ arr3 = @pons[0].sides
200
+ for i in 1..@pons.size - 1
201
+ arr1 = arr3
202
+ arr3 = []
203
+ arr2 = @pons[i].sides
204
+ h1 = count_chance_sum_chances_step(arr1, arr2, arr3, h)
205
+ h = h1
206
+ end
207
+ res = {}
208
+ fchance = @pons.inject(1) { |mult, item| mult * item.csides }
209
+ arr3.each {|item| res[item] = Float(h[item]) / fchance}
210
+ res
211
+ end
212
+
213
+ end
214
+ end
215
+
216
+ module BernoulliTrials
217
+
218
+ include Combinatorics
219
+ include Math
220
+
221
+ def bernoulli_formula_and_laplace_theorem(n, k, all, suc = -1)
222
+ if suc != -1
223
+ p = suc.fdiv all
224
+ else
225
+ p = all
226
+ end
227
+ q = 1 - p
228
+ if n * p * q < 9 # Laplace theorem give satisfactory approximation for n*p*q > 9, else Bernoulli formula
229
+ combination(n, k) * (p ** k) * (q ** (n - k)) # Bernoulli formula C(n,k) * (p ^ k) * (q ^ (n-k))
230
+ else
231
+ gaussian_function((k - n * p).fdiv sqrt(n * p * q)).fdiv(sqrt(n * p * q)) # Laplace theorem φ((k - n*p)/sqrt(n*p*q)) / sqrt(n*p*q)
232
+ end
233
+ end
234
+
235
+ def gaussian_function(x)
236
+ if x < 0 # φ(-x) = φ(x)
237
+ x * -1
238
+ end
239
+ a = exp(-(x ** 2) / 2).fdiv sqrt(2 * PI) # φ(x) = exp(-(x^2/2)) / sqrt(2*π)
240
+ end
227
241
  end