diff options
Diffstat (limited to 'subprojects/viatra-runtime-localsearch/src/main/java/tools/refinery/viatra/runtime/localsearch/planner/LocalSearchPlanner.java')
-rw-r--r-- | subprojects/viatra-runtime-localsearch/src/main/java/tools/refinery/viatra/runtime/localsearch/planner/LocalSearchPlanner.java | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime-localsearch/src/main/java/tools/refinery/viatra/runtime/localsearch/planner/LocalSearchPlanner.java b/subprojects/viatra-runtime-localsearch/src/main/java/tools/refinery/viatra/runtime/localsearch/planner/LocalSearchPlanner.java new file mode 100644 index 00000000..f44be655 --- /dev/null +++ b/subprojects/viatra-runtime-localsearch/src/main/java/tools/refinery/viatra/runtime/localsearch/planner/LocalSearchPlanner.java | |||
@@ -0,0 +1,140 @@ | |||
1 | /******************************************************************************* | ||
2 | * Copyright (c) 2010-2014, Marton Bur, Akos Horvath, Zoltan Ujhelyi, Istvan Rath and Daniel Varro | ||
3 | * This program and the accompanying materials are made available under the | ||
4 | * terms of the Eclipse Public License v. 2.0 which is available at | ||
5 | * http://www.eclipse.org/legal/epl-v20.html. | ||
6 | * | ||
7 | * SPDX-License-Identifier: EPL-2.0 | ||
8 | *******************************************************************************/ | ||
9 | package tools.refinery.viatra.runtime.localsearch.planner; | ||
10 | |||
11 | import java.util.ArrayList; | ||
12 | import java.util.Collection; | ||
13 | import java.util.HashMap; | ||
14 | import java.util.HashSet; | ||
15 | import java.util.List; | ||
16 | import java.util.Map; | ||
17 | import java.util.Set; | ||
18 | |||
19 | import org.apache.log4j.Logger; | ||
20 | import tools.refinery.viatra.runtime.localsearch.matcher.integration.LocalSearchHints; | ||
21 | import tools.refinery.viatra.runtime.localsearch.operations.ISearchOperation; | ||
22 | import tools.refinery.viatra.runtime.localsearch.plan.SearchPlanForBody; | ||
23 | import tools.refinery.viatra.runtime.localsearch.planner.compiler.IOperationCompiler; | ||
24 | import tools.refinery.viatra.runtime.matchers.backend.ResultProviderRequestor; | ||
25 | import tools.refinery.viatra.runtime.matchers.context.IQueryBackendContext; | ||
26 | import tools.refinery.viatra.runtime.matchers.context.IQueryRuntimeContext; | ||
27 | import tools.refinery.viatra.runtime.matchers.planning.SubPlan; | ||
28 | import tools.refinery.viatra.runtime.matchers.psystem.PBody; | ||
29 | import tools.refinery.viatra.runtime.matchers.psystem.PVariable; | ||
30 | import tools.refinery.viatra.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
31 | import tools.refinery.viatra.runtime.matchers.psystem.queries.PParameter; | ||
32 | import tools.refinery.viatra.runtime.matchers.psystem.queries.PQuery; | ||
33 | import tools.refinery.viatra.runtime.matchers.psystem.rewriters.PBodyNormalizer; | ||
34 | import tools.refinery.viatra.runtime.matchers.psystem.rewriters.PDisjunctionRewriter; | ||
35 | import tools.refinery.viatra.runtime.matchers.psystem.rewriters.PDisjunctionRewriterCacher; | ||
36 | import tools.refinery.viatra.runtime.matchers.psystem.rewriters.PQueryFlattener; | ||
37 | |||
38 | /** | ||
39 | * | ||
40 | * @author Marton Bur | ||
41 | * @noreference This class is not intended to be referenced by clients. | ||
42 | */ | ||
43 | public class LocalSearchPlanner implements ILocalSearchPlanner { | ||
44 | |||
45 | // Externally set tools for planning | ||
46 | private final PDisjunctionRewriter preprocessor; | ||
47 | private final LocalSearchRuntimeBasedStrategy plannerStrategy; | ||
48 | private final IQueryRuntimeContext runtimeContext; | ||
49 | private final LocalSearchHints configuration; | ||
50 | private final IOperationCompiler operationCompiler; | ||
51 | private final IQueryBackendContext context; | ||
52 | private final ResultProviderRequestor resultRequestor; | ||
53 | |||
54 | /** | ||
55 | * @param resultRequestor | ||
56 | * @since 1.7 | ||
57 | */ | ||
58 | public LocalSearchPlanner(IQueryBackendContext backendContext, IOperationCompiler compiler, Logger logger, | ||
59 | final LocalSearchHints configuration, ResultProviderRequestor resultRequestor) | ||
60 | { | ||
61 | |||
62 | this.runtimeContext = backendContext.getRuntimeContext(); | ||
63 | this.configuration = configuration; | ||
64 | this.operationCompiler = compiler; | ||
65 | this.resultRequestor = resultRequestor; | ||
66 | PQueryFlattener flattener = new PQueryFlattener(configuration.getFlattenCallPredicate()); | ||
67 | /* | ||
68 | * TODO https://bugs.eclipse.org/bugs/show_bug.cgi?id=439358: The normalizer is initialized with the false | ||
69 | * parameter to turn off unary constraint elimination to work around an issue related to plan ordering: the | ||
70 | * current implementation of the feature target checking operations expect that the source types were checked | ||
71 | * before. However, this causes duplicate constraint checks in the search plan that might affect performance | ||
72 | * negatively. | ||
73 | */ | ||
74 | PBodyNormalizer normalizer = new PBodyNormalizer(runtimeContext.getMetaContext()) { | ||
75 | |||
76 | @Override | ||
77 | protected boolean shouldCalculateImpliedTypes(PQuery query) { | ||
78 | return false; | ||
79 | } | ||
80 | }; | ||
81 | preprocessor = new PDisjunctionRewriterCacher(flattener, normalizer); | ||
82 | |||
83 | plannerStrategy = new LocalSearchRuntimeBasedStrategy(); | ||
84 | |||
85 | context = backendContext; | ||
86 | } | ||
87 | |||
88 | /** | ||
89 | * Creates executable plans for the provided query. It is required to call one of the | ||
90 | * <code>initializePlanner()</code> methods before calling this method. | ||
91 | * | ||
92 | * @param querySpec | ||
93 | * @param boundParameters | ||
94 | * a set of bound parameters | ||
95 | * @return a mapping between ISearchOperation list and a mapping, that holds a PVariable-Integer mapping for the | ||
96 | * list of ISearchOperations | ||
97 | */ | ||
98 | @Override | ||
99 | public Collection<SearchPlanForBody> plan(PQuery querySpec, Set<PParameter> boundParameters) { | ||
100 | // 1. Preparation | ||
101 | preprocessor.setTraceCollector(configuration.getTraceCollector()); | ||
102 | Set<PBody> normalizedBodies = preprocessor.rewrite(querySpec.getDisjunctBodies()).getBodies(); | ||
103 | |||
104 | List<SearchPlanForBody> plansForBodies = new ArrayList<>(normalizedBodies.size()); | ||
105 | |||
106 | for (PBody normalizedBody : normalizedBodies) { | ||
107 | // 2. Plan creation | ||
108 | // Context has matchers for the referred Queries (IQuerySpecifications) | ||
109 | Set<PVariable> boundVariables = calculatePatternAdornmentForPlanner(boundParameters, normalizedBody); | ||
110 | PlanState searchPlanInternal = plannerStrategy.plan(normalizedBody, boundVariables, context, resultRequestor, configuration); | ||
111 | SubPlan plan = plannerStrategy.convertPlan(boundVariables, searchPlanInternal); | ||
112 | // 3. PConstraint -> POperation compilation step | ||
113 | // * Pay extra caution to extend operations, when more than one variables are unbound | ||
114 | List<ISearchOperation> compiledOperations = operationCompiler.compile(plan, boundParameters); | ||
115 | // Store the variable mappings for the plans for debug purposes (traceability information) | ||
116 | SearchPlanForBody compiledPlan = new SearchPlanForBody(normalizedBody, | ||
117 | operationCompiler.getVariableMappings(), plan, compiledOperations, | ||
118 | operationCompiler.getDependencies(), | ||
119 | searchPlanInternal, searchPlanInternal.getCost()); | ||
120 | |||
121 | plansForBodies.add(compiledPlan); | ||
122 | } | ||
123 | |||
124 | return plansForBodies; | ||
125 | } | ||
126 | |||
127 | private Set<PVariable> calculatePatternAdornmentForPlanner(Set<PParameter> boundParameters, PBody normalizedBody) { | ||
128 | Map<PParameter, PVariable> parameterMapping = new HashMap<>(); | ||
129 | for (ExportedParameter constraint : normalizedBody.getSymbolicParameters()) { | ||
130 | parameterMapping.put(constraint.getPatternParameter(), constraint.getParameterVariable()); | ||
131 | } | ||
132 | Set<PVariable> boundVariables = new HashSet<>(); | ||
133 | for (PParameter parameter : boundParameters) { | ||
134 | PVariable mappedParameter = parameterMapping.get(parameter); | ||
135 | boundVariables.add(mappedParameter); | ||
136 | } | ||
137 | return boundVariables; | ||
138 | } | ||
139 | |||
140 | } | ||