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 |
