Class: Ilp::TermArray

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/ruby-cbc/ilp/term_array.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(terms) ⇒ TermArray

Returns a new instance of TermArray.



7
8
9
# File 'lib/ruby-cbc/ilp/term_array.rb', line 7

def initialize(terms)
  @terms = terms
end

Instance Attribute Details

#termsObject

Returns the value of attribute terms.



5
6
7
# File 'lib/ruby-cbc/ilp/term_array.rb', line 5

def terms
  @terms
end

Instance Method Details

#*(mult) ⇒ Object

Raises:

  • (ArgumentError)


31
32
33
34
35
# File 'lib/ruby-cbc/ilp/term_array.rb', line 31

def *(mult)
  raise ArgumentError, 'Argument is not numeric' unless mult.is_a? Numeric
  new_terms = terms.map { |term| term * mult }
  TermArray.new(new_terms)
end

#+(vars) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/ruby-cbc/ilp/term_array.rb', line 11

def +(vars)
  new_terms = terms.dup
  if vars.is_a? Numeric
    new_terms << vars
  elsif vars.is_a? Ilp::Var
    new_terms << Ilp::Term.new(vars)
  elsif vars.is_a? Ilp::Term
    new_terms << vars
  elsif vars.is_a? Ilp::TermArray
    new_terms.concat(vars.terms)
  else
    raise ArgumentError, "Argument is not allowed: #{vars} of type #{vars.class}"
  end
  TermArray.new(new_terms)
end

#-(vars) ⇒ Object



27
28
29
# File 'lib/ruby-cbc/ilp/term_array.rb', line 27

def -(vars)
  self + -1 * vars
end

#<=(value) ⇒ Object



55
56
57
# File 'lib/ruby-cbc/ilp/term_array.rb', line 55

def <=(value)
  Ilp::Constraint.new(self, Ilp::Constraint::LESS_OR_EQ, value)
end

#==(value) ⇒ Object



63
64
65
# File 'lib/ruby-cbc/ilp/term_array.rb', line 63

def ==(value)
  Ilp::Constraint.new(self, Ilp::Constraint::EQUALS, value)
end

#>=(value) ⇒ Object



59
60
61
# File 'lib/ruby-cbc/ilp/term_array.rb', line 59

def >=(value)
  Ilp::Constraint.new(self, Ilp::Constraint::GREATER_OR_EQ, value)
end

#coerce(value) ⇒ Object



67
68
69
# File 'lib/ruby-cbc/ilp/term_array.rb', line 67

def coerce(value)
  [Ilp::Constant.new(value), self]
end

#each(&block) ⇒ Object



71
72
73
# File 'lib/ruby-cbc/ilp/term_array.rb', line 71

def each(&block)
  @terms.each(&block)
end

#normalize!Object

cste + nb * var + nb * var…



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/ruby-cbc/ilp/term_array.rb', line 38

def normalize!
  constant = @terms.select{ |t| t.is_a? Numeric }.reduce(:+)
  hterms = @terms.select{ |t| t.is_a? Ilp::Term }.group_by(&:var)
  @terms = []
  constant ||= 0
  @terms << constant
  reduced = hterms.map do |v, ts|
    if ts.count == 1
      ts.first
    else
      ts.reduce(Ilp::Term.new(v, 0)) { |v1, v2| v1.mult += v2.mult; v1 }
    end
  end.reject { |term| term.mult == 0 }
  @terms.concat reduced
  self
end

#to_sObject



75
76
77
# File 'lib/ruby-cbc/ilp/term_array.rb', line 75

def to_s
  @terms.map(&:to_s).join(' ')
end

#varsObject



79
80
81
# File 'lib/ruby-cbc/ilp/term_array.rb', line 79

def vars
  @terms.map(&:var)
end