class Amor::Expression

Attributes

factors[R]

Public Class Methods

new(value) click to toggle source
# File lib/amor/expression.rb, line 6
def initialize(value)
  if value.is_a? Array
    @factors = value
  elsif value.is_a? Expression
    @factors = value.factors
  elsif value.is_a? Variable
    @factors = [[1, value]]
  elsif value.is_a? Numeric
    @factors = [[value, :constant]]
  end
end

Public Instance Methods

+(value) click to toggle source
# File lib/amor/expression.rb, line 18
def +(value)
  Expression.new(self.factors + Expression.new(value).factors)
end
-(value) click to toggle source
# File lib/amor/expression.rb, line 22
def -(value)
  self + -value
end
-@() click to toggle source
# File lib/amor/expression.rb, line 26
def -@
  return Expression.new(self.factors.map{|factor| [-factor[0], factor[1]]})
end
<=(value) click to toggle source
# File lib/amor/expression.rb, line 42
def <= value
  Constraint.new(self, :lesser_equal, value)
end
==(value) click to toggle source
# File lib/amor/expression.rb, line 38
def == value
  Constraint.new(self, :equal, value)
end
>=(value) click to toggle source
# File lib/amor/expression.rb, line 46
def >= value
  Constraint.new(self, :greater_equal, value)
end
constant_factor() click to toggle source
# File lib/amor/expression.rb, line 62
def constant_factor
  @factors.select{|factor| !factor[1].is_a?(Variable)}.inject(0) {|m, factor| m + factor[0]}
end
eql?(value) click to toggle source
# File lib/amor/expression.rb, line 34
def eql? value
  self.hash == value.hash
end
hash() click to toggle source
# File lib/amor/expression.rb, line 30
def hash
  @factors.hash
end
lp_string() click to toggle source
# File lib/amor/expression.rb, line 66
def lp_string
  result = ''
  factor_strings = self.simplified.factors.each_with_index.map do |factor, i|
    scalar = factor[0]
    if scalar < 0
      sign = '- '
      scalar = -scalar
    elsif i > 0
      sign = '+ '
    else
      sign = ''
    end

    if factor[1].is_a? Variable
      "#{sign}#{scalar} x#{factor[1].internal_index+1}"
    else
      "#{sign}#{scalar}"
    end
  end
  return factor_strings.join(' ')
end
remove_constants() click to toggle source
# File lib/amor/expression.rb, line 58
def remove_constants
  Expression.new(@factors.select{|factor| factor[1].is_a?(Variable)})
end
simplified() click to toggle source
# File lib/amor/expression.rb, line 50
def simplified
  summed_scalars = Hash.new
  @factors.each do |factor|
    summed_scalars[factor[1]] = (summed_scalars[factor[1]] || 0) + factor[0]
  end
  Expression.new(summed_scalars.map{|var, scalar| [scalar, var]}.select{|factor| !factor[0].zero? })
end
to_s() click to toggle source
# File lib/amor/expression.rb, line 88
def to_s
  factors.map{|factor| factor[1].is_a?(Variable) ? "#{factor[0]} #{factor[1]}" : "#{factor[0]}"}.join(" ")
end