aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Rebus Farkas <rebus.detenyleg@gmail.com>2018-08-28 14:21:57 +0200
committerLibravatar Rebus Farkas <rebus.detenyleg@gmail.com>2018-08-28 14:21:57 +0200
commit7b5bc7ef4c842b1f365b53b526e78083bb85a9c3 (patch)
tree41647dabc7ebe7e1e42fefcf964b665b312ce787
parentFix SolutionStoreWithDiversityDescriptor (diff)
downloadVIATRA-Generator-7b5bc7ef4c842b1f365b53b526e78083bb85a9c3.tar.gz
VIATRA-Generator-7b5bc7ef4c842b1f365b53b526e78083bb85a9c3.tar.zst
VIATRA-Generator-7b5bc7ef4c842b1f365b53b526e78083bb85a9c3.zip
Add patterns to shape
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend19
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/FurtherNodeDescriptorWithEquivalenceCounter.xtend6
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend53
3 files changed, 48 insertions, 30 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend
index 2e8f61a9..f9cf2986 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend
@@ -5,6 +5,7 @@ import java.util.Map
5import java.util.Set 5import java.util.Set
6import org.eclipse.xtend.lib.annotations.Data 6import org.eclipse.xtend.lib.annotations.Data
7import java.util.List 7import java.util.List
8import java.util.HashSet
8 9
9@Data abstract class AbstractNodeDescriptor { 10@Data abstract class AbstractNodeDescriptor {
10 long dataHash 11 long dataHash
@@ -25,10 +26,11 @@ import java.util.List
25// } 26// }
26} 27}
27 28
28//TODO: Modify for patterns 29
29@Data class LocalNodeDescriptor extends AbstractNodeDescriptor{ 30@Data class LocalNodeDescriptor extends AbstractNodeDescriptor{
30 Set<String> types 31 Set<String> types
31 String id; 32 String id;
33
32 new(String id, Set<String> types) { 34 new(String id, Set<String> types) {
33 super(calcualteDataHash(id,types)) 35 super(calcualteDataHash(id,types))
34 this.types = types 36 this.types = types
@@ -89,8 +91,6 @@ import java.util.List
89// } 91// }
90} 92}
91 93
92//TODO: PatternRelation
93
94@Data class PatternRelation<NODESHAPE> { 94@Data class PatternRelation<NODESHAPE> {
95 String patternName 95 String patternName
96 int param 96 int param
@@ -107,28 +107,31 @@ import java.util.List
107 String type 107 String type
108} 108}
109 109
110//TODO: Modify for hypergraphs
111@Data class FurtherNodeDescriptor<NodeRep> extends AbstractNodeDescriptor{ 110@Data class FurtherNodeDescriptor<NodeRep> extends AbstractNodeDescriptor{
112 111
113 NodeRep previousRepresentation 112 NodeRep previousRepresentation
114 Map<IncomingRelation<NodeRep>,Integer> incomingEdges 113 Map<IncomingRelation<NodeRep>,Integer> incomingEdges
115 Map<OutgoingRelation<NodeRep>,Integer> outgoingEdges 114 Map<OutgoingRelation<NodeRep>,Integer> outgoingEdges
115 Set<PatternRelation<NodeRep>> patterns
116 116
117 new( 117 new(
118 NodeRep previousRepresentation, 118 NodeRep previousRepresentation,
119 Map<IncomingRelation<NodeRep>,Integer> incomingEdges, 119 Map<IncomingRelation<NodeRep>,Integer> incomingEdges,
120 Map<OutgoingRelation<NodeRep>,Integer> outgoingEdges) 120 Map<OutgoingRelation<NodeRep>,Integer> outgoingEdges,
121 Set<PatternRelation<NodeRep>> patterns)
121 { 122 {
122 super(calculateDataHash(previousRepresentation,incomingEdges,outgoingEdges)) 123 super(calculateDataHash(previousRepresentation,incomingEdges,outgoingEdges,patterns))
123 this.previousRepresentation = previousRepresentation 124 this.previousRepresentation = previousRepresentation
124 this.incomingEdges = new HashMap(incomingEdges) 125 this.incomingEdges = new HashMap(incomingEdges)
125 this.outgoingEdges = new HashMap(outgoingEdges) 126 this.outgoingEdges = new HashMap(outgoingEdges)
127 this.patterns=new HashSet(patterns)
126 } 128 }
127 129
128 static def private <NodeRep> int calculateDataHash( 130 static def private <NodeRep> int calculateDataHash(
129 NodeRep previousRepresentation, 131 NodeRep previousRepresentation,
130 Map<IncomingRelation<NodeRep>,Integer> incomingEdges, 132 Map<IncomingRelation<NodeRep>,Integer> incomingEdges,
131 Map<OutgoingRelation<NodeRep>,Integer> outgoingEdges) 133 Map<OutgoingRelation<NodeRep>,Integer> outgoingEdges,
134 Set<PatternRelation<NodeRep>> patterns)
132 { 135 {
133 val int prime = 31; 136 val int prime = 31;
134 var int result = previousRepresentation.hashCode; 137 var int result = previousRepresentation.hashCode;
@@ -136,6 +139,8 @@ import java.util.List
136 result = prime * result + incomingEdges.hashCode(); 139 result = prime * result + incomingEdges.hashCode();
137 if(outgoingEdges !== null) 140 if(outgoingEdges !== null)
138 result = prime * result + outgoingEdges.hashCode(); 141 result = prime * result + outgoingEdges.hashCode();
142 if (patterns !== null)
143 result = prime * result + patterns.hashCode();
139 return result; 144 return result;
140 } 145 }
141 146
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/FurtherNodeDescriptorWithEquivalenceCounter.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/FurtherNodeDescriptorWithEquivalenceCounter.xtend
index 22e890a2..28b936df 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/FurtherNodeDescriptorWithEquivalenceCounter.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/FurtherNodeDescriptorWithEquivalenceCounter.xtend
@@ -2,15 +2,17 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.ne
2 2
3import java.util.Map 3import java.util.Map
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement 4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
5import java.util.Set
5 6
6class FurtherNodeDescriptorWithEquivalenceCounter extends FurtherNodeDescriptor<AbstractNodeDescriptor> { 7class FurtherNodeDescriptorWithEquivalenceCounter extends FurtherNodeDescriptor<AbstractNodeDescriptor> {
7 8
8 new(AbstractNodeDescriptor previousRepresentation, 9 new(AbstractNodeDescriptor previousRepresentation,
9 Map<IncomingRelation<AbstractNodeDescriptor>, Integer> incomingEdges, 10 Map<IncomingRelation<AbstractNodeDescriptor>, Integer> incomingEdges,
10 Map<OutgoingRelation<AbstractNodeDescriptor>, Integer> outgoingEdges, 11 Map<OutgoingRelation<AbstractNodeDescriptor>, Integer> outgoingEdges,
11 Map<DefinedElement, FurtherNodeDescriptor<AbstractNodeDescriptor>> node2Representation) 12 Map<DefinedElement, FurtherNodeDescriptor<AbstractNodeDescriptor>> node2Representation,
13 Set<PatternRelation<AbstractNodeDescriptor>> patterns)
12 { 14 {
13 super(previousRepresentation, incomingEdges, outgoingEdges) 15 super(previousRepresentation, incomingEdges, outgoingEdges, patterns)
14 } 16 }
15 17
16} \ No newline at end of file 18} \ No newline at end of file
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend
index 1d26a413..e6bc5706 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend
@@ -99,7 +99,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
99 def Map<DefinedElement, List<PatternRelation<DefinedElement>>> createPatternRelations( 99 def Map<DefinedElement, List<PatternRelation<DefinedElement>>> createPatternRelations(
100 PartialInterpretation model, Set<ViatraQueryMatcher<? extends IPatternMatch>> relevantPatterns) { 100 PartialInterpretation model, Set<ViatraQueryMatcher<? extends IPatternMatch>> relevantPatterns) {
101 val Map<DefinedElement, List<PatternRelation<DefinedElement>>> result=new HashMap; 101 val Map<DefinedElement, List<PatternRelation<DefinedElement>>> result=new HashMap;
102 if (relevantPatterns==null) return result; 102 if (relevantPatterns===null) return result;
103 for (element : model.elements) { 103 for (element : model.elements) {
104 result.put(element,new LinkedList<PatternRelation<DefinedElement>>) 104 result.put(element,new LinkedList<PatternRelation<DefinedElement>>)
105 } 105 }
@@ -122,7 +122,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
122 } 122 }
123 var id=0; 123 var id=0;
124 for (DefinedElement e:sanitizedMatch) { 124 for (DefinedElement e:sanitizedMatch) {
125 if (e!=null) { 125 if (e!==null) {
126 result.get(e).add(new PatternRelation<DefinedElement>(name,id,sanitizedMatch)) 126 result.get(e).add(new PatternRelation<DefinedElement>(name,id,sanitizedMatch))
127 } 127 }
128 id++ 128 id++
@@ -132,13 +132,6 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
132 println('''Ignored params '''+ignoredParams+''' of pattern '''+ name) 132 println('''Ignored params '''+ignoredParams+''' of pattern '''+ name)
133 } 133 }
134 134
135 /*for(relevantPattern : relevantPatterns) {
136 * relevantPattern.allMatches.forEach[
137 * it.
138 * ]
139 }*/
140
141
142 return result; 135 return result;
143 136
144 } 137 }
@@ -222,7 +215,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
222 } else if (range > 0) { 215 } else if (range > 0) {
223 val previous = doRecursiveNeighbourCalculation(model, types, IncomingRelations, OutgoingRelations, PatternRelations, 216 val previous = doRecursiveNeighbourCalculation(model, types, IncomingRelations, OutgoingRelations, PatternRelations,
224 range - 1, parallels, maxNumber) 217 range - 1, parallels, maxNumber)
225 val r = calculateFurtherNodeDescriptors(model, previous, IncomingRelations, OutgoingRelations, 218 val r = calculateFurtherNodeDescriptors(model, previous, IncomingRelations, OutgoingRelations,PatternRelations,
226 parallels, maxNumber) 219 parallels, maxNumber)
227 // println('''Level «range» finished.''') 220 // println('''Level «range» finished.''')
228 val res = createFurtherRepresentation(r.key, r.value, previous, deepRepresentation) 221 val res = createFurtherRepresentation(r.key, r.value, previous, deepRepresentation)
@@ -235,7 +228,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
235 } else 228 } else
236 return res 229 return res
237 } else if (range == FixPointRage) { 230 } else if (range == FixPointRage) {
238 return refineUntilFixpoint(model, types, IncomingRelations, OutgoingRelations, parallels, maxNumber) 231 return refineUntilFixpoint(model, types, IncomingRelations, OutgoingRelations, PatternRelations, parallels, maxNumber)
239 } else if (range == GraphWidthRange) { 232 } else if (range == GraphWidthRange) {
240 val width = this.getWidth(types, IncomingRelations, OutgoingRelations) 233 val width = this.getWidth(types, IncomingRelations, OutgoingRelations)
241 // println(width) 234 // println(width)
@@ -246,7 +239,9 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
246 239
247 def private refineUntilFixpoint(PartialInterpretation model, Map<DefinedElement, Set<String>> types, 240 def private refineUntilFixpoint(PartialInterpretation model, Map<DefinedElement, Set<String>> types,
248 Map<DefinedElement, List<IncomingRelation<DefinedElement>>> IncomingRelations, 241 Map<DefinedElement, List<IncomingRelation<DefinedElement>>> IncomingRelations,
249 Map<DefinedElement, List<OutgoingRelation<DefinedElement>>> OutgoingRelations, int parallels, 242 Map<DefinedElement, List<OutgoingRelation<DefinedElement>>> OutgoingRelations,
243 Map<DefinedElement, List<PatternRelation<DefinedElement>>> PatternRelations,
244 int parallels,
250 int maxNumbers) { 245 int maxNumbers) {
251 var lastRange = 0 246 var lastRange = 0
252 val last = calculateLocalNodeDescriptors(model, types, maxNumbers) 247 val last = calculateLocalNodeDescriptors(model, types, maxNumbers)
@@ -256,7 +251,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
256 do { 251 do {
257 val nextRange = lastRange + 1 252 val nextRange = lastRange + 1
258 val next = calculateFurtherNodeDescriptors(model, lastRepresentation, IncomingRelations, 253 val next = calculateFurtherNodeDescriptors(model, lastRepresentation, IncomingRelations,
259 OutgoingRelations, parallels, maxNumbers) 254 OutgoingRelations, PatternRelations, parallels, maxNumbers)
260 val nextRepresentation = createFurtherRepresentation(next.key, next.value, lastRepresentation, 255 val nextRepresentation = createFurtherRepresentation(next.key, next.value, lastRepresentation,
261 deepRepresentation) 256 deepRepresentation)
262 257
@@ -286,9 +281,9 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
286 node2Type.put(element, new HashSet) 281 node2Type.put(element, new HashSet)
287 } 282 }
288 283
289// for(typeDefinition : model.problem.types.filter(TypeDefinition)) { 284 // for(typeDefinition : model.problem.types.filter(TypeDefinition)) {
290// // Dont need 285 // // Dont need
291// } 286 // }
292 for (typeInterpretation : model.partialtypeinterpratation) { 287 for (typeInterpretation : model.partialtypeinterpratation) {
293 if (typeInterpretation instanceof PartialPrimitiveInterpretation) { 288 if (typeInterpretation instanceof PartialPrimitiveInterpretation) {
294 } else if (typeInterpretation instanceof PartialComplexTypeInterpretation) { 289 } else if (typeInterpretation instanceof PartialComplexTypeInterpretation) {
@@ -328,7 +323,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
328 } 323 }
329 324
330 /** 325 /**
331 * Creates a local representation of the objects (aka zero range neighbourhood) 326 * Creates the representation of the initial shape (aka zero range neighbourhood)
332 */ 327 */
333 def abstract protected NeighbourhoodWithTraces<ModelRepresentation, NodeRepresentation> createLocalRepresentation( 328 def abstract protected NeighbourhoodWithTraces<ModelRepresentation, NodeRepresentation> createLocalRepresentation(
334 Map<DefinedElement, LocalNodeDescriptor> node2Representation, 329 Map<DefinedElement, LocalNodeDescriptor> node2Representation,
@@ -336,7 +331,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
336 ) 331 )
337 332
338 /** 333 /**
339 * Creates a 334 * Creates the representation of a shape (aka neighbourhood) with positive range
340 */ 335 */
341 def abstract protected NeighbourhoodWithTraces<ModelRepresentation, NodeRepresentation> createFurtherRepresentation( 336 def abstract protected NeighbourhoodWithTraces<ModelRepresentation, NodeRepresentation> createFurtherRepresentation(
342 Map<FurtherNodeDescriptor<NodeRepresentation>, Integer> nodeDescriptors, 337 Map<FurtherNodeDescriptor<NodeRepresentation>, Integer> nodeDescriptors,
@@ -383,6 +378,19 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
383 } 378 }
384 return res; 379 return res;
385 } 380 }
381
382 private def calculatePatterns(Map<DefinedElement, List<PatternRelation<DefinedElement>>> PatternRelations,
383 DefinedElement object,
384 Map<DefinedElement, ? extends NodeRepresentation> previousNodeRepresentations) {
385 val res = new HashSet<PatternRelation<NodeRepresentation>>()
386
387 for (patternRelation : PatternRelations.get(object)) {
388 val matchshape=patternRelation.parameters.map[previousNodeRepresentations.getOrDefault(it,null)]
389 res.add(new PatternRelation<NodeRepresentation>(patternRelation.patternName,patternRelation.param,matchshape))
390 }
391
392 return res
393 }
386 394
387 /*def private <KEY,VALUE> void addOrCreate_Set(Map<KEY,Set<VALUE>> map, KEY key, VALUE value) { 395 /*def private <KEY,VALUE> void addOrCreate_Set(Map<KEY,Set<VALUE>> map, KEY key, VALUE value) {
388 * var Set<VALUE> s; 396 * var Set<VALUE> s;
@@ -397,7 +405,9 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
397 private def calculateFurtherNodeDescriptors(PartialInterpretation model, 405 private def calculateFurtherNodeDescriptors(PartialInterpretation model,
398 NeighbourhoodWithTraces<ModelRepresentation, NodeRepresentation> previous, 406 NeighbourhoodWithTraces<ModelRepresentation, NodeRepresentation> previous,
399 Map<DefinedElement, List<IncomingRelation<DefinedElement>>> IncomingRelations, 407 Map<DefinedElement, List<IncomingRelation<DefinedElement>>> IncomingRelations,
400 Map<DefinedElement, List<OutgoingRelation<DefinedElement>>> OutgoingRelations, int parallels, 408 Map<DefinedElement, List<OutgoingRelation<DefinedElement>>> OutgoingRelations,
409 Map<DefinedElement, List<PatternRelation<DefinedElement>>> PatternRelations,
410 int parallels,
401 int maxNumber) { 411 int maxNumber) {
402 val previousNodeRepresentations = previous.nodeRepresentations 412 val previousNodeRepresentations = previous.nodeRepresentations
403 val node2Representation = new HashMap<DefinedElement, FurtherNodeDescriptor<NodeRepresentation>> 413 val node2Representation = new HashMap<DefinedElement, FurtherNodeDescriptor<NodeRepresentation>>
@@ -419,14 +429,15 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation<ModelRepresenta
419 previousNodeRepresentations, parallels) 429 previousNodeRepresentations, parallels)
420 val outgoingEdges = this.calcuateOutgoingEdges(OutgoingRelations, object, 430 val outgoingEdges = this.calcuateOutgoingEdges(OutgoingRelations, object,
421 previousNodeRepresentations, parallels) 431 previousNodeRepresentations, parallels)
422 // TODO: patternDescriptors 432 val patterns = this.calculatePatterns(PatternRelations, object, previousNodeRepresentations)
433
423 val previousType = previousNodeRepresentations.get(object) 434 val previousType = previousNodeRepresentations.get(object)
424 435
425 if (previousType === null) { 436 if (previousType === null) {
426 println("Error in state coder") 437 println("Error in state coder")
427 } 438 }
428 439
429 val nodeDescriptor = new FurtherNodeDescriptor(previousType, incomingEdges, outgoingEdges) 440 val nodeDescriptor = new FurtherNodeDescriptor(previousType, incomingEdges, outgoingEdges, patterns)
430 441
431 if (this.mergeSimilarNeighbourhood) { 442 if (this.mergeSimilarNeighbourhood) {
432 if (descriptor2Number.containsKey(nodeDescriptor)) { 443 if (descriptor2Number.containsKey(nodeDescriptor)) {