silicium 0.0.20 → 0.0.21

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 (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