dydx 0.1.4 → 0.1.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -3
  3. data/README.md +124 -61
  4. data/Rakefile +8 -5
  5. data/dydx.gemspec +13 -13
  6. data/lib/dydx.rb +25 -23
  7. data/lib/dydx/algebra.rb +76 -8
  8. data/lib/dydx/algebra/formula.rb +38 -71
  9. data/lib/dydx/algebra/inverse.rb +12 -19
  10. data/lib/dydx/algebra/operator/common_parts.rb +3 -0
  11. data/lib/dydx/algebra/operator/formula.rb +4 -0
  12. data/lib/dydx/algebra/operator/general.rb +4 -0
  13. data/lib/dydx/algebra/operator/inverse.rb +4 -0
  14. data/lib/dydx/algebra/operator/num.rb +4 -0
  15. data/lib/dydx/algebra/operator/parts/base.rb +2 -2
  16. data/lib/dydx/algebra/operator/parts/formula.rb +38 -63
  17. data/lib/dydx/algebra/operator/parts/general.rb +31 -84
  18. data/lib/dydx/algebra/operator/parts/interface.rb +22 -0
  19. data/lib/dydx/algebra/operator/parts/inverse.rb +4 -4
  20. data/lib/dydx/algebra/operator/parts/num.rb +11 -16
  21. data/lib/dydx/algebra/operator/parts/symbol.rb +2 -2
  22. data/lib/dydx/algebra/operator/symbol.rb +15 -0
  23. data/lib/dydx/algebra/set.rb +34 -271
  24. data/lib/dydx/algebra/set/base.rb +9 -0
  25. data/lib/dydx/algebra/set/cos.rb +22 -0
  26. data/lib/dydx/algebra/set/e.rb +16 -0
  27. data/lib/dydx/algebra/set/fixnum.rb +14 -0
  28. data/lib/dydx/algebra/set/float.rb +14 -0
  29. data/lib/dydx/algebra/set/log.rb +22 -0
  30. data/lib/dydx/algebra/set/num.rb +26 -0
  31. data/lib/dydx/algebra/set/pi.rb +16 -0
  32. data/lib/dydx/algebra/set/sin.rb +21 -0
  33. data/lib/dydx/algebra/set/symbol.rb +14 -0
  34. data/lib/dydx/algebra/set/tan.rb +17 -0
  35. data/lib/dydx/delta.rb +1 -1
  36. data/lib/dydx/function.rb +1 -1
  37. data/lib/dydx/helper.rb +61 -55
  38. data/lib/dydx/integrand.rb +10 -22
  39. data/lib/dydx/version.rb +1 -1
  40. data/spec/dydx_spec.rb +29 -10
  41. data/spec/lib/algebra/formula_spec.rb +38 -44
  42. data/spec/lib/algebra/operator/parts/base_spec.rb +5 -5
  43. data/spec/lib/algebra/operator/parts/formula_spec.rb +50 -57
  44. data/spec/lib/algebra/operator/parts/inverse_spec.rb +8 -8
  45. data/spec/lib/algebra/set/cos_spec.rb +18 -0
  46. data/spec/lib/algebra/set/e_spec.rb +27 -0
  47. data/spec/lib/algebra/set/fixnum_spec.rb +65 -0
  48. data/spec/lib/algebra/set/float_spec.rb +65 -0
  49. data/spec/lib/algebra/set/log_spec.rb +15 -0
  50. data/spec/lib/algebra/set/num_spec.rb +23 -0
  51. data/spec/lib/algebra/set/pi_spec.rb +25 -0
  52. data/spec/lib/algebra/set/sin_spec.rb +14 -0
  53. data/spec/lib/algebra/set/symbol_spec.rb +22 -0
  54. data/spec/lib/algebra/set/tan_spec.rb +13 -0
  55. data/spec/lib/delta_spec.rb +8 -32
  56. data/spec/lib/function_spec.rb +34 -60
  57. data/spec/lib/helper_spec.rb +49 -47
  58. data/spec/lib/integrand_spec.rb +15 -13
  59. data/spec/spec_helper.rb +1 -2
  60. metadata +39 -9
  61. data/.pryrc +0 -2
  62. data/.rubocop.yml +0 -25
  63. data/spec/lib/algebra/set_spec.rb +0 -263
@@ -0,0 +1,22 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Operator
4
+ module Parts
5
+ module Interface
6
+ %w(+ - * / ^).map(&:to_sym).each do |operator|
7
+ define_method(operator) do |x|
8
+ x = ::Set::Num.new(x) if x.is_a?(Fixnum)
9
+ if operator == :/ && x.is_0?
10
+ raise ZeroDivisionError
11
+ elsif [:-, :/].include?(operator)
12
+ send(inverse_ope(operator), inverse(x, inverse_ope(operator)))
13
+ else
14
+ super(x)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -3,17 +3,17 @@ module Dydx
3
3
  module Operator
4
4
  module Parts
5
5
  module Inverse
6
- %w(+ * **).map(&:to_sym).each do |operator|
6
+ %w(+ * ^).map(&:to_sym).each do |operator|
7
7
  define_method(operator) do |x|
8
8
  if inverse?(operator, x)
9
9
  case operator
10
10
  when :+ then e0
11
11
  when :* then e1
12
12
  end
13
- elsif operator.eql?(:+) && !x.is_a?(Inverse)
13
+ elsif !x.is_a?(Inverse) && operator == :+
14
14
  x + self
15
- elsif operator.eql?(:**) && self.operator.eql?(:*)
16
- inverse(self.x ** x, :*)
15
+ elsif self.operator == :* && operator == :^
16
+ inverse(self.x ^ x, :*)
17
17
  else
18
18
  super(x)
19
19
  end
@@ -3,36 +3,31 @@ module Dydx
3
3
  module Operator
4
4
  module Parts
5
5
  module Num
6
- %w(+ * **).map(&:to_sym).each do |operator|
6
+ %w(+ * ^).map(&:to_sym).each do |operator|
7
7
  define_method(operator) do |x|
8
- if x.is_a?(Num)
9
- _(n.send(operator, x.n))
10
- elsif operator == :+ && x.inverse?(:+) && x.x.is_a?(Num)
11
- _(n - x.x.n)
12
- elsif operator == :* && x.inverse?(:*) && x.x.is_a?(Num) && n % x.x.n == 0
13
- _(n / x.x.n)
14
- elsif zero?
8
+ if is_0?
15
9
  case operator
16
10
  when :+ then x
17
11
  when :* then e0
18
- when :** then e0
12
+ when :^ then e0
19
13
  end
20
- elsif one?
14
+ elsif is_1?
21
15
  case operator
22
16
  when :+ then super(x)
23
17
  when :* then x
24
- when :** then e1
18
+ when :^ then e1
25
19
  end
20
+ elsif x.is_a?(Num)
21
+ _(n.send(operator, x.n))
22
+ elsif operator == :+ && x.inverse?(:+) && x.x.is_a?(Num)
23
+ _(n - x.x.n)
24
+ elsif operator == :* && x.inverse?(:*) && x.x.is_a?(Num)
25
+ _(n / x.x.n)
26
26
  else
27
27
  super(x)
28
28
  end
29
29
  end
30
30
  end
31
-
32
- def %(num)
33
- fail ArgumentError, "#{num} should be Num class object" unless num.is_a?(Num)
34
- _(n % num.n)
35
- end
36
31
  end
37
32
  end
38
33
  end
@@ -4,10 +4,10 @@ module Dydx
4
4
  module Parts
5
5
  module Symbol
6
6
  def *(x)
7
- if x.formula?(:**) &&
7
+ if x.exponentiation? &&
8
8
  self == x.f
9
9
 
10
- self ** (1 + x.g)
10
+ self ^ (1 + x.g)
11
11
  else
12
12
  super(x)
13
13
  end
@@ -0,0 +1,15 @@
1
+ require 'dydx/algebra/operator/common_parts'
2
+ require 'dydx/algebra/operator/parts/symbol'
3
+
4
+ module Dydx
5
+ module Algebra
6
+ module Operator
7
+ module Symbol
8
+ include Parts::Base
9
+ include Parts::Symbol
10
+ include Parts::General
11
+ include Parts::Interface
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,208 +1,31 @@
1
- require 'dydx/algebra/operator/parts/base'
2
- require 'dydx/algebra/operator/parts/general'
3
- require 'dydx/algebra/operator/parts/formula'
4
- require 'dydx/algebra/operator/parts/inverse'
5
- require 'dydx/algebra/operator/parts/num'
6
-
7
- require 'dydx/algebra/operator/inverse'
8
- require 'dydx/algebra/operator/formula'
9
- require 'dydx/algebra/operator/num'
10
- require 'dydx/algebra/operator/general'
11
-
12
- require 'dydx/algebra/formula'
13
- require 'dydx/algebra/inverse'
1
+ require 'dydx/algebra/set/base'
2
+ require 'dydx/algebra/set/num'
3
+ require 'dydx/algebra/set/fixnum'
4
+ require 'dydx/algebra/set/float'
5
+ require 'dydx/algebra/set/symbol'
6
+ require 'dydx/algebra/set/e'
7
+ require 'dydx/algebra/set/pi'
8
+ require 'dydx/algebra/set/log'
9
+ require 'dydx/algebra/set/sin'
10
+ require 'dydx/algebra/set/cos'
11
+ require 'dydx/algebra/set/tan'
14
12
 
15
13
  module Dydx
16
14
  module Algebra
17
15
  module Set
18
- module Base
19
- include Helper
20
-
21
- # TODO: Pi should not have attr_accessor
22
- def self.included(_klass)
23
- attr_accessor :n, :x
24
- alias_method :d, :differentiate
25
- end
26
-
27
- def initialize(x = nil)
28
- case self
29
- when Num
30
- @n = x
31
- when Sin, Cos, Tan, Log, Log10, Log2
32
- @x = x
33
- end
34
- end
35
-
36
- def to_s
37
- case self
38
- when Num then n.to_s
39
- when Pi then 'pi'
40
- when E then 'e'
41
- when Sin then "sin( #{x} )"
42
- when Cos then "cos( #{x} )"
43
- when Tan then "tan( #{x} )"
44
- when Log then "log( #{x} )"
45
- when Log10 then "log10( #{x} )"
46
- when Log2 then "log2( #{x} )"
47
- end
48
- end
49
-
50
- def to_f
51
- case self
52
- when Num then n.to_f
53
- when Pi then Math::PI
54
- when E then Math::E
55
- when Symbol then fail ArgumentError
56
- when Sin then Math.sin(x.to_f)
57
- when Cos then Math.cos(x.to_f)
58
- when Tan then Math.tan(x.to_f)
59
- when Log then Math.log(x.to_f)
60
- when Log10 then Math.log(x.to_f, 10)
61
- when Log2 then Math.log(x.to_f, 2)
62
- end
63
- end
64
-
65
- def subst(hash = {})
66
- case self
67
- when Num, Pi, E
68
- self
69
- when Symbol
70
- hash[self] || self
71
- when Sin then sin(x.subst(hash))
72
- when Cos then cos(x.subst(hash))
73
- when Tan then tan(x.subst(hash))
74
- when Log then log(x.subst(hash))
75
- when Log10 then log10(x.subst(hash))
76
- when Log2 then log2(x.subst(hash))
77
- end
78
- end
79
-
80
- def differentiate(sym = :x)
81
- case self
82
- when Num, Pi, E then e0
83
- when Symbol then self == sym ? e1 : e0
84
- when Sin then cos(x) * x.d(sym)
85
- when Cos then -1 * sin(x) * x.d(sym)
86
- when Tan then 1 / (cos(x) ** 2)
87
- when Log then x.d(sym) / (x)
88
- when Log10 then x.d(sym) / (x * log(10))
89
- when Log2 then x.d(sym) / (x * log(2))
90
- end
91
- end
92
- end
93
-
94
- class Num
95
- include Base
96
- include Operator::Num
97
- %w(> >= < <=).each do |operator|
98
- define_method(operator) do |x|
99
- x = x.n if x.is_a?(Num)
100
- n.send(operator, x)
101
- end
102
- end
103
- end
104
-
105
- class Pi
106
- include Base
107
- include Operator::General
108
- end
109
-
110
- class E
111
- include Base
112
- include Operator::General
113
- end
114
-
115
- class Sin
116
- include Base
117
- include Operator::General
118
- end
119
-
120
- class Cos
121
- include Base
122
- include Operator::General
123
- end
124
-
125
- class Tan
126
- include Base
127
- include Operator::General
128
- end
129
-
130
- class Log
131
- include Base
132
- include Operator::General
133
- end
134
-
135
- class Log10
136
- include Base
137
- include Operator::General
138
- end
139
-
140
- class Log2
141
- include Base
142
- include Operator::General
143
- end
144
-
145
- Symbol.class_eval do
146
- include Base
147
- include Operator::General
148
- end
149
-
150
- numeric_proc = Proc.new do
151
- include Helper
152
-
153
- def subst(_hash = {})
154
- self
155
- end
156
-
157
- def differentiate(_sym = :x)
158
- e0
159
- end
160
- alias_method :d, :differentiate
161
-
162
- alias_method :addition, :+
163
- alias_method :subtraction, :-
164
- alias_method :multiplication, :*
165
- alias_method :division, :/
166
- alias_method :exponentiation, :**
167
- alias_method :modulation, :%
168
-
169
- ope_to_str = {
170
- addition: :+,
171
- subtraction: :-,
172
- multiplication: :*,
173
- division: :/,
174
- exponentiation: :**,
175
- modulation: :%
176
- }
177
- %w(+ - * / ** %).each do |operator|
178
- define_method(operator) do |g|
179
- if g.is_a?(Symbol) ||
180
- g.is_a?(Formula) ||
181
- g.is_a?(Base)
182
-
183
- _(self).send(operator.to_sym, g)
184
- else
185
- send(ope_to_str.key(operator.to_sym), g)
186
- end
187
- end
188
- end
189
- if self == Rational
190
- def to_s
191
- "( #{numerator} / #{denominator} )"
192
- end
193
- end
194
- end
195
-
196
- Float.class_eval(&numeric_proc)
197
- Fixnum.class_eval(&numeric_proc)
198
- Rational.class_eval(&numeric_proc)
199
-
200
16
  def e0
201
- eval('$e0 ||= _(0)')
17
+ eval("$e0 ||= Num.new(0)")
202
18
  end
203
19
 
204
20
  def e1
205
- eval('$e1 ||= _(1)')
21
+ eval("$e1 ||= Num.new(1)")
22
+ end
23
+ def _(num)
24
+ if num >= 0
25
+ eval("$p#{num} ||= Num.new(num)")
26
+ else
27
+ eval("$n#{-1 * num} ||= Num.new(num)")
28
+ end
206
29
  end
207
30
 
208
31
  def pi
@@ -217,15 +40,14 @@ module Dydx
217
40
  Float::INFINITY
218
41
  end
219
42
 
220
- # TODO: Method has too many lines. [13/10]
221
43
  def log(formula)
222
- if formula.formula?(:*)
44
+ if formula.multiplication?
223
45
  f, g = formula.f, formula.g
224
46
  log(f) + log(g)
225
- elsif formula.formula?(:**)
47
+ elsif formula.exponentiation?
226
48
  f, g = formula.f, formula.g
227
49
  g * log(f)
228
- elsif formula.one?
50
+ elsif formula.is_1?
229
51
  e0
230
52
  elsif formula.is_a?(E)
231
53
  e1
@@ -234,87 +56,28 @@ module Dydx
234
56
  end
235
57
  end
236
58
 
237
- def log2(formula)
238
- # TODO: refactor with log function.
239
- if formula.formula?(:*)
240
- f, g = formula.f, formula.g
241
- log2(f) + log2(g)
242
- elsif formula.formula?(:**)
243
- f, g = formula.f, formula.g
244
- g * log2(f)
245
- elsif formula.one?
59
+ def sin(x)
60
+ multiplier = x.is_multiple_of(pi)
61
+ if multiplier.is_a?(Num)
246
62
  e0
247
- elsif formula.is_a?(Num)
248
- (formula.n == 2) ? e1 : log2(formula.n)
249
- elsif formula == 2
250
- e1
251
63
  else
252
- Log2.new(formula)
64
+ Sin.new(x)
253
65
  end
254
66
  end
255
67
 
256
- def log10(formula)
257
- # TODO: refactor with log function.
258
- if formula.formula?(:*)
259
- f, g = formula.f, formula.g
260
- log10(f) + log10(g)
261
- elsif formula.formula?(:**)
262
- f, g = formula.f, formula.g
263
- g * log10(f)
264
- elsif formula.one?
265
- e0
266
- elsif formula.is_a?(Num)
267
- (formula.n == 10) ? e1 : log10(formula.n)
268
- elsif formula == 10
68
+ def cos(x)
69
+ multiplier = x.is_multiple_of(pi)
70
+ if multiplier.is_a?(Num) && multiplier.n % 2 == 0
269
71
  e1
72
+ elsif multiplier.is_a?(Num) && multiplier.n % 2 == 1
73
+ _(-1)
270
74
  else
271
- Log10.new(formula)
272
- end
273
- end
274
-
275
- # TODO: We should negative num
276
- def sin(x)
277
- return Sin.new(x) unless x.multiple_of?(pi) && (x / pi).num?
278
-
279
- radn = (x / pi)
280
- loop do
281
- break if radn < 2
282
- radn -= 2
283
- end
284
-
285
- case radn
286
- when 0 then 0
287
- when _(1) / 2 then 1
288
- when 1 then 0
289
- when _(3) / 2 then -1
290
- else Sin.new(x)
291
- end
292
- end
293
-
294
- def cos(x)
295
- return Cos.new(x) unless x.multiple_of?(pi) && (x / pi).num?
296
-
297
- radn = (x / pi)
298
- loop do
299
- break if radn < 2
300
- radn -= 2
301
- end
302
-
303
- case radn
304
- when 0 then 1
305
- when _(1) / 2 then 0
306
- when 1 then -1
307
- when _(3) / 2 then 0
308
- else Sin.new(x)
75
+ Cos.new(x)
309
76
  end
310
77
  end
311
78
 
312
79
  def tan(x)
313
- if x == 0
314
- 0
315
- else
316
- Tan.new(x)
317
- end
80
+ Tan.new(x)
318
81
  end
319
82
  end
320
83
  end