本文整理汇总了C#中de.unika.ipd.grGen.lgsp.SourceBuilder类的典型用法代码示例。如果您正苦于以下问题:C# SourceBuilder类的具体用法?C# SourceBuilder怎么用?C# SourceBuilder使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
SourceBuilder类属于de.unika.ipd.grGen.lgsp命名空间,在下文中一共展示了SourceBuilder类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: EmitMatchedReset
public void EmitMatchedReset(SourceBuilder builder, bool parallel)
{
if(parallel)
builder.AppendFrontFormat("flagsPerElement{0}[candidate{0}.uniqueId] &= (ushort)~GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED;\n", this.Id);
else
builder.AppendFrontFormat("candidate{0}.lgspFlags &= ~((uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED);\n", this.Id);
}
示例2: Emit
public override void Emit(SourceBuilder sourceCode)
{
sourceCode.Append(IsVar ? NamesOfEntities.Variable(Left) : NamesOfEntities.CandidateVariable(Left));
sourceCode.Append(" = ");
sourceCode.Append("(" + TargetType + ")");
Right.Emit(sourceCode);
sourceCode.Append(";\n");
}
示例3: EmitMatchedCheckAndSet
public void EmitMatchedCheckAndSet(SourceBuilder builder, bool parallel)
{
if(parallel)
{
builder.AppendFrontFormat("List<ushort> flagsPerElement{0} = graph.flagsPerThreadPerElement[threadId];\n", this.Id);
builder.AppendFrontFormat("if((flagsPerElement{0}[candidate{0}.uniqueId] & (ushort)GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED) != 0)\n", this.Id);
builder.AppendFront("\tcontinue;\n");
builder.AppendFrontFormat("flagsPerElement{0}[candidate{0}.uniqueId] |= (ushort)GRGEN_LGSP.LGSPElemFlagsParallel.IS_MATCHED;\n", this.Id);
}
else
{
builder.AppendFrontFormat("if((candidate{0}.lgspFlags & (uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED) != 0)\n", this.Id);
builder.AppendFront("\tcontinue;\n");
builder.AppendFrontFormat("candidate{0}.lgspFlags |= (uint)GRGEN_LGSP.LGSPElemFlags.IS_MATCHED;\n", this.Id);
}
}
示例4: ToString
public override string ToString()
{
String fromStr = "";
SourceBuilder sbFrom = new SourceBuilder();
if(From != null)
{
sbFrom.Append(Index.Name);
if(IncludingFrom)
sbFrom.Append("<=");
else
sbFrom.Append("<");
From.Emit(sbFrom);
fromStr = sbFrom.ToString();
}
String toStr = "";
SourceBuilder sbTo = new SourceBuilder();
if(To != null)
{
sbTo.Append(Index.Name);
if(IncludingTo)
sbTo.Append(">=");
else
sbTo.Append(">");
To.Emit(sbTo);
toStr = sbTo.ToString();
}
if(From == null && To == null)
return "descending(" + Index.Name + ")";
else
return "descending(" + fromStr + " " + toStr + ")";
}
示例5: Custom
/// <summary>
/// Does action-backend dependent stuff.
/// </summary>
/// <param name="args">Any kind of parameters for the stuff to do</param>
public override void Custom(params object[] args)
{
if(args.Length == 0) goto invalidCommand;
switch((String) args[0])
{
case "gen_searchplan":
{
if(graph.statistics.edgeCounts == null)
throw new ArgumentException("Graph not analyzed yet!\nPlease execute 'custom graph analyze'!");
LGSPAction[] oldActions;
if(args.Length == 1)
{
oldActions = new LGSPAction[actions.Count];
int i = 0;
foreach(LGSPAction action in actions.Values)
{
oldActions[i] = action;
++i;
}
}
else
{
oldActions = new LGSPAction[args.Length - 1];
for(int i = 0; i < oldActions.Length; i++)
{
oldActions[i] = (LGSPAction)GetAction((String)args[i + 1]);
if(oldActions[i] == null)
throw new ArgumentException("'" + (String)args[i + 1] + "' is not the name of an action!\n"
+ "Please use 'show actions' to get a list of the available names.");
}
}
int startticks = Environment.TickCount;
matcherGenerator.LazyNegativeIndependentConditionEvaluation = LazyNIC;
matcherGenerator.InlineIndependents = InlineIndependents;
matcherGenerator.Profile = Profile;
LGSPAction[] newActions = matcherGenerator.GenerateActions(graph, modelAssemblyName,
actionsAssemblyName, oldActions);
int stopticks = Environment.TickCount;
Console.Write("Searchplans for actions ");
for(int i = 0; i < oldActions.Length; i++)
{
actions[oldActions[i].Name] = newActions[i];
if(i != 0) Console.Write(", ");
Console.Write("'" + oldActions[i].Name + "'");
}
Console.WriteLine(" generated in " + (stopticks - startticks) + " ms.");
return;
}
case "dump_sourcecode":
if(args.Length != 2)
throw new ArgumentException("Usage: dump_sourcecode <bool>\n"
+ "If <bool> == true, C# files will be dumped for new searchplans.");
if(!bool.TryParse((String) args[1], out matcherGenerator.DumpDynSourceCode))
throw new ArgumentException("Illegal bool value specified: \"" + (String) args[1] + "\"");
return;
case "dump_searchplan":
if(args.Length != 2)
throw new ArgumentException("Usage: dump_searchplan <bool>\n"
+ "If <bool> == true, VCG and TXT files will be dumped for new searchplans.");
if(!bool.TryParse((String) args[1], out matcherGenerator.DumpSearchPlan))
throw new ArgumentException("Illegal bool value specified: \"" + (String) args[1] + "\"");
return;
case "explain":
{
if(args.Length != 2)
throw new ArgumentException("Usage: explain <name>\n"
+ "Explains the searchplan of the given action.");
LGSPAction action = (LGSPAction)GetAction((String)args[1]);
if(action == null)
throw new ArgumentException("'" + (String)args[1] + "' is not the name of an action!\n"
+ "Please use 'show actions' to get a list of the available names.");
if(action.patternGraph.schedules[0] == null)
{
LGSPGraphStatistics graphStatistics = null;
if(StatisticsPath != null)
{
Console.WriteLine("static search plans from " + StatisticsPath);
graphStatistics = new LGSPGraphStatistics(graph.Model);
graphStatistics.Parse(StatisticsPath);
}
else
Console.WriteLine("static search plans");
LGSPMatcherGenerator matcherGen = new LGSPMatcherGenerator(graph.Model);
matcherGen.FillInStaticSearchPlans(graphStatistics, InlineIndependents, action);
}
SourceBuilder sb = new SourceBuilder();
foreach(KeyValuePair<LGSPMatchingPattern, LGSPMatchingPattern> usedSubpattern
//.........这里部分代码省略.........
示例6: GenerateAction
/// <summary>
/// Generates an LGSPAction object for the given scheduled search plan.
/// </summary>
/// <param name="action">Needed for the rule pattern and the name</param>
/// <param name="sourceOutputFilename">null if no output file needed</param>
public LGSPAction GenerateAction(ScheduledSearchPlan scheduledSearchPlan, LGSPAction action,
String modelAssemblyLocation, String actionAssemblyLocation, String sourceOutputFilename)
{
SourceBuilder sourceCode = new SourceBuilder(CommentSourceCode);
GenerateFileHeaderForActionsFile(sourceCode, model.GetType().Namespace, action.rulePattern.GetType().Namespace);
// can't generate new subpattern matchers due to missing scheduled search plans for them / missing graph analyze data
Debug.Assert(action.rulePattern.patternGraph.embeddedGraphsPlusInlined.Length == 0);
GenerateActionAndMatcher(sourceCode, action.rulePattern, false);
// close namespace
sourceCode.Append("}");
// write generated source to file if requested
if(sourceOutputFilename != null)
{
StreamWriter writer = new StreamWriter(sourceOutputFilename);
writer.Write(sourceCode.ToString());
writer.Close();
}
// set up compiler
CSharpCodeProvider compiler = new CSharpCodeProvider();
CompilerParameters compParams = GetDynCompilerSetup(modelAssemblyLocation, actionAssemblyLocation);
// Stopwatch compilerWatch = Stopwatch.StartNew();
// compile generated code
CompilerResults compResults = compiler.CompileAssemblyFromSource(compParams, sourceCode.ToString());
if(compResults.Errors.HasErrors)
{
String errorMsg = compResults.Errors.Count + " Errors:";
foreach(CompilerError error in compResults.Errors)
errorMsg += Environment.NewLine + "Line: " + error.Line + " - " + error.ErrorText;
throw new ArgumentException("Illegal dynamic C# source code produced for actions \"" + action.Name + "\": " + errorMsg);
}
// create action instance
Object obj = compResults.CompiledAssembly.CreateInstance("de.unika.ipd.grGen.lgspActions.DynAction_" + action.Name);
// long compSourceTicks = compilerWatch.ElapsedTicks;
// Console.WriteLine("GenMatcher: Compile source: {0} us", compSourceTicks / (Stopwatch.Frequency / 1000000));
return (LGSPAction) obj;
}
示例7: GenerateTasksMemoryPool
/// <summary>
/// Generates memory pooling code for matching tasks of class given by it's name
/// </summary>
private void GenerateTasksMemoryPool(SourceBuilder sb, String className, bool isAlternative, bool isIterationBreaking, int branchingFactor)
{
// getNewTask method handing out new task from pool or creating task if pool is empty
if(isAlternative)
sb.AppendFront("public static " + className + " getNewTask(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, "
+ "Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_, GRGEN_LGSP.PatternGraph[] patternGraphs_) {\n");
else
sb.AppendFront("public static " + className + " getNewTask(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, "
+ "Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_) {\n");
sb.Indent();
sb.AppendFront(className + " newTask;\n");
sb.AppendFront("if(numFreeTasks>0) {\n");
sb.Indent();
sb.AppendFront("newTask = freeListHead;\n");
sb.AppendFront("newTask.actionEnv = actionEnv_; newTask.openTasks = openTasks_;\n");
if(isAlternative)
sb.AppendFront("newTask.patternGraphs = patternGraphs_;\n");
else if(isIterationBreaking)
sb.AppendFront("newTask.breakIteration = false;\n");
sb.AppendFront("freeListHead = newTask.next;\n");
sb.AppendFront("newTask.next = null;\n");
sb.AppendFront("--numFreeTasks;\n");
sb.Unindent();
sb.AppendFront("} else {\n");
sb.Indent();
if(isAlternative)
sb.AppendFront("newTask = new " + className + "(actionEnv_, openTasks_, patternGraphs_);\n");
else
sb.AppendFront("newTask = new " + className + "(actionEnv_, openTasks_);\n");
sb.Unindent();
sb.AppendFront("}\n");
sb.AppendFront("return newTask;\n");
sb.Unindent();
sb.AppendFront("}\n\n");
// releaseTask method recycling task into pool if pool is not full
sb.AppendFront("public static void releaseTask(" + className + " oldTask) {\n");
sb.Indent();
sb.AppendFront("if(numFreeTasks<MAX_NUM_FREE_TASKS) {\n");
sb.Indent();
sb.AppendFront("oldTask.next = freeListHead;\n");
sb.AppendFront("oldTask.actionEnv = null; oldTask.openTasks = null;\n");
sb.AppendFront("freeListHead = oldTask;\n");
sb.AppendFront("++numFreeTasks;\n");
sb.Unindent();
sb.AppendFront("}\n");
sb.Unindent();
sb.AppendFront("}\n\n");
// tasks pool administration data
sb.AppendFront("private static " + className + " freeListHead = null;\n");
sb.AppendFront("private static int numFreeTasks = 0;\n");
sb.AppendFront("private const int MAX_NUM_FREE_TASKS = 100;\n\n"); // todo: compute antiproportional to pattern size
sb.AppendFront("private " + className + " next = null;\n\n");
// for parallelized subpatterns/alternatives/iterateds we need a freelist per thread
if(branchingFactor > 1)
{
// getNewTask method handing out new task from pool or creating task if pool is empty
if(isAlternative)
sb.AppendFront("public static " + className + " getNewTask(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, "
+ "Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_, GRGEN_LGSP.PatternGraph[] patternGraphs_, int threadId) {\n");
else
sb.AppendFront("public static " + className + " getNewTask(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, "
+ "Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_, int threadId) {\n");
sb.Indent();
sb.AppendFront(className + " newTask;\n");
sb.AppendFront("if(numFreeTasks_perWorker[threadId]>0) {\n");
sb.Indent();
sb.AppendFront("newTask = freeListHead_perWorker[threadId];\n");
sb.AppendFront("newTask.actionEnv = actionEnv_; newTask.openTasks = openTasks_;\n");
if(isAlternative)
sb.AppendFront("newTask.patternGraphs = patternGraphs_;\n");
else if(isIterationBreaking)
sb.AppendFront("newTask.breakIteration = false;\n");
sb.AppendFront("freeListHead_perWorker[threadId] = newTask.next;\n");
sb.AppendFront("newTask.next = null;\n");
sb.AppendFront("--numFreeTasks_perWorker[threadId];\n");
sb.Unindent();
sb.AppendFront("} else {\n");
sb.Indent();
if(isAlternative)
sb.AppendFront("newTask = new " + className + "(actionEnv_, openTasks_, patternGraphs_);\n");
else
sb.AppendFront("newTask = new " + className + "(actionEnv_, openTasks_);\n");
sb.Unindent();
sb.AppendFront("}\n");
sb.AppendFront("return newTask;\n");
sb.Unindent();
sb.AppendFront("}\n\n");
// releaseTask method recycling task into pool if pool is not full
sb.AppendFront("public static void releaseTask(" + className + " oldTask, int threadId) {\n");
sb.Indent();
sb.AppendFront("if(numFreeTasks_perWorker[threadId]<MAX_NUM_FREE_TASKS/2) {\n");
sb.Indent();
//.........这里部分代码省略.........
示例8: GenerateMatcherClassHeadIterated
/// <summary>
/// Generates matcher class head source code for the given iterated pattern into given source builder
/// isInitialStatic tells whether the initial static version or a dynamic version after analyze is to be generated.
/// </summary>
public void GenerateMatcherClassHeadIterated(SourceBuilder sb, LGSPMatchingPattern matchingPattern,
PatternGraph iter, bool isInitialStatic)
{
PatternGraph patternGraph = (PatternGraph)matchingPattern.PatternGraph;
String namePrefix = (isInitialStatic ? "" : "Dyn") + "IteratedAction_";
String className = namePrefix + iter.pathPrefix + iter.name;
String matchingPatternClassName = matchingPattern.GetType().Name;
if(patternGraph.Package != null)
{
sb.AppendFrontFormat("namespace {0}\n", patternGraph.Package);
sb.AppendFront("{\n");
sb.Indent();
}
sb.AppendFront("public class " + className + " : GRGEN_LGSP.LGSPSubpatternAction\n");
sb.AppendFront("{\n");
sb.Indent(); // class level
sb.AppendFront("private " + className + "(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_) {\n");
sb.Indent(); // method body level
sb.AppendFront("actionEnv = actionEnv_; openTasks = openTasks_;\n");
sb.AppendFront("patternGraph = " + matchingPatternClassName + ".Instance.patternGraph;\n");
int index = -1;
for (int i=0; i<iter.embeddingGraph.iteratedsPlusInlined.Length; ++i) {
if (iter.embeddingGraph.iteratedsPlusInlined[i].iteratedPattern == iter) index = i;
}
sb.AppendFrontFormat("minMatchesIter = {0};\n", iter.embeddingGraph.iteratedsPlusInlined[index].minMatches);
sb.AppendFrontFormat("maxMatchesIter = {0};\n", iter.embeddingGraph.iteratedsPlusInlined[index].maxMatches);
sb.AppendFront("numMatchesIter = 0;\n");
if(iter.isIterationBreaking)
sb.AppendFront("breakIteration = false;\n");
sb.Unindent(); // class level
sb.AppendFront("}\n\n");
sb.AppendFront("int minMatchesIter;\n");
sb.AppendFront("int maxMatchesIter;\n");
sb.AppendFront("int numMatchesIter;\n");
if(iter.isIterationBreaking)
sb.AppendFront("bool breakIteration;\n");
sb.Append("\n");
GenerateTasksMemoryPool(sb, className, false, iter.isIterationBreaking, matchingPattern.patternGraph.branchingFactor);
Dictionary<string, bool> neededNodes = new Dictionary<string, bool>();
Dictionary<string, bool> neededEdges = new Dictionary<string, bool>();
Dictionary<string, GrGenType> neededVariables = new Dictionary<string, GrGenType>();
foreach (KeyValuePair<string, bool> neededNode in iter.neededNodes)
neededNodes[neededNode.Key] = neededNode.Value;
foreach (KeyValuePair<string, bool> neededEdge in iter.neededEdges)
neededEdges[neededEdge.Key] = neededEdge.Value;
foreach (KeyValuePair<string, GrGenType> neededVariable in iter.neededVariables)
neededVariables[neededVariable.Key] = neededVariable.Value;
foreach (KeyValuePair<string, bool> node in neededNodes)
{
sb.AppendFront("public GRGEN_LGSP.LGSPNode " + node.Key + ";\n");
}
foreach (KeyValuePair<string, bool> edge in neededEdges)
{
sb.AppendFront("public GRGEN_LGSP.LGSPEdge " + edge.Key + ";\n");
}
foreach (KeyValuePair<string, GrGenType> variable in neededVariables)
{
sb.AppendFront("public " + TypesHelper.TypeName(variable.Value) + " " + variable.Key + ";\n");
}
GenerateIndependentsMatchObjects(sb, matchingPattern, iter);
sb.AppendFront("\n");
}
示例9: GenerateMatcherClassHeadSubpattern
/// <summary>
/// Generates matcher class head source code for the subpattern of the rulePattern into given source builder
/// isInitialStatic tells whether the initial static version or a dynamic version after analyze is to be generated.
/// </summary>
public void GenerateMatcherClassHeadSubpattern(SourceBuilder sb, LGSPMatchingPattern matchingPattern,
bool isInitialStatic)
{
Debug.Assert(!(matchingPattern is LGSPRulePattern));
PatternGraph patternGraph = (PatternGraph)matchingPattern.PatternGraph;
String namePrefix = (isInitialStatic ? "" : "Dyn") + "PatternAction_";
String className = namePrefix + matchingPattern.name;
String matchingPatternClassName = matchingPattern.GetType().Name;
if(patternGraph.Package != null)
{
sb.AppendFrontFormat("namespace {0}\n", patternGraph.Package);
sb.AppendFront("{\n");
sb.Indent();
}
sb.AppendFront("public class " + className + " : GRGEN_LGSP.LGSPSubpatternAction\n");
sb.AppendFront("{\n");
sb.Indent(); // class level
sb.AppendFront("private " + className + "(GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnv_, Stack<GRGEN_LGSP.LGSPSubpatternAction> openTasks_) {\n");
sb.Indent(); // method body level
sb.AppendFront("actionEnv = actionEnv_; openTasks = openTasks_;\n");
sb.AppendFront("patternGraph = " + matchingPatternClassName + ".Instance.patternGraph;\n");
sb.Unindent(); // class level
sb.AppendFront("}\n\n");
GenerateTasksMemoryPool(sb, className, false, false, matchingPattern.patternGraph.branchingFactor);
for (int i = 0; i < patternGraph.nodesPlusInlined.Length; ++i)
{
PatternNode node = patternGraph.nodesPlusInlined[i];
if (node.PointOfDefinition == null)
{
sb.AppendFront("public GRGEN_LGSP.LGSPNode " + node.name + ";\n");
}
}
for (int i = 0; i < patternGraph.edgesPlusInlined.Length; ++i)
{
PatternEdge edge = patternGraph.edgesPlusInlined[i];
if (edge.PointOfDefinition == null)
{
sb.AppendFront("public GRGEN_LGSP.LGSPEdge " + edge.name + ";\n");
}
}
for (int i = 0; i < patternGraph.variablesPlusInlined.Length; ++i)
{
PatternVariable variable = patternGraph.variablesPlusInlined[i];
sb.AppendFront("public " +TypesHelper.TypeName(variable.type) + " " + variable.name + ";\n");
}
GenerateIndependentsMatchObjects(sb, matchingPattern, patternGraph);
sb.AppendFront("\n");
}
示例10: GenerateActionAndMatcherOfIterated
/// <summary>
/// Generates the action interface plus action implementation including the matcher source code
/// for the given iterated pattern into the given source builder
/// </summary>
public void GenerateActionAndMatcherOfIterated(SourceBuilder sb,
LGSPMatchingPattern matchingPattern, PatternGraph iter, bool isInitialStatic)
{
// generate the search program out of the schedule within the pattern graph of the iterated pattern
SearchProgram searchProgram = GenerateSearchProgramIterated(matchingPattern, iter);
// generate the parallelized search program out of the parallelized schedule within the pattern graph of the iterated pattern
SearchProgram searchProgramParallelized = GenerateParallelizedSearchProgramIteratedAsNeeded(matchingPattern, iter);
// emit matcher class head, body, tail; body is source code representing search program
GenerateMatcherClassHeadIterated(sb, matchingPattern, iter, isInitialStatic);
searchProgram.Emit(sb);
if(searchProgramParallelized != null)
searchProgramParallelized.Emit(sb);
GenerateMatcherClassTail(sb, matchingPattern.PatternGraph.Package != null);
// finally generate matcher source for all the nested alternatives or iterateds of the iterated pattern graph
// nested inside the alternatives,iterateds,negatives,independents
foreach (Alternative alt in iter.alternativesPlusInlined)
{
GenerateActionAndMatcherOfAlternative(sb, matchingPattern, alt, isInitialStatic);
}
foreach (Iterated nestedIter in iter.iteratedsPlusInlined)
{
GenerateActionAndMatcherOfIterated(sb, matchingPattern, nestedIter.iteratedPattern, isInitialStatic);
}
foreach (PatternGraph neg in iter.negativePatternGraphsPlusInlined)
{
GenerateActionAndMatcherOfNestedPatterns(sb, matchingPattern, neg, isInitialStatic);
}
foreach (PatternGraph idpt in iter.independentPatternGraphsPlusInlined)
{
GenerateActionAndMatcherOfNestedPatterns(sb, matchingPattern, idpt, isInitialStatic);
}
}
示例11: GenerateActionAndMatcher
/// <summary>
/// Generates the action interface plus action implementation including the matcher source code
/// for the given rule pattern into the given source builder
/// </summary>
public void GenerateActionAndMatcher(SourceBuilder sb,
LGSPMatchingPattern matchingPattern, bool isInitialStatic)
{
// generate the search program out of the schedule(s) within the pattern graph of the rule
SearchProgram searchProgram = GenerateSearchProgram(matchingPattern);
// generate the parallelized search program out of the parallelized schedule(s) within the pattern graph of the rule
SearchProgram searchProgramParallelized = GenerateParallelizedSearchProgramAsNeeded(matchingPattern);
// emit matcher class head, body, tail; body is source code representing search program
if(matchingPattern is LGSPRulePattern) {
GenerateActionInterface(sb, (LGSPRulePattern)matchingPattern); // generate the exact action interface
GenerateMatcherClassHeadAction(sb, (LGSPRulePattern)matchingPattern, isInitialStatic, searchProgram);
searchProgram.Emit(sb);
if(searchProgramParallelized != null)
searchProgramParallelized.Emit(sb);
GenerateActionImplementation(sb, (LGSPRulePattern)matchingPattern);
GenerateMatcherClassTail(sb, matchingPattern.PatternGraph.Package != null);
} else {
GenerateMatcherClassHeadSubpattern(sb, matchingPattern, isInitialStatic);
searchProgram.Emit(sb);
if(searchProgramParallelized != null)
searchProgramParallelized.Emit(sb);
GenerateMatcherClassTail(sb, matchingPattern.PatternGraph.Package != null);
}
// finally generate matcher source for all the nested alternatives or iterateds of the pattern graph
// nested inside the alternatives,iterateds,negatives,independents
foreach(Alternative alt in matchingPattern.patternGraph.alternativesPlusInlined)
{
GenerateActionAndMatcherOfAlternative(sb, matchingPattern, alt, isInitialStatic);
}
foreach (Iterated iter in matchingPattern.patternGraph.iteratedsPlusInlined)
{
GenerateActionAndMatcherOfIterated(sb, matchingPattern, iter.iteratedPattern, isInitialStatic);
}
foreach (PatternGraph neg in matchingPattern.patternGraph.negativePatternGraphsPlusInlined)
{
GenerateActionAndMatcherOfNestedPatterns(sb, matchingPattern, neg, isInitialStatic);
}
foreach (PatternGraph idpt in matchingPattern.patternGraph.independentPatternGraphsPlusInlined)
{
GenerateActionAndMatcherOfNestedPatterns(sb, matchingPattern, idpt, isInitialStatic);
}
}
示例12: DumpScheduledSearchPlan
private void DumpScheduledSearchPlan(ScheduledSearchPlan ssp, String dumpname)
{
StreamWriter sw = new StreamWriter(dumpname + "-scheduledsp.txt", false);
SourceBuilder sb = new SourceBuilder();
ssp.Explain(sb, model);
sb.Append("\n");
sw.WriteLine(sb.ToString());
sw.Close();
/* StreamWriter sw = new StreamWriter(dumpname + "-scheduledsp.vcg", false);
sw.WriteLine("graph:{\ninfoname 1: \"Attributes\"\ndisplay_edge_labels: no\nport_sharing: no\nsplines: no\n"
+ "\nmanhattan_edges: no\nsmanhattan_edges: no\norientation: bottom_to_top\nedges: yes\nnodes: yes\nclassname 1: \"normal\"");
sw.WriteLine("node:{title:\"root\" label:\"ROOT\"}\n");
SearchPlanNode root = new SearchPlanNode("root");
sw.WriteLine("graph:{{title:\"pattern\" label:\"{0}\" status:clustered color:lightgrey", dumpname);
foreach(SearchOperation op in ssp.Operations)
{
switch(op.Type)
{
case SearchOperationType.Lookup:
case SearchOperationType.Incoming:
case SearchOperationType.Outgoing:
case SearchOperationType.ImplicitSource:
case SearchOperationType.ImplicitTarget:
{
SearchPlanNode spnode = (SearchPlanNode) op.Element;
DumpNode(sw, spnode);
SearchPlanNode src;
switch(op.Type)
{
case SearchOperationType.Lookup:
case SearchOperationType.ActionPreset:
case SearchOperationType.NegPreset:
src = root;
break;
default:
src = op.SourceSPNode;
break;
}
DumpEdge(sw, op.Type, src, spnode, op.CostToEnd, false);
break;
}
case SearchOperationType.Condition:
sw.WriteLine("node:{title:\"Condition\" label:\"CONDITION\"}\n");
break;
case SearchOperationType.NegativePattern:
sw.WriteLine("node:{title:\"NAC\" label:\"NAC\"}\n");
break;
}
}*/
}
示例13: GenerateMatcherClassHeadAction
/// <summary>
/// Generates matcher class head source code for the pattern of the rulePattern into given source builder
/// isInitialStatic tells whether the initial static version or a dynamic version after analyze is to be generated.
/// </summary>
void GenerateMatcherClassHeadAction(SourceBuilder sb, LGSPRulePattern rulePattern,
bool isInitialStatic, SearchProgram searchProgram)
{
PatternGraph patternGraph = (PatternGraph)rulePattern.PatternGraph;
String namePrefix = (isInitialStatic ? "" : "Dyn") + "Action_";
String className = namePrefix + rulePattern.name;
String rulePatternClassName = rulePattern.GetType().Name;
String matchClassName = rulePatternClassName + "." + "Match_" + rulePattern.name;
String matchInterfaceName = rulePatternClassName + "." + "IMatch_" + rulePattern.name;
String actionInterfaceName = "IAction_" + rulePattern.name;
if(patternGraph.Package != null)
{
sb.AppendFrontFormat("namespace {0}\n", patternGraph.Package);
sb.AppendFront("{\n");
sb.Indent();
}
sb.AppendFront("public class " + className + " : GRGEN_LGSP.LGSPAction, "
+ "GRGEN_LIBGR.IAction, " + actionInterfaceName + "\n");
sb.AppendFront("{\n");
sb.Indent(); // class level
sb.AppendFront("public " + className + "() {\n");
sb.Indent(); // method body level
sb.AppendFront("_rulePattern = " + rulePatternClassName + ".Instance;\n");
sb.AppendFront("patternGraph = _rulePattern.patternGraph;\n");
if(rulePattern.patternGraph.branchingFactor < 2)
{
sb.AppendFront("DynamicMatch = myMatch;\n");
if(!isInitialStatic)
sb.AppendFrontFormat("GRGEN_ACTIONS.Action_{0}.Instance.DynamicMatch = myMatch;\n", rulePattern.name);
}
else
{
sb.AppendFront("if(Environment.ProcessorCount == 1)\n");
sb.AppendFront("{\n");
sb.AppendFront("\tDynamicMatch = myMatch;\n");
if(!isInitialStatic)
sb.AppendFrontFormat("\tGRGEN_ACTIONS.Action_{0}.Instance.DynamicMatch = myMatch;\n", rulePattern.name);
sb.AppendFront("}\n");
sb.AppendFront("else\n");
sb.AppendFront("{\n");
sb.Indent();
sb.AppendFront("DynamicMatch = myMatch_parallelized;\n");
if(!isInitialStatic)
sb.AppendFrontFormat("GRGEN_ACTIONS.Action_{0}.Instance.DynamicMatch = myMatch_parallelized;\n", rulePattern.name);
sb.AppendFrontFormat("numWorkerThreads = GRGEN_LGSP.WorkerPool.EnsurePoolSize({0});\n", rulePattern.patternGraph.branchingFactor);
sb.AppendFrontFormat("parallelTaskMatches = new GRGEN_LGSP.LGSPMatchesList<{0}, {1}>[numWorkerThreads];\n", matchClassName, matchInterfaceName);
sb.AppendFront("moveHeadAfterNodes = new List<GRGEN_LGSP.LGSPNode>[numWorkerThreads];\n");
sb.AppendFront("moveHeadAfterEdges = new List<GRGEN_LGSP.LGSPEdge>[numWorkerThreads];\n");
sb.AppendFront("moveOutHeadAfter = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>[numWorkerThreads];\n");
sb.AppendFront("moveInHeadAfter = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>[numWorkerThreads];\n");
sb.AppendFront("for(int i=0; i<numWorkerThreads; ++i)\n");
sb.AppendFront("{\n");
sb.Indent();
sb.AppendFront("moveHeadAfterNodes[i] = new List<GRGEN_LGSP.LGSPNode>();\n");
sb.AppendFront("moveHeadAfterEdges[i] = new List<GRGEN_LGSP.LGSPEdge>();\n");
sb.AppendFront("moveOutHeadAfter[i] = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>();\n");
sb.AppendFront("moveInHeadAfter[i] = new List<KeyValuePair<GRGEN_LGSP.LGSPNode, GRGEN_LGSP.LGSPEdge>>();\n");
sb.Unindent();
sb.AppendFront("}\n");
sb.AppendFront("for(int i=0; i<parallelTaskMatches.Length; ++i)\n");
sb.AppendFrontFormat("\tparallelTaskMatches[i] = new GRGEN_LGSP.LGSPMatchesList<{0}, {1}>(this);\n", matchClassName, matchInterfaceName);
sb.Unindent();
sb.AppendFront("}\n");
}
sb.AppendFrontFormat("ReturnArray = new object[{0}];\n", rulePattern.Outputs.Length);
sb.AppendFront("matches = new GRGEN_LGSP.LGSPMatchesList<" + matchClassName +", " + matchInterfaceName + ">(this);\n");
sb.Unindent(); // class level
sb.AppendFront("}\n\n");
sb.AppendFront("public " + rulePatternClassName + " _rulePattern;\n");
sb.AppendFront("public override GRGEN_LGSP.LGSPRulePattern rulePattern { get { return _rulePattern; } }\n");
sb.AppendFront("public override string Name { get { return \"" + rulePattern.name + "\"; } }\n");
sb.AppendFront("private GRGEN_LGSP.LGSPMatchesList<" + matchClassName + ", " + matchInterfaceName + "> matches;\n\n");
if (isInitialStatic)
{
sb.AppendFront("public static " + className + " Instance { get { return instance; } set { instance = value; } }\n");
sb.AppendFront("private static " + className + " instance = new " + className + "();\n");
}
GenerateIndependentsMatchObjects(sb, rulePattern, patternGraph);
sb.AppendFront("\n");
GenerateParallelizationSetupAsNeeded(sb, rulePattern, searchProgram);
}
示例14: GenerateParallelizationSetupAsNeeded
void GenerateParallelizationSetupAsNeeded(SourceBuilder sb, LGSPRulePattern rulePattern, SearchProgram searchProgram)
{
if(rulePattern.patternGraph.branchingFactor < 2)
return;
foreach(SearchOperation so in rulePattern.patternGraph.parallelizedSchedule[0].Operations)
{
switch(so.Type)
{
case SearchOperationType.WriteParallelPreset:
if(so.Element is SearchPlanNodeNode)
sb.AppendFrontFormat("GRGEN_LGSP.LGSPNode {0};\n", NamesOfEntities.IterationParallelizationParallelPresetCandidate(((SearchPlanNodeNode)so.Element).PatternElement.Name));
else //SearchPlanEdgeNode
sb.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0};\n", NamesOfEntities.IterationParallelizationParallelPresetCandidate(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
break;
case SearchOperationType.WriteParallelPresetVar:
sb.AppendFrontFormat("{0} {1};\n",
TypesHelper.TypeName(((PatternVariable)so.Element).Type),
NamesOfEntities.IterationParallelizationParallelPresetCandidate(((PatternVariable)so.Element).Name));
break;
case SearchOperationType.SetupParallelLookup:
if(so.Element is SearchPlanNodeNode)
{
sb.AppendFrontFormat("GRGEN_LGSP.LGSPNode {0};\n", NamesOfEntities.IterationParallelizationListHead(((SearchPlanNodeNode)so.Element).PatternElement.Name));
sb.AppendFrontFormat("GRGEN_LGSP.LGSPNode {0};\n", NamesOfEntities.IterationParallelizationNextCandidate(((SearchPlanNodeNode)so.Element).PatternElement.Name));
}
else
{
sb.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0};\n", NamesOfEntities.IterationParallelizationListHead(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
sb.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0};\n", NamesOfEntities.IterationParallelizationNextCandidate(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
}
break;
case SearchOperationType.SetupParallelPickFromStorage:
if(TypesHelper.DotNetTypeToXgrsType(so.Storage.Variable.type).StartsWith("set") || TypesHelper.DotNetTypeToXgrsType(so.Storage.Variable.type).StartsWith("map"))
{
sb.AppendFrontFormat("IEnumerator<KeyValuePair<{0},{1}>> {2};\n",
TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(TypesHelper.DotNetTypeToXgrsType(so.Storage.Variable.Type)), model),
TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractDst(TypesHelper.DotNetTypeToXgrsType(so.Storage.Variable.Type)), model),
NamesOfEntities.IterationParallelizationIterator(((SearchPlanNode)so.Element).PatternElement.Name));
}
else
{
sb.AppendFrontFormat("IEnumerator<{0}> {1};\n",
TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(TypesHelper.DotNetTypeToXgrsType(so.Storage.Variable.Type)), model),
NamesOfEntities.IterationParallelizationIterator(((SearchPlanNode)so.Element).PatternElement.Name));
}
break;
case SearchOperationType.SetupParallelPickFromStorageDependent:
if(TypesHelper.AttributeTypeToXgrsType(so.Storage.Attribute.Attribute).StartsWith("set") || TypesHelper.AttributeTypeToXgrsType(so.Storage.Attribute.Attribute).StartsWith("map"))
{
sb.AppendFrontFormat("IEnumerator<KeyValuePair<{0},{1}>> {2};\n",
TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(TypesHelper.AttributeTypeToXgrsType(so.Storage.Attribute.Attribute)), model),
TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractDst(TypesHelper.AttributeTypeToXgrsType(so.Storage.Attribute.Attribute)), model),
NamesOfEntities.IterationParallelizationIterator(((SearchPlanNode)so.Element).PatternElement.Name));
}
else
{
sb.AppendFrontFormat("IEnumerator<{0}> {1};\n",
TypesHelper.XgrsTypeToCSharpType(TypesHelper.ExtractSrc(TypesHelper.AttributeTypeToXgrsType(so.Storage.Attribute.Attribute)), model),
NamesOfEntities.IterationParallelizationIterator(((SearchPlanNode)so.Element).PatternElement.Name));
}
break;
case SearchOperationType.SetupParallelPickFromIndex:
sb.AppendFrontFormat("IEnumerator<{0}> {1};\n",
TypesHelper.TypeName(so.IndexAccess.Index is AttributeIndexDescription ?
((AttributeIndexDescription)so.IndexAccess.Index).GraphElementType :
((IncidenceCountIndexDescription)so.IndexAccess.Index).StartNodeType),
NamesOfEntities.IterationParallelizationIterator(((SearchPlanNode)so.Element).PatternElement.Name));
break;
case SearchOperationType.SetupParallelPickFromIndexDependent:
sb.AppendFrontFormat("IEnumerator<{0}> {1};\n",
TypesHelper.TypeName(so.IndexAccess.Index is AttributeIndexDescription ?
((AttributeIndexDescription)so.IndexAccess.Index).GraphElementType :
((IncidenceCountIndexDescription)so.IndexAccess.Index).StartNodeType),
NamesOfEntities.IterationParallelizationIterator(((SearchPlanNode)so.Element).PatternElement.Name));
break;
case SearchOperationType.SetupParallelIncoming:
case SearchOperationType.SetupParallelOutgoing:
sb.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0};\n", NamesOfEntities.IterationParallelizationListHead(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
sb.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0};\n", NamesOfEntities.IterationParallelizationNextCandidate(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
break;
case SearchOperationType.SetupParallelIncident:
sb.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0};\n", NamesOfEntities.IterationParallelizationListHead(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
sb.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0};\n", NamesOfEntities.IterationParallelizationNextCandidate(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
sb.AppendFrontFormat("int {0};\n", NamesOfEntities.IterationParallelizationDirectionRunCounterVariable(((SearchPlanEdgeNode)so.Element).PatternElement.Name));
break;
}
}
sb.AppendFront("\n");
String rulePatternClassName = rulePattern.GetType().Name;
String matchClassName = rulePatternClassName + "." + "Match_" + rulePattern.name;
String matchInterfaceName = rulePatternClassName + "." + "IMatch_" + rulePattern.name;
sb.AppendFront("private static GRGEN_LGSP.LGSPMatchesList<" + matchClassName + ", " + matchInterfaceName + ">[] parallelTaskMatches;\n");
sb.AppendFront("private static int numWorkerThreads;\n");
sb.AppendFront("private static int iterationNumber;\n");
sb.AppendFront("private static int iterationLock;\n");
sb.AppendFront("[ThreadStatic] private static int currentIterationNumber;\n");
sb.AppendFront("[ThreadStatic] private static int threadId;\n");
sb.AppendFront("private static GRGEN_LGSP.LGSPActionExecutionEnvironment actionEnvParallel;\n");
//.........这里部分代码省略.........
示例15: GenerateActionAndMatcherOfNestedPatterns
/// <summary>
/// Generates the action interface plus action implementation including the matcher source code
/// for the alternatives/iterateds nested within the given negative/independent pattern graph into the given source builder
/// </summary>
public void GenerateActionAndMatcherOfNestedPatterns(SourceBuilder sb,
LGSPMatchingPattern matchingPattern, PatternGraph negOrIdpt, bool isInitialStatic)
{
// nothing to do locally ..
// .. just move on to the nested alternatives or iterateds
foreach (Alternative alt in negOrIdpt.alternativesPlusInlined)
{
GenerateActionAndMatcherOfAlternative(sb, matchingPattern, alt, isInitialStatic);
}
foreach (Iterated iter in negOrIdpt.iteratedsPlusInlined)
{
GenerateActionAndMatcherOfIterated(sb, matchingPattern, iter.iteratedPattern, isInitialStatic);
}
foreach (PatternGraph nestedNeg in negOrIdpt.negativePatternGraphsPlusInlined)
{
GenerateActionAndMatcherOfNestedPatterns(sb, matchingPattern, nestedNeg, isInitialStatic);
}
foreach (PatternGraph nestedIdpt in negOrIdpt.independentPatternGraphsPlusInlined)
{
GenerateActionAndMatcherOfNestedPatterns(sb, matchingPattern, nestedIdpt, isInitialStatic);
}
}