lib/dydx/algebra/operator/parts/general.rb in dydx-0.1.4 vs lib/dydx/algebra/operator/parts/general.rb in dydx-0.1.25

- old
+ new

@@ -1,109 +1,56 @@ module Dydx module Algebra module Operator module Parts - module Interface - %w(+ - * / ** %).map(&:to_sym).each do |operator| + module General + %w(+ * ^).map(&:to_sym).each do |operator| define_method(operator) do |x| - x = _(x) if x.is_a?(Numeric) - if operator == :/ && x.zero? - fail ZeroDivisionError - elsif [:-, :/].include?(operator) - send(operator.inv, inverse(x, operator.inv)) - else - super(x) - end - end - end - end - - module Associative - %w(+ * **).map(&:to_sym).each do |operator| - define_method(operator) do |x| - if operator.associative? - if x.formula?(operator) - if combinable?(x.f, operator) - send(operator, x.f).send(operator, x.g) - elsif combinable?(x.g, operator) - send(operator, x.g).send(operator, x.f) - else - super(x) - end - elsif x.is_a?(Inverse) && x.operator == operator && x.x.formula?(operator) - if combinable?(x.x.f, operator) - send(operator, inverse(x.x.f, operator)).send(operator, inverse(x.x.g, operator)) - elsif combinable?(x.x.g, operator) - send(operator, inverse(x.x.g, operator)).send(operator, inverse(x.x.f, operator)) - else - super(x) - end - else - super(x) - end - else - super(x) - end - end - end - end - - module General1 - %w(+ * **).map(&:to_sym).each do |operator| - define_method(operator) do |x| - if x.zero? + if x.is_0? case operator - when :+ then self - when :* then x - when :** then e1 + when :+ then self + when :* then x + when :^ then e1 end - elsif x.one? + elsif x.is_1? case operator - when :+ then super(x) - when :* then self - when :** then self + when :+ then super(x) + when :* then self + when :^ then self end elsif self == x case operator - when :+ then _(2) * self - when :* then self ** _(2) - when :** then super(x) + when :+ then _(2) * self + when :* then self ^ _(2) + when :^ then super(x) end - elsif inverse?(operator, x) - case operator - when :+ then e0 - when :* then e1 + elsif operator == :+ && inverse?(:+, x) + e0 + elsif operator == :* && inverse?(:*, x) + e1 + elsif [:+, :*].include?(operator) && x.formula?(operator) + if combinable?(x.f, operator) + send(operator, x.f).send(operator, x.g) + elsif combinable?(x.g, operator) + send(operator, x.g).send(operator, x.f) + else + super(x) end - elsif [:+, :*].include?(operator) - if x.formula?(operator.super) && self == x.f - send(operator.super, (1 + x.g)) + elsif x.is_a?(Inverse) && x.operator == operator && x.x.formula?(operator) + if combinable?(x.x.f, operator) + send(operator, inverse(x.x.f, operator)).send(operator, inverse(x.x.g, operator)) + elsif combinable?(x.x.g, operator) + send(operator, inverse(x.x.g, operator)).send(operator, inverse(x.x.f, operator)) else super(x) end + elsif [:*].include?(operator) && x.inverse?(:+) + inverse(::Algebra::Formula.new(self, x.x, operator.to_sym), :+) else super(x) end end end - end - - module General2 - %w(+ * **).map(&:to_sym).each do |operator| - define_method(operator) do |x| - if operator == :* && x.inverse?(:+) - -(self * x.x) - else - super(x) - end - end - end - end - - module General - include General2 - include General1 - include Associative - include Interface end end end end end