Class: Unit::Optimizer

Inherits:
Object
  • Object
show all
Defined in:
lib/unitmanager/unit_composition.rb

Class Method Summary collapse

Class Method Details

.base(units) ⇒ Object



208
209
210
# File 'lib/unitmanager/unit_composition.rb', line 208

def Optimizer.base(units)
  units.collect {| item | item.h_base}
end

.process(params) ⇒ Object



178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/unitmanager/unit_composition.rb', line 178

def Optimizer.process(params)
  raise "Incoming parameter has to respond to [] method" unless params.respond_to?(:[])
  
  #initialize local values
  coefficient = params[:coefficient] || 1
  dividends = [] + (params[:dividends] || [])
  divisors =  [] + (params[:divisors] || [])

  #create arrays of unit hierarchy bases..  
  base_dividends = base(dividends)
  base_divisors = base(divisors)

  #try to find matching units and optimize them
  base_dividends.each_index { | i |
    if index = base_divisors.index(base_dividends[i])
      coefficient *= dividends[i].to_base(1.0)
      coefficient /= divisors[index].to_base(1.0)
        
      #set 'used' units to nil, so they won't be used again  
      dividends[i] = divisors[index] = base_divisors[index] = nil
    end
  }          
     
  return {
    :coefficient => coefficient,
    :dividends => dividends.compact,
    :divisors => divisors.compact
  }
end