Class: CPEE::ProcessTransformation::Traces

Inherits:
Array
  • Object
show all
Defined in:
lib/cpee/processtransformation/structures.rb

Overview

}}}

Instance Method Summary collapse

Instance Method Details

#add_breaks(context) ⇒ Object



342
343
344
345
346
347
348
349
350
351
# File 'lib/cpee/processtransformation/structures.rb', line 342

def add_breaks(context)
  trueloops = self.find_all{ |t| t.last == t.first }.length
  if trueloops == self.length
    self << [self.first_node] ### the blank conditional so that we get a break
  else
    self.each do |t|
      t << Break.new(context,1) unless t.last == t.first ### an explicit break
    end
  end  
end

#all_loops?Boolean

Returns:

  • (Boolean)


335
336
337
338
339
# File 'lib/cpee/processtransformation/structures.rb', line 335

def all_loops?
  num = 0
  self.each{|n| num += 1 if n.first == n.last }
  num == self.length
end

#eliminate(loops) ⇒ Object



361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
# File 'lib/cpee/processtransformation/structures.rb', line 361

def eliminate(loops)
  ### find nested loops
  self.each_with_index do |t,i|
    maxcut = 0
    ### find out which common parts the traces share with theloops
    loops.each do |l|
      maxcut.upto(l.length) do |i|
        maxcut = i if t[0...i] == l[0...i]
      end
    end
    ### in case of nested loop (common part occurs at end of loop), include the whole
    0.upto (maxcut-1) do |j|
      if self[i][j] == self[i].last
        loops << self[i].shift(self[i].length)
      end
    end  
  end
  loops.uniq!
  loops.remove_empty
  self.remove_empty

  ### cut from non-nested loops
  self.each_with_index do |t,i|
    maxcut = 0
    ### find out which common parts the traces share with theloops
    loops.each do |l|
      maxcut.upto(l.length) do |i|
        maxcut = i if t[0...i] == l[0...i]
      end
    end
    cutted = self[i].shift(maxcut)
    loops << cutted if cutted.length > 1 ### if only the loop node is left, no need to attach
  end
end

#empty!Object



275
276
277
# File 'lib/cpee/processtransformation/structures.rb', line 275

def empty!
  self.delete_if{true}
end

#extendObject



396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
# File 'lib/cpee/processtransformation/structures.rb', line 396

def extend
  # find largest common
  max = nil
  sh = self.shortest
  sh = sh[0..-2] if sh.first == sh.last
  sh.each_with_index do |e,i|
    if self.same_position_in_all?(e,i)
      max = e
    else  
      break
    end
  end

  # all before the largest common are just copied, so incoming should be 1
  sh.each do |e|
    break if e == max
    e.incoming = 1
  end  

  # if last is the largest common do nothing
  # else append from last to largest common
  self.each do |t|
    unless t.last == max
      last = t.last
      if t.index(last) && t.index(max)
        (t.index(last) + 1).upto(t.index(max)) do |i|
          t << t[i]
        end 
      end
    end  
  end

  max.incoming = self.length + 1
  max
end

#find_endnodeObject



439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
# File 'lib/cpee/processtransformation/structures.rb', line 439

def find_endnode
  # supress loops
  trcs = self.dup
  # trcs.delete_if { |t| t.uniq.length < t.length }

  # find common node (except loops)
  enode = nil
  unless trcs.empty?
    trcs.first.each do |n|
      if trcs.include_in_all?(n)
        enode = n
        break
      end  
    end
  end  
  enode
end

#finished?Boolean

Returns:

  • (Boolean)


305
306
307
# File 'lib/cpee/processtransformation/structures.rb', line 305

def finished?
  self.reduce(0){|sum,t| sum += t.length} == 0
end

#first_nodeObject



283
284
285
# File 'lib/cpee/processtransformation/structures.rb', line 283

def first_node
  self.first.first
end

#include_in_all?(e) ⇒ Boolean

Returns:

  • (Boolean)


324
325
326
327
328
# File 'lib/cpee/processtransformation/structures.rb', line 324

def include_in_all?(e)
  num = 0
  self.each{|n| num += 1 if n.include?(e)} 
  num == self.length
end

#incomingObject

future use



314
315
316
317
318
319
320
321
322
# File 'lib/cpee/processtransformation/structures.rb', line 314

def incoming
  if node = self.same_first
    tcount = 1
    self.each{|t| tcount += 1 if t.first == t.last }
    tcount
  else
    raise "Wrong Question"
  end  
end

#initialize_copy(other) ⇒ Object

{{{



264
265
266
267
# File 'lib/cpee/processtransformation/structures.rb', line 264

def initialize_copy(other)
 super
 self.map!{ |t| t.dup }
end

#loopsObject



353
354
355
356
357
358
359
# File 'lib/cpee/processtransformation/structures.rb', line 353

def loops
  lo = Traces.new self.find_all{ |t| t.first == t.last }
  self.each do |t|
    lo << t if lo.second_nodes.include?(t[1])
  end
  lo.uniq
end

#pop_allObject



301
302
303
# File 'lib/cpee/processtransformation/structures.rb', line 301

def pop_all
  self.each{ |tr| tr.pop }
end

#remove(trcs) ⇒ Object



269
270
271
272
273
# File 'lib/cpee/processtransformation/structures.rb', line 269

def remove(trcs)
  trcs.each do |t|
    self.delete(t)
  end  
end

#remove_emptyObject



279
280
281
# File 'lib/cpee/processtransformation/structures.rb', line 279

def remove_empty
  self.delete_if{|t| t.empty? }
end

#same_firstObject



309
310
311
# File 'lib/cpee/processtransformation/structures.rb', line 309

def same_first
  (n = self.map{|t| t.first }.uniq).length == 1 ? n.first : nil
end

#same_position_in_all?(e, i) ⇒ Boolean

Returns:

  • (Boolean)


329
330
331
332
333
# File 'lib/cpee/processtransformation/structures.rb', line 329

def same_position_in_all?(e,i)
  num = 0
  self.each{|n| num += 1 if n[i] == e}
  num == self.length
end

#second_nodesObject



286
287
288
# File 'lib/cpee/processtransformation/structures.rb', line 286

def second_nodes
  self.map { |t| t.length > 1 ? t[1] : t[0] }
end

#segment_by(endnode) ⇒ Object



457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
# File 'lib/cpee/processtransformation/structures.rb', line 457

def segment_by(endnode)
  # cut shit until common node, return the shit you cut away
  tracesgroup = self.group_by{|t| t.first}.map do |k,trace|
    coltrace = trace.map do |t|
      # slice upto common node, collect the sliced away part
      len = t.index(endnode)
      if len
        cut = t.slice!(0...len)
        cut << t.first
      else # if endnode is nil, then return the whole
        t
      end
    end.uniq
    Traces.new(coltrace)
  end
  [tracesgroup,endnode]
end

#segment_by_loops(loops) ⇒ Object



432
433
434
435
436
437
# File 'lib/cpee/processtransformation/structures.rb', line 432

def segment_by_loops(loops)
  # supress loops
  self.delete_if { |t| loops.include?(t) }
  self.eliminate(loops)
  loops.extend
end

#shift_allObject



298
299
300
# File 'lib/cpee/processtransformation/structures.rb', line 298

def shift_all
  self.each{ |tr| tr.shift }
end

#shortestObject



290
291
292
# File 'lib/cpee/processtransformation/structures.rb', line 290

def shortest
  self.min_by{|e|e.length}
end

#to_sObject



294
295
296
# File 'lib/cpee/processtransformation/structures.rb', line 294

def to_s
  "TRACES: " + self.collect { |t| t.empty? ? '' : t.collect{|n| "%2d" % n.niceid }.join('') }.join("\n        ")
end