lib/dydx/helper.rb in dydx-0.1.4 vs lib/dydx/helper.rb in dydx-0.1.25

- old
+ new

@@ -1,88 +1,114 @@ module Dydx module Helper + OP_SYM_STR = { + addition: :+, + multiplication: :*, + exponentiation: :^ + } + SUPER_OPE_RELATION = { :+ => :*, :- => :/, - :* => :**, + :* => :^, :/ => :| } INVERSE_OPE_RELATION = { :+ => :-, :- => :+, :* => :/, :/ => :*, - :** => :|, - :| => :** + :^ => :|, + :| => :^ } - def num? - is_a?(Num) || is_a?(Numeric) + def super_ope(operator) + SUPER_OPE_RELATION[operator] end - def to_numeric - is_a?(Num) ? n : self + def sub_ope(operator) + SUPER_OPE_RELATION.invert[operator] end - def zero? - [0, 0.0].include?(self) || (is_a?(Num) && n.zero?) + def inverse_ope(operator) + INVERSE_OPE_RELATION[operator] end - def one? - [1, 1.0].include?(self) || (is_a?(Num) && n.one?) + def inverse_super_ope(operator) + inverse_ope(super_ope(operator)) end - def minus1? - [-1, -1.0].include?(self) || (is_a?(Num) && n.minus1?) + def is_num? + (is_a?(Num) || is_a?(Fixnum) || is_a?(Float)) || (is_a?(Inverse) && x.is_num?) end + def is_0? + [0, 0.0].include?(self) || (is_a?(Num) && n.is_0?) + end + + def is_1? + [1, 1.0].include?(self) || (is_a?(Num) && n.is_1?) + end + + def is_minus1? + [1, -1.0].include?(self)|| (is_a?(Num) && n.is_minus1?) + end + def distributive?(ope1, ope2) - [ope1.super, ope1.inv_super].include?(ope2) + [super_ope(ope1), inverse_super_ope(ope1)].include?(ope2) end - # TODO: Cyclomatic complexity for combinable? is too high. [17/6] def combinable?(x, operator) case operator when :+ - (num? && x.num?) || - (formula?(:*) && (f.num? || g.num?)) && x.num? || - like_term?(x) || + self == x || + (is_num? && x.is_num?) || + (multiplication? && (f == x || g == x)) || + (x.multiplication? && (x.f == self || x.g == self)) || inverse?(:+, x) when :* self == x || - (num? && x.num?) || + (is_num? && x.is_num?) || inverse?(:*, x) - when :** - (num? && x.num?) || zero? || one? + when :^ + (is_num? && x.is_num?) || is_0? || is_1? end end - # TODO: Cyclomatic complexity for combinable? is too high. [9/6] - def like_term?(x) - self == x || - formula?(:*) && include?(x) || - x.formula?(:*) && x.include?(self)|| - (formula?(:*) && formula?(:*) && !([f, g] & [x.f, x.g]).empty?) + def is_multiple_of(x) + if is_0? + e0 + elsif self == x + e1 + # elsif is_num? && x.is_num? && (self % x == 0) + # _(n / x.n) + elsif multiplication? && (f == x || g == x) + f == x ? g : f + else + false + end end - # TODO: Cyclomatic complexity for combinable? is too high. [7/6] - def multiple_of?(x) - zero? || - self == x || - (num? && x.num? && self % x == 0) || - (formula?(:*) && (f == x || g == x)) + OP_SYM_STR.each do |operator_name, operator| + define_method("#{operator_name}?") do + is_a?(Formula) && (@operator == operator) + # is_a?(Inverse) && self.operator == operator + end end def rest(f_or_g) ([:f, :g] - [f_or_g]).first end - def distributable?(_operator) + def commutative? end - def inverse?(operator, x = nil) + def distributable?(operator) + end + + def inverse?(operator, x=nil) if is_a?(Algebra::Inverse) self.operator == operator && (self.x == x || x.nil?) elsif x.is_a?(Algebra::Inverse) self == x.x else @@ -95,29 +121,9 @@ end Symbol.class_eval do def commutative? [:+, :*].include?(self) - end - - def associative? - [:+, :*].include?(self) - end - - def super - SUPER_OPE_RELATION[self] || self - end - - def sub - SUPER_OPE_RELATION.invert[self] || self - end - - def inv - INVERSE_OPE_RELATION[self] || self - end - - def inv_super - self.super.inv end end def ==(x) to_s == x.to_s