dydx 0.1.4 → 0.1.25

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