symbolic 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -17,6 +17,8 @@ Currently I've implemented only naive optimizations to simplify math expressions
17
17
  f = symbolic { (4 - 2*(-x) + y*(-1.0))*x - 0*y + 0 - 2 }
18
18
  puts f # => (4+2*x-y)*x-2
19
19
 
20
+ p f.detailed_operations # => {"+"=>1, "-"=>2, "*"=>2}
21
+ p f.operations # => 5
20
22
  p f.undefined_variables.map &:name # => ["x", "y"]
21
23
  x.value = 2
22
24
  y.value = 4
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.8'
8
+ gem.version = '0.1.9'
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"
@@ -6,8 +6,4 @@ class Matrix
6
6
  def variables
7
7
  map {|it| it.variables }.to_a.flatten.uniq
8
8
  end
9
-
10
- def symbolic?
11
- !variables.empty?
12
- end
13
9
  end
@@ -6,8 +6,4 @@ class Numeric
6
6
  def variables
7
7
  []
8
8
  end
9
-
10
- def symbolic?
11
- false
12
- end
13
9
  end
data/lib/symbolic/core.rb CHANGED
@@ -38,7 +38,7 @@ module Symbolic
38
38
  alias non_symbolic_#{name} #{sign}
39
39
 
40
40
  def #{sign}(value)
41
- if value.symbolic?
41
+ if value.is_a? Symbolic
42
42
  Optimization.#{name} self, value
43
43
  else
44
44
  non_symbolic_#{name}(value)
@@ -58,7 +58,7 @@ module Symbolic
58
58
  alias non_symbolic_#{operation} #{operation}
59
59
 
60
60
  def #{operation}(value)
61
- if value.symbolic?
61
+ if value.is_a? Symbolic
62
62
  Symbolic::Method.new value, :#{operation}
63
63
  else
64
64
  non_symbolic_#{operation} value
@@ -1,5 +1,7 @@
1
1
  module Symbolic
2
- class Expression < Operatable
2
+ class Expression
3
+ include Symbolic
4
+
3
5
  attr_reader :var1, :var2, :operation
4
6
 
5
7
  def initialize(var1, var2, operation)
@@ -33,7 +35,7 @@ module Symbolic
33
35
  end
34
36
 
35
37
  def variables
36
- variables_of(@var1) | variables_of(@var2)
38
+ @var1.variables | @var2.variables
37
39
  end
38
40
 
39
41
  def undefined_variables
@@ -45,6 +47,12 @@ module Symbolic
45
47
  ((object.var1 == @var1 && object.var2 == @var2) || ((plus? || multiply?) && (object.var1 == @var2 && object.var2 == @var1)))
46
48
  end
47
49
 
50
+ def detailed_operations
51
+ stats = operations_of(@var1).merge(operations_of @var2) {|k,v1,v2| v1 + v2 }
52
+ stats[@operation] += 1
53
+ stats
54
+ end
55
+
48
56
  private
49
57
 
50
58
  def brackets(var)
@@ -55,8 +63,8 @@ module Symbolic
55
63
  %w(* /).include?(@operation) && (var.is_a?(UnaryMinus) || var.is_a?(Expression) && (var.plus? || var.minus?))
56
64
  end
57
65
 
58
- def variables_of(object)
59
- object.symbolic? ? object.variables : []
66
+ def operations_of(var)
67
+ var.is_a?(Symbolic) ? var.detailed_operations : Hash.new(0)
60
68
  end
61
69
  end
62
70
  end
@@ -1,5 +1,7 @@
1
1
  module Symbolic
2
- class Method < Operatable
2
+ class Method
3
+ include Symbolic
4
+
3
5
  def initialize(variable, operation)
4
6
  @variable, @operation = variable, operation
5
7
  end
@@ -19,5 +21,11 @@ module Symbolic
19
21
  def undefined_variables
20
22
  @variable.undefined_variables
21
23
  end
24
+
25
+ def detailed_operations
26
+ stats = @variable.detailed_operations.dup
27
+ stats[@operation] += 1
28
+ stats
29
+ end
22
30
  end
23
31
  end
@@ -1,5 +1,7 @@
1
1
  module Symbolic
2
- class UnaryMinus < Operatable
2
+ class UnaryMinus
3
+ include Symbolic
4
+
3
5
  def self.create(var)
4
6
  var.is_a?(UnaryMinus) ? var.abs : new(var)
5
7
  end
@@ -17,7 +19,7 @@ module Symbolic
17
19
  end
18
20
 
19
21
  def abs
20
- # add a common method for Operatable which will point to an instance of Abs(magnitude) class
22
+ # TODO: add a common method for Symbolic which will point to an instance of Abs(magnitude) class
21
23
  @variable
22
24
  end
23
25
 
@@ -36,5 +38,11 @@ module Symbolic
36
38
  def ==(object)
37
39
  object.is_a?(UnaryMinus) && object.abs == @variable
38
40
  end
41
+
42
+ def detailed_operations
43
+ stats = @variable.detailed_operations.dup
44
+ stats['-@'] += 1
45
+ stats
46
+ end
39
47
  end
40
48
  end
@@ -1,5 +1,7 @@
1
1
  module Symbolic
2
- class Variable < Operatable
2
+ class Variable
3
+ include Symbolic
4
+
3
5
  attr_accessor :name, :proc
4
6
  attr_writer :value
5
7
 
@@ -23,5 +25,9 @@ module Symbolic
23
25
  def undefined_variables
24
26
  value ? [] : variables
25
27
  end
28
+
29
+ def detailed_operations
30
+ Hash.new 0
31
+ end
26
32
  end
27
33
  end
data/lib/symbolic.rb CHANGED
@@ -6,13 +6,37 @@ module Symbolic
6
6
  :/ => :division }
7
7
  end
8
8
 
9
+ operations.each do |sign, name|
10
+ method = <<-CODE
11
+ def #{sign}(value)
12
+ Optimization.#{name} self, value
13
+ end
14
+ CODE
15
+ class_eval method, __FILE__, __LINE__
16
+ end
17
+
9
18
  def self.math_operations
10
19
  [:cos, :sin]
11
20
  end
21
+
22
+ def -@
23
+ UnaryMinus.create self
24
+ end
25
+
26
+ def +@
27
+ self
28
+ end
29
+
30
+ def undefined?
31
+ !value
32
+ end
33
+
34
+ def operations
35
+ detailed_operations.values.inject(0) {|sum,it| sum + it }
36
+ end
12
37
  end
13
38
 
14
39
  require 'symbolic/core'
15
- require 'symbolic/operatable'
16
40
  require 'symbolic/optimizations'
17
41
  require 'symbolic/optimizations/base'
18
42
  require 'symbolic/optimizations/addition'
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.8
4
+ version: 0.1.9
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-03 00:00:00 +03:00
12
+ date: 2009-12-04 00:00:00 +03:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -41,7 +41,6 @@ files:
41
41
  - lib/symbolic/core.rb
42
42
  - lib/symbolic/expression.rb
43
43
  - lib/symbolic/method.rb
44
- - lib/symbolic/operatable.rb
45
44
  - lib/symbolic/optimizations.rb
46
45
  - lib/symbolic/optimizations/addition.rb
47
46
  - lib/symbolic/optimizations/base.rb
@@ -1,28 +0,0 @@
1
- module Symbolic
2
- class Operatable
3
- def -@
4
- UnaryMinus.create self
5
- end
6
-
7
- def +@
8
- self
9
- end
10
-
11
- Symbolic.operations.each do |operation_sign, operation_name|
12
- method = <<-CODE
13
- def #{operation_sign}(value)
14
- Optimization.#{operation_name} self, value
15
- end
16
- CODE
17
- class_eval method, __FILE__, __LINE__
18
- end
19
-
20
- def undefined?
21
- !value
22
- end
23
-
24
- def symbolic?
25
- true
26
- end
27
- end
28
- end