Class: CPEE::ProcessTransformation::Traces
- Inherits:
-
Array
- Object
- Array
- CPEE::ProcessTransformation::Traces
- Defined in:
- lib/cpee/processtransformation/structures.rb
Overview
}}}
Instance Method Summary collapse
- #aaa ⇒ Object
- #add_breaks(context, front = true) ⇒ Object
- #all_loops? ⇒ Boolean
- #eliminate(loops) ⇒ Object
- #empty! ⇒ Object
- #extend ⇒ Object
- #find_endnode ⇒ Object
- #finished? ⇒ Boolean
- #first_node ⇒ Object
- #include_in_all?(e) ⇒ Boolean
-
#incoming(node) ⇒ Object
future use.
-
#initialize_copy(other) ⇒ Object
{{{.
- #loops ⇒ Object
- #pop_all ⇒ Object
- #remove(trcs) ⇒ Object
- #remove_by_endnode(enode) ⇒ Object
- #remove_empty ⇒ Object
- #same_first ⇒ Object
- #second_nodes ⇒ Object
- #segment_by(endnode) ⇒ Object
- #segment_by_loops(loops) ⇒ Object
- #shift_all ⇒ Object
- #shortest ⇒ Object
- #to_s ⇒ Object
Instance Method Details
#aaa ⇒ Object
330 331 332 |
# File 'lib/cpee/processtransformation/structures.rb', line 330 def aaa puts 'rrr' end |
#add_breaks(context, front = true) ⇒ Object
340 341 342 343 344 345 346 347 348 349 350 |
# File 'lib/cpee/processtransformation/structures.rb', line 340 def add_breaks(context,front=true) trueloops = self.find_all{ |t| t.last == t.first }.length tb = Break.new(context) if trueloops == self.length self << (front ? [nil,tb] : [tb,nil]) else self.each do |t| t << tb unless t.last == t.first ### an explicit break end end end |
#all_loops? ⇒ Boolean
334 335 336 337 338 |
# File 'lib/cpee/processtransformation/structures.rb', line 334 def all_loops? num = 0 self.each{|n| num += 1 if n.first == n.last } num == self.length end |
#eliminate(loops) ⇒ Object
360 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 |
# File 'lib/cpee/processtransformation/structures.rb', line 360 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
276 277 278 |
# File 'lib/cpee/processtransformation/structures.rb', line 276 def empty! self.delete_if{true} end |
#extend ⇒ Object
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 |
# File 'lib/cpee/processtransformation/structures.rb', line 395 def extend # find largest common max = [] sh = self.shortest sh = sh[0..-2] if sh.first == sh.last sh.each_with_index do |e,i| max << e if self.include_in_all?(e) end max = max.last # 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 end |
#find_endnode ⇒ Object
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 |
# File 'lib/cpee/processtransformation/structures.rb', line 428 def find_endnode # supress loops trcs = self.dup # dangerous TODO 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
306 307 308 |
# File 'lib/cpee/processtransformation/structures.rb', line 306 def finished? self.reduce(0){|sum,t| sum += t.length} == 0 end |
#first_node ⇒ Object
284 285 286 |
# File 'lib/cpee/processtransformation/structures.rb', line 284 def first_node self.first.first end |
#include_in_all?(e) ⇒ 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 |
#incoming(node) ⇒ Object
future use
315 316 317 318 319 320 321 322 |
# File 'lib/cpee/processtransformation/structures.rb', line 315 def incoming(node) tcount = 1 self.each do |t| break if t.length == 1 tcount += 1 if t.last == node end tcount end |
#initialize_copy(other) ⇒ Object
{{{
260 261 262 263 |
# File 'lib/cpee/processtransformation/structures.rb', line 260 def initialize_copy(other) super self.map!{ |t| t.dup } end |
#loops ⇒ Object
352 353 354 355 356 357 358 |
# File 'lib/cpee/processtransformation/structures.rb', line 352 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_all ⇒ Object
302 303 304 |
# File 'lib/cpee/processtransformation/structures.rb', line 302 def pop_all self.each{ |tr| tr.pop } end |
#remove(trcs) ⇒ Object
265 266 267 268 269 |
# File 'lib/cpee/processtransformation/structures.rb', line 265 def remove(trcs) trcs.each do |t| self.delete(t) end end |
#remove_by_endnode(enode) ⇒ Object
270 271 272 273 274 |
# File 'lib/cpee/processtransformation/structures.rb', line 270 def remove_by_endnode(enode) self.delete_if do |t| t[0] != enode end end |
#remove_empty ⇒ Object
280 281 282 |
# File 'lib/cpee/processtransformation/structures.rb', line 280 def remove_empty self.delete_if{|t| t.empty? } end |
#same_first ⇒ Object
310 311 312 |
# File 'lib/cpee/processtransformation/structures.rb', line 310 def same_first (n = self.map{|t| t.first }.uniq).length == 1 ? n.first : nil end |
#second_nodes ⇒ Object
287 288 289 |
# File 'lib/cpee/processtransformation/structures.rb', line 287 def second_nodes self.map { |t| t.length > 1 ? t[1] : t[0] } end |
#segment_by(endnode) ⇒ Object
447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 |
# File 'lib/cpee/processtransformation/structures.rb', line 447 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
421 422 423 424 425 426 |
# File 'lib/cpee/processtransformation/structures.rb', line 421 def segment_by_loops(loops) # supress loops self.delete_if { |t| loops.include?(t) } self.eliminate(loops) loops.extend end |
#shift_all ⇒ Object
299 300 301 |
# File 'lib/cpee/processtransformation/structures.rb', line 299 def shift_all self.each{ |tr| tr.shift } end |
#shortest ⇒ Object
291 292 293 |
# File 'lib/cpee/processtransformation/structures.rb', line 291 def shortest self.min_by{|e|e.length} end |
#to_s ⇒ Object
295 296 297 |
# File 'lib/cpee/processtransformation/structures.rb', line 295 def to_s "TRACES: " + self.collect { |t| t.empty? ? '∅' : t.collect{|n| "%2d" % n.niceid }.join('→ ') }.join("\n ") end |