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.alignment.algorithms.Constants; 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 matrix; HashMap idmapping; private TriangleMatrix matrix; private SymbolMap uniqueTasks; private double gapPenalty; private double positiveThreshold; public ObjectDistanceSubstitionMatrix( SymbolMap uniqueTasks,float positiveThreshold) { this.uniqueTasks = uniqueTasks; this.positiveThreshold = positiveThreshold; idmapping = new HashMap(); matrix = new TriangleMatrix(uniqueTasks.size()+1); gapPenalty = -2; } @Override public double getGapPenalty() { return gapPenalty; } @Override public void generate() { int index = 0; float maxDistance =34; for (Iterator it = uniqueTasks.getSymbols().iterator(); it .hasNext();) { Object obj1 = it.next(); IEventTaskInstance eti1 = null; if (obj1 instanceof IEventTaskInstance) { eti1 = (IEventTaskInstance) obj1; } for (Iterator 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(meandistance/(uniqueTasks.size()*uniqueTasks.size())); //System.out.println(idmapping.toString()); //System.out.println(matrix.toString()); //System.out.println("ObjectDistanceMatrix: MaxDistance: " + maxDistance); //System.out.println(idmapping.keySet().toString()); //System.out.println(idmapping.values().toString()); } public String toString(){ return matrix.toString(); } public double getScore(int taskId1, int taskId2) { if(taskId1 == Constants.GAP_SYMBOL || taskId1 == Constants.UNMATCHED_SYMBOL || taskId2 == Constants.GAP_SYMBOL || taskId2 == Constants.UNMATCHED_SYMBOL ) { return 0.0; } else { return matrix.get(idmapping.get(taskId1),idmapping.get(taskId2)); } } }