Class: CPEE::ProcessTransformation::Traces
- Inherits:
-
Array
- Object
- Array
- CPEE::ProcessTransformation::Traces
- Defined in:
- lib/cpee/processtransformation/structures.rb
Overview
}}}
Instance Method Summary collapse
- #add_breaks(context) ⇒ 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 ⇒ Object
future use.
-
#initialize_copy(other) ⇒ Object
{{{.
- #loops ⇒ Object
- #pop_all ⇒ Object
- #remove(trcs) ⇒ Object
- #remove_empty ⇒ Object
- #same_first ⇒ Object
- #same_position_in_all?(e, i) ⇒ Boolean
- #second_nodes ⇒ Object
- #segment_by(endnode) ⇒ Object
- #segment_by_loops(loops) ⇒ Object
- #shift_all ⇒ Object
- #shortest ⇒ Object
- #to_s ⇒ Object
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
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 |
#extend ⇒ Object
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_endnode ⇒ Object
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
305 306 307 |
# File 'lib/cpee/processtransformation/structures.rb', line 305 def finished? self.reduce(0){|sum,t| sum += t.length} == 0 end |
#first_node ⇒ Object
283 284 285 |
# File 'lib/cpee/processtransformation/structures.rb', line 283 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 ⇒ Object
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 |
#loops ⇒ Object
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_all ⇒ Object
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_empty ⇒ Object
279 280 281 |
# File 'lib/cpee/processtransformation/structures.rb', line 279 def remove_empty self.delete_if{|t| t.empty? } end |
#same_first ⇒ Object
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
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_nodes ⇒ Object
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_all ⇒ Object
298 299 300 |
# File 'lib/cpee/processtransformation/structures.rb', line 298 def shift_all self.each{ |tr| tr.shift } end |
#shortest ⇒ Object
290 291 292 |
# File 'lib/cpee/processtransformation/structures.rb', line 290 def shortest self.min_by{|e|e.length} end |
#to_s ⇒ Object
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 |