/// <summary> /// move outwards from starting point on until operation to continue at is found /// appending restore isomorphy at insertion point for isomorphy written on the way /// returns operation to continue at /// </summary> private static SearchProgramOperation MoveOutwardsAppendingRemoveIsomorphy( SearchProgramOperation startingPoint, ref SearchProgramOperation insertionPoint, string[] neededElementsForCheckOperation, SearchProgramOperation outermostOperation, SearchProgram topLevelSearchProgram) { // currently focused operation on our way outwards SearchProgramOperation op = startingPoint; // move outwards until operation to continue at is found bool creationPointOfDominatingElementFound = false; bool iterationReached = false; do { op = op.Previous; // insert code to clean up isomorphy information written by candidate acceptance // in between the operation to continue and the check operation if (op is AcceptCandidate) { AcceptCandidate writeIsomorphy = op as AcceptCandidate; AbandonCandidate restoreIsomorphy = new AbandonCandidate( writeIsomorphy.PatternElementName, writeIsomorphy.NegativeIndependentNamePrefix, writeIsomorphy.IsNode, writeIsomorphy.NeverAboveMaxIsoSpace, writeIsomorphy.Parallel, writeIsomorphy.LockForAllThreads); insertionPoint = insertionPoint.Append(restoreIsomorphy); } // insert code to clean up isomorphy information written by global candidate acceptance // in between the operation to continue and the check operation if (op is AcceptCandidateGlobal) { AcceptCandidateGlobal writeIsomorphy = op as AcceptCandidateGlobal; AbandonCandidateGlobal removeIsomorphy = new AbandonCandidateGlobal( writeIsomorphy.PatternElementName, writeIsomorphy.NegativeIndependentNamePrefix, writeIsomorphy.IsNode, writeIsomorphy.NeverAboveMaxIsoSpace, writeIsomorphy.Parallel); insertionPoint = insertionPoint.Append(removeIsomorphy); } // insert code to clean up isomorphy information written by patternpath candidate acceptance // in between the operation to continue and the check operation if (op is AcceptCandidatePatternpath) { AcceptCandidatePatternpath writeIsomorphy = op as AcceptCandidatePatternpath; AbandonCandidatePatternpath removeIsomorphy = new AbandonCandidatePatternpath( writeIsomorphy.PatternElementName, writeIsomorphy.NegativeIndependentNamePrefix, writeIsomorphy.IsNode); insertionPoint = insertionPoint.Append(removeIsomorphy); } // insert code to remove iterated pattern acceptance if (op is AcceptIterated) { AcceptIterated acceptIterated = op as AcceptIterated; AbandonIterated abandonIterated = new AbandonIterated(); insertionPoint = insertionPoint.Append(abandonIterated); } // insert code to undo subpattern matching initialization if we leave the subpattern matching method if (op is InitializeSubpatternMatching) { InitializeSubpatternMatching initialize = op as InitializeSubpatternMatching; FinalizeSubpatternMatching finalize = new FinalizeSubpatternMatching(initialize.Type); insertionPoint = insertionPoint.Append(finalize); } // insert code to undo negative/independent matching initialization if we leave the negative/independent matching method if (op is InitializeNegativeIndependentMatching) { InitializeNegativeIndependentMatching initialize = op as InitializeNegativeIndependentMatching; FinalizeNegativeIndependentMatching finalize = new FinalizeNegativeIndependentMatching(initialize.NeverAboveMaxIsoSpace, initialize.Parallel); insertionPoint = insertionPoint.Append(finalize); } // determine operation to continue at // found by looking at the graph elements // the check operation depends on / is dominated by // its the first element iteration on our way outwards the search program // after or at the point of a get element operation // of some dominating element the check depends on // (or the outermost operation if no iteration is found until it is reached) if (op is GetCandidate || op is BothDirectionsIteration) { if (creationPointOfDominatingElementFound == false) { if (neededElementsForCheckOperation != null) { foreach (string dominating in neededElementsForCheckOperation) { GetCandidate getCandidate = op as GetCandidate; BothDirectionsIteration bothDirections = op as BothDirectionsIteration; if (getCandidate != null && getCandidate.PatternElementName == dominating || bothDirections != null && bothDirections.PatternElementName == dominating) { creationPointOfDominatingElementFound = true; iterationReached = false; break; } } } else { // needed elements == null means everything fits, // take first element iteration on our way outwards the search program // (or the outermost operation if no iteration is found until it is reached) creationPointOfDominatingElementFound = true; iterationReached = false; } } if (op is GetCandidateByIteration || op is GetCandidateByIterationParallel || op is BothDirectionsIteration) { iterationReached = true; } } }while(!(creationPointOfDominatingElementFound && iterationReached) && op != outermostOperation); return(op); }
/// <summary> /// Search program operations completing the matching process /// after all pattern elements have been found are created and inserted into the program /// </summary> private SearchProgramOperation buildMatchComplete( SearchProgramOperation insertionPoint) { PatternGraph patternGraph = patternGraphWithNestingPatterns.Peek(); string negativeIndependentNamePrefix = NegativeIndependentNamePrefix(patternGraph); // is subpattern gives information about type of top level enclosing pattern (action vs. subpattern) // contains subpatterns gives informations about current pattern graph (might be negative, independent itself, too) bool isSubpattern = programType == SearchProgramType.Subpattern || programType == SearchProgramType.AlternativeCase || programType == SearchProgramType.Iterated; bool existsNonInlinedSubpattern = false; foreach(PatternGraphEmbedding sub in patternGraph.embeddedGraphsPlusInlined) if(!sub.inlined) existsNonInlinedSubpattern = true; bool containsSubpatterns = existsNonInlinedSubpattern || patternGraph.alternativesPlusInlined.Length >= 1 || patternGraph.iteratedsPlusInlined.Length >= 1; // increase iterated matched counter if it is iterated if(programType==SearchProgramType.Iterated) { AcceptIterated acceptIterated = new AcceptIterated(); insertionPoint = insertionPoint.Append(acceptIterated); } // push subpattern tasks (in case there are some) if(containsSubpatterns) insertionPoint = insertPushSubpatternTasks(insertionPoint); // if this is a subpattern without subpatterns // it may be the last to be matched - handle that case if(!containsSubpatterns && isSubpattern && programType!=SearchProgramType.Iterated && negativeIndependentNamePrefix=="") insertionPoint = insertCheckForTasksLeft(insertionPoint); // if this is a subpattern or a top-level pattern which contains subpatterns if(containsSubpatterns || isSubpattern && negativeIndependentNamePrefix=="") { // we do the global accept of all candidate elements (write isomorphy information) insertionPoint = insertGlobalAccept(insertionPoint); // and execute the open subpattern matching tasks MatchSubpatterns matchSubpatterns = new MatchSubpatterns(negativeIndependentNamePrefix, parallelized); insertionPoint = insertionPoint.Append(matchSubpatterns); } // pop subpattern tasks (in case there are/were some) if(containsSubpatterns) insertionPoint = insertPopSubpatternTasks(insertionPoint); // handle matched or not matched subpatterns, matched local pattern if(negativeIndependentNamePrefix == "") { // subpattern or top-level pattern which contains subpatterns if(containsSubpatterns || isSubpattern) insertionPoint = insertCheckForSubpatternsFound(insertionPoint, false); else // top-level-pattern of action without subpatterns insertionPoint = insertPatternFound(insertionPoint); } else { // negative/independent contains subpatterns if(containsSubpatterns) insertionPoint = insertCheckForSubpatternsFoundNegativeIndependent(insertionPoint); else insertionPoint = insertPatternFoundNegativeIndependent(insertionPoint); } // global abandon of all accepted candidate elements (remove isomorphy information) if(containsSubpatterns || isSubpattern && negativeIndependentNamePrefix=="") insertionPoint = insertGlobalAbandon(insertionPoint); // decrease iterated matched counter again if it is iterated if(programType == SearchProgramType.Iterated) { AbandonIterated abandonIterated = new AbandonIterated(); insertionPoint = insertionPoint.Append(abandonIterated); } return insertionPoint; }