aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend206
1 files changed, 206 insertions, 0 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend
new file mode 100644
index 00000000..5fb85b0c
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend
@@ -0,0 +1,206 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.statecoder
2
3import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.neighbourhood.AbstractNodeDescriptor
4import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.neighbourhood.PartialInterpretation2ImmutableTypeLattice
5import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
6import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage
7import java.util.ArrayList
8import java.util.LinkedList
9import java.util.List
10import java.util.Map
11import org.eclipse.emf.common.notify.Notifier
12import org.eclipse.emf.ecore.EClass
13import org.eclipse.emf.ecore.EObject
14import org.eclipse.emf.ecore.EStructuralFeature
15import org.eclipse.viatra.dse.statecode.IStateCoder
16import org.eclipse.viatra.dse.statecode.IStateCoderFactory
17import org.eclipse.viatra.query.runtime.api.IPatternMatch
18import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine
19import org.eclipse.viatra.query.runtime.base.api.FeatureListener
20import org.eclipse.viatra.query.runtime.base.api.IndexingLevel
21import org.eclipse.viatra.query.runtime.base.api.InstanceListener
22import org.eclipse.viatra.query.runtime.emf.EMFBaseIndexWrapper
23import org.eclipse.viatra.query.runtime.emf.EMFScope
24import org.eclipse.xtend.lib.annotations.Accessors
25import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
26import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
27import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation
28import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialRelationInterpretation
29import java.util.Set
30import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration
31import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
32import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.neighbourhood.PartialInterpretation2NeighbourhoodRepresentation
33
34class NeighbourhoodBasedStateCoderFactory implements IStateCoderFactory {
35 val List<NeighbourhoodBasedPartialInterpretationStateCoder> statecoders = new LinkedList
36
37 val int range
38 val int parallels
39 val int maxNumber
40 val Set<TypeDeclaration> relevantTypes
41 val Set<RelationDeclaration> relevantRelations
42
43 public new() {
44 this.range = PartialInterpretation2NeighbourhoodRepresentation::FixPointRage
45 this.parallels = PartialInterpretation2NeighbourhoodRepresentation::FullParallels
46 this.maxNumber = PartialInterpretation2NeighbourhoodRepresentation::MaxNumbers
47 this.relevantTypes = null
48 this.relevantRelations = null
49 }
50
51 public new(int range, int parallels, int maxNumber, Set<TypeDeclaration> relevantTypes, Set<RelationDeclaration> relevantRelations) {
52 this.range = range
53 this.parallels = parallels
54 this.maxNumber = maxNumber
55 this.relevantTypes = relevantTypes
56 this.relevantRelations = relevantRelations
57 }
58
59 synchronized override createStateCoder() {
60 val res = new NeighbourhoodBasedPartialInterpretationStateCoder(statecoders.size,
61 range,parallels,maxNumber,relevantTypes,relevantRelations)
62 statecoders += res
63 return res
64 }
65 def getSumStatecoderRuntime() {
66 statecoders.map[statecoderRuntime].reduce[p1, p2|p1+p2]
67 }
68}
69
70class NeighbourhoodBasedPartialInterpretationStateCoder implements IStateCoder{
71 val int id;
72 val int range
73 val int parallels
74 val int maxNumber
75 val Set<TypeDeclaration> relevantTypes
76 val Set<RelationDeclaration> relevantRelations
77
78 val calculator =
79 new PartialInterpretation2ImmutableTypeLattice
80 var PartialInterpretation target
81
82 private var Map<DefinedElement, ? extends AbstractNodeDescriptor> nodeRepresentations = null
83 private var Map<? extends AbstractNodeDescriptor, Integer> modelRepresentation = null
84
85 /*public new(int id) {
86 this.id = id
87 this.range = PartialInterpretation2NeighbourhoodRepresentation::FixPointRage
88 this.parallels = PartialInterpretation2NeighbourhoodRepresentation::FullParallels
89 this.maxNumber = maxNumber = PartialInterpretation2NeighbourhoodRepresentation::MaxNumbers
90 this.relevantTypes = relevantTypes
91 this.relevantRelations = relevantRelations
92 }*/
93
94 public new(int id, int range, int parallels, int maxNumber, Set<TypeDeclaration> relevantTypes, Set<RelationDeclaration> relevantRelations) {
95 this.id = id
96 this.range = range
97 this.parallels = parallels
98 this.maxNumber = maxNumber
99 this.relevantTypes = relevantTypes
100 this.relevantRelations = relevantRelations
101 }
102
103 @Accessors(PUBLIC_GETTER) var long statecoderRuntime = 0
104
105// val range = -1
106// val par = Integer.MAX_VALUE
107 //val deeprepresentation = false
108
109 /////////
110 // Caching version
111 /////////
112 synchronized private def refreshStateCodes() {
113 if(this.nodeRepresentations === null || this.modelRepresentation === null) {
114 val startTime = System.nanoTime
115 //relevantObjects.forEach[println(it)]
116 val code = calculator.createRepresentation(target,range,parallels,maxNumber,relevantTypes,relevantRelations)
117 this.modelRepresentation = code.modelRepresentation
118 this.nodeRepresentations = code.nodeRepresentations
119 statecoderRuntime += (System.nanoTime - startTime)
120 }
121 }
122 synchronized override createActivationCode(IPatternMatch match) {
123 refreshStateCodes
124
125 val startTime = System.nanoTime
126 val size = match.specification.parameters.size
127 val res = new ArrayList(size)
128 var int index = 0
129 while(index < size) {
130 res.add(getCode(match.get(index)))
131 index++
132 }
133 statecoderRuntime += (System.nanoTime - startTime)
134 return match.specification.fullyQualifiedName->res.hashCode
135 }
136
137 def private getCode(Object o) {
138 if(o instanceof DefinedElement) {
139 this.nodeRepresentations.get(o)
140 } else if(o instanceof PartialInterpretation || o instanceof LogicProblem) {
141 return null
142 } else if(o instanceof PartialRelationInterpretation) {
143 return o.interpretationOf.name
144 } else if(o instanceof PartialTypeInterpratation) {
145 return o.interpretationOf.name
146 } else {
147 throw new UnsupportedOperationException('''Unsupported type: «o.class.simpleName»''')
148 }
149 }
150
151 synchronized override createStateCode() {
152 refreshStateCodes
153 return this.modelRepresentation.hashCode
154 }
155 /////////
156 // Caching version
157 /////////
158
159 /////////
160 // Recalculating version
161 /////////
162// synchronized override createActivationCode(IPatternMatch match) {
163// val nodes = calculator.createRepresentation(getRelevantObjects().toList,range,par).nodeRepresentations
164// val res = match.toArray.map[objectInMatch |
165// nodes.get(objectInMatch)
166// ]
167// return res
168// }
169//
170// override createStateCode() {
171// return this.calculator.createRepresentation(getRelevantObjects().toList,range,par).modelRepresentation
172// }
173 /////////
174 // Recalculating version
175 /////////
176
177 override init(Notifier notifier) {
178 this.target = notifier as PartialInterpretation
179 val queryEngine = ViatraQueryEngine.on(new EMFScope(notifier))
180 val baseIndex = queryEngine.getBaseIndex() as EMFBaseIndexWrapper
181 val navigationHelper = baseIndex.getNavigationHelper();
182
183 val classes = PartialinterpretationPackage.eINSTANCE.EClassifiers.filter(EClass).toSet
184 val features = classes.map[it.EAllStructuralFeatures].flatten.toSet
185 navigationHelper.registerObservedTypes(
186 classes,
187 null,
188 features,
189 IndexingLevel.FULL);
190
191
192 navigationHelper.addFeatureListener(features, new FeatureListener() {
193 override public void featureInserted(EObject host, EStructuralFeature feature, Object value) { invalidate }
194 override public void featureDeleted(EObject host, EStructuralFeature feature, Object value) { invalidate }
195 });
196 navigationHelper.addInstanceListener(classes, new InstanceListener() {
197 override public void instanceInserted(EClass clazz, EObject instance) { invalidate }
198 override public void instanceDeleted(EClass clazz, EObject instance) { invalidate }
199 });
200 }
201
202 synchronized def public invalidate() {
203 this.nodeRepresentations = null
204 this.modelRepresentation = null
205 }
206}