Changeset 1107 for trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/DefaultIterationDetectionRule.java
- Timestamp:
- 02/21/13 18:39:13 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/DefaultIterationDetectionRule.java
r1045 r1107 61 61 * @author Patrick Harms 62 62 */ 63 public class DefaultIterationDetectionRule implements TemporalRelationshipRule { 64 63 class DefaultIterationDetectionRule implements TemporalRelationshipRule { 64 65 /** 66 * <p> 67 * the maximum length for iterated sequences 68 * </p> 69 */ 65 70 private static final int MAX_LENGTH_OF_ITERATED_SEQUENCE = 50; 66 71 67 72 /** 68 73 * <p> 74 * the task tree node factory to be used for creating substructures for the temporal 75 * relationships identified during rule 76 * </p> 77 */ 78 private ITaskTreeNodeFactory taskTreeNodeFactory; 79 /** 80 * <p> 81 * the task tree builder to be used for creating substructures for the temporal relationships 82 * identified during rule application 83 * </p> 84 */ 85 private ITaskTreeBuilder taskTreeBuilder; 86 87 /** 88 * <p> 69 89 * the node equality manager needed for comparing task tree nodes with each other 70 90 * </p> … … 87 107 */ 88 108 DefaultIterationDetectionRule(NodeEqualityRuleManager nodeEqualityRuleManager, 89 NodeEquality minimalNodeEquality) 109 NodeEquality minimalNodeEquality, 110 ITaskTreeNodeFactory taskTreeNodeFactory, 111 ITaskTreeBuilder taskTreeBuilder) 90 112 { 91 super();92 113 this.nodeEqualityRuleManager = nodeEqualityRuleManager; 93 114 this.minimalNodeEquality = minimalNodeEquality; 115 this.taskTreeNodeFactory = taskTreeNodeFactory; 116 this.taskTreeBuilder = taskTreeBuilder; 94 117 } 95 118 … … 97 120 * (non-Javadoc) 98 121 * 99 * @see TemporalRelationshipRule#apply(TaskTreeNode, TaskTreeBuilder, TaskTreeNodeFactory) 122 * @see de.ugoe.cs.tasktree.temporalrelation.TemporalRelationshipRule#apply(TaskTreeNode, 123 * boolean) 100 124 */ 101 125 @Override 102 public RuleApplicationResult apply(ITaskTreeNode parent, 103 ITaskTreeBuilder treeBuilder, 104 ITaskTreeNodeFactory nodeFactory, 105 boolean finalize) 106 { 126 public RuleApplicationResult apply(ITaskTreeNode parent, boolean finalize) { 107 127 if (!(parent instanceof ISequence)) { 108 128 return null; … … 122 142 123 143 124 SubSequences subSequences = getEqualSubsequences(parent , treeBuilder, nodeFactory);144 SubSequences subSequences = getEqualSubsequences(parent); 125 145 126 146 if (subSequences != null) { 127 147 RuleApplicationResult result = new RuleApplicationResult(); 128 148 129 mergeEqualNodes(subSequences.equalVariants , treeBuilder, nodeFactory);130 IIteration newIteration = createIterationBasedOnIdentifiedVariants131 (subSequences, treeBuilder, nodeFactory, result);149 mergeEqualNodes(subSequences.equalVariants); 150 IIteration newIteration = 151 createIterationBasedOnIdentifiedVariants(subSequences, result); 132 152 133 153 determineNewlyCreatedParentTasks(parent, newIteration, result); … … 135 155 // remove iterated children 136 156 for (int j = subSequences.start; j < subSequences.end; j++) { 137 t reeBuilder.removeChild((ISequence) parent, subSequences.start);157 taskTreeBuilder.removeChild((ISequence) parent, subSequences.start); 138 158 } 139 159 140 160 // add the new iteration instead 141 t reeBuilder.addChild((ISequence) parent, subSequences.start, newIteration);161 taskTreeBuilder.addChild((ISequence) parent, subSequences.start, newIteration); 142 162 143 163 result.setRuleApplicationStatus(RuleApplicationStatus.RULE_APPLICATION_FINISHED); … … 161 181 * 162 182 * @param parent the parent node in which iterations of children shall be found 163 * @param treeBuilder the tree builder that can be used for connecting task tree nodes164 * @param nodeFactory the node factory that can be used for instantiating task tree nodes165 183 * 166 184 * @return the iterated subsequences identified in a specific part (contains the equal … … 168 186 * subpart in which the sequences were found) 169 187 */ 170 private SubSequences getEqualSubsequences(ITaskTreeNode parent, 171 ITaskTreeBuilder treeBuilder, 172 ITaskTreeNodeFactory nodeFactory) 173 { 188 private SubSequences getEqualSubsequences(ITaskTreeNode parent) { 174 189 SubSequences subSequences = null; 175 190 … … 184 199 185 200 boolean foundFurtherVariants = findFurtherVariants 186 (subSequences, parent, start, end, treeBuilder, nodeFactory, 187 useEqualSublistLengths); 201 (subSequences, parent, start, end, useEqualSublistLengths); 188 202 189 203 if (foundFurtherVariants) { … … 247 261 * @param end the end index (exclusive) of the current subpart of children 248 262 * in which iterations are searched for 249 * @param treeBuilder the tree builder that can be used for connecting task tree250 * nodes251 * @param nodeFactory the node factory that can be used for instantiating task tree252 * nodes253 263 * @param useEqualSublistLengths true if the sublists to be searched for all need to have the 254 264 * same length … … 260 270 int start, 261 271 int end, 262 ITaskTreeBuilder treeBuilder,263 ITaskTreeNodeFactory nodeFactory,264 272 boolean useEqualSublistLengths) 265 273 { … … 279 287 } 280 288 281 ISequence furtherVariant = nodeFactory.createNewSequence();289 ISequence furtherVariant = taskTreeNodeFactory.createNewSequence(); 282 290 283 291 for (int j = start; j < start + childCount; j++) { 284 t reeBuilder.addChild(furtherVariant, parent.getChildren().get(j));292 taskTreeBuilder.addChild(furtherVariant, parent.getChildren().get(j)); 285 293 } 286 294 … … 305 313 306 314 foundFurtherVariants = findFurtherVariants 307 (subSequences, parent, start + childCount, end, treeBuilder, nodeFactory, 308 useEqualSublistLengths); 315 (subSequences, parent, start + childCount, end, useEqualSublistLengths); 309 316 310 317 if (foundFurtherVariants) { … … 331 338 * 332 339 * @param nodes the list of nodes to be merged 333 * @param treeBuilder the tree builder that can be used for connecting task tree nodes 334 * @param nodeFactory the node factory that can be used for instantiating task tree nodes 335 */ 336 private void mergeEqualNodes(List<ITaskTreeNode> nodes, 337 ITaskTreeBuilder treeBuilder, 338 ITaskTreeNodeFactory nodeFactory) 339 { 340 */ 341 private void mergeEqualNodes(List<ITaskTreeNode> nodes) { 340 342 int index1 = 0; 341 343 int index2 = 0; … … 349 351 while (index2 < nodes.size()) { 350 352 variant2 = nodes.get(index2); 351 ITaskTreeNode mergedChild = 352 mergeEqualTasks(variant1, variant2, treeBuilder, nodeFactory); 353 ITaskTreeNode mergedChild = mergeEqualTasks(variant1, variant2); 353 354 354 355 if (mergedChild != null) { … … 382 383 * @param node1 the first task to be merged 383 384 * @param node2 the second task to be merged 384 * @param treeBuilder the tree builder that can be used for connecting task tree nodes385 * @param nodeFactory the node factory that can be used for instantiating task tree nodes386 385 * 387 386 * @return the result of the merge 388 387 */ 389 private ITaskTreeNode mergeEqualTasks(ITaskTreeNode node1, 390 ITaskTreeNode node2, 391 ITaskTreeBuilder treeBuilder, 392 ITaskTreeNodeFactory nodeFactory) 393 { 388 private ITaskTreeNode mergeEqualTasks(ITaskTreeNode node1, ITaskTreeNode node2) { 394 389 ITaskTreeNode mergeResult = null; 395 390 396 391 if ((node1 instanceof ISequence) && (node2 instanceof ISequence)) { 397 mergeResult = mergeEqualSequences 398 ((ISequence) node1, (ISequence) node2, treeBuilder, nodeFactory); 392 mergeResult = mergeEqualSequences((ISequence) node1, (ISequence) node2); 399 393 } 400 394 else if ((node1 instanceof ISelection) && (node2 instanceof ISelection)) { 401 mergeResult = mergeEqualSelections 402 ((ISelection) node1, (ISelection) node2, treeBuilder, nodeFactory); 395 mergeResult = mergeEqualSelections((ISelection) node1, (ISelection) node2); 403 396 } 404 397 else if ((node1 instanceof IIteration) && (node2 instanceof IIteration)) { 405 mergeResult = mergeEqualIterations 406 ((IIteration) node1, (IIteration) node2, treeBuilder, nodeFactory); 398 mergeResult = mergeEqualIterations((IIteration) node1, (IIteration) node2); 407 399 } 408 400 else if (node1 instanceof ISelection) { 409 t reeBuilder.addChild((ISelection) node1, node2);401 taskTreeBuilder.addChild((ISelection) node1, node2); 410 402 mergeResult = node1; 411 403 } 412 404 else if (node2 instanceof ISelection) { 413 t reeBuilder.addChild((ISelection) node2, node1);405 taskTreeBuilder.addChild((ISelection) node2, node1); 414 406 mergeResult = node2; 415 407 } 416 408 else if (node1 instanceof IIteration) { 417 mergeResult = mergeEqualTasks 418 (((IIteration) node1).getChildren().get(0), node2, treeBuilder, nodeFactory); 409 mergeResult = mergeEqualTasks(((IIteration) node1).getChildren().get(0), node2); 419 410 420 411 if (mergeResult != null) { 421 IIteration iteration = nodeFactory.createNewIteration();422 t reeBuilder.setChild(iteration, mergeResult);412 IIteration iteration = taskTreeNodeFactory.createNewIteration(); 413 taskTreeBuilder.setChild(iteration, mergeResult); 423 414 mergeResult = iteration; 424 415 } 425 416 } 426 417 else if (node2 instanceof IIteration) { 427 mergeResult = mergeEqualTasks 428 (((IIteration) node2).getChildren().get(0), node1, treeBuilder, nodeFactory); 418 mergeResult = mergeEqualTasks(((IIteration) node2).getChildren().get(0), node1); 429 419 430 420 if (mergeResult != null) { 431 IIteration iteration = nodeFactory.createNewIteration();432 t reeBuilder.setChild(iteration, mergeResult);421 IIteration iteration = taskTreeNodeFactory.createNewIteration(); 422 taskTreeBuilder.setChild(iteration, mergeResult); 433 423 mergeResult = iteration; 434 424 } … … 443 433 444 434 if (mergeResult == null) { 445 mergeResult = nodeFactory.createNewSelection();446 t reeBuilder.addChild((ISelection) mergeResult, node1);447 t reeBuilder.addChild((ISelection) mergeResult, node2);435 mergeResult = taskTreeNodeFactory.createNewSelection(); 436 taskTreeBuilder.addChild((ISelection) mergeResult, node1); 437 taskTreeBuilder.addChild((ISelection) mergeResult, node2); 448 438 } 449 439 … … 463 453 * @param sequence1 the first sequence to be merged 464 454 * @param sequence2 the second sequence to be merged 465 * @param treeBuilder the tree builder that can be used for connecting task tree nodes466 * @param nodeFactory the node factory that can be used for instantiating task tree nodes467 455 * 468 456 * @return the result of the merge or null if merging was not possible 469 457 */ 470 private ISequence mergeEqualSequences(ISequence sequence1, 471 ISequence sequence2, 472 ITaskTreeBuilder treeBuilder, 473 ITaskTreeNodeFactory nodeFactory) 474 { 458 private ISequence mergeEqualSequences(ISequence sequence1, ISequence sequence2) { 475 459 ISequence mergeResult = null; 476 460 477 461 if (sequence1.getChildren().size() == sequence2.getChildren().size()) { 478 mergeResult = nodeFactory.createNewSequence();462 mergeResult = taskTreeNodeFactory.createNewSequence(); 479 463 480 464 for (int i = 0; i < sequence1.getChildren().size(); i++) { 481 465 ITaskTreeNode mergedNode = mergeEqualTasks 482 (sequence1.getChildren().get(i), sequence2.getChildren().get(i), 483 treeBuilder, nodeFactory); 466 (sequence1.getChildren().get(i), sequence2.getChildren().get(i)); 484 467 485 468 if (mergedNode != null) { 486 t reeBuilder.addChild(mergeResult, mergedNode);469 taskTreeBuilder.addChild(mergeResult, mergedNode); 487 470 } 488 471 else { … … 506 489 * @param selection1 the first selection to be merged 507 490 * @param selection2 the second selection to be merged 508 * @param treeBuilder the tree builder that can be used for connecting task tree nodes509 * @param nodeFactory the node factory that can be used for instantiating task tree nodes510 491 * 511 492 * @return the result of the merge which is never null 512 493 */ 513 private ITaskTreeNode mergeEqualSelections(ISelection selection1, 514 ISelection selection2, 515 ITaskTreeBuilder treeBuilder, 516 ITaskTreeNodeFactory nodeFactory) 517 { 494 private ITaskTreeNode mergeEqualSelections(ISelection selection1, ISelection selection2) { 518 495 ISelection mergeResult = selection1; 519 496 … … 526 503 childToMerge = selection2.getChildren().get(i); 527 504 for (int j = 0; j < selection1.getChildren().size(); j++) { 528 mergedChild = mergeEqualTasks 529 (selection1.getChildren().get(j), childToMerge, treeBuilder, nodeFactory); 505 mergedChild = mergeEqualTasks(selection1.getChildren().get(j), childToMerge); 530 506 531 507 // a merge must not be a selection, except it is one of the children. Otherwise … … 538 514 // we found a real merge. So replace the original child in selection 1 with 539 515 // the merged child 540 t reeBuilder.removeChild(selection1, selection1.getChildren().get(j));541 t reeBuilder.addChild(selection1, mergedChild);516 taskTreeBuilder.removeChild(selection1, selection1.getChildren().get(j)); 517 taskTreeBuilder.addChild(selection1, mergedChild); 542 518 mergedChild = null; 543 519 childToMerge = null; … … 547 523 548 524 if (childToMerge != null) { 549 t reeBuilder.addChild(selection1, childToMerge);525 taskTreeBuilder.addChild(selection1, childToMerge); 550 526 } 551 527 } … … 563 539 * @param selection1 the first iteration to be merged 564 540 * @param selection2 the second iteration to be merged 565 * @param treeBuilder the tree builder that can be used for connecting task tree nodes566 * @param nodeFactory the node factory that can be used for instantiating task tree nodes567 541 * 568 542 * @return the result of the merge or null if merging is not possible 569 543 */ 570 private ITaskTreeNode mergeEqualIterations(IIteration iteration1, 571 IIteration iteration2, 572 ITaskTreeBuilder treeBuilder, 573 ITaskTreeNodeFactory nodeFactory) 574 { 544 private ITaskTreeNode mergeEqualIterations(IIteration iteration1, IIteration iteration2) { 575 545 ITaskTreeNode mergedChild = mergeEqualTasks 576 (iteration1.getChildren().get(0), iteration2.getChildren().get(0), 577 treeBuilder, nodeFactory); 546 (iteration1.getChildren().get(0), iteration2.getChildren().get(0)); 578 547 579 548 IIteration mergeResult = null; 580 549 581 550 if (mergedChild != null) { 582 mergeResult = nodeFactory.createNewIteration();583 t reeBuilder.setChild(mergeResult, mergedChild);551 mergeResult = taskTreeNodeFactory.createNewIteration(); 552 taskTreeBuilder.setChild(mergeResult, mergedChild); 584 553 } 585 554 … … 598 567 * 599 568 * @param subsequences the identified and already merged equal subsequences 600 * @param treeBuilder the tree builder that can be used for connecting task tree nodes601 * @param nodeFactory the node factory that can be used for instantiating the iteration602 569 * 603 570 * @return the resulting iteration 604 571 */ 605 572 private IIteration createIterationBasedOnIdentifiedVariants(SubSequences subsequences, 606 ITaskTreeBuilder treeBuilder,607 ITaskTreeNodeFactory nodeFactory,608 573 RuleApplicationResult result) 609 574 { 610 IIteration newIteration = nodeFactory.createNewIteration();575 IIteration newIteration = taskTreeNodeFactory.createNewIteration(); 611 576 result.addNewlyCreatedParentNode(newIteration); 612 577 … … 616 581 // there is only one equal variant and this has only one child. So create an 617 582 // iteration of this child 618 t reeBuilder.setChild583 taskTreeBuilder.setChild 619 584 (newIteration, subsequences.equalVariants.get(0).getChildren().get(0)); 620 585 } 621 586 else { 622 587 // there was an iteration of one equal sequence 623 t reeBuilder.setChild(newIteration, subsequences.equalVariants.get(0));588 taskTreeBuilder.setChild(newIteration, subsequences.equalVariants.get(0)); 624 589 result.addNewlyCreatedParentNode(subsequences.equalVariants.get(0)); 625 590 } … … 628 593 // there are distinct variants of equal subsequences or children --> create an 629 594 // iterated selection 630 ISelection selection = nodeFactory.createNewSelection();595 ISelection selection = taskTreeNodeFactory.createNewSelection(); 631 596 result.addNewlyCreatedParentNode(selection); 632 597 633 598 for (ITaskTreeNode variant : subsequences.equalVariants) { 634 599 if (variant.getChildren().size() == 1) { 635 t reeBuilder.addChild(selection, variant.getChildren().get(0));600 taskTreeBuilder.addChild(selection, variant.getChildren().get(0)); 636 601 } 637 602 else { 638 t reeBuilder.addChild(selection, variant);603 taskTreeBuilder.addChild(selection, variant); 639 604 result.addNewlyCreatedParentNode(variant); 640 605 } 641 606 } 642 607 643 t reeBuilder.setChild(newIteration, selection);608 taskTreeBuilder.setChild(newIteration, selection); 644 609 } 645 610
Note: See TracChangeset
for help on using the changeset viewer.