Index: anches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/Alignment.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/Alignment.java	(revision 1571)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package de.ugoe.cs.autoquest.tasktrees.alignment.algorithms;
-
-import java.util.List;
-
-public interface Alignment {
-	public List<Match> getMatches();
-	
-}
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/FengDoolittle.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/FengDoolittle.java	(revision 1571)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/FengDoolittle.java	(revision 1572)
@@ -1,5 +1,5 @@
 package de.ugoe.cs.autoquest.tasktrees.alignment.algorithms;
 
-import de.ugoe.cs.autoquest.tasktrees.alignment.substitution.TriangleMatrix;
+import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.TriangleMatrix;
 
 public class FengDoolittle {
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/SmithWaterman.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/SmithWaterman.java	(revision 1571)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/SmithWaterman.java	(revision 1572)
@@ -4,7 +4,7 @@
 import java.util.List;
 
-import de.ugoe.cs.autoquest.tasktrees.alignment.substitution.SubstitutionMatrix;
-
-public class SmithWaterman implements Alignment {
+import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.SubstitutionMatrix;
+
+public class SmithWaterman  {
 
 	/**
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/SmithWatermanRepeated.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/SmithWatermanRepeated.java	(revision 1571)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/algorithms/SmithWatermanRepeated.java	(revision 1572)
@@ -2,9 +2,11 @@
 
 import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 
-import de.ugoe.cs.autoquest.tasktrees.alignment.substitution.SubstitutionMatrix;
-
-public class SmithWatermanRepeated implements Alignment {
+import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.SubstitutionMatrix;
+
+public class SmithWatermanRepeated {
 
 	/**
@@ -29,5 +31,6 @@
 	private MatrixEntry[][] matrix;
 
-	
+
+	private List<NumberSequence> alignment;
 	
 	private float scoreThreshold;
@@ -50,4 +53,5 @@
 		
 		matrix = new MatrixEntry[length1+2][length2+1];
+		alignment = new ArrayList<NumberSequence>();
 		
 		for (int i = 0; i <= length1+1; i++) {
@@ -218,5 +222,42 @@
 	}
 	
-	public List<Match> traceback() {
+	
+	public void traceback() {
+		MatrixEntry tmp = matrix[length1+1][0];
+		
+		int aligned1[] = new int[length1+length2];
+		int aligned2[] = new int[length1+length2];
+		int count = 0;
+		do
+		{	
+			if(count != 0)
+			{
+				aligned1[count] = tmp.getXvalue();
+				aligned2[count] = tmp.getYvalue();
+			}
+			
+			tmp = tmp.getPrevious();
+			count++;
+			
+		} while(tmp != null);
+
+		//reverse order
+		int reversed1[] = new int[count];
+		int reversed2[] = new int[count];
+		
+		for(int i = count; count > 0; count ++) {
+			
+		}
+		
+		NumberSequence ns1 = new NumberSequence(reversed1.length);
+		NumberSequence ns2 = new NumberSequence(reversed2.length);
+		ns1.setSequence(reversed1);
+		ns2.setSequence(reversed2);
+		
+		alignment.add(ns1);
+		alignment.add(ns2);
+	}
+	
+	public void printAlignment() {
 		MatrixEntry tmp = matrix[length1+1][0];
 		String aligned1 = "";
@@ -259,5 +300,4 @@
 		System.out.println(aligned1);
 		System.out.println(aligned2);
-		return null;
 	}
 	
@@ -321,4 +361,13 @@
 		return matchList;
 	}
+	
+
+	public List<NumberSequence> getAlignment() {
+		return alignment;
+	}
+
+	public void setAlignment(List<NumberSequence> alignment) {
+		this.alignment = alignment;
+	}
 
 }
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DifferenceSubstitutionMatrix.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DifferenceSubstitutionMatrix.java	(revision 1572)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/DifferenceSubstitutionMatrix.java	(revision 1572)
@@ -0,0 +1,62 @@
+/**
+ * 
+ */
+package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+import java.util.Collection;
+import java.util.List;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
+
+/**
+ * @author Ralph Krimmel
+ *
+ */
+public class DifferenceSubstitutionMatrix implements SubstitutionMatrix {
+
+	private int[] input1;
+	private int[] input2;
+	private int maxValue;
+	
+	public DifferenceSubstitutionMatrix(int[] input1,int[] input2) {
+		this.input1 = input1;
+		this.input2 = input2;
+		this.maxValue = getMaxValue();
+	}
+	
+	/* (non-Javadoc)
+	 * @see de.ugoe.cs.autoquest.plugin.alignment.SubstitutionMatrix#getDistance(int, int)
+	 */
+	public double getDistance(int pos1, int pos2) {
+		return maxValue - (input1[pos1] - input2[pos2]);
+	}
+	
+	private int getMaxValue() {
+		int max = input1[0];
+		for (int i=0; i < input1.length; i++) {
+			if(input1[i] > max) {
+				max = input1[i];
+			}
+		}
+		for (int j=0; j < input2.length; j++) {
+			if(input2[j] > max) {
+				max = input2[j];
+			}
+		}
+		return max;
+	}
+
+	@Override
+	public double getGapPenalty() {
+		return -maxValue;
+	}
+
+
+	@Override
+	public void generate() {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/NearbySubstitutionMatrix.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/NearbySubstitutionMatrix.java	(revision 1572)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/NearbySubstitutionMatrix.java	(revision 1572)
@@ -0,0 +1,56 @@
+/**
+ * 
+ */
+package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+import java.util.Collection;
+import java.util.List;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
+
+/**
+ * @author Ralph Krimmel
+ *
+ */
+public class NearbySubstitutionMatrix implements SubstitutionMatrix {
+
+	private int[] input1;
+	private int[] input2;
+	private int range;
+	
+	public NearbySubstitutionMatrix(int[] input1,int[] input2, int range) {
+		this.input1 = input1;
+		this.input2 = input2;
+		this.range = range;
+	}
+	
+	/* (non-Javadoc)
+	 * @see de.ugoe.cs.autoquest.plugin.alignment.SubstitutionMatrix#getDistance(int, int)
+	 */
+	public double getDistance(int pos1, int pos2) {
+		int difference = Math.abs(input1[pos1]-input2[pos2]); 
+		if(difference < range) {
+			return range-difference;
+		}
+		else {
+			return -range;
+		}
+	}
+
+
+	@Override
+	public double getGapPenalty() {
+		return -range-1;
+	}
+
+
+	@Override
+	public void generate() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	
+
+}
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/ObjectDistanceSubstitionMatrix.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/ObjectDistanceSubstitionMatrix.java	(revision 1572)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/ObjectDistanceSubstitionMatrix.java	(revision 1572)
@@ -0,0 +1,122 @@
+package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+
+import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.autoquest.tasktrees.alignment.algorithms.AlignmentHelpers;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
+import de.ugoe.cs.autoquest.usageprofiles.SymbolMap;
+
+
+public class ObjectDistanceSubstitionMatrix implements SubstitutionMatrix {
+
+	// private ArrayList<int[][]> matrix;
+	HashMap<Integer, Integer> idmapping;
+	private TriangleMatrix matrix;
+	private SymbolMap<ITaskInstance, ITask> uniqueTasks;
+	private double gapPenalty; 
+	private double positiveThreshold;
+	
+	public ObjectDistanceSubstitionMatrix(
+			SymbolMap<ITaskInstance, ITask> uniqueTasks,float positiveThreshold) {
+		this.uniqueTasks = uniqueTasks;
+		this.positiveThreshold = positiveThreshold;
+		idmapping = new HashMap<Integer, Integer>();
+		matrix = new TriangleMatrix(uniqueTasks.size()+1);
+		gapPenalty = -5;
+		
+	}
+
+	@Override
+	public double getGapPenalty() {
+		return gapPenalty;
+	}
+
+	@Override
+	public void generate() {
+		int index = 0;
+		//TODO We need to determine this parameter before generating the matrix..
+		//float meandistance = 18;
+		//TODO We need to determine this parameter before generating the matrix..
+		float maxDistance =34;
+		for (Iterator<ITaskInstance> it = uniqueTasks.getSymbols().iterator(); it
+				.hasNext();) {
+			Object obj1 = it.next();
+			IEventTaskInstance eti1 = null;
+			if (obj1 instanceof IEventTaskInstance) {
+				eti1 = (IEventTaskInstance) obj1;
+			}
+			//System.out.println(eti1.getTask().toString());
+		
+			for (Iterator<ITaskInstance> jt = uniqueTasks.getSymbols()
+					.iterator(); jt.hasNext();) {
+				IEventTaskInstance eti2 = null;
+				Object obj2 = jt.next();
+				if (obj2 instanceof IEventTaskInstance) {
+					eti2 = (IEventTaskInstance) obj2;
+				}
+				IGUIElement first = (IGUIElement) eti1.getEvent().getTarget();
+				IGUIElement second = (IGUIElement) eti2.getEvent().getTarget();
+				int tempindex1 = -1;
+				int tempindex2 = -1;
+				if(!idmapping.containsKey(eti1.getTask().getId()))
+				{
+					idmapping.put(eti1.getTask().getId(), index);
+					tempindex1 = index;
+					index++;
+				}	
+				else 
+				{
+					tempindex1 = idmapping.get(eti1.getTask().getId());
+				}	
+				if(!idmapping.containsKey(eti2.getTask().getId()))
+				{
+					idmapping.put(eti2.getTask().getId(), index);
+					tempindex2 = index;
+					index++;
+				}	
+				else 
+				{
+					tempindex2 = idmapping.get(eti2.getTask().getId());
+				}
+				float distance = -1*AlignmentHelpers.distanceBetween(first, second);
+			
+			
+				if(distance > maxDistance){
+					maxDistance = distance;
+				}
+				
+				distance += positiveThreshold;
+				
+
+				
+				matrix.set(tempindex1, tempindex2,distance);
+				
+			}
+		}
+		//System.out.println("ObjectDistanceMatrix: MaxDistance: " + maxDistance);
+		//System.out.println(meandistance/(uniqueTasks.size()*uniqueTasks.size()));
+		//System.out.println(idmapping.toString());
+		//System.out.println(matrix.toString());
+		//System.out.println(idmapping.keySet().toString());
+		//System.out.println(idmapping.values().toString());
+		
+	}
+	
+	public String toString(){
+		return matrix.toString();
+	}
+
+	@Override
+	public double getDistance(int taskId1, int taskId2) {
+		//System.out.println("Taskid1: " + taskId1 + " Taskid2: " + taskId2 + " Idmapping1: " + idmapping.get(taskId1) + " Idmapping2: " + idmapping.get(taskId2));
+		return matrix.get(idmapping.get(taskId1),idmapping.get(taskId2));
+	}
+
+}
+
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/SubstitutionMatrix.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/SubstitutionMatrix.java	(revision 1572)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/SubstitutionMatrix.java	(revision 1572)
@@ -0,0 +1,15 @@
+package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+
+
+public interface SubstitutionMatrix {
+	
+
+	public double getDistance(int pos1, int pos2);
+
+	public double getGapPenalty();
+
+	public void generate();
+
+	
+}
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/TriangleMatrix.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/TriangleMatrix.java	(revision 1572)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/TriangleMatrix.java	(revision 1572)
@@ -0,0 +1,55 @@
+package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+public class TriangleMatrix {
+	
+	private double[] matrix;
+	protected int size;
+	
+	
+	
+	public TriangleMatrix(int size) {
+		this.size = size;
+		matrix = new double [size*(size+1)/2];
+	}
+	
+	public double get(int first, int second) {
+		int row = Math.min(first, second);
+		int col = Math.max(first, second);
+		return matrix[row*size-(row*(row+1)/2 - (size-col))];
+		
+	}
+	
+	public void set(int first, int second, double value) {
+		int row = Math.min(first, second);
+		int col = Math.max(first, second);
+		matrix[row*size-(row*(row+1)/2 - (size-col))] = value;
+	}
+
+	public void initialize(double value) {
+		for (int i=0; i < matrix.length; i++) {
+			matrix[i] = value;
+		}
+	}
+	
+	
+	public String toString() {
+		String result = "";
+		for (int i = 0; i < size; i++) {
+			for(int j = 0; j< size; j++) {
+				if(i<j) {
+					if(Double.isInfinite(this.get(i,j))) {
+						result = result + " -------";
+					}
+					else {
+						result = result + String.format("%+8.2f",this.get(i,j));
+					}
+				}
+				else {
+					result = result + ("        ");
+				}
+			}
+			result = result + "\n";
+		}
+		return result;
+	}
+}
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/UPGMAMatrix.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/UPGMAMatrix.java	(revision 1572)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/alignment/matrix/UPGMAMatrix.java	(revision 1572)
@@ -0,0 +1,44 @@
+package de.ugoe.cs.autoquest.tasktrees.alignment.matrix;
+
+import de.ugoe.cs.autoquest.tasktrees.alignment.pal.misc.Identifier;
+
+
+public class UPGMAMatrix extends TriangleMatrix {
+
+	public UPGMAMatrix(int size) {
+		super(size);
+	}
+
+	public int size() {
+		return size;
+	}
+
+	public String toString() {
+		String result = "";
+		for (int i = 0; i < size; i++) {
+			result = result + String.format("%8d", i);
+		}
+		result += "\n";
+		
+		for (int i = 0; i < size; i++) {
+			for(int j = 0; j< size; j++) {
+				if(i<j) {
+					if(Double.isInfinite(this.get(i,j))) {
+						result = result + " -------";
+					}
+					else {
+						result = result + String.format("%+8.2f",this.get(i,j));
+					}
+				}
+				else {
+					result = result + ("        ");
+				}
+			}
+			result = result + "   " + i + "\n";
+		}
+		return result;
+	}
+
+	
+
+}
Index: /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleAlignment.java
===================================================================
--- /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleAlignment.java	(revision 1571)
+++ /branches/ralph/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/SequenceForTaskDetectionRuleAlignment.java	(revision 1572)
@@ -15,4 +15,7 @@
 package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,6 +31,8 @@
 import de.ugoe.cs.autoquest.tasktrees.alignment.algorithms.NumberSequence;
 import de.ugoe.cs.autoquest.tasktrees.alignment.algorithms.SmithWatermanRepeated;
-import de.ugoe.cs.autoquest.tasktrees.alignment.substitution.ObjectDistanceSubstitionMatrix;
-import de.ugoe.cs.autoquest.tasktrees.alignment.substitution.TriangleMatrix;
+import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.ObjectDistanceSubstitionMatrix;
+import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.TriangleMatrix;
+import de.ugoe.cs.autoquest.tasktrees.alignment.matrix.UPGMAMatrix;
+import de.ugoe.cs.autoquest.tasktrees.alignment.pal.tree.UPGMATree;
 import de.ugoe.cs.autoquest.tasktrees.taskequality.TaskEquality;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
@@ -161,5 +166,5 @@
 		submat.generate();
 
-		TriangleMatrix sequenceDistances = new TriangleMatrix(numberseqs.size());
+		UPGMAMatrix sequenceDistances = new UPGMAMatrix(numberseqs.size());
 		sequenceDistances.initialize(Double.POSITIVE_INFINITY);
 
@@ -186,6 +191,4 @@
 					SmithWatermanRepeated randomSequence = new SmithWatermanRepeated(
 							ns1.shuffle().getSequence(),ns2.shuffle().getSequence(),submat,smithWatermanThreshold);
-					//randomSequence.printDPMatrix();
-					//randomSequence.traceback();
 					
 					double score = twoSequences.getAlignmentScore();
@@ -235,4 +238,6 @@
 		}
 		System.out.println(sequenceDistances.toString());
+		UPGMATree guidetree = new UPGMATree(numberseqs, sequenceDistances);
+		System.out.println(guidetree.toString());
 		
 		do {
