Name: simulation/test/p1.rb 
1:
require 'pp'
2:
 
3:
class Task #{{{
4:
  attr_reader :id, :min, :avg, :max
5:
 
6:
  def initialize(id,min,avg,max)
7:
    @id = id
8:
    @min = min
9:
    @avg = avg
10:
    @max = max
11:
  end
12:
end #}}}
13:
 
14:
class SequenceContainer #{{{
15:
  attr_reader :sequence, :counter, :run
16:
 
17:
  def initialize(seq,crit)
18:
    @sequence = seq
19:
    @criterion = crit
20:
    @counter = 0
21:
    @run = seq.length > 0 ? sequence[0].send(crit) : 0
22:
  end
23:
 
24:
  def length
25:
    @sequence.length - @counter
26:
  end  
27:
 
28:
  def <=>(cmp)
29:
    return nil unless cmp.class == SequenceContainer
30:
    return nil if self.length == 0 and cmp.length == 0
31:
    return -1  if cmp.length == 0
32:
    return 1   if self.length == 0
33:
    run <=> cmp.run
34:
  end
35:
 
36:
  def first
37:
    @sequence[@counter] if @counter < @sequence.length
38:
  end
39:
 
40:
  def advance
41:
    if @counter < @sequence.length
42:
      @run += first.send(@criterion)
43:
      @counter += 1
44:
    end  
45:
  end
46:
end #}}}
47:
 
48:
def generate_sequence(id,mtime,max_deviation_percent,num)
49:
  s = []
50:
  1.upto num do |i|
51:
    seed = rand(mtime)
52:
    s << Task.new("#{id}_#{i}", [0, seed - rand(seed*max_deviation_percent*1000)/1000.0].max, seed, seed + rand(seed*max_deviation_percent*1000)/1000.0)
53:
  end
54:
  s
55:
end
56:
 
57:
def parallel_trace(*seqs)
58:
  trace = []
59:
  maxlength = seqs.inject(0){ |inj,e| inj += e.length  }
60:
  0.upto(maxlength-1) do |i|
61:
    seq = seqs.min
62:
    trace << seq.first
63:
    seq.advance
64:
  end
65:
  trace
66:
end
67:
 
68:
s1 = generate_sequence('s1',70,0.1,3)
69:
s2 = generate_sequence('s2',70,0.1,3)
70:
 
71:
t1 = parallel_trace(SequenceContainer.new(s1,'avg'), SequenceContainer.new(s2, 'avg'))
72:
t2 = parallel_trace(SequenceContainer.new(s1,'min'), SequenceContainer.new(s2, 'max'))
73:
t3 = parallel_trace(SequenceContainer.new(s1,'max'), SequenceContainer.new(s2, 'min'))
74:
t4 = parallel_trace(SequenceContainer.new(s1,'min'), SequenceContainer.new(s2, 'min'))
75:
t5 = parallel_trace(SequenceContainer.new(s1,'max'), SequenceContainer.new(s2, 'max'))
76:
 
77:
#puts 'avg'
78:
#pp t1
79:
#puts 'min-max'
80:
#pp t2
81:
#puts 'max-min'
82:
#pp t3
83:
#puts 'min-min'
84:
#pp t4
85:
#puts 'max-max'
86:
#pp t5