Changeset 1733 for branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskInstanceComparator.java
- Timestamp:
- 09/05/14 19:33:12 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/autoquest-core-tasktrees-alignment/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TaskInstanceComparator.java
r1401 r1733 27 27 /** 28 28 * <p> 29 * implementation of a symbol comparator for task instances. Internally, it uses comparison buffers 30 * to prevent comparing two tasks or task instances several times. It internally instantiates 31 * comparers being the implementation strategy of the comparisons required for a specific level 32 * of task equality. The comparers internally use the {@link TaskEqualityRuleManager} for 33 * performing comparisons. 29 * implementation of a symbol comparator for task instances. Internally, it uses 30 * comparison buffers to prevent comparing two tasks or task instances several 31 * times. It internally instantiates comparers being the implementation strategy 32 * of the comparisons required for a specific level of task equality. The 33 * comparers internally use the {@link TaskEqualityRuleManager} for performing 34 * comparisons. 34 35 * </p> 35 36 */ 36 37 public class TaskInstanceComparator implements SymbolComparator<ITaskInstance> { 37 38 /** */ 39 private static final long serialVersionUID = 1L; 40 41 /** 42 * the maximum size of the internal buffer used for storing comparison results 43 */ 44 private static final int MAX_BUFFER_SIZE = 2 * 1024 * 1024; 45 46 /** 47 * the considered level of task equality 48 */ 49 private TaskEquality minimalTaskEquality; 50 51 /** 52 * the comparer used internally for comparing two tasks 53 */ 54 private transient Comparer comparer; 55 56 /** 57 * the comparer used for comparing two tasks on the lexical level 58 */ 59 private transient Comparer lexicalComparer; 60 61 /** 62 * internal buffer used for storing comparison results 63 */ 64 private transient HashMap<Long, Boolean> equalityBuffer = new HashMap<Long, Boolean>(); 65 66 /** 67 * internal buffer used for storing comparison results only for lexical comparisons 68 */ 69 private transient HashMap<Long, Boolean> lexicalEqualityBuffer; 70 71 /** 72 * <p> 73 * initializes the comparator with a considered task equality level 74 * </p> 75 * 76 * @param minimalTaskEquality the considered task equality level 77 */ 78 public TaskInstanceComparator(TaskEquality minimalTaskEquality) { 79 this.minimalTaskEquality = minimalTaskEquality; 80 init(); 81 } 82 83 /* (non-Javadoc) 84 * @see SymbolComparator#equals(Object, Object) 85 */ 86 @Override 87 public boolean equals(ITaskInstance taskInstance1, ITaskInstance taskInstance2) { 88 return equals(taskInstance1.getTask(), taskInstance2.getTask()); 89 } 90 91 /** 92 * <p> 93 * returns true, if this comparator considers the provided tasks as equal, false else 94 * </p> 95 * 96 * @param task1 the first task to compare 97 * @param task2 the second task to compare 98 * 99 * @return as described 100 */ 101 public boolean equals(ITask task1, ITask task2) { 102 Boolean result; 103 104 if (task1 != task2) { 105 //if ((task1 instanceof IEventTask) && (task2 instanceof IEventTask)) { 106 long key = ((long) System.identityHashCode(task1)) << 32; 107 key += System.identityHashCode(task2); 108 109 result = equalityBuffer.get(key); 110 111 if (result == null) { 112 result = comparer.compare(task1, task2); 113 114 if (equalityBuffer.size() < MAX_BUFFER_SIZE) { 115 equalityBuffer.put(key, result); 116 } 117 } 118 /*} 119 else { 120 result = false; 121 }*/ 122 } 123 else { 124 result = true; 125 } 126 127 return result; 128 } 129 130 /** 131 * <p> 132 * returns true, if this comparator considers the provided tasks as lexically equal, false else 133 * </p> 134 * 135 * @param task1 the first task to compare 136 * @param task2 the second task to compare 137 * 138 * @return as described 139 */ 140 public boolean areLexicallyEqual(ITask task1, ITask task2) { 141 Boolean result; 142 143 if (task1 != task2) { 144 long key = ((long) System.identityHashCode(task1)) << 32; 145 key += System.identityHashCode(task2); 146 147 result = lexicalEqualityBuffer.get(key); 148 149 if (result == null) { 150 result = lexicalComparer.compare(task1, task2); 151 if (equalityBuffer.size() < MAX_BUFFER_SIZE) { 152 lexicalEqualityBuffer.put(key, result); 153 } 154 } 155 } 156 else { 157 result = true; 158 } 159 160 return result; 161 } 162 163 /** 164 * <p> 165 * can be called externally to clear the internal comparison buffers 166 * </p> 167 */ 168 public void clearBuffers() { 169 equalityBuffer.clear(); 170 init(); 171 } 172 173 /** 174 * <p> 175 * initializes the comparator with comparers depending on the different comparison levels as 176 * well as with the required comparison buffers. Comparers and buffers for lexical comparison 177 * may be reused if the considered equality level is also lexical. 178 * </p> 179 */ 180 private void init() { 181 if (minimalTaskEquality == TaskEquality.LEXICALLY_EQUAL) { 182 comparer = new LexicalComparer(); 183 } 184 else if (minimalTaskEquality == TaskEquality.SYNTACTICALLY_EQUAL) { 185 comparer = new SyntacticalComparer(); 186 } 187 else if (minimalTaskEquality == TaskEquality.SEMANTICALLY_EQUAL) { 188 comparer = new SemanticalComparer(); 189 } 190 else { 191 comparer = new DefaultComparer(this.minimalTaskEquality); 192 } 193 194 if (minimalTaskEquality == TaskEquality.LEXICALLY_EQUAL) { 195 lexicalComparer = comparer; 196 lexicalEqualityBuffer = equalityBuffer; 197 } 198 else { 199 lexicalComparer = new LexicalComparer(); 200 lexicalEqualityBuffer = new HashMap<Long, Boolean>(); 201 } 202 } 203 204 /** 205 * <p> 206 * deserialize this object and reinitialize the buffers 207 * </p> 208 */ 209 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 210 in.defaultReadObject(); 211 init(); 212 } 213 214 215 /** 216 * <p> 217 * interface for internally used comparers containing only a compare method 218 * </p> 219 */ 220 private static interface Comparer { 221 222 /** 223 * <p> 224 * returns true, if this comparator considers the provided tasks as equal, false else 225 * </p> 226 * 227 * @param task1 the first task to compare 228 * @param task2 the second task to compare 229 * 230 * @return as described 231 */ 232 boolean compare(ITask task1, ITask task2); 233 } 234 235 /** 236 * <p> 237 * comparer that performs comparisons only on the lexical level 238 * </p> 239 */ 240 private static class LexicalComparer implements Comparer { 241 242 /* (non-Javadoc) 243 * @see Comparer#compare(ITask, ITask) 244 */ 245 public boolean compare(ITask task1, ITask task2) { 246 return TaskEqualityRuleManager.getInstance().areLexicallyEqual(task1, task2); 247 } 248 } 249 250 /** 251 * <p> 252 * comparer that performs comparisons only on the syntactical level 253 * </p> 254 * 255 */ 256 private static class SyntacticalComparer implements Comparer { 257 258 /* (non-Javadoc) 259 * @see Comparer#compare(ITask, ITask) 260 */ 261 public boolean compare(ITask task1, ITask task2) { 262 return TaskEqualityRuleManager.getInstance().areSyntacticallyEqual(task1, task2); 263 } 264 } 265 266 /** 267 * <p> 268 * comparer that performs comparisons only on the semantical level 269 * </p> 270 */ 271 private static class SemanticalComparer implements Comparer { 272 273 /* (non-Javadoc) 274 * @see Comparer#compare(ITask, ITask) 275 */ 276 public boolean compare(ITask task1, ITask task2) { 277 return TaskEqualityRuleManager.getInstance().areSemanticallyEqual(task1, task2); 278 } 279 } 280 281 /** 282 * <p> 283 * comparer that performs comparisons only on the provided level 284 * </p> 285 */ 286 private static class DefaultComparer implements Comparer { 287 288 /** 289 * <p> 290 * the minimal task equality considered by this comparer 291 * </p> 292 */ 293 private TaskEquality minimalTaskEquality; 294 295 /** 296 * <p> 297 * initializes this comparer with the task equality to be considered 298 * </p> 299 */ 300 public DefaultComparer(TaskEquality minimalTaskEquality) { 301 this.minimalTaskEquality = minimalTaskEquality; 302 } 303 304 /* (non-Javadoc) 305 * @see Comparer#compare(ITask, ITask) 306 */ 307 public boolean compare(ITask task1, ITask task2) { 308 return TaskEqualityRuleManager.getInstance().areAtLeastEqual 309 (task1, task2, minimalTaskEquality); 310 } 311 } 38 39 /** 40 * <p> 41 * interface for internally used comparers containing only a compare method 42 * </p> 43 */ 44 private static interface Comparer { 45 46 /** 47 * <p> 48 * returns true, if this comparator considers the provided tasks as 49 * equal, false else 50 * </p> 51 * 52 * @param task1 53 * the first task to compare 54 * @param task2 55 * the second task to compare 56 * 57 * @return as described 58 */ 59 boolean compare(ITask task1, ITask task2); 60 } 61 62 /** 63 * <p> 64 * comparer that performs comparisons only on the provided level 65 * </p> 66 */ 67 private static class DefaultComparer implements Comparer { 68 69 /** 70 * <p> 71 * the minimal task equality considered by this comparer 72 * </p> 73 */ 74 private final TaskEquality minimalTaskEquality; 75 76 /** 77 * <p> 78 * initializes this comparer with the task equality to be considered 79 * </p> 80 */ 81 public DefaultComparer(TaskEquality minimalTaskEquality) { 82 this.minimalTaskEquality = minimalTaskEquality; 83 } 84 85 /* 86 * (non-Javadoc) 87 * 88 * @see Comparer#compare(ITask, ITask) 89 */ 90 @Override 91 public boolean compare(ITask task1, ITask task2) { 92 return TaskEqualityRuleManager.getInstance().areAtLeastEqual(task1, 93 task2, minimalTaskEquality); 94 } 95 } 96 97 /** 98 * <p> 99 * comparer that performs comparisons only on the lexical level 100 * </p> 101 */ 102 private static class LexicalComparer implements Comparer { 103 104 /* 105 * (non-Javadoc) 106 * 107 * @see Comparer#compare(ITask, ITask) 108 */ 109 @Override 110 public boolean compare(ITask task1, ITask task2) { 111 return TaskEqualityRuleManager.getInstance().areLexicallyEqual( 112 task1, task2); 113 } 114 } 115 116 /** 117 * <p> 118 * comparer that performs comparisons only on the semantical level 119 * </p> 120 */ 121 private static class SemanticalComparer implements Comparer { 122 123 /* 124 * (non-Javadoc) 125 * 126 * @see Comparer#compare(ITask, ITask) 127 */ 128 @Override 129 public boolean compare(ITask task1, ITask task2) { 130 return TaskEqualityRuleManager.getInstance().areSemanticallyEqual( 131 task1, task2); 132 } 133 } 134 135 /** 136 * <p> 137 * comparer that performs comparisons only on the syntactical level 138 * </p> 139 * 140 */ 141 private static class SyntacticalComparer implements Comparer { 142 143 /* 144 * (non-Javadoc) 145 * 146 * @see Comparer#compare(ITask, ITask) 147 */ 148 @Override 149 public boolean compare(ITask task1, ITask task2) { 150 return TaskEqualityRuleManager.getInstance().areSyntacticallyEqual( 151 task1, task2); 152 } 153 } 154 155 /** */ 156 private static final long serialVersionUID = 1L; 157 158 /** 159 * the maximum size of the internal buffer used for storing comparison 160 * results 161 */ 162 private static final int MAX_BUFFER_SIZE = 2 * 1024 * 1024; 163 164 /** 165 * the considered level of task equality 166 */ 167 private final TaskEquality minimalTaskEquality; 168 169 /** 170 * the comparer used internally for comparing two tasks 171 */ 172 private transient Comparer comparer; 173 174 /** 175 * the comparer used for comparing two tasks on the lexical level 176 */ 177 private transient Comparer lexicalComparer; 178 179 /** 180 * internal buffer used for storing comparison results 181 */ 182 private transient HashMap<Long, Boolean> equalityBuffer = new HashMap<Long, Boolean>(); 183 184 /** 185 * internal buffer used for storing comparison results only for lexical 186 * comparisons 187 */ 188 private transient HashMap<Long, Boolean> lexicalEqualityBuffer; 189 190 /** 191 * <p> 192 * initializes the comparator with a considered task equality level 193 * </p> 194 * 195 * @param minimalTaskEquality 196 * the considered task equality level 197 */ 198 public TaskInstanceComparator(TaskEquality minimalTaskEquality) { 199 this.minimalTaskEquality = minimalTaskEquality; 200 init(); 201 } 202 203 /** 204 * <p> 205 * returns true, if this comparator considers the provided tasks as 206 * lexically equal, false else 207 * </p> 208 * 209 * @param task1 210 * the first task to compare 211 * @param task2 212 * the second task to compare 213 * 214 * @return as described 215 */ 216 public boolean areLexicallyEqual(ITask task1, ITask task2) { 217 Boolean result; 218 219 if (task1 != task2) { 220 long key = ((long) System.identityHashCode(task1)) << 32; 221 key += System.identityHashCode(task2); 222 223 result = lexicalEqualityBuffer.get(key); 224 225 if (result == null) { 226 result = lexicalComparer.compare(task1, task2); 227 if (equalityBuffer.size() < MAX_BUFFER_SIZE) { 228 lexicalEqualityBuffer.put(key, result); 229 } 230 } 231 } else { 232 result = true; 233 } 234 235 return result; 236 } 237 238 /** 239 * <p> 240 * can be called externally to clear the internal comparison buffers 241 * </p> 242 */ 243 public void clearBuffers() { 244 equalityBuffer.clear(); 245 init(); 246 } 247 248 /** 249 * <p> 250 * returns true, if this comparator considers the provided tasks as equal, 251 * false else 252 * </p> 253 * 254 * @param task1 255 * the first task to compare 256 * @param task2 257 * the second task to compare 258 * 259 * @return as described 260 */ 261 public boolean equals(ITask task1, ITask task2) { 262 Boolean result; 263 264 if (task1 != task2) { 265 // if ((task1 instanceof IEventTask) && (task2 instanceof 266 // IEventTask)) { 267 long key = ((long) System.identityHashCode(task1)) << 32; 268 key += System.identityHashCode(task2); 269 270 result = equalityBuffer.get(key); 271 272 if (result == null) { 273 result = comparer.compare(task1, task2); 274 275 if (equalityBuffer.size() < MAX_BUFFER_SIZE) { 276 equalityBuffer.put(key, result); 277 } 278 } 279 /* 280 * } else { result = false; } 281 */ 282 } else { 283 result = true; 284 } 285 286 return result; 287 } 288 289 /* 290 * (non-Javadoc) 291 * 292 * @see SymbolComparator#equals(Object, Object) 293 */ 294 @Override 295 public boolean equals(ITaskInstance taskInstance1, 296 ITaskInstance taskInstance2) { 297 return equals(taskInstance1.getTask(), taskInstance2.getTask()); 298 } 299 300 /** 301 * <p> 302 * initializes the comparator with comparers depending on the different 303 * comparison levels as well as with the required comparison buffers. 304 * Comparers and buffers for lexical comparison may be reused if the 305 * considered equality level is also lexical. 306 * </p> 307 */ 308 private void init() { 309 if (minimalTaskEquality == TaskEquality.LEXICALLY_EQUAL) { 310 comparer = new LexicalComparer(); 311 } else if (minimalTaskEquality == TaskEquality.SYNTACTICALLY_EQUAL) { 312 comparer = new SyntacticalComparer(); 313 } else if (minimalTaskEquality == TaskEquality.SEMANTICALLY_EQUAL) { 314 comparer = new SemanticalComparer(); 315 } else { 316 comparer = new DefaultComparer(this.minimalTaskEquality); 317 } 318 319 if (minimalTaskEquality == TaskEquality.LEXICALLY_EQUAL) { 320 lexicalComparer = comparer; 321 lexicalEqualityBuffer = equalityBuffer; 322 } else { 323 lexicalComparer = new LexicalComparer(); 324 lexicalEqualityBuffer = new HashMap<Long, Boolean>(); 325 } 326 } 327 328 /** 329 * <p> 330 * deserialize this object and reinitialize the buffers 331 * </p> 332 */ 333 private void readObject(ObjectInputStream in) throws IOException, 334 ClassNotFoundException { 335 in.defaultReadObject(); 336 init(); 337 } 312 338 313 339 }
Note: See TracChangeset
for help on using the changeset viewer.