g1t1

Team 1

 

Szenario-X: Untersuchung im Krankenhaus (Aufgabe 1)

Das gewählte Szenario beschreibt eine Untersuchung in einer Krankenhaus-Ambulanz, mit anschließender Behandlung des Patienten. Das Szenario wurde bewusst simplifiziert um zu einem späteren Zeitpunkt weitere Tasks und Kontrollfluss hinzufügen zu können. Beispiele wären hier etwa die Blutabnahme durch die Krankenschwester vor der Laboruntersuchung, oder eine Befundanalyse durch den Arzt, etc. Wir haben uns für diesen Prozess entschieden, weil er jedem von uns bekannt ist und vermutlich in jeder Krankenanstalt anders ausgeführt wird. 
 
Untersuchung
Abbildung 1: Untersuchung

Variante A

Untersuchung Variante A
Abbildung 2: Untersuchung Variante A
 
 

Variante B

Untersuchung Variante B
Abbildung 3: Untersuchung Variante B
 
 

Aufgabe 2-1: Differenzen

Von Szenario X zu Prozess A

  1. Verschiebung der Tasks aus dem Pool Krankenschwester zu Arzt 
  2. Löschen des Pools Krankenschwester  
  3. Verschieben des Tasks Labor nach Sozialanamnese 
  4. Einfügen einer Entscheidung nach Task Labor 
  5. Verzweigung zu Task Entlassung einfügen (Der Patient ist gesund)  
  6. Verzweigung zu Task Sozialanamnese einfügen (Der Patient lügt)  
  7. Einfügen einer Entscheidung nach vorheriger Entscheidung (Der Patient krank)  
  8. Einfügen des Tasks Stationäre Aufnahme als Alternative zu Behandlung  
  9. Einfügen des zweiten Endergebnisses nach Task Stationäre Aufnahme 
  10. Aufräumen: Löschen der leeren Parallelität 

Von Szenario X zu Prozess B

  1. Einfügen einer Entscheidung nach dem Parallelitäts-Join Labor 
  2. Verzweigung zu Task Entlassung einfügen (Der Patient ist gesund)  
  3. Verzweigung zu Task Sozialanamnese einfügen (Der Patient lügt)  
  4. Verzweigung zu Task Behandlung einfügen (Der Patient ist krank)  

a.)

Daraus kann sich ein Control Flow Problem ergeben sowie pre- oder post conditions verletzt werden. Beispiel: Beim Verschieben/Einfügen/Löschen eines Tasks auf den ein Entscheidungs-branch verweist kann es vorkommen, dass der Branch hinfällig bzw. gelöscht wird. Möglicherweise entsteht ein "infinite loop" oder es kann nicht mehr in einen branch verzweigt werden (pre/post condition verletzt) 

b.)

Beim Verschieben von Knoten (change subsequence) muss darauf geachtet werden, dass es sich nicht immer um ein löschen und einfügen handelt sondern etwa um ein swap() oder serialMove(). Der Knoten muss im gesamten Prozess eindeutig (atomar) sein. Es ist nach dem verschieben auf die Korrektheit des Prozesses zu achten, denn es ändert sich nicht nur die Struktur des Prozesses sondern auch die Bedeutung. Beispiel: Das Verschieben eines Tasks aus einem Parallelitäts Zweig, sodass die Parallelität hinfällig wird und entfernt wird.  

c.)

Unser Team hat sich dafür entschieden zwei verschiedene Repräsentationen unserer Szenarien zu wählen: 

PseudoCode Variante: Szenario X

START
LOOP#1
  Daten_Aufnahme
  Daten_überprüfen
LOOP#1_E_Daten_korrekt == 1
  Basis Anamnese
PARALLEL#1
PARALLEL#1 WAY#1
  Labor
PARALLEL#1 WAY#1_E
PARALLEL#1 WAY#2
  Sozialanamnese
PARALLEL#1 WAY#2_E
PARALLEL#1_E
 Behandlung
 Entlassung
 PROCESS_END#1

PseudoCode Variante: Prozess A

START
LOOP#1  
  Daten_Aufnahme
  Daten_überprüfen
LOOP#1_E Daten_korrekt == 1
  Basis Anamnese
LOOP#2
  Sozialanamnese
  Labor
LOOP#2_E Patient_hat_Wahrheit_gesagt == 1
BRANCH#1
BRANCH#1 WAY#1_Patient_ist_gesund == 1
  Entlassung
  PROCESS_END#1
BRANCH#1 WAY#1_E
BRANCH#1 WAY#2_Patient_ist_krank == 1
BRANCH#2 WAY#1
  Behandlung
  -->Entlassung
BRANCH#2 WAY#1_E
BRANCH#2 WAY#2
  Stationäre_Aufnahme
  PROCESS_END#2
BRANCH#2 WAY#2_E
BRANCH#2_E
BRANCH#1 WAY#2_E
BRANCH#1_E

PseudoCode Variante: Prozess B

START
LOOP#1
  Daten_Aufnahme
  Daten_überprüfen
LOOP#1_E_Daten_korrekt == 1
  Basis Anamnese
PARALLEL#1
PARALLEL#1 WAY#1
  Labor
PARALLEL#1 WAY#1_E
PARALLEL#1 WAY#2
LOOP#2
  Sozialanamnese
PARALLEL#1 WAY#2_E
PARALLEL#1_E
LOOP#2_E Patient_hat_Wahrheit_gesagt = 1
BRANCH#1
BRANCH#1 WAY#1_Patient_ist_krank ==1
  Behandlung
  --> Entlassung
BRANCH#1 WAY#1_E
BRANCH#1 WAY#2_Patient_ist_gesund == 1
  Entlassung
  PROCCESS_END#1
BRANCH#1 WAY#2_E
BRANCH#1_E

c.) Diff Pseudocode Variante von X nach A

LOOP#1
Daten_Aufnahme
Daten_übrprüfen
LOOP#1_E_Daten_korrekt == 1
Basis_Anamnese
PARALLEL#1
PARALLEL#1 WAY#1
Labor
PARALLEL#1 WAY#1_E
PARALLEL#1 WAY#2
Sozialanamnese
PARALLEL#1 WAY#2_E
PARALLEL#1_E
Behandlung
Entlassung
PROCESS_END#1
LOOP#2
Sozialanamnese
Labor
BRANCH#1
BRANCH#1 WAY#1_Patient_ist_gesund == 1
Entlassung
PROCESS_END#1
BRANCH#1 WAY#1_E
BRANCH#1 WAY#2_Patient_ist_krank == 1
BRANCH#2 WAY#1
Behandlung
–>Entlassung
BRANCH#2 WAY#1_E
BRANCH#2 WAY#2
Stationäre_Aufnahme
PROCESS_END#2
BRANCH#2 WAY#2_E
BRANCH#2_E
BRANCH#1 WAY#2_E
BRANCH#1_E
Tabelle 2: Table Description

XML Variante: Szenario X

<process name="X">
<start id="0" target="1">start</start>
 <task id="1" pre="0" target="2">Daten Aufnahme</task>
 <task id="2" pre="1" target="3">Daten Überprüfen</task>
 <cond id="3" pre="2">Daten korrekt</cond>
   <branch id="4" pre="3" target="6">Daten sind korrekt</branch>
   <branch id="5" pre="3" target="1">Daten inkonsistent</branch>
 <task id="6" pre="4" target="7">Basis Anamnese</task>
 <par id="7" pre="6" type="s"></par>
  <branch id="8" pre="7" target="10"></branch>
  <branch id="9" pre="7" target="11"></branch>
 <task id="10" pre="8" target="12">Labor</task>
 <task id="11" pre="9" target="12">Sozialanamnese</task>
 <par id="12" type="e">par0</end>
 <task id="13" pre="12" target="14">Behandlung</task>
 <task id="14" pre="15" target="19">Entlassung</task>
 <end id="15" pre="14">end0</end>
</process>

XML Variante: Prozess A

<process name="A">
<start id="0" target="1">start</start>
 <task id="1" pre="0" target="2">Daten Aufnahme</task>
 <task id="2" pre="1" target="3">Daten Überprüfen</task>
 <cond id="3" pre="2">Daten korrekt</cond>
   <branch id="4" pre="3" target="6">Daten sind korrekt</branch>
   <branch id="5" pre="3" target="1">Daten inkonsistent</branch>
 <task id="6" pre="4" target="7">Basis Anamnese</task>
 <task id="7" pre="6" target="8">Sozialanamnese</task>
 <task id="8" pre="7" target="9">Labor</task>
 <cond id="9" pre="8">Patienten Status</cond>
   <branch id="10" pre="9" target="7">Der Patient lügt</branch>
   <branch id="11" pre="9" target="17">Patient ist gesund</branch>
   <branch id="12" pre="9" target="13">Patient ist krank</branch>
 <cond id="13" pre="8">Patienten Status2</cond>
   <branch id="14" pre="13" target="16">Behandlung reicht</branch>
   <branch id="15" pre="13" target="19">Stationäre Aufnahme nötig</branch>
  <task id="16" pre="14" target="17">Behandlung</task>
  <task id="17" pre="16" target="18">Entlassung</task>
 <end id="18" pre="17">end0</end>
  <task id="19" pre="15" target="20">Stationäre Aufnahme</task>
 <end id="20" pre="19">end1</end>
</process>
 
FOR DIFF: (Erklärung unten) 
 
START="start"
TASK="Daten Aufnahme"
TASK="Daten Überprüfen"
COND="Daten korrekt"
BRANCH_TARGET="Basis Anamnese"
BRANCH_TARGET="Daten Aufnahme"
TASK="Basis Anamnese"
TASK="Sozialanamnese"
TASK="Labor"
COND="Patienten Status"
BRANCH_TARGET="Sozialanamnese"
BRANCH_TARGET="Entlassung"
BRANCH_TARGET="Patienten Status2"
COND="Patienten Status2"
BRANCH_TARGET="Behandlung"
BRANCH_TARGET="Stationäre Aufnahme"
TASK="Behandlung"
TASK="Entlassung"
END="end0"
END="end1"

XML Variante: Prozess B

<process name="B">
<start id="0" target="1">start</start>
 <task id="1" pre="0" target="2">Daten Aufnahme</task>
 <task id="2" pre="1" target="3">Daten Überprüfen</task>
 <cond id="3" pre="2">Daten korrekt</cond>
   <branch id="4" pre="3" target="6">Daten sind korrekt</branch>
   <branch id="5" pre="3" target="1">Daten inkonsistent</branch>
 <task id="6" pre="4" target="7">Basis Anamnese</task>
 <par id="7" pre="6" type="s"></par>
  <branch id="8" pre="7" target="10"></branch>
  <branch id="9" pre="7" target="11"></branch>
 <task id="10" pre="8" target="12">Labor</task>
 <task id="11" pre="9" target="12">Sozialanamnese</task>
 <par id="12" type="e">par0</end>
 <cond id="13" pre="12">Patienten Status</cond>
   <branch id="14" pre="13" target="11">Der Patient lügt</branch>
   <branch id="15" pre="13" target="17">Patient ist gesund</branch>
   <branch id="16" pre="13" target="16">Patient ist krank</branch>
  <task id="17" pre="15" target="18">Behandlung</task>
  <task id="18" pre="17" target="19">Entlassung</task>
 <end id="19" pre="18">end0</end>
</process>
 
 
FOR DIFF: (Erklärung unten) 
 
START="start"
TASK="Daten Aufnahme"
TASK="Daten Überprüfen"
COND="Daten korrekt"
BRANCH_TARGET="Basis Anamnese"
BRANCH_TARGET="Daten Aufnahme"
TASK="Basis Anamnese"
PAR="par0"
TASK="Sozialanamnese"
TASK="Labor"
COND="Patienten Status"
BRANCH_TARGET="Sozialanamnese"
BRANCH_TARGET="Entlassung"
BRANCH_TARGET="Behandlung"
END="end0"

Beschreibung: XML Struktur

tags:  
 
<process><start><end><task><cond><branch><par>
 
Attribute:  
 
<task>
id
target {id des nächsten Knoten}
pre {id des Vorgänger Knoten}
 
<cond>
id
pre {id des Vorgänger Knoten}
 
<branch>
id
pre {id des Vorgänger Knoten}
target {id des nächsten Knoten}
 
<par>
 
id
type {start oder ende]
 

Idee & Zielsetzung der Repräsentation

Das Ziel des Ansatzes ist größtmögliche Flexibilität zu erreichen. Es ist möglich an jeden beliebigen Punkt eines (komplexen) Prozesses einzusteigen und nach "vorne" oder "hinten" zu navigieren. Die Überlegung: Wenn die Repräsentation flexibel ist und komplexe Prozesse eindeutig darstellen kann, dann müsste es theoretisch möglich sein auch komplexe Prozesse zu mergen.  
 

Diff:

Bei der Erstellung eines differentials nach klassischem Muster (zeilenweise Unterschiede), bei einer XML Struktur, gibt es ein entscheidendes Problem. Es ist möglich, dass sich alle "Zeilen" eines Prozesses unterscheiden können obwohl der Prozess ident ist. Dieses Problem ergibt sich aus der Verknüfung mit ID Attributen in den einzelnen Tags. Beginnen die IDs (etwa durch eine vorherige Evolution) nicht bei 0 sind alle Referenzen von einander verschieden, obwohl die Referenzen die selben Knoten verbinden. Der Output eines Diff Algorithmus auf eine derartige XML Struktur muss die Referenzen berücksichtigen und nicht einfach Sequenzen von Zeichen vergleichen, sondern Referenzen auf Knoten. Eine Möglichkeit der Darstellung basiert auf der Annahme, dass IDs, in unterschiedlichen Prozessen gleichgesetzt werden, wenn die Knoten den selben Namen tragen. Sequenzen würden sich dann aus der Abfolge der tags ergeben. Dies könnte als LCS Problem betrachtet werden und mit dem Hunt-Mcllroy Algorithmus geolöst werden. 

Pseudo Code

  1. Finde die Anzahl/Typ/Name der Knoten in den Prozessen 
  2. Definiere welche Knoten entweder hinzugefügt oder entfernt wurden.  
  3. Finden der longest common subsequenc auf Basis der ID Refs  
  4. Definiere an welchem Punkt (ID,PRE,TARGET) Änderungen vorgenommen werden müssen.  
  5. Erstellen des changesets  

Beispiel: Einfügen eines tasks

  1. Vergebe eine ID für den neuen TASK 
  2. Setze die Nachfolger ID 
  3. Setze die Vorgänger ID 
  4. Vom Nachfolger die Vorgänger ID ändern 
  5. Vom Vorgänger die Nachfolger ID ändern 
Beim Einfügen einer Sequenz ändert sich an dem Schema nichts, da nur die "Enden" in den Prozess eingehängt werden. Das entfernen eines Konotens (Sequenz) läuft im Prinzip gleich ab.  

d.)

Differenzen zwischen Prozess A und Prozess B mittels XML Repräsentation

Prozess A
Prozess X
START="start"
START="start"
TASK="Daten Aufnahme"
TASK="Daten Aufnahme"
TASK="Daten Überprüfen"
TASK="Daten Überprüfen"
COND="Daten korrekt"
COND="Daten korrekt"
BRANCH_TARGET="Basis Anamnese"
BRANCH_TARGET="Basis Anamnese"
BRANCH_TARGET="Daten Aufnahme"
BRANCH_TARGET="Daten Aufnahme"
TASK="Basis Anamnese"
TASK="Basis Anamnese"
TASK="Sozialanamnese"
PAR="par0"
TASK="Labor"
TASK="Sozialanamnese"
COND="Patienten Status"
TASK="Labor"
BRANCH_TARGET="Sozialanamnese"
COND="Patienten Status
BRANCH_TARGET="Entlassung"
BRANCH_TARGET="Sozialanamnese"
BRANCH_TARGET="Patienten Status2"
BRANCH_TARGET="Entlassung"
COND="Patienten Status2"
BRANCH_TARGET="Behandlung"
BRANCH_TARGET="Behandlung"
END="end0"
BRANCH_TARGET="Stationäre Aufnahme"
TASK="Behandlung"
TASK="Entlassung"
END="end0"
END="end1"
Tabelle 2: Knoten Unterschiede
Diese Darstellung zeigt nur welche Knoten vorhanden/nicht vorhanden sind. Mit Hilfe der IDs kann man nun eine Differenz finden die die Reihenfolge berücksichtigt. 
 

Beispiel DIFF für Prozess X nach Prozess A

- <process name="X"> 
+ <process name="A"> 
- <par id="7" pre="6" type="s"></par> 
- <branch id="8" pre="7" target="10"></branch> 
- <branch id="9" pre="7" target="11"></branch> 
- <par id="12" type="e">par0</end> 
CHANGE_ON_TASK{(id_old=11,id=21,pre=6,target=10)} // Sozialanamnese vor Labor stellen (Ich kenne die ID von Labor weil Tasks mit dem selben Namen auch eine äquivalente ID haben) 
CHANGE_ON_TASK{(id_old=6,id=6,pre=4,target=21)} // Vorgänger mit Sozialanamnese verknüpfen 
CHANGE_ON_TASK{(id_old=10,id=10,pre=21,target=22)} 
+ <cond id="" pre="">Patienten Status</cond> 
ADD_COND{(id=22,pre=10)} 
+ <branch id="" pre="" target="">Der Patient lügt</branch> 
ADD_BRANCH{(id=23,pre=22,target=21)} 
+ <branch id="" pre="" target="">Patient ist gesund</branch> 
ADD_BRANCH{(id=24,pre=22,target=14)} 
+ <branch id="" pre="" target="">Patient ist krank</branch> 
ADD_BRANCH{(id=25,pre=22,target=25)} 
+ <cond id="" pre="">Patienten Status2</cond> 
ADD_COND{(id=26,pre=25)} 
+ <branch id="" pre="" target="">Behandlung reicht</branch> 
ADD_BRANCH{(id=27,pre=26,target=13)} 
+ <branch id="" pre="" target="">Stationäre Aufnahme nötig</branch> 
ADD_BRANCH{(id=28,pre=26,target=29)} 
+ <task id="" pre="" target="">Stationäre Aufnahme</task> 
ADD_TASK{(id=29,pre=28,target=30)} 
+ <end id="" pre="">end1</end> 
ADD_END{(id=30,pre=29)} 
 
 
Ein Changeset beschreibt wie aus einer Sequenz eine andere Sequenz generiert werden kann. Ein Changelog zeigt im Prinzip nur an welche Änderungen vorgenommen wurden, jedoch nicht wie man zu diesen gelangt. 

Aufgabe 2-2: Merge

Wenn unser Team diese Frage richtig versteht sind hier unter den "Anleitungen" nicht die Diff Algorithmen aus Punkt c/d gemeint sondern die Anleitungen vom Anfang der Hausübung 2-1
 
nach 3-way-merge 
  1. Auflösen der Parallelität Labor/Sozialanamnese 
  2. Einfügen einer Entscheidung nach Task „Labor“ 
  3. Verzweigung zu Task „Entlassung“ einfügen (Patient ist gesund) 
  4. Verzweigung zu Task „Sozialanamnese“ einfügen (Patient lügt) 
    ….. 
Das Ergebnis wäre der Prozess A! 

a.) Einfacher Merge

Untersuchung Variante C
Abbildung 4: Untersuchung Variante C
 
Untersuchung Variante D
Abbildung 5: Untersuchung Variante D
 

Merge Szenario (C) mit Szenario (D)

xxx 
 

b.) Prozesse E und F

Untersuchung Variante E
Abbildung 6: Untersuchung Variante E
 
Untersuchung Variante F
Abbildung 7: Untersuchung Variante F

Merge Szenario (E) mit Szenario (F)

Der Mensch muss an dieser Stelle entscheiden ob bei dem Prozess das Blut hausintern im Labor getestet, oder das Blut zur Analyse in ein Institut geschickt werden soll. Ein "Automatch" durch den Computer wäre zwar möglich, würde jedoch zu einem falschen Ergebnis führen, da jedes Blut zweimal getestet würde. Die Folge wären höhere Kosten und redundante Ergebnisse. 
 

c.) Prozesse G und H

Untersuchung Variante G
Abbildung 8: Untersuchung Variante G
 
Untersuchung Variante H
Abbildung 9: Untersuchung Variante H

Merge Szenario (G) mit Szenario (H)

In Szenario (G) wurde vor dem Task "Stationäre Aufnahme" zusätzlich eine Überprüfung auf freie Betten hinzugefügt. Ein äquivalenter Subprozess wurde in Szenario (H) gleich nach der Überprüfung der Daten angehängt. Ein Computer würde bei einem Automatch entweder beide Subprozesse in einem neuen Modell vereinen oder könnte nicht zwischen richtig und falsch unterscheiden. Für den Menschen ist es offensichtlich, dass die Überprüfung auf freie Betten nur dann notwendig ist, wenn ein Patient auch stationär aufgenommen werden muss.  
Zusätzlich wurde ein Tippfehler bei Labor (Laboe) und ein Rechtschreibfehler bei Basis Anamnese (Anamnehse) zur Verwirrung hinzugefügt. Der Computer würde, aufgrund des fehlenden Verständnis der Semantik wiederum den Menschen um Rat fragen. Für diesen wäre die Lösung wiederum eindeutig. 

d.) Probleme beim Merging

Szenario (A) und Szenario (B) wären nur partiell automergebar. So würde der Computer den Task "Stationäre Aufnahme" korrekt in einem neuen Modell anhängen. Bei der "Parallelität" und "Serialität" der Tasks Sozialanamnese und Labor müsste sich jedoch der Mensch für die "richtige" Variante entscheiden, da beide Varianten nicht in einem Modell existieren können. 

e.) Probleme der schrittweisen Anleitung

Kann zu Inkonsistenzen bzw. zu semantischen Fehlern füren. Die Anleitungen taugen nicht für ein merging.  

Verbesserungsvorschlag

XML Repräsentation verwenden und mittels 2-way-merge die Prozesse mergen. Komponentenbasiertes merging mit Metriken sollten wesentlich bessere Ergebnisse liefern können als die schrittweisen Anleitungen. 
 
 

Aufgabe 3: Maschinenunterstuezte Differenzen

= Repräsentation der Prozesse (Änderungen zu Aufgabe 2) 
 
Beispiel-Prozess X: 
 
<process name="X">
 <start id="0" target="400">start</start>
  <task id="400" pre="0" target="401">Daten Aufnahme</task>
  <task id="401" pre="400" target="1">Daten Überprüfen</task>
  <cond id="1" pre="401">Daten korrekt</cond>
   <branch id="300" pre="1" target="402">Daten sind korrekt</branch>
   <branch id="301" pre="1" target="400">Daten inkonsistent</branch>
  <task id="402" pre="300" target="100">Basis Anamnese</task>
  <par id="100" pre="402" type="s">par0</par>
   <branch id="307" pre="100" target="403">l1</branch>
   <branch id="308" pre="100" target="404">s1</branch>
  <task id="403" pre="307" target="101">Labor</task>
  <task id="404" pre="308" target="101">Sozialanamnese</task>
  <par id="101" type="e" target="405">par0e</par>
  <task id="405" pre="101" target="406">Behandlung</task>
  <task id="406" pre="405" target="1000">Entlassung</task>
  <end id="1000" pre="406">end0</end>
</process>
 
Untersuchung
Abbildung 10: Untersuchung
 
Beispiel-Prozess A: 
 
<process name="A">
 <start id="0" target="400">start</start>
  <task id="400" pre="0" target="401">Daten Aufnahme</task>
  <task id="401" pre="400" target="1">Daten Überprüfen</task>
  <cond id="1" pre="401">Daten korrekt</cond>
   <branch id="300" pre="1" target="402">Daten sind korrekt</branch>
   <branch id="301" pre="1" target="400">Daten inkonsistent</branch>
  <task id="402" pre="300" target="404">Basis Anamnese</task>
  <task id="404" pre="402" target="403">Sozialanamnese</task>
  <task id="403" pre="404" target="2">Labor</task>
  <cond id="2" pre="403">Patienten Status</cond>
   <branch id="302" pre="2" target="404">Der Patient lügt</branch>
   <branch id="303" pre="2" target="406">Patient ist gesund</branch>
   <branch id="304" pre="2" target="3">Patient ist krank</branch>
  <cond id="3" pre="304">Patienten Status2</cond>
   <branch id="305" pre="3" target="405">Behandlung reicht</branch>
   <branch id="306" pre="3" target="407">Stationäre Aufnahme nötig</branch>
  <task id="405" pre="305" target="406">Behandlung</task>
  <task id="406" pre="405" target="1000">Entlassung</task>
  <end id="1000" pre="406">end0</end>
  <task id="407" pre="306" target="1001">Stationäre Aufnahme</task>
  <end id="1001" pre="407">end1</end>
</process> 
 
Untersuchung Variante A
Abbildung 11: Untersuchung Variante A
 
Beispiel-Prozess G: 
 
<process name="G">
 <start id="0" target="400">start</start>
  <task id="400" pre="0" target="401">Daten Aufnahme</task>
  <task id="401" pre="400" target="1">Daten Überprüfen</task>
  <cond id="1" pre="401">Daten korrekt</cond>
   <branch id="300" pre="1" target="402">Daten sind korrekt</branch>
   <branch id="301" pre="1" target="400">Daten inkonsistent</branch>
  <task id="402" pre="300" target="404">Basis Anamnese</task>
  <task id="404" pre="402" target="403">Sozialanamnese</task>
  <task id="403" pre="404" target="2">Labor</task>
  <cond id="2" pre="403">Patienten Status</cond>
   <branch id="302" pre="2" target="404">Der Patient lügt</branch>
   <branch id="303" pre="2" target="406">Patient ist gesund</branch>
   <branch id="304" pre="2" target="3">Patient ist krank</branch>
  <cond id="3" pre="304">Patienten Status2</cond>
   <branch id="305" pre="3" target="405">Behandlung reicht</branch>
   <branch id="306" pre="3" target="412">Stationäre Aufnahme nötig</branch>
  <task id="405" pre="305" target="406">Behandlung</task>
  <task id="406" pre="405" target="1000">Entlassung</task>
  <end id="1000" pre="406">end0</end>
  <task id="412" pre="306" target="5">Überprüfung Bettenkapazitäten</task>
  <cond id="5" pre="412">Betten vorhanden</cond>
   <branch id="313" pre="5" target="407">BettVorhandenJa</branch>
   <branch id="314" pre="5" target="413">BettVorhandenNein</branch>
  <task id="413" pre="314" target="1004">Überweisung</task>
  <end id="1004" pre="413">endÜberweisung</end>
  <task id="407" pre="313" target="1001">Stationäre Aufnahme</task>
  <end id="1001" pre="407">end1</end>
</process>
 
Untersuchung Variante G
Abbildung 12: Untersuchung Variante G
 

Repräsentation: Bedingungen

  1. Jeder Knoten hat eine eindeutige ID. Eine ID bezieht sich immer auf den Namen eines jeden Knotens. IDs bzw. Namen sind auch Kontext abhängig (conditions und branches) 
  2. IDs werden einmal vergeben. Ein Task mit dem Namen "Test" kann immer nur eine ID haben. "Test2" hat mit Sicherheit eine andere ID. Diese Einschränkung wird gerechtfertigt,  
indem wir davon ausgehen, dass jeder Knoten wenn er angelegt wird, (z.B in einem Business Process Modeling Tool) eindeutig ist bzw eine klar definierte Aufgabe zu erfüllen  
 
hat (bzw. Pre-Post Condition). In Aufgabe 2 wurde noch zusätzliche Flexibilität durch unterschiedliche IDs gefrodert. Wurde verworfen da zu aufwendig. 
  1. Start kann es nur einmal geben und hat immer einen Nachfolger der nicht End sein darf. 
  2. Tasks haben immer Vorgänger und Nachfolger  
  3. Conditions haben keinen Nachfolger (denn es kann mehrere geben, sodass nicht eindeutig definiert) sondern nur einen Vorgänger 
  4. Branches haben immer einen Vorgänger und einen Nachfolger 
  5. Parallel Start hat immer einen Vorgänger und einen type s 
  6. Parallel End hat immer einen Nachfolger und einen type e 
  7. End hat einen Vorgänger und keinen Nachfolger (kann mehrfach existieren) 
  8. Alle nodes haben ein value, welches elementar ist 

Beispiel: diffx FROM:X TO:A

<diff from="X" to="A">
 <del>
   <par id="100" pre="402" type="s">par0</par>
   <branch id="307" pre="100" target="403">l1</branch>
   <branch id="308" pre="100" target="404">s1</branch>
   <par id="101" target="405" type="e">par0e</par>
 </del>
 <add>
   <cond id="2" pre="403">Patienten Status</cond>
   <branch id="302" pre="2" target="404">Der Patient lügt</branch>
   <branch id="303" pre="2" target="406">Patient ist gesund</branch>
   <branch id="304" pre="2" target="3">Patient ist krank</branch>
   <cond id="3" pre="304">Patienten Status2</cond>
   <branch id="305" pre="3" target="405">Behandlung reicht</branch>
   <branch id="306" pre="3" target="407">Stationäre Aufnahme nötig</branch>
   <task id="407" pre="306" target="1001">Stationäre Aufnahme</task>
   <end id="1001" pre="407">end1</end>
 </add>
 <moved>
   <task id="404" pre="308" target="101">Sozialanamnese</task>
   <task id="403" pre="307" target="101">Labor</task>
 </moved>
 <sequence>
   <start id="0" target="400">start</start>
   <task id="400" pre="0" target="401">Daten Aufnahme</task>
   <task id="401" pre="400" target="1">Daten Überprüfen</task>
   <cond id="1" pre="401">Daten korrekt</cond>
   <branch id="300" pre="1" target="402">Daten sind korrekt</branch>
   <branch id="301" pre="1" target="400">Daten inkonsistent</branch>
   <task id="402" pre="300" target="100">Basis Anamnese</task>
   <task id="405" pre="101" target="406">Behandlung</task>
   <task id="406" pre="405" target="1000">Entlassung</task>
   <end id="1000" pre="406">end0</end>
 </sequence>
 <change id="402" target="404"></change>
 <change id="405" pre="305"></change>
 <change id="404" pre="402"></change>
 <change id="404" target="403"></change>
 <change id="403" pre="404"></change>
 <change id="403" target="2"></change>
</diff>

Erklärung des diffs

  1. Diff = Wie komme ich von einem Prozess zu einem anderen Prozess 
  2. Idee: Mengenbasierter Ansatz 
  3. Alle Elemente die aus dem Ausgangsprozess gelöscht wurden 
  4. Alle Elemente die hinzugefügt wurden 
  5. Alle Elemente die zwar in beiden Prozessen vorkommen, aber in einer anderen Anordnung (moved) 
  6. Alle Sequenzen die in beiden Prozessen vorkommen. (Eine Sequenz besteht aus min. 2 oder mehr zusammenhängenden Elementen) 
  7. Alle diese Mengen müssen nun zusammengesetzt werden (change Anweisung: wähle Element mit der id=xy und ändere ihre pre || target auf ID=xyz) 
Hinweis: Das hier aufgeführte diff file kann viel kleiner gehalten werden indem nur die IDs angegben werden. Zum Verständnis ist es aber besser die gesamte Struktur zu zeigen. 

Algorithmus

  1. Finde alle Elemente die aus dem Ausgangsprozess gelöscht wurden. 
  2. Finde alle Elemente die zum Zielprozess hinzugefügt wurden. 
  3. Finde alle Sequenzen in der Menge der Elemente die in beiden Prozessen enthalten sind.  
  4. Nach diesem Schritt muss nachvollziehbar gemacht werden, wie die Elemente und Sequenzen verbunden werden können. 
  5. Sequenzen müssen/können nur am Anfang bzw. am Ende modifiziert werden ⇒ Anfang/Ende durchsuchen und mit Zielprozess vergleichen 
  6. Moved Items werden nach dem selben Schema zugeordnet 
  7. Erstellen der change Anweisungen 

diffx tool

v0.4.1 Diffx linux executable 
v0.5.1 Some serious bugs fixed 
v0.5.3 Some minor bugs fixed 
 
diffx testtool (C++), überprüft ein diffx. Bash script für Ordnerstruktur folgt zu einem späteren Zeitpunkt 
v0.1.2 diffx_tester 

diffx tool (Strukturbasierter Ansatz)

Test Tool

  1. Vergleich der Anzahl aller "DELETE", "ADD", "MOVED" und "SEQUENCE" Tags. 
  2. Wenn obige Bedingung erfüllt: Vergleich der ID# in der "CHANGING" section. 
  3. –> ID Vergleich der "Targets" und "Pres" 
  4. "Semantischer" Vergleich 

Aufgabe 4: Three-Way Merge

Update: diffx Testtool 

Test Tool

Die folgende Datei enthält das diffx tool inklusive der scripts und programme um automatische Tests durchführen zu können (Vollständig nachgereicht für Aufgabe3) 
diffx-v0.5.4 mit testtool 

Beschreibung:

Zur Validierung der erstellten diffx-files wurde das Test-Programm "diffx_tester" entworfen. Als Grundlage wurde die Annahme getroffen, dass aus einem diff-file, welches den Unterschied von Prozess X und Prozess A beschreibt der Zielprozess A erstellt werden kann. Dem diffx_tester müssen daher zwei Parameter übergeben werden: Das diffx-file und der erwartete Prozess. Der Tester erstellt temporär aus dem diffx-file den Zielprozess und vergleicht diesen mit dem erwarteten Prozess. Das difx-file ist korrekt falls keine Unterschiede zwischen Zielprozess und dem erwarteten Prozess erkannt wurde. Um alle diffx Dateien automatisch testen zu können wurde ein Shell-Script geschrieben. Dieses iteriert über alle Dateien im diffx-Ordner und übergibt die erforderlichen Parameter dem diffx_tester. Anhand der Ausgabe können fehlerhafte Dateien schnell gefunden werden. 
 
Ergebnis: Keine Fehler gefunden !! 

Aufgabe 4.1: 3way mergex tool

  1. Programm Abstürze nicht ausgeschlossen 
  2. Fehler in der richtigen Verknüpfung bei komplexeren Prozessen möglich 
  3. Einige Routinen sind noch nicht vollständig implementiert und werden nachgereicht 
  4. User Dialog nicht vollständig umgesetzt 
mergex3-v0.2.9 
mergex3-v0.3.0 bug fixed in writer 

Beschreibung:

Die gewählte Repräsentation ermöglicht es, von einer rein sequenziellen Vorgehensweise Abstand nehmen zu können. mergex3 erkennt welche Änderungen wo und in welcher Form durchgeführt wurden. Der Lösungsansatz ist regelorientiert. Beispiel: Wenn eine Änderung exakt gleich ist, wird sie sofort angewendet. Wenn ein delete und ein move auf das gleiche Element durchgeführt wird, wird der User in Form  
von Platzierungsvorschlägen nach seiner Meinung gefragt.  
 
  1. Einlesen der Prozess files: A.prcx, B.prcx, X.prcx 
  2. Erstellen der diffx files: X_A.diffx und X_B.diffx 
  3. Erneutes einlesen der *.diffx files  
  4. Anwenden der Changes 
  5. Erkennen und Aufteilen der Änderungen in (dieser ersten Phase des Algorithmus) "konfliktfreihe" und "konfliktbehaftete" Elemente 
  6. Im nächsten Schritt (reduce() Methode) wird entschieden welche Änderungen aus welchem *.diffx File aufgenommen werden können (Abgleich mit gelöschten Vorgängern/Nachfolgern) 
  7. Erkennen von Konflikten die sich aus den verschiedenen Verknüpfungen (pre/target) auf geänderte Elemente ergeben 
  8. In manchen Fällen ist eine automatische Zuordnung möglich, etwa: Ein neuer Task und eine Condition werden an der selben Stelle eingeführt. Wer kommt zuerst? Antwort: der Task 
  9. In einigen Fällen kann nicht automatisch zugeordnet werden. Der User wird mit Vorschägen zur Verknüpfung konfrontiert. 
  10. Nach Abarbeitung der Fragen werden neue Change Anweisungen generiert die sich potenziell auf alle beteiligten Elemente eines Prozesses auswirken können (SCHWER!) 
  11. Ausgabe eines *.diffx files auf std out oder in einem file 
 
Ausgabe A_B_X.mergex: Merge von A.prcx und B.prcx 
 
<mergex process_1="A" process_2="B" ancestor="X">
 <del>
   <par id="100" pre="402" type="s">par0</par>
   <branch id="307" pre="100" target="403">l1</branch>
   <branch id="308" pre="100" target="404">s1</branch>
   <par id="101" target="405" type="e">par0e</par>
 </del>
 <add>
   <branch id="302" pre="2" target="404">Der Patient lügt</branch>
   <branch id="303" pre="2" target="406">Patient ist gesund</branch>
   <cond id="3" pre="304">Patienten Status2</cond>
   <branch id="305" pre="3" target="405">Behandlung reicht</branch>
   <branch id="306" pre="3" target="407">Stationäre Aufnahme nötig</branch>
   <task id="407" pre="306" target="1001">Stationäre Aufnahme</task>
   <end id="1001" pre="407">end1</end>
   <cond id="2" pre="403">Patienten Status</cond>
   <branch id="304" pre="2" target="3">Patient ist krank</branch>
 </add>
 <moved>
   <task id="404" pre="402" target="403">Sozialanamnese</task>
   <task id="403" pre="404" target="2">Labor</task>
 </moved>
 <sequence>
   <start id="0" target="400">start</start>
   <task id="400" pre="0" target="401">Daten Aufnahme</task>
   <task id="401" pre="400" target="1">Daten Überprüfen</task>
   <cond id="1" pre="401">Daten korrekt</cond>
   <branch id="300" pre="1" target="402">Daten sind korrekt</branch>
   <branch id="301" pre="1" target="400">Daten inkonsistent</branch>
   <task id="406" pre="405" target="1000">Entlassung</task>
   <end id="1000" pre="406">end0</end>
   <task id="402" pre="300" target="404">Basis Anamnese</task>
   <task id="405" pre="305" target="406">Behandlung</task>
</mergex>
 
Ausgabe D_E_X.mergex: Merge von D.prcx und E.prcx 
 
X_E.diffx written successfully ...
X_D.diffx written successfully ...
Commencing merge ...
 
-----------------------------------------------
Warning: Automatic merge process halted!
Element 403 was once deleted and once moved.
Enter option (f) to forget element or (p) for placing the Element
f
-----------------------------------------------
Warning: Automatic merge process halted!
The predecessor of Element 416 does not exist anymore.
The sucessor of Element 416 is 417
Valid predecessors are:
404
418
Please provide an ID for the new predecessor:
404
-----------------------------------------------
Warning: Automatic merge process halted!
The predecessor of Element 415 does not exist anymore.
The sucessor of Element 415 is 405
Valid predecessors are:
418
Please provide an ID for the new predecessor:
418
 
<mergex process_1="D" process_2="E" ancestor="X">
 <del>
   <branch id="307" pre="100" target="403">l1</branch>
   <par id="100" pre="402" type="s">par0</par>
   <branch id="308" pre="100" target="404">s1</branch>
   <par id="101" target="405" type="e">par0e</par>
   <branch id="316" pre="100" target="416">zurBlutabnahme</branch>
   <task id="403" pre="404" target="2">Labor</task>
 </del>
 <add>
   <cond id="2" pre="403">Patienten Status</cond>
   <branch id="302" pre="2" target="404">Der Patient lügt</branch>
   <branch id="303" pre="2" target="406">Patient ist gesund</branch>
   <branch id="304" pre="2" target="3">Patient ist krank</branch>
   <cond id="3" pre="304">Patienten Status2</cond>
   <branch id="305" pre="3" target="410">Behandlung reicht</branch>
   <branch id="306" pre="3" target="407">Stationäre Aufnahme nötig</branch>
   <task id="410" pre="305" target="4">Arztgespräch</task>
   <cond id="4" pre="410">Patienten nach Studie fragen</cond>
   <branch id="311" pre="4" target="411">StudieJa</branch>
   <branch id="312" pre="4" target="405">StudieNein</branch>
   <task id="411" pre="311" target="406">BehandlungMitStudie</task>
   <task id="407" pre="306" target="1001">Stationäre Aufnahme</task>
   <end id="1001" pre="407">end1</end>
   <task id="416" pre="316" target="417">Blutabnahme</task>
   <task id="417" pre="416" target="418">Blutanalyse Labor</task>
   <task id="418" pre="417" target="101">Erstellung Blutbild</task>
   <task id="415" pre="101" target="405">Befundanalyse</task>
 </add>
 <moved>
   <task id="404" pre="402" target="403">Sozialanamnese</task>
 </moved>
 <sequence>
   <start id="0" target="400">start</start>
   <task id="400" pre="0" target="401">Daten Aufnahme</task>
   <task id="401" pre="400" target="1">Daten Überprüfen</task>
   <cond id="1" pre="401">Daten korrekt</cond>
   <branch id="300" pre="1" target="402">Daten sind korrekt</branch>
   <branch id="301" pre="1" target="400">Daten inkonsistent</branch>
   <task id="406" pre="405" target="1000">Entlassung</task>
   <end id="1000" pre="406">end0</end>
   <task id="402" pre="300" target="404">Basis Anamnese</task>
   <task id="405" pre="415" target="406">Behandlung</task>
 </sequences>
 <change id="416" pre="404"></change>
 <change id="404"></change>
 <change id="415" pre="418"></change>
 <change id="418"></change>
 <change id="312"></change>
 <change id="405" pre="312"></change>
 <change id="415"></change>
 <change id="2" pre="415"></change>
</mergex>
Done!
 

Aufgabe 5: Metriken & Vergleichbarkeit herstellen

Aufgabe 5.1 Vergleichbarkeit herstellen

Umwandlung in Sumatra (Prozess X)
Abbildung 13: Umwandlung in Sumatra (Prozess X)
 
Umwandlung in Sumatra (Prozess A)
Abbildung 14: Umwandlung in Sumatra (Prozess A)
 
Umwandlung in Sumatra (Prozess B)
Abbildung 15: Umwandlung in Sumatra (Prozess B)
 
Dennoch Probleme beim mergen weil keine Rückführenden Verzweigungen möglich!! 
 
«XML Code des Prozesses X:»  
 

Speichern sie dann das Testset und schreiben Sie einen Uebersetzer der die XML Description (+

Endpunkte + Datenelemente) in ihr Format übersetzt:

Link zum Translator:  

Ausgehende XML Repräsentation von Prozess A

<description>
<description xmlns="http://cpee.org/ns/description/1.0">
 <call id="a1" endpoint="">
   <parameters>
     <method>post</method>
     <parameters>
       <Act_name>Start</Act_name>
     </parameters>
   </parameters>
 </call>
 <choose>
   <alternative condition="Daten inkonsistent">
     <call id="a2" endpoint="">
       <parameters>
         <method>post</method>
         <parameters>
           <Act_name>Daten Aufnahme</Act_name>
         </parameters>
       </parameters>
       </call>
     <call id="a3" endpoint="">
       <parameters>
         <method>post</method>
         <parameters>
           <Act_name>Daten überprüfen</Act_name>
         </parameters>
       </parameters>
     </call>
   </alternative>
   <otherwise/>
 </choose>
 <call id="a4" endpoint="">
   <parameters>
     <method>post</method>
     <parameters>
       <Act_name>Basis Anamnese</Act_name>
     </parameters>
   </parameters>
 </call>
 <call id="a5" endpoint="">
   <parameters>
     <method>post</method>
     <parameters>
       <Act_name>Sozialanamnese</Act_name>
     </parameters>
   </parameters>
 </call>
 <call id="a6" endpoint="">
   <parameters>
     <method>post</method>
     <parameters>
       <Act_name>Labor</Act_name>
     </parameters>
   </parameters>
 </call>
 <choose>
   <alternative condition="Patient ist gesund">
     <call id="a7" endpoint="">
       <parameters>
         <method>post</method>
         <parameters>
           <Act_name>Entlassung</Act_name>
         </parameters>
       </parameters>
     </call>
     <call id="a12" endpoint="">
       <parameters>
         <method>post</method>
         <parameters>
           <Act_name>Ende</Act_name>
         </parameters>
       </parameters>
     </call>
   </alternative>
   <otherwise>
     <choose>
       <alternative condition="schwer krank">
         <call id="a8" endpoint="">
           <parameters>
             <method>post</method>
             <parameters>
               <Act_name>stationäre Aufnahme</Act_name>
             </parameters>
           </parameters>
         </call>
           <call id="a9" endpoint="">
             <parameters>
               <method>post</method>
               <parameters>
                 <Act_name>Ende</Act_name>
               </parameters>
             </parameters>
         </call>
       </alternative>
       <otherwise>
         <call id="a10" endpoint="">
           <parameters>
             <method>post</method>
             <parameters>
               <Act_name>Behandlung</Act_name>
             </parameters>
           </parameters>
         </call>
         <call id="a11" endpoint="">
           <parameters>
             <method>post</method>
             <parameters>
               <Act_name>Ende</Act_name>
             </parameters>
           </parameters>
         </call>
       </otherwise>
     </choose>
   </otherwise>
 </choose>
 </description>
 </description>
 
 

Übersetzter Prozess A in eigene XML Repräsentation:

<process>
 <start id="0" target="1">Start</start>
 <cond id="1" pre="0">Daten inkonsistent</cond>
 <branch id="3000" pre="1" target="4000">Ja</branch>
 <task id="4000" pre="3000" target="4001">Daten Aufnahme</task>
 <task id="4001" pre="4000" target="4002">Daten überprüfen</task>
 <branch id="3001" pre="1" target="4002">Nein</branch>
 <task id="4002" pre="3001" target="4003">Basis Anamnese</task>
 <task id="4003" pre="4002" target="4004">Sozialanamnese</task>
 <task id="4004" pre="4003" target="2">Labor</task>
 <cond id="2" pre="4004">Patient ist gesund</cond>
 <branch id="3002" pre="2" target="4005">Ja</branch>
 <task id="4005" pre="3002" target="1000">Entlassung</task>
 <end id="1000" pre="4005">Ende</end>
 <branch id="3003" pre="2" target="3">Nein</branch>
 <cond id="3" pre="3003">schwer krank</cond>
 <branch id="3004" pre="3" target="4006">Ja</branch>
 <task id="4006" pre="3004" target="1001">stationäre Aufnahme</task>
 <end id="1001" pre="4006">Ende</end>
 <branch id="3005" pre="3" target="4007">Nein</branch>
 <task id="4007" pre="3005" target="1002">Behandlung</task>
 <end id="1002" pre="4007">Ende</end></process>

Probleme

Aufgabe 5.2 Prozess diff/merge Metriken

mergex3-v0.6.1 added option '-i' [int] to enable verbose output and iterations 
 
Merged Process:  
 
<process name="B_C" properties="data1.prpx">
 <task id="404" pre="402" target="403">Sozialanamnese</task>
 <task id="403" pre="404" target="2">Labor</task>
 <branch id="302" pre="2" target="404">Der Patient lügt</branch>
 <branch id="303" pre="2" target="406">Patient ist gesund</branch>
 <cond id="3" pre="304">Patienten Status2</cond>
 <branch id="305" pre="3" target="405">Behandlung reicht</branch>
 <branch id="306" pre="3" target="407">Stationäre Aufnahme nötig</branch>
 <task id="407" pre="306" target="6">Stationäre Aufnahme</task>
 <cond id="6" pre="407">Patienten ist zusatzversichert</cond>
 <branch id="309" pre="6" target="408">zversNein</branch>
 <branch id="310" pre="6" target="409">zversJa</branch>
 <task id="408" pre="309" target="1002">roter Bettenturm</task>
 <task id="409" pre="310" target="1003">grüner Bettenturm</task>
 <end id="1002" pre="408">endImBettrot</end>
 <end id="1003" pre="409">endImBettgrün</end>
 <cond id="2" pre="403">Patienten Status</cond>
 <branch id="304" pre="2" target="3">Patient ist krank</branch>
 <start id="0" target="400">start</start>
 <task id="400" pre="0" target="401">Daten Aufnahme</task>
 <task id="401" pre="400" target="1">Daten Überprüfen</task>
 <cond id="1" pre="401">Daten korrekt</cond>
 <branch id="300" pre="1" target="402">Daten sind korrekt</branch>
 <branch id="301" pre="1" target="400">Daten inkonsistent</branch>
 <task id="406" pre="405" target="1000">Entlassung</task>
 <end id="1000" pre="406">end0</end>
 <task id="402" pre="300" target="404">Basis Anamnese</task>
 <task id="405" pre="305" target="406">Behandlung</task>
</process>

Changed nodes and edges: 

 
From Process: X To Process: B 

 
<moved>
</moved>
<moved_count>0</moved_count>
 
<deleted>
</deleted>
<deleted_count>0</deleted_count>
 
<changed_edges>
 <edge id="101" new_target="2"></edge>
 <edge id="405" new_pre="304"></edge>
</changed_edges>
<changed_edges_count>2</changed_edges_count>
 
From Process: X To Process: C 

 
<moved>
 <node id="404">Sozialanamnese</node>
 <node id="403">Labor</node>
</moved>
<moved_count>2</moved_count>
 
<deleted>
 <node id="100">par0</node>
 <node id="307">l1</node>
 <node id="308">s1</node>
 <node id="101">par0e</node>
</deleted>
<deleted_count>4</deleted_count>
 
<changed_edges>
 <edge id="402" new_target="404"></edge>
 <edge id="405" new_pre="305"></edge>
 <edge id="404" new_pre="402"></edge>
 <edge id="404" new_target="403"></edge>
 <edge id="403" new_pre="404"></edge>
 <edge id="403" new_target="2"></edge>
</changed_edges>
<changed_edges_count>6</changed_edges_count>
 
From Process: X To Process: B_C 

 
<moved>
 <node id="404">Sozialanamnese</node>
 <node id="403">Labor</node>
</moved>
<moved_count>2</moved_count>
 
<deleted>
 <node id="100">par0</node>
 <node id="307">l1</node>
 <node id="308">s1</node>
 <node id="101">par0e</node>
</deleted>
<deleted_count>4</deleted_count>
 
<changed_edges>
 <edge id="402" new_target="404"></edge>
 <edge id="404" new_pre="402"></edge>
 <edge id="404" new_target="403"></edge>
 <edge id="403" new_pre="404"></edge>
 <edge id="403" new_target="2"></edge>
</changed_edges>
<changed_edges_count>5</changed_edges_count>
 

Runtime Information: 

Time in seconds: 0.41 
Average memory usage: 30.7705 
Iterations: 200 

Beschreibung

Performance Messungen wurden in einer virtuellen Maschine (VirtualBox 4.1.6, Linux Mint 11, 4 CPUS, x32, AMD Phenom II 3.4 GHZ, 2048MB Ram) durchgeführt.  
diffx ist als Teilkomponente in mergex3 implementiert und wird nicht als eigenes Programm durch mergex3 aufgerufen. Eine Iteration umfasst. 
  1. (diffx) Einlesen des Ancestors 
  2. (diffx) Einlesen eines Abgeleiteten Prozesses 
  3. (diffx) diff berechnen und schreiben 
  4. (diffx) Wiederholung der Schritte 1-4 für den zweiten abgeleiteten Prozess 
  5. (mergex3) Einlesen des ancestors 
  6. (mergex3) Einlesen des 1. diffs 
  7. (mergex3) Einlesen des 2. diffs 
  8. (mergex3) merge durchführen (ohne schreiben des fertigen Prozesses) 

Aufgabe 6.1 Vergleichen

mergex3 v.0.6.4 Anpassungen für Team3 
mergex3 v.0.6.5 Team 2 prcx files hinzugefügt 

Translator

Für die automatisierte Übersetzung der Web-Repräsentation in die proprietäre Prozessbeschreibung wurde der Translator geschrieben. 
Da jedes Team eine teilweise sehr unterschiedliche Darstellung der Prozesse verfolgte müssen dem Programm 2 Parameter übergeben  
werden: Der Pfad zur XML-Datei und die Nummer der ID(Bsp.: Translator ./processes/X3.xml 3). 
Aufgrund der besonderen Gegebenheiten unserer Datenstruktur beinhaltet die Übersetzung noch kleine Bugs bei der Vergabe der XML-Attribute die mit der 
Hand korrigiert wurden. Die Prozesse von Team 2 konnten leider nicht evaluiert werden da unser Programm größere Schwierigkeiten bei der Übersetzung der Branches hatte. 
Diese führen bereits bei unserem Diff Tool zu einem Absturz.  
 

Team 2

translator.rar Java Tool zur Übersetzung der xml files 
 
X2.prcx 
<process name="X2">
 <start id="0" target="424">Start</start>
 <task id="424" pre="0" target="5">Voruntersuchung durchfuhren</task>
 <cond id="5" pre="424">Operation nicht notwendig</cond>
 <branch id="313" pre="5" target="426">branchOperation nicht notwendig</branch>
 <task id="426" pre="313" target="9">alternative Behandlung (zB Gips) durchfuhren</task>
 <branch id="314" pre="5" target="427">Operation notwendig</branch>
 <task id="427" pre="314" target="103">Termin vereinbaren</task>
 <par id="103" type="s" pre="427">par2</par>
 <branch id="318" pre="103" target="430">103parallel_branch</branch>
 <task id="430" pre="318" target="102">Operationsvoruntersuchung durchfuhren</task>
 <branch id="328" pre="103" target="431">328parallel_branch</branch>
 <task id="431" pre="328" target="102">Blut abnehmen</task>
 <par id="102" type="e" target="7">par11</par>
 <cond id="7" pre="102">Operation kann nicht durchgefuhrt werden</cond>
 <branch id="315" pre="7" target="425">branchOperation kann nicht durchgefuhrt werden</branch>
 <branch id="316" pre="7" target="432">Operation kann durchgefuhrt werden</branch>
 <task id="432" pre="316" target="428">Patient uber Risiken aufklaren</task>
 <task id="428" pre="432" target="429">Operation durchfuhren</task>
 <task id="429" pre="428" target="9">Nachbehandlung durchfuhren</task>
 <cond id="9" pre="429">if !behandlungErledigt</cond>
 <branch id="321" pre="9" target="5"  >if !behandlungErledigtNein</branch>
 <branch id="322" pre="9" target="425">if !behandlungErledigtJa</branch>
 <task id="425" pre="315" target="1000">Physiotherapie durchfuhren</task>
 <end id="1000" pre="425">end1</end>
</process>
 
A2.prcx 
<process name="A2">
 <start id="0" target="424">Start</start>
 <task id="424" pre="0" target="5">Voruntersuchung durchfuhren</task>
 <cond id="5" pre="424">Operation nicht notwendig</cond>
 <branch id="313" pre="5" target="426">branchOperation nicht notwendig</branch>
 <task id="426" pre="313" target="9">alternative Behandlung (zB Gips) durchfuhren</task>
 <branch id="314" pre="5" target="427">Operation notwendig</branch>
 <task id="427" pre="314" target="103">Termin vereinbaren</task>
 <par id="103" type="s" pre="427">par2</par>
 <branch id="318" pre="103" target="430">103parallel_branch</branch>
 <task id="430" pre="318" target="102">Operationsvoruntersuchung durchfuhren</task>
 <branch id="328" pre="103" target="431">328parallel_branch</branch>
 <task id="431" pre="328" target="433">Blut abnehmen</task>
 <task id="433" pre="431" target="102">Blutbild beurteilen</task>
 <par id="102" type="e" target="7">par11</par>
 <cond id="7" pre="102">Operation kann nicht durchgefuhrt werden</cond>
 <branch id="315" pre="7" target="425">branchOperation kann nicht durchgefuhrt werden</branch>
 <branch id="316" pre="7" target="428">Operation kann durchgefuhrt werden</branch>
 <task id="428" pre="316" target="429">Operation durchfuhren</task>
 <task id="429" pre="428" target="9">Nachbehandlung durchfuhren</task>
 <cond id="9" pre="429">if !behandlungErledigt</cond>
 <branch id="321" pre="9" target="5">if !behandlungErledigtNein</branch>
 <branch id="322" pre="9" target="425">if !behandlungErledigtJa</branch>
 <task id="425" pre="315" target="1000">Physiotherapie durchfuhren</task>
 <end id="1000" pre="425">end1</end>
</process>
 
B2.prcx 
<process name="B2">
 <start id="0" target="424">Start</start>
 <task id="424" pre="0" target="5">Voruntersuchung durchfuhren</task>
 <cond id="5" pre="424">Operation nicht notwendig</cond>
 <branch id="313" pre="5" target="426">branchOperation nicht notwendig</branch>
 <task id="426" pre="313" target="9">alternative Behandlung (zB Gips) durchfuhren</task>
 <branch id="314" pre="5" target="427">Operation notwendig</branch>
 <task id="427" pre="314" target="103">Termin vereinbaren</task>
 <par id="103" type="s" pre="427">par2</par>
 <branch id="318" pre="103" target="430">103parallel_branch</branch>
 <task id="430" pre="318" target="102">Operationsvoruntersuchung durchfuhren</task>
 <branch id="328" pre="103" target="431">328parallel_branch</branch>
 <task id="431" pre="328" target="102">Blut abnehmen</task>
 <par id="102" type="e" target="7">par11</par>
 <cond id="7" pre="102">Operation kann nicht durchgefuhrt werden</cond>
 <branch id="315" pre="7" target="425">branchOperation kann nicht durchgefuhrt werden</branch>
 <branch id="316" pre="7" target="432">Operation kann durchgefuhrt werden</branch>
 <task id="432" pre="316" target="428">Patient uber Risiken aufklaren</task>
 <task id="428" pre="432" target="429">Operation durchfuhren</task>
 <task id="429" pre="428" target="9">Nachbehandlung durchfuhren</task>
 <cond id="9" pre="429">if !behandlungErledigt</cond>
 <branch id="321" pre="9" target="5" >if !behandlungErledigtNein</branch>
 <branch id="322" pre="9" target="425">if !behandlungErledigtJa</branch>
 <task id="425" pre="315" target="1000">Physiotherapie durchfuhren</task>
 <end id="1000" pre="425">end1</end>
</process>
 
Fehler: Leider ist es uns nicht möglich einen mergex3 run durchzuführen, da die Prozesse problematisch sind: Etwa der Task id="426" der auf das target="102" zeigt. 102 ist ein parallel end. Es gab davor aber kein parallel start!? ⇒ Führt zu Absturz 
 
Update:  
Mit Version 0.6.7 des tools ist ein diff/merge jetzt möglich: 
mergex3-v0.6.7 bugfixes in differ module 
 

Zeichnung des merged Prozesses

Prozess A3_B3
Abbildung 16: Prozess A3_B3
 
Merged Process:  
<process name="A2_B2" properties="X2">
 <task id="433" pre="431" target="102">Blutbild beurteilen</task>
 <branch id="326" pre="7" target="428">branchOperation kann durchgefuhrt werden</branch>
 <start id="0" target="424">Start</start>
 <task id="424" pre="0" target="5">Voruntersuchung durchfuhren</task>
 <cond id="5" pre="424">Operation nicht notwendig</cond>
 <branch id="313" pre="5" target="426">branchOperation nicht notwendig</branch>
 <branch id="314" pre="5" target="427">Operation notwendig</branch>
 <task id="427" pre="314" target="103">Termin vereinbaren</task>
 <task id="426" pre="313" target="9">alternative Behandlung (zB Gips) durchfuhren</task>
 <cond id="9" pre="429">if !behandlungErledigt</cond>
 <branch id="321" pre="9" target="5">if !behandlungErledigtNein</branch>
 <branch id="322" pre="9" target="425">if !behandlungErledigtJa</branch>
 <task id="425" pre="315" target="1000">Physiotherapie durchfuhren</task>
 <end id="1000" pre="425">end1</end>
 <par id="103" pre="427" type="s">par2</par>
 <branch id="318" pre="103" target="430">103parallel_branch</branch>
 <branch id="328" pre="103" target="431">328parallel_branch</branch>
 <task id="430" pre="318" target="102">Operationsvoruntersuchung durchfuhren</task>
 <par id="102" target="7" type="e">par11</par>
 <cond id="7" pre="102">Operation kann nicht durchgefuhrt werden</cond>
 <branch id="315" pre="7" target="425">branchOperation kann nicht durchgefuhrt werden</branch>
 <task id="429" pre="428" target="9">Nachbehandlung durchfuhren</task>
 <task id="431" pre="328" target="102">Blut abnehmen</task>
 <task id="428" pre="326" target="429">Operation durchfuhren</task>
</process>

Changed nodes and edges: 

 
From Process: X2 To Process: A2 

 
<moved>
</moved>
<moved_count>0</moved_count>
 
<deleted>
 <node id="316">Operation kann durchgefuhrt werden</node>
 <node id="432">Patient uber Risiken aufklaren</node>
</deleted>
<deleted_count>2</deleted_count>
 
<changed_edges>
 <edge id="431" new_target="433"></edge>
 <edge id="5" new_pre="424"></edge>
 <edge id="7" new_pre="102"></edge>
 <edge id="9" new_pre="429"></edge>
 <edge id="428" new_pre="326"></edge>
</changed_edges>
<changed_edges_count>5</changed_edges_count>
 
From Process: X2 To Process: B2 

 
<moved>
</moved>
<moved_count>0</moved_count>
 
<deleted>
</deleted>
<deleted_count>0</deleted_count>
 
<changed_edges>
 <edge id="5" new_pre="424"></edge>
 <edge id="7" new_pre="102"></edge>
 <edge id="9" new_pre="429"></edge>
</changed_edges>
<changed_edges_count>3</changed_edges_count>
 
From Process: X2 To Process: A2_B2 

 
<moved>
</moved>
<moved_count>0</moved_count>
 
<deleted>
 <node id="316">Operation kann durchgefuhrt werden</node>
 <node id="432">Patient uber Risiken aufklaren</node>
</deleted>
<deleted_count>2</deleted_count>
 
<changed_edges>
 <edge id="5" new_pre="424"></edge>
 <edge id="9" new_pre="429"></edge>
 <edge id="7" new_pre="102"></edge>
 <edge id="428" new_pre="326"></edge>
</changed_edges>
<changed_edges_count>4</changed_edges_count>
 

Runtime Information: 

Time in seconds: 0.4 
Average memory usage: 31.1567 
Iterations: 200 

Zeichnung des merged Prozesses

Team 3

Beschreibung der Transformation 
 
X3.prcx  
<process name="X3">
 <start id="0" target="400">Start</start>
 <task id="400" pre="0" target="401">Create Contexts for HO and NWUs</task>
 <task id="401" pre="400" target="402">Create Layer3 Data</task>
 <task id="402" pre="401" target="403">EAD Calculation</task>
 <task id="403" pre="402" target="1">Technical Check</task>
 <cond id="1" pre="403">c1</cond>
 <branch id="300" pre="1" target="404">branch1</branch>
 <task id="404" pre="300" target="2">BF Check</task>
 <cond id="2" pre="404">c2</cond>
 <branch id="301" pre="2" target="405">branch2</branch>
 <task id="405" pre="301" target="101">New Parametrization</task>
 <branch id="302" pre="2" target="100">c2Nein</branch>
 <branch id="303" pre="1" target="100">c1Nein</branch>
 <cond id="3" pre="303">c3</cond>
 <branch target="402" id="304" pre="3">a1Nein</branch>
 <branch id="305" pre="3" target="100">a1Ja</branch>
 <par id="100" type="s" pre="405">par0</par>
 <branch id="306" pre="100" target="406">s1</branch>
 <task id="406" pre="306" target="407">RWA Calculation</task>
 <task id="407" pre="406" target="101">RWA-Reports for FMA</task>
 <branch id="307" pre="100" target="408">s2</branch>
 <task id="408" pre="307" target="101">CORP-Reports for FMA</task>
 <par id="101" type="e" target="409">par0e</par>
 <task id="409" pre="101" target="4">Unlock User for Context HO</task>
 <cond id="4" pre="409">c4</cond>
 <branch id="308" pre="4" target="410">branch3</branch>
 <task id="410" pre="308" target="411">SQL</task>
 <task id="411" pre="410" target="413">EXCEL</task>
 <branch id="309" pre="4" target="412">c3Nein</branch>
 <task id="412" pre="309" target="413">FRM</task>
 <task id="413" pre="411" target="1000">Board Presentation</task>
 <end id="1000" pre="413">end0</end>
</process>
 
A3.prcx 
<process name="A3">
 <start id="0" target="414">Start</start>
 <task id="414" pre="0" target="415">Receive RBRU Data from local HO</task>
 <task id="415" pre="414" target="402">Install local Calculation Setup</task>
 <task id="402" pre="415" target="403">EAD Calculation</task>
 <task id="403" pre="402" target="1">Technical Check</task>
 <cond id="1" pre="403">c1</cond>
 <branch id="300" pre="1" target="406">branch1</branch>
 <task id="406" pre="300" target="404">RWA Calculation</task>
 <task id="404" pre="406" target="2">BF Check</task>
 <cond id="2" pre="404">c2</cond>
 <branch id="301" pre="2" target="405">branch2</branch>
 <task id="405" pre="301" target="101">New Parametrization</task>
 <branch id="302" pre="2" target="100">c2Nein</branch>
 <branch id="303" pre="1" target="100">c1Nein</branch>
 <cond id="3" pre="303">c3</cond>
 <branch target="402" id="304" pre="3">a1Nein</branch>
 <branch id="305" pre="3" target="100">a1Ja</branch>
 <par id="100" type="s" pre="405">par0</par>
 <branch id="317" pre="100" target="416">s317</branch>
 <task id="416" pre="317" target="101">CORP-Reports for local Supervisor</task>
 <branch id="306" pre="100" target="417">s1</branch>
 <task id="417" pre="306" target="101">FIN-Reports for local Supervisor</task>
 <branch id="310" pre="100" target="418">s3</branch>
 <task id="418" pre="310" target="419">Prepare DFF-Files for Stresstesting</task>
 <task id="419" pre="418" target="420">Load DFF-Files into Stresstesting</task>
 <task id="420" pre="419" target="101">Stresstesting Calculation</task>
 <par id="101" type="e" target="421">par0e</par>
 <task id="421" pre="101" target="422">Unlock User for Context RBRU</task>
 <task id="422" pre="421" target="423">RWA-Reports for local Supervisor</task>
 <task id="423" pre="422" target="413">Reporting via Custom SQL + MS EXCEL</task>
 <task id="413" pre="423" target="1000">Board Presentation</task>
 <end id="1000" pre="413">end0</end>
</process>
 
B3.prcx 
<process name="B3">
 <start id="0" target="414">Start</start>
 <task id="414" pre="0" target="415">Receive RBRU Data from local HO</task>
 <task id="415" pre="414" target="402">Install local Calculation Setup</task>
 <task id="402" pre="415" target="403">EAD Calculation</task>
 <task id="403" pre="402" target="1">Technical Check</task>
 <cond id="1" pre="403">c1</cond>
 <branch id="300" pre="1" target="404">branch1</branch>
 <task id="404" pre="300" target="2">BF Check</task>
 <cond id="2" pre="404">c2</cond>
 <branch id="301" pre="2" target="405">branch2</branch>
 <task id="405" pre="301" target="101">New Parametrization</task>
 <branch id="302" pre="2" target="100">c2Nein</branch>
 <branch id="303" pre="1" target="100">c1Nein</branch>
 <cond id="3" pre="303">c3</cond>
 <branch target="402" id="304" pre="3">a1Nein</branch>
 <branch id="305" pre="3" target="100">a1Ja</branch>
 <par id="100" type="s" pre="405">par0</par>
 <branch id="306" pre="100" target="406">s1</branch>
 <task id="406" pre="306" target="101">RWA Calculation</task>
 <branch id="317" pre="100" target="416">s317</branch>
 <task id="416" pre="317" target="101">CORP-Reports for local Supervisor</task>
 <par id="101" type="e" target="422">par0e</par>
 <task id="422" pre="101" target="412">RWA-Reports for local Supervisor</task>
 <task id="412" pre="422" target="413">FRM</task>
 <task id="413" pre="412" target="1000">Board Presentation</task>
 <end id="1000" pre="413">end0</end>
</process>

diffx der beiden Prozesse zu ihrem Ancestor

<diff from="X3" to="A3">
 <del>
   <task id="400" pre="0" target="401">Create Contexts for HO and NWUs</task>
   <task id="401" pre="400" target="402">Create Layer3 Data</task>
   <task id="407" pre="406" target="101">RWA-Reports for FMA</task>
   <branch id="307" pre="100" target="408">s2</branch>
   <task id="408" pre="307" target="101">CORP-Reports for FMA</task>
   <task id="409" pre="101" target="4">Unlock User for Context HO</task>
   <cond id="4" pre="409">c4</cond>
   <branch id="308" pre="4" target="410">branch3</branch>
   <task id="410" pre="308" target="411">SQL</task>
   <task id="411" pre="410" target="413">EXCEL</task>
   <branch id="309" pre="4" target="412">c3Nein</branch>
   <task id="412" pre="309" target="413">FRM</task>
 </del>
 <add>
   <task id="414" pre="0" target="415">Receive RBRU Data from local HO</task>
   <task id="415" pre="414" target="402">Install local Calculation Setup</task>
   <branch id="317" pre="100" target="416">s317</branch>
   <task id="416" pre="317" target="101">CORP-Reports for local Supervisor</task>
   <task id="417" pre="306" target="101">FIN-Reports for local Supervisor</task>
   <branch id="310" pre="100" target="418">s3</branch>
   <task id="418" pre="310" target="419">Prepare DFF-Files for Stresstesting</task>
   <task id="419" pre="418" target="420">Load DFF-Files into Stresstesting</task>
   <task id="420" pre="419" target="101">Stresstesting Calculation</task>
   <task id="421" pre="101" target="422">Unlock User for Context RBRU</task>
   <task id="422" pre="421" target="423">RWA-Reports for local Supervisor</task>
   <task id="423" pre="422" target="413">Reporting via Custom SQL + MS EXCEL</task>
 </add>
 <moved>
   <start id="0" target="400">Start</start>
   <end id="1000" pre="413">end0</end>
   <task id="413" pre="411" target="1000">Board Presentation</task>
 </moved>
 <sequence>
   <task id="402" pre="401" target="403">EAD Calculation</task>
   <task id="403" pre="402" target="1">Technical Check</task>
   <cond id="1" pre="403">c1</cond>
   <branch id="300" pre="1" target="404">branch1</branch>
   <branch id="303" pre="1" target="100">c1Nein</branch>
   <par id="100" pre="405" type="s">par0</par>
   <branch id="306" pre="100" target="406">s1</branch>
   <task id="406" pre="306" target="407">RWA Calculation</task>
   <task id="404" pre="300" target="2">BF Check</task>
   <task id="404" pre="300" target="2">BF Check</task>
   <cond id="2" pre="404">c2</cond>
   <branch id="301" pre="2" target="405">branch2</branch>
   <branch id="302" pre="2" target="100">c2Nein</branch>
   <task id="405" pre="301" target="101">New Parametrization</task>
   <par id="101" target="409" type="e">par0e</par>
 </sequence>
 <change id="402" pre="415"></change>
 <change id="406" target="404"></change>
 <change id="404" pre="406"></change>
 <change id="101" target="421"></change>
 <change id="0" target="414"></change>
</diff>
 
<diff from="X3" to="B3">
 <del>
   <task id="400" pre="0" target="401">Create Contexts for HO and NWUs</task>
   <task id="401" pre="400" target="402">Create Layer3 Data</task>
   <task id="407" pre="406" target="101">RWA-Reports for FMA</task>
   <branch id="307" pre="100" target="408">s2</branch>
   <task id="408" pre="307" target="101">CORP-Reports for FMA</task>
   <task id="409" pre="101" target="4">Unlock User for Context HO</task>
   <cond id="4" pre="409">c4</cond>
   <branch id="308" pre="4" target="410">branch3</branch>
   <task id="410" pre="308" target="411">SQL</task>
   <task id="411" pre="410" target="413">EXCEL</task>
   <branch id="309" pre="4" target="412">c3Nein</branch>
 </del>
 <add>
   <task id="414" pre="0" target="415">Receive RBRU Data from local HO</task>
   <task id="415" pre="414" target="402">Install local Calculation Setup</task>
   <branch id="317" pre="100" target="416">s317</branch>
   <task id="416" pre="317" target="101">CORP-Reports for local Supervisor</task>
   <task id="422" pre="101" target="412">RWA-Reports for local Supervisor</task>
 </add>
 <moved>
   <start id="0" target="400">Start</start>
   <end id="1000" pre="413">end0</end>
   <task id="413" pre="411" target="1000">Board Presentation</task>
 </moved>
 <sequence>
   <task id="402" pre="401" target="403">EAD Calculation</task>
   <task id="403" pre="402" target="1">Technical Check</task>
   <cond id="1" pre="403">c1</cond>
   <branch id="300" pre="1" target="404">branch1</branch>
   <branch id="303" pre="1" target="100">c1Nein</branch>
   <par id="100" pre="405" type="s">par0</par>
   <branch id="306" pre="100" target="406">s1</branch>
   <task id="406" pre="306" target="407">RWA Calculation</task>
   <task id="404" pre="300" target="2">BF Check</task>
   <task id="404" pre="300" target="2">BF Check</task>
   <cond id="2" pre="404">c2</cond>
   <branch id="301" pre="2" target="405">branch2</branch>
   <branch id="302" pre="2" target="100">c2Nein</branch>
   <task id="405" pre="301" target="101">New Parametrization</task>
   <par id="101" target="409" type="e">par0e</par>
 </sequence>
 <change id="402" pre="415"></change>
 <change id="406" target="101"></change>
 <change id="101" target="422"></change>
 <change id="0" target="414"></change>
</diff>
 

3way merge der beiden diff files mit dem ancestor

Ergebnis: Version v0.6.1 mergex3 
 
Es wurden zwei Targets hintereinander geloescht
-----------------------------------------------
Warning: Automatic merge process halted!
Element 400 has an successor 401 which has status deleted.
Enter option (f) to forget elements, or (k) to keep an element of your choice:
 
Die Prozesse sind nicht automatisch mergebar. Wenn man die beiden diff files <del> betrachtet, erkennt man, dass mehrere Tasks mitsamt ihren Vorgängern bzw. Nachfolgern gelöscht werden. Soweit uns bekannt wird in einem derartigen Fall der Benutzer gefragt. Nach der 3way merge Regel muss der Benutzer gefragt werden, da es theoretisch passieren kann, dass von einem Prozess "nichts" mehr übrig bleibt. Dieser Fall tritt bei den Tasks mit der ID=400,409,410 und 411 auf. Leider ist es uns nicht möglich den Code "schnell" umzuschreiben, sodass der user nicht gefragt wird und Kennzahlen aufscheinen. 
 
Edit: Version v0.6.4 mergex3 
 
Nach dem Einbau von exceptions für Team 3 kann man jetzt mergen 

Zeichnung des merged Prozesses

Prozess A3_B3
Abbildung 17: Prozess A3_B3
 
Merged Process:  
<process name="A3_B3" properties="X3">
 <start id="0" target="414">Start</start>
 <end id="1000" pre="413">end0</end>
 <task id="413" pre="423" target="1000">Board Presentation</task>
 <task id="414" pre="0" target="415">Receive RBRU Data from local HO</task>
 <task id="415" pre="414" target="402">Install local Calculation Setup</task>
 <branch id="317" pre="100" target="416">s317</branch>
 <task id="416" pre="317" target="101">CORP-Reports for local Supervisor</task>
 <task id="417" pre="306" target="101">FIN-Reports for local Supervisor</task>
 <branch id="310" pre="100" target="418">s3</branch>
 <task id="418" pre="310" target="419">Prepare DFF-Files for Stresstesting</task>
 <task id="419" pre="418" target="420">Load DFF-Files into Stresstesting</task>
 <task id="420" pre="419" target="101">Stresstesting Calculation</task>
 <task id="421" pre="101" target="422">Unlock User for Context RBRU</task>
 <task id="423" pre="422" target="413">Reporting via Custom SQL + MS EXCEL</task>
 <task id="422" pre="421" target="423">RWA-Reports for local Supervisor</task>
 <task id="402" pre="415" target="403">EAD Calculation</task>
 <task id="403" pre="402" target="1">Technical Check</task>
 <cond id="1" pre="403">c1</cond>
 <branch id="300" pre="1" target="404">branch1</branch>
 <branch id="303" pre="1" target="100">c1Nein</branch>
 <par id="100" pre="405" type="s">par0</par>
 <branch id="306" pre="100" target="406">s1</branch>
 <task id="404" pre="300" target="2">BF Check</task>
 <task id="404" pre="300" target="2">BF Check</task>
 <cond id="2" pre="404">c2</cond>
 <branch id="301" pre="2" target="405">branch2</branch>
 <branch id="302" pre="2" target="100">c2Nein</branch>
 <task id="405" pre="301" target="101">New Parametrization</task>
 <task id="406" pre="306" target="404">RWA Calculation</task>
 <par id="101" target="421" type="e">par0e</par>
</process>

Changed nodes and edges: 

 
From Process: X3 To Process: A3 

 
<moved>
 <node id="0">Start</node>
 <node id="1000">end0</node>
 <node id="413">Board Presentation</node>
</moved>
<moved_count>3</moved_count>
 
<deleted>
 <node id="400">Create Contexts for HO and NWUs</node>
 <node id="401">Create Layer3 Data</node>
 <node id="407">RWA-Reports for FMA</node>
 <node id="307">s2</node>
 <node id="408">CORP-Reports for FMA</node>
 <node id="409">Unlock User for Context HO</node>
 <node id="4">c4</node>
 <node id="308">branch3</node>
 <node id="410">SQL</node>
 <node id="411">EXCEL</node>
 <node id="309">c3Nein</node>
 <node id="412">FRM</node>
</deleted>
<deleted_count>12</deleted_count>
 
<changed_edges>
 <edge id="402" new_pre="415"></edge>
 <edge id="406" new_target="404"></edge>
 <edge id="404" new_pre="406"></edge>
 <edge id="101" new_target="421"></edge>
 <edge id="0" new_target="414"></edge>
</changed_edges>
<changed_edges_count>5</changed_edges_count>
 
From Process: X3 To Process: B3 

 
<moved>
 <node id="0">Start</node>
 <node id="1000">end0</node>
 <node id="413">Board Presentation</node>
</moved>
<moved_count>3</moved_count>
 
<deleted>
 <node id="400">Create Contexts for HO and NWUs</node>
 <node id="401">Create Layer3 Data</node>
 <node id="407">RWA-Reports for FMA</node>
 <node id="307">s2</node>
 <node id="408">CORP-Reports for FMA</node>
 <node id="409">Unlock User for Context HO</node>
 <node id="4">c4</node>
 <node id="308">branch3</node>
 <node id="410">SQL</node>
 <node id="411">EXCEL</node>
 <node id="309">c3Nein</node>
</deleted>
<deleted_count>11</deleted_count>
 
<changed_edges>
 <edge id="402" new_pre="415"></edge>
 <edge id="406" new_target="101"></edge>
 <edge id="101" new_target="422"></edge>
 <edge id="0" new_target="414"></edge>
</changed_edges>
<changed_edges_count>4</changed_edges_count>
 
-------------------------------------------------------------
Runtime Information:
-------------------------------------------------------------
Time in seconds: 0.53
Average memory usage: 31.3341
Iterations: 200

Ergebnis

Leider fehlen die Kennzahlen für den gemergeten Prozess mit dem Ancestor, denn das erstellen des diff files lässt mergex3 abstürzten. Bis jetzt haben wir keine Erklärung dafür, vermuten aber Aufgrund der "Bastel Lösung" für Team 3 ein Problem mit dem gemergeten Prozess.  
 

Appendix

Zu Vergleichszwecken hier noch unser gemergter Prozess A_B (Ancestor=X) 
 
Prozess A_B (Ancestor=X)
Abbildung 18: Prozess A_B (Ancestor=X)
Letzte Änderung: 16.01.2012, 20:35 | 16106 Worte