symbolic 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ begin
5
5
  require 'jeweler'
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "symbolic"
8
- gem.version = '0.1.9'
8
+ gem.version = '0.2.0'
9
9
  gem.summary = 'Symbolic math for ruby'
10
10
  gem.description = %Q{Symbolic math can be really helpful if you want to simplify some giant equation or if you don't want to get a performance hit re-evaluating big math expressions every time when few variables change.}
11
11
  gem.email = "ravwar@gmail.com"
@@ -2,11 +2,4 @@ module Kernel
2
2
  def var(options={}, &proc)
3
3
  Symbolic::Variable.new options, &proc
4
4
  end
5
-
6
- def symbolic
7
- Symbolic::Core.enable
8
- result = yield
9
- Symbolic::Core.disable
10
- return result
11
- end
12
5
  end
data/lib/symbolic.rb CHANGED
@@ -27,6 +27,10 @@ module Symbolic
27
27
  self
28
28
  end
29
29
 
30
+ def coerce(numeric)
31
+ return Coerced.new(self), numeric
32
+ end
33
+
30
34
  def undefined?
31
35
  !value
32
36
  end
@@ -36,13 +40,13 @@ module Symbolic
36
40
  end
37
41
  end
38
42
 
39
- require 'symbolic/core'
40
- require 'symbolic/optimizations'
41
- require 'symbolic/optimizations/base'
42
- require 'symbolic/optimizations/addition'
43
- require 'symbolic/optimizations/subtraction'
44
- require 'symbolic/optimizations/multiplication'
45
- require 'symbolic/optimizations/division'
43
+ require 'symbolic/coerced'
44
+ require 'symbolic/optimization'
45
+ require 'symbolic/optimization/base'
46
+ require 'symbolic/optimization/addition'
47
+ require 'symbolic/optimization/subtraction'
48
+ require 'symbolic/optimization/multiplication'
49
+ require 'symbolic/optimization/division'
46
50
  require 'symbolic/variable'
47
51
  require 'symbolic/expression'
48
52
  require 'symbolic/method'
@@ -0,0 +1,16 @@
1
+ module Symbolic
2
+ class Coerced
3
+ def initialize(symbolic)
4
+ @symbolic = symbolic
5
+ end
6
+
7
+ Symbolic.operations.each do |sign, name|
8
+ method = <<-CODE
9
+ def #{sign}(numeric)
10
+ Optimization.#{name} numeric, @symbolic
11
+ end
12
+ CODE
13
+ class_eval method, __FILE__, __LINE__
14
+ end # Symbolic.operations.each
15
+ end # Coerced
16
+ end # Symbolic
@@ -29,9 +29,7 @@ module Symbolic
29
29
  end
30
30
 
31
31
  def value
32
- if undefined_variables.empty?
33
- @var1.value.send @operation, @var2.value
34
- end
32
+ @var1.value.send @operation, @var2.value if undefined_variables.empty?
35
33
  end
36
34
 
37
35
  def variables
@@ -48,9 +46,7 @@ module Symbolic
48
46
  end
49
47
 
50
48
  def detailed_operations
51
- stats = operations_of(@var1).merge(operations_of @var2) {|k,v1,v2| v1 + v2 }
52
- stats[@operation] += 1
53
- stats
49
+ operations_of(@var1).tap {|it| it.merge!(operations_of @var2)[@operation] += 1 }
54
50
  end
55
51
 
56
52
  private
@@ -23,9 +23,7 @@ module Symbolic
23
23
  end
24
24
 
25
25
  def detailed_operations
26
- stats = @variable.detailed_operations.dup
27
- stats[@operation] += 1
28
- stats
26
+ @variable.detailed_operations.tap {|it| it[@operation] += 1}
29
27
  end
30
28
  end
31
29
  end
File without changes
@@ -12,10 +12,6 @@ module Symbolic::Optimization::Multiplication
12
12
  end
13
13
 
14
14
  def self.optimize_second_arg(var1, var2)
15
- if var2.is_a? Numeric
16
- var2 * var1
17
- else
18
- optimize_first_arg var2, var1
19
- end
15
+ optimize_first_arg var2, var1
20
16
  end
21
17
  end
@@ -40,9 +40,7 @@ module Symbolic
40
40
  end
41
41
 
42
42
  def detailed_operations
43
- stats = @variable.detailed_operations.dup
44
- stats['-@'] += 1
45
- stats
43
+ @variable.detailed_operations.tap {|it| it['-@'] += 1}
46
44
  end
47
45
  end
48
46
  end
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,4 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'symbolic'
3
3
  require 'rubygems'
4
4
  require 'spec'
5
- require 'spec/autorun'
6
-
7
- Symbolic::Core.enable
5
+ require 'spec/autorun'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: symbolic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - brainopia
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-04 00:00:00 +03:00
12
+ date: 2009-12-07 00:00:00 +03:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -38,15 +38,15 @@ files:
38
38
  - lib/extensions/matrix.rb
39
39
  - lib/extensions/numeric.rb
40
40
  - lib/symbolic.rb
41
- - lib/symbolic/core.rb
41
+ - lib/symbolic/coerced.rb
42
42
  - lib/symbolic/expression.rb
43
43
  - lib/symbolic/method.rb
44
- - lib/symbolic/optimizations.rb
45
- - lib/symbolic/optimizations/addition.rb
46
- - lib/symbolic/optimizations/base.rb
47
- - lib/symbolic/optimizations/division.rb
48
- - lib/symbolic/optimizations/multiplication.rb
49
- - lib/symbolic/optimizations/subtraction.rb
44
+ - lib/symbolic/optimization.rb
45
+ - lib/symbolic/optimization/addition.rb
46
+ - lib/symbolic/optimization/base.rb
47
+ - lib/symbolic/optimization/division.rb
48
+ - lib/symbolic/optimization/multiplication.rb
49
+ - lib/symbolic/optimization/subtraction.rb
50
50
  - lib/symbolic/unary_minus.rb
51
51
  - lib/symbolic/variable.rb
52
52
  - spec/spec.opts
data/lib/symbolic/core.rb DELETED
@@ -1,92 +0,0 @@
1
- module Symbolic
2
- module Core
3
- @enabled = false
4
-
5
- class << self
6
- def enable
7
- if !@enabled
8
- @enabled = true
9
- redefine_numerical_methods
10
- redefine_math_methods
11
- end
12
- end
13
-
14
- def disable
15
- if @enabled
16
- @enabled = false
17
- restore_numerical_methods
18
- restore_math_methods
19
- end
20
- end
21
-
22
- private
23
-
24
- def numerical_eval(*args, &proc)
25
- [Fixnum, Bignum, Float].each do |klass|
26
- klass.class_eval *args, &proc
27
- end
28
- end
29
-
30
- def redefine_numerical_methods
31
- Symbolic.operations.each do |sign, name|
32
- numerical_eval numerical_method(sign,name), __FILE__, __LINE__
33
- end
34
- end
35
-
36
- def numerical_method(sign, name)
37
- <<-CODE
38
- alias non_symbolic_#{name} #{sign}
39
-
40
- def #{sign}(value)
41
- if value.is_a? Symbolic
42
- Optimization.#{name} self, value
43
- else
44
- non_symbolic_#{name}(value)
45
- end
46
- end
47
- CODE
48
- end
49
-
50
- def redefine_math_methods
51
- Symbolic.math_operations.each do |operation|
52
- Math.instance_eval math_method(operation), __FILE__, __LINE__
53
- end
54
- end
55
-
56
- def math_method(operation)
57
- <<-CODE
58
- alias non_symbolic_#{operation} #{operation}
59
-
60
- def #{operation}(value)
61
- if value.is_a? Symbolic
62
- Symbolic::Method.new value, :#{operation}
63
- else
64
- non_symbolic_#{operation} value
65
- end
66
- end
67
- CODE
68
- end
69
-
70
- def restore_numerical_methods
71
- numerical_eval do
72
- Symbolic.operations.each do |operation_sign, operation_name|
73
- alias_method operation_sign, "non_symbolic_#{operation_name}"
74
- remove_method "non_symbolic_#{operation_name}"
75
- end
76
- end
77
- end
78
-
79
- def restore_math_methods
80
- Math.module_eval do
81
- class << self
82
- Symbolic.math_operations.each do |operation|
83
- non_symbolic_operation = "non_symbolic_#{operation}"
84
- alias_method operation, non_symbolic_operation
85
- remove_method non_symbolic_operation
86
- end
87
- end
88
- end
89
- end
90
- end # class << self
91
- end # Core
92
- end # Symbolic