symbolic 0.1.9 → 0.2.0

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