dydx 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +22 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +5 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +29 -0
  7. data/Rakefile +13 -0
  8. data/dydx.gemspec +25 -0
  9. data/lib/dydx.rb +28 -0
  10. data/lib/dydx/algebra.rb +90 -0
  11. data/lib/dydx/algebra/formula.rb +42 -0
  12. data/lib/dydx/algebra/operator/common_parts.rb +3 -0
  13. data/lib/dydx/algebra/operator/formula.rb +15 -0
  14. data/lib/dydx/algebra/operator/general.rb +14 -0
  15. data/lib/dydx/algebra/operator/num.rb +15 -0
  16. data/lib/dydx/algebra/operator/parts/base.rb +28 -0
  17. data/lib/dydx/algebra/operator/parts/formula.rb +41 -0
  18. data/lib/dydx/algebra/operator/parts/general.rb +55 -0
  19. data/lib/dydx/algebra/operator/parts/interface.rb +16 -0
  20. data/lib/dydx/algebra/operator/parts/num.rb +55 -0
  21. data/lib/dydx/algebra/operator/parts/symbol.rb +29 -0
  22. data/lib/dydx/algebra/operator/symbol.rb +15 -0
  23. data/lib/dydx/algebra/set/base.rb +9 -0
  24. data/lib/dydx/algebra/set/cos.rb +21 -0
  25. data/lib/dydx/algebra/set/e.rb +16 -0
  26. data/lib/dydx/algebra/set/fixnum.rb +28 -0
  27. data/lib/dydx/algebra/set/log.rb +22 -0
  28. data/lib/dydx/algebra/set/num.rb +22 -0
  29. data/lib/dydx/algebra/set/pi.rb +16 -0
  30. data/lib/dydx/algebra/set/sin.rb +21 -0
  31. data/lib/dydx/algebra/set/symbol.rb +14 -0
  32. data/lib/dydx/algebra/set/tan.rb +17 -0
  33. data/lib/dydx/helper.rb +38 -0
  34. data/lib/dydx/version.rb +3 -0
  35. data/spec/dydx_spec.rb +7 -0
  36. data/spec/lib/algebra/formula_spec.rb +68 -0
  37. data/spec/lib/algebra/operator/parts/base_spec.rb +8 -0
  38. data/spec/lib/algebra/operator/parts/formula_spec.rb +13 -0
  39. data/spec/lib/algebra/set/cos_spec.rb +18 -0
  40. data/spec/lib/algebra/set/e_spec.rb +27 -0
  41. data/spec/lib/algebra/set/fixnum_spec.rb +64 -0
  42. data/spec/lib/algebra/set/log_spec.rb +15 -0
  43. data/spec/lib/algebra/set/num_spec.rb +17 -0
  44. data/spec/lib/algebra/set/pi_spec.rb +25 -0
  45. data/spec/lib/algebra/set/sin_spec.rb +14 -0
  46. data/spec/lib/algebra/set/symbol_spec.rb +22 -0
  47. data/spec/lib/algebra/set/tan_spec.rb +13 -0
  48. data/spec/lib/helper_spec.rb +32 -0
  49. data/spec/spec_helper.rb +4 -0
  50. metadata +165 -0
@@ -0,0 +1,16 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Operator
4
+ module Parts
5
+ module Interface
6
+ %w(+ - * / ^).each do |operator|
7
+ define_method(operator) do |x|
8
+ x = _(x) if x.is_a?(Fixnum)
9
+ super(x)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,55 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Operator
4
+ module Parts
5
+ module Num
6
+ def +(x)
7
+ if n == 0
8
+ x
9
+ elsif x.is_a?(Num)
10
+ _(n + x.n)
11
+ else
12
+ super(x)
13
+ end
14
+ end
15
+
16
+ def -(x)
17
+ if x.is_a?(Num)
18
+ _(n - x.n)
19
+ else
20
+ super(x)
21
+ end
22
+ end
23
+
24
+ def *(x)
25
+ if n == 0
26
+ self
27
+ elsif n == 1
28
+ x
29
+ elsif x.is_a?(Num)
30
+ _(n * x.n)
31
+ else
32
+ super(x)
33
+ end
34
+ end
35
+
36
+ def /(x)
37
+ if (n == 0)
38
+ self
39
+ else
40
+ super(x)
41
+ end
42
+ end
43
+
44
+ def ^(x)
45
+ if (n == 0) || (n == 1)
46
+ self
47
+ else
48
+ super(x)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Operator
4
+ module Parts
5
+ module Symbol
6
+ def *(x)
7
+ if x.exponentiation? &&
8
+ self == x.f
9
+
10
+ self ^ (1 + x.g)
11
+ else
12
+ super(x)
13
+ end
14
+ end
15
+
16
+ def /(x)
17
+ if x.exponentiation? &&
18
+ self == x.f
19
+
20
+ self ^ (1 - x.g)
21
+ else
22
+ super(x)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ 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
@@ -0,0 +1,9 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class Base
5
+ include Helper
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class Cos < Base
5
+ attr_accessor :x
6
+
7
+ def initialize(x)
8
+ @x = x
9
+ end
10
+
11
+ def to_s
12
+ "cos( #{x.to_s} )"
13
+ end
14
+
15
+ def d(sym=:x)
16
+ -1 * sin(x) * x.d(sym)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class E < Base
5
+ def differentiate(sym=:x)
6
+ _(0)
7
+ end
8
+ alias_method :d, :differentiate
9
+
10
+ def to_s
11
+ 'e'
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ Fixnum.class_eval do
5
+ include Helper
6
+
7
+ %w(+ - * / ^).each do |operator|
8
+ define_method(operator) do |g|
9
+ if g.is_a?(Symbol) ||
10
+ g.is_a?(Formula) ||
11
+ g.is_a?(Base) ||
12
+ %w(/ ^).include?(operator)
13
+
14
+ _(self).send(operator.to_sym, g)
15
+ else
16
+ (to_f.send(operator.to_sym, g)).to_i
17
+ end
18
+ end
19
+ end
20
+
21
+ def differentiate(sym=:x)
22
+ _(0)
23
+ end
24
+ alias_method :d, :differentiate
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class Log < Base
5
+ attr_accessor :f
6
+
7
+ def initialize(f)
8
+ @f = f
9
+ end
10
+
11
+ def differentiate(sym=:x)
12
+ f.d(sym) / (f)
13
+ end
14
+ alias_method :d, :differentiate
15
+
16
+ def to_s
17
+ "log( #{f.to_s} )"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class Num < Base
5
+ attr_accessor :n
6
+
7
+ def initialize(n)
8
+ @n = n
9
+ end
10
+
11
+ def differentiate(sym=:x)
12
+ _(0)
13
+ end
14
+ alias_method :d, :differentiate
15
+
16
+ def to_s
17
+ @n.to_s
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class Pi < Base
5
+ def differentiate(sym=:x)
6
+ _(0)
7
+ end
8
+ alias_method :d, :differentiate
9
+
10
+ def to_s
11
+ 'pi'
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class Sin < Base
5
+ attr_accessor :x
6
+
7
+ def initialize(x)
8
+ @x = x
9
+ end
10
+
11
+ def to_s
12
+ "sin( #{x.to_s} )"
13
+ end
14
+
15
+ def d(sym=:x)
16
+ cos(x) * x.d(sym)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ Symbol.class_eval do
5
+ include Helper
6
+
7
+ def differentiate(sym=:x)
8
+ self == sym ? _(1) : _(0)
9
+ end
10
+ alias_method :d, :differentiate
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module Dydx
2
+ module Algebra
3
+ module Set
4
+ class Tan < Base
5
+ attr_accessor :x
6
+
7
+ def initialize(x)
8
+ @x = x
9
+ end
10
+
11
+ def to_s
12
+ "tan( #{x.to_s} )"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ module Dydx
2
+ module Helper
3
+ def is_0?
4
+ self == 0 || (is_a?(Num) && n == 0)
5
+ end
6
+
7
+ def is_1?
8
+ self == 1 || (is_a?(Num) && n == 1)
9
+ end
10
+
11
+ def is_minus1?
12
+ self == -1 || (is_a?(Num) && n == -1)
13
+ end
14
+
15
+ def is_multiple_of(x)
16
+ is_multiple = if is_0?
17
+ _(0)
18
+ elsif self == x
19
+ _(1)
20
+ elsif is_a?(Formula) &&
21
+ (f == x || g == x)
22
+ f == x ? g : f
23
+ else
24
+ false
25
+ end
26
+ end
27
+
28
+ {
29
+ addition: :+,
30
+ subtraction: :-,
31
+ multiplication: :*,
32
+ division: :/,
33
+ exponentiation: :^
34
+ }.each do |operator_name, operator|
35
+ define_method("#{operator_name}?") { @operator == operator }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module Dydx
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dydx do
4
+ it 'has a version number' do
5
+ expect(Dydx::VERSION).not_to be nil
6
+ end
7
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dydx::Algebra::Formula do
4
+ let(:addition) { (:x + :y) }
5
+ let(:subtraction) { (:x - :y) }
6
+ let(:multiplication){ (:x * :y) }
7
+ let(:division) { (:x / :y) }
8
+ let(:exponentiation){ (:x ^ :y) }
9
+ describe 'Calculate' do
10
+ context 'With Fixnum' do
11
+ let(:formula) { (:x + :y) }
12
+ it{ expect((formula + 0).to_s).to eq(formula.to_s) }
13
+ it{ expect((formula - 0).to_s).to eq(formula.to_s) }
14
+ it{ expect((formula * 0).to_s).to eq('0') }
15
+ it{ expect((formula * 1).to_s).to eq(formula.to_s) }
16
+ it{ expect{(formula / 0).to_s}.to raise_error(ZeroDivisionError) }
17
+ it{ expect(formula / 1).to eq(formula) }
18
+ it{ expect((formula ^ 0).to_s).to eq('1') }
19
+ end
20
+ end
21
+
22
+ describe '#to_s' do
23
+ it{ expect(addition.to_s).to eq('( x + y )') }
24
+ it{ expect(subtraction.to_s).to eq('( x - y )') }
25
+ it{ expect(multiplication.to_s).to eq('( x * y )') }
26
+ it{ expect(division.to_s).to eq('( x / y )') }
27
+ it{ expect(exponentiation.to_s).to eq('( x ^ y )') }
28
+ it{ expect( (addition * multiplication).to_s ).to eq('( ( x + y ) * ( x * y ) )') }
29
+ end
30
+
31
+ describe '#differentiate' do
32
+ it{ expect(addition.d(:x).to_s).to eq('1') }
33
+ it{ expect(addition.d(:y).to_s).to eq('1') }
34
+ it{ expect(addition.d(:z).to_s).to eq('0') }
35
+
36
+ it{ expect(subtraction.d(:x).to_s).to eq('1') }
37
+ it{ expect(subtraction.d(:y).to_s).to eq('-1') }
38
+ it{ expect(subtraction.d(:z).to_s).to eq('0') }
39
+
40
+ it{ expect(multiplication.d(:x)).to eq(:y) }
41
+ it{ expect(multiplication.d(:y)).to eq(:x) }
42
+ it{ expect(multiplication.d(:z).to_s).to eq('0') }
43
+
44
+ it{ expect(division.d(:x).to_s).to eq("( y ^ -1 )") }
45
+ it{ expect(division.d(:y).to_s).to eq('( ( - x ) / ( y ^ 2 ) )') }
46
+ it{ expect(division.d(:z).to_s).to eq('0') }
47
+
48
+ it{ expect(exponentiation.d(:x).to_s).to eq('( y * ( x ^ ( y - 1 ) ) )') }
49
+ it{ expect(exponentiation.d(:y).to_s).to eq('( ( x ^ y ) * log( x ) )') }
50
+ it{ expect(exponentiation.d(:z).to_s).to eq('0') }
51
+ end
52
+
53
+ context 'With Symbol' do
54
+ $a = (:x ^ :n)
55
+ let(:d1){ da/dx }
56
+ let(:d2){ d/dx($a) }
57
+ it{ expect(d1.to_s).to eq('( n * ( x ^ ( n - 1 ) ) )') }
58
+ it{ expect(d2.to_s).to eq('( n * ( x ^ ( n - 1 ) ) )') }
59
+ end
60
+
61
+ context 'With Symbol' do
62
+ $b = (:x ^ (:x * 2))
63
+ let(:d1){ db/dx }
64
+ let(:d2){ d/dx($b) }
65
+ it{ expect(d1.to_s).to eq('( ( x * 2 ) * ( x ^ ( ( x * 2 ) - 1 ) ) )') }
66
+ it{ expect(d2.to_s).to eq('( ( x * 2 ) * ( x ^ ( ( x * 2 ) - 1 ) ) )') }
67
+ end
68
+ end