silicium 0.0.15 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +4 -0
  3. data/.gitignore +3 -1
  4. data/.travis.yml +12 -1
  5. data/Gemfile +4 -0
  6. data/Makefile +269 -0
  7. data/README.md +2 -0
  8. data/Rakefile +7 -0
  9. data/docs/Object.html +117 -0
  10. data/docs/README_md.html +142 -0
  11. data/docs/Silicium.html +101 -0
  12. data/docs/Silicium/Combinatorics.html +270 -0
  13. data/docs/Silicium/Dice.html +99 -0
  14. data/docs/Silicium/Dice/Polyhedron.html +315 -0
  15. data/docs/Silicium/Dice/PolyhedronSet.html +321 -0
  16. data/docs/Silicium/Error.html +106 -0
  17. data/docs/Silicium/Geometry.html +940 -0
  18. data/docs/Silicium/Geometry/Line2dCanon.html +243 -0
  19. data/docs/Silicium/Geometry/VariablesOrderException.html +106 -0
  20. data/docs/Silicium/Graphs.html +164 -0
  21. data/docs/Silicium/Graphs/GraphError.html +106 -0
  22. data/docs/Silicium/Graphs/OrientedGraph.html +775 -0
  23. data/docs/Silicium/Graphs/UnorientedGraph.html +284 -0
  24. data/docs/Silicium/IntegralDoesntExistError.html +106 -0
  25. data/docs/Silicium/NumericalIntegration.html +521 -0
  26. data/docs/Silicium/Optimization.html +639 -0
  27. data/docs/Silicium/Plotter.html +186 -0
  28. data/docs/Silicium/Plotter/Image.html +297 -0
  29. data/docs/created.rid +9 -0
  30. data/docs/css/fonts.css +167 -0
  31. data/docs/css/rdoc.css +619 -0
  32. data/docs/fonts/Lato-Light.ttf +0 -0
  33. data/docs/fonts/Lato-LightItalic.ttf +0 -0
  34. data/docs/fonts/Lato-Regular.ttf +0 -0
  35. data/docs/fonts/Lato-RegularItalic.ttf +0 -0
  36. data/docs/fonts/SourceCodePro-Bold.ttf +0 -0
  37. data/docs/fonts/SourceCodePro-Regular.ttf +0 -0
  38. data/docs/images/add.png +0 -0
  39. data/docs/images/arrow_up.png +0 -0
  40. data/docs/images/brick.png +0 -0
  41. data/docs/images/brick_link.png +0 -0
  42. data/docs/images/bug.png +0 -0
  43. data/docs/images/bullet_black.png +0 -0
  44. data/docs/images/bullet_toggle_minus.png +0 -0
  45. data/docs/images/bullet_toggle_plus.png +0 -0
  46. data/docs/images/date.png +0 -0
  47. data/docs/images/delete.png +0 -0
  48. data/docs/images/find.png +0 -0
  49. data/docs/images/loadingAnimation.gif +0 -0
  50. data/docs/images/macFFBgHack.png +0 -0
  51. data/docs/images/package.png +0 -0
  52. data/docs/images/page_green.png +0 -0
  53. data/docs/images/page_white_text.png +0 -0
  54. data/docs/images/page_white_width.png +0 -0
  55. data/docs/images/plugin.png +0 -0
  56. data/docs/images/ruby.png +0 -0
  57. data/docs/images/tag_blue.png +0 -0
  58. data/docs/images/tag_green.png +0 -0
  59. data/docs/images/transparent.png +0 -0
  60. data/docs/images/wrench.png +0 -0
  61. data/docs/images/wrench_orange.png +0 -0
  62. data/docs/images/zoom.png +0 -0
  63. data/docs/index.html +132 -0
  64. data/docs/js/darkfish.js +84 -0
  65. data/docs/js/navigation.js +105 -0
  66. data/docs/js/navigation.js.gz +0 -0
  67. data/docs/js/search.js +110 -0
  68. data/docs/js/search_index.js +1 -0
  69. data/docs/js/search_index.js.gz +0 -0
  70. data/docs/js/searcher.js +229 -0
  71. data/docs/js/searcher.js.gz +0 -0
  72. data/docs/table_of_contents.html +608 -0
  73. data/lib/geometry.rb +236 -0
  74. data/lib/graph.rb +164 -0
  75. data/lib/numerical_integration.rb +147 -0
  76. data/lib/optimization.rb +144 -0
  77. data/lib/plotter.rb +96 -0
  78. data/lib/silicium.rb +0 -1
  79. data/lib/silicium/version.rb +1 -1
  80. data/lib/theory_of_probability.rb +227 -0
  81. data/silicium.gemspec +4 -2
  82. metadata +90 -3
@@ -0,0 +1,144 @@
1
+ require "silicium"
2
+ require 'fast_matrix'
3
+
4
+ module Silicium
5
+ module Optimization
6
+
7
+
8
+ # reflector function
9
+ def re_lu(x)
10
+ x.negative? ? 0 : x
11
+ end
12
+
13
+ #sigmoid function
14
+ def sigmoid(x)
15
+ 1.0 / (1 + Math.exp(-x))
16
+ end
17
+
18
+ #integrating using method Monte Carlo (f - function, a, b - integrating limits, n - amount of random numbers)
19
+ def integrating_Monte_Carlo_base(a, b, n = 100000, &block)
20
+ res = 0
21
+ range = a..b.to_f
22
+ for i in 1..(n + 1)
23
+ x = rand(range)
24
+ res += (b - a) * 1.0 / n * block.call(x)
25
+ end
26
+ res
27
+ end
28
+
29
+ #return true if array is sorted
30
+ def sorted?(a)
31
+ return false if a.nil?
32
+ for i in 0..a.length - 2
33
+ if (a[i + 1] < a[i])
34
+ return false
35
+ end
36
+ end
37
+ true
38
+ end
39
+
40
+ #fastest(but it is not exactly) sort, modify sequance
41
+ def bogosort!(a)
42
+ if (a.nil?)
43
+ raise ArgumentError, "Nil array in bogosort"
44
+ end
45
+ while (!sorted?(a))
46
+ a.shuffle!
47
+ end
48
+ a
49
+ end
50
+
51
+ #fastest(but it is not exactly) sort
52
+ def bogosort(a)
53
+ if (a.nil?)
54
+ raise ArgumentError, "Nil array in bogosort"
55
+ end
56
+ crutch = a
57
+ while (!sorted?(crutch))
58
+ crutch = a.shuffle
59
+ end
60
+ crutch
61
+ end
62
+
63
+ #calculate current accuracy in Hook - Jeeves method
64
+ def accuracy(step)
65
+ acc = 0
66
+ step.each { |a| acc += a * a }
67
+ Math.sqrt(acc)
68
+ end
69
+
70
+ #do one Hook - Jeeves step
71
+ def hook_jeeves_step(x, i, step, &block)
72
+ x[i] += step[i]
73
+ tmp1 = block.call(x)
74
+ x[i] = x[i] - 2 * step[i]
75
+ tmp2 = block.call(x)
76
+ if (tmp1 > tmp2)
77
+ cur_f = tmp2
78
+ else
79
+ x[i] = x[i] + step[i] * 2
80
+ cur_f = tmp1
81
+ end
82
+ [cur_f, x[i]]
83
+ end
84
+
85
+ #switch step if current func value > previous func value
86
+ def switch_step(cur_f, prev_f, step, i)
87
+ return step[i] / 2.0 if cur_f >= prev_f #you can switch 2.0 on something else
88
+ step[i]
89
+ end
90
+ #Hook - Jeeves method for find minimum point (x - array of start variables, step - step of one iteration, eps - allowable error, alfa - slowdown of step,
91
+ #block - function which takes array x, WAENING function doesn't control correctness of input
92
+ def hook_jeeves(x, step, eps = 0.1, &block)
93
+ prev_f = block.call(x)
94
+ acc = accuracy(step)
95
+ while (acc > eps)
96
+ for i in 0..x.length - 1
97
+ tmp = hook_jeeves_step(x, i, step, &block)
98
+ cur_f = tmp[0]
99
+ x[i] = tmp[1]
100
+ step[i] = switch_step(cur_f, prev_f, step, i)
101
+ prev_f = cur_f
102
+ end
103
+ acc = accuracy(step)
104
+ end
105
+ x
106
+ end
107
+
108
+ #find centr of interval
109
+ def middle(a, b)
110
+ (a + b) / 2.0
111
+ end
112
+
113
+ #do one half division step
114
+ def half_division_step(a, b, c, &block)
115
+ if (block.call(a) * block.call(c) < 0)
116
+ b = c
117
+ c = middle(a, c)
118
+ else
119
+ a = c
120
+ c = middle(b, c)
121
+ end
122
+ [a, b, c]
123
+ end
124
+
125
+ #find root in [a, b], if he exist, if number of iterations > iters -> error
126
+ def half_division(a, b, eps = 0.001, &block)
127
+ iters = 1000000
128
+ c = middle(a, b)
129
+ while ((block.call(c).abs) > eps)
130
+ tmp = half_division_step(a, b, c, &block)
131
+ a = tmp[0]
132
+ b = tmp[1]
133
+ c = tmp[2]
134
+ iters -= 1
135
+ if iters == 0
136
+ raise RuntimeError, "Root not found! Check does he exist, or change eps or iters"
137
+ end
138
+ end
139
+ c
140
+ end
141
+
142
+
143
+ end
144
+ end
@@ -0,0 +1,96 @@
1
+ require 'silicium'
2
+ require 'chunky_png'
3
+
4
+ module Silicium
5
+ module Plotter
6
+ ##
7
+ # Factory method to return a color value, based on the arguments given.
8
+ #
9
+ # @overload Color(r, g, b, a)
10
+ # @param (see ChunkyPNG::Color.rgba)
11
+ # @return [Integer] The rgba color value.
12
+ #
13
+ # @overload Color(r, g, b)
14
+ # @param (see ChunkyPNG::Color.rgb)
15
+ # @return [Integer] The rgb color value.
16
+ #
17
+ # @overload Color(hex_value, opacity = nil)
18
+ # @param (see ChunkyPNG::Color.from_hex)
19
+ # @return [Integer] The hex color value, with the opacity applied if one
20
+ # was given.
21
+ #
22
+ # @overload Color(color_name, opacity = nil)
23
+ # @param (see ChunkyPNG::Color.html_color)
24
+ # @return [Integer] The hex color value, with the opacity applied if one
25
+ # was given.
26
+ #
27
+ # @overload Color(color_value, opacity = nil)
28
+ # @param [Integer, :to_i] The color value.
29
+ # @return [Integer] The color value, with the opacity applied if one was
30
+ # given.
31
+ #
32
+ # @return [Integer] The determined color value as RGBA integer.
33
+ # @raise [ArgumentError] if the arguments weren't understood as a color.
34
+ def color(*args)
35
+ case args.length
36
+ when 1; ChunkyPNG::Color.parse(args.first)
37
+ when 2; (ChunkyPNG::Color.parse(args.first) & 0xffffff00) | args[1].to_i
38
+ when 3; ChunkyPNG::Color.rgb(*args)
39
+ when 4; ChunkyPNG::Color.rgba(*args)
40
+ else raise ArgumentError, "Don't know how to create a color from #{args.inspect}!"
41
+ end
42
+ end
43
+ ##
44
+ # A class representing canvas for plotting bar charts and function graphs
45
+ class Image
46
+ ##
47
+ # Creates a new plot with chosen +width+ and +height+ parameters
48
+ # with background colored +bg_color+
49
+ def initialize(width, height, bg_color = ChunkyPNG::Color::TRANSPARENT)
50
+ @image = ChunkyPNG::Image.new(width, height, bg_color)
51
+ end
52
+
53
+ def rectangle(x, y, width, height, color)
54
+ x_end = x + width - 1
55
+ y_end = y + height - 1
56
+ (x..x_end).each do |i|
57
+ (y..y_end).each do |j|
58
+ @image[i, j] = color
59
+ end
60
+ end
61
+ end
62
+
63
+ ##
64
+ # Draws a bar chart in the plot using provided +bars+,
65
+ # each of them has width of +bar_width+ and colored +bars_color+
66
+ def bar_chart(bars, bar_width, bars_color = ChunkyPNG::Color('red @ 1.0'), axis_color = ChunkyPNG::Color::BLACK)
67
+ if bars.count * bar_width > @image.width
68
+ raise ArgumentError, 'Not enough big size of image to plot these number of bars'
69
+ end
70
+
71
+ padding = 5
72
+ # Values of x and y on borders of plot
73
+ minx = [bars.collect { |k, _| k }.min, 0].min
74
+ maxx = [bars.collect { |k, _| k }.max, 0].max
75
+ miny = [bars.collect { |_, v| v }.min, 0].min
76
+ maxy = [bars.collect { |_, v| v }.max, 0].max
77
+ dpux = Float((@image.width - 2 * padding)) / (maxx - minx + bar_width) # Dots per unit for X
78
+ dpuy = Float((@image.height - 2 * padding)) / (maxy - miny) # Dots per unit for Y
79
+ rectangle(padding, @image.height - padding - (miny.abs * dpuy).ceil, @image.width - 2 * padding, 1, axis_color) # Axis OX
80
+ rectangle(padding + (minx.abs * dpux).ceil, padding, 1, @image.height - 2 * padding, axis_color) # Axis OY
81
+
82
+ bars.each do |x, y| # Cycle drawing bars
83
+ rectangle(padding + ((x + minx.abs) * dpux).floor,
84
+ @image.height - padding - (([y, 0].max + miny.abs) * dpuy).ceil + (y.negative? ? 1 : 0),
85
+ bar_width, (y.abs * dpuy).ceil, bars_color)
86
+ end
87
+ end
88
+
89
+ ##
90
+ # Exports plotted image to file +filename+
91
+ def export(filename)
92
+ @image.save(filename, :interlace => true)
93
+ end
94
+ end
95
+ end
96
+ end
@@ -2,5 +2,4 @@ require "silicium/version"
2
2
 
3
3
  module Silicium
4
4
  class Error < StandardError; end
5
- # Your code goes here...
6
5
  end
@@ -1,3 +1,3 @@
1
1
  module Silicium
2
- VERSION = "0.0.15"
2
+ VERSION = "0.0.20"
3
3
  end
@@ -0,0 +1,227 @@
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
227
+ end