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 +1 -1
- data/lib/extensions/kernel.rb +0 -7
- data/lib/symbolic.rb +11 -7
- data/lib/symbolic/coerced.rb +16 -0
- data/lib/symbolic/expression.rb +2 -6
- data/lib/symbolic/method.rb +1 -3
- data/lib/symbolic/{optimizations.rb → optimization.rb} +0 -0
- data/lib/symbolic/{optimizations → optimization}/addition.rb +0 -0
- data/lib/symbolic/{optimizations → optimization}/base.rb +0 -0
- data/lib/symbolic/{optimizations → optimization}/division.rb +0 -0
- data/lib/symbolic/{optimizations → optimization}/multiplication.rb +1 -5
- data/lib/symbolic/{optimizations → optimization}/subtraction.rb +0 -0
- data/lib/symbolic/unary_minus.rb +1 -3
- data/spec/spec_helper.rb +1 -3
- metadata +9 -9
- data/lib/symbolic/core.rb +0 -92
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.
|
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"
|
data/lib/extensions/kernel.rb
CHANGED
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/
|
40
|
-
require 'symbolic/
|
41
|
-
require 'symbolic/
|
42
|
-
require 'symbolic/
|
43
|
-
require 'symbolic/
|
44
|
-
require 'symbolic/
|
45
|
-
require 'symbolic/
|
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
|
data/lib/symbolic/expression.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/symbolic/method.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/symbolic/unary_minus.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
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.
|
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-
|
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/
|
41
|
+
- lib/symbolic/coerced.rb
|
42
42
|
- lib/symbolic/expression.rb
|
43
43
|
- lib/symbolic/method.rb
|
44
|
-
- lib/symbolic/
|
45
|
-
- lib/symbolic/
|
46
|
-
- lib/symbolic/
|
47
|
-
- lib/symbolic/
|
48
|
-
- lib/symbolic/
|
49
|
-
- lib/symbolic/
|
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
|