diff options
author | OszkarSemerath <oszkar.semerath@gmail.com> | 2018-07-16 18:25:34 +0200 |
---|---|---|
committer | OszkarSemerath <oszkar.semerath@gmail.com> | 2018-07-16 18:25:34 +0200 |
commit | 59a53fc819355fb2809b23544a5ca19ffff802fb (patch) | |
tree | e67cba5ca12cfbba7d2dc68e6c07fe36c996e3f2 /Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend | |
parent | Support for building float, double and BigDecimal literals (diff) | |
download | VIATRA-Generator-59a53fc819355fb2809b23544a5ca19ffff802fb.tar.gz VIATRA-Generator-59a53fc819355fb2809b23544a5ca19ffff802fb.tar.zst VIATRA-Generator-59a53fc819355fb2809b23544a5ca19ffff802fb.zip |
Scope support for attributes
Diffstat (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend')
-rw-r--r-- | Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend | 171 |
1 files changed, 146 insertions, 25 deletions
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend index ee1a92f0..9b2b4a3e 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend | |||
@@ -14,49 +14,172 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.StringTyp | |||
14 | import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic | 14 | import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic |
15 | import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace | 15 | import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace |
16 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.TypeScopes | 16 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.TypeScopes |
17 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | ||
18 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
19 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition | ||
17 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | 20 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem |
21 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partial2logicannotations.PartialModelRelation2Assertion | ||
22 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink | ||
23 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.IntegerElement | ||
24 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.NaryRelationLink | ||
25 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PrimitiveElement | ||
26 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.RealElement | ||
27 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.StringElement | ||
28 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.UnaryElementRelationLink | ||
29 | import java.math.BigDecimal | ||
30 | import java.util.HashMap | ||
31 | import java.util.LinkedList | ||
32 | import java.util.List | ||
33 | import java.util.Map | ||
34 | import java.util.Set | ||
18 | import org.eclipse.emf.ecore.EClass | 35 | import org.eclipse.emf.ecore.EClass |
36 | import org.eclipse.xtend.lib.annotations.Data | ||
37 | |||
38 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
39 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntLiteral | ||
40 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealLiteral | ||
41 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringLiteral | ||
42 | |||
43 | @Data class KnownElements { | ||
44 | val Map<Type,Set<DefinedElement>> knownElementsByType | ||
45 | val Set<Integer> knownIntegers | ||
46 | val Set<BigDecimal> knownReals | ||
47 | val Set<String> knownStrings | ||
48 | } | ||
19 | 49 | ||
20 | class ScopeLoader { | 50 | class ScopeLoader { |
21 | def TypeScopes loadScope(ScopeSpecification specification, LogicProblem problem, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { | 51 | def loadScope(ScopeSpecification specification, LogicProblem problem, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { |
22 | val res = new TypeScopes | 52 | val res = new TypeScopes |
53 | val knownElements = initialiseknownElements(problem,res) | ||
54 | val inconsistencies = new LinkedList<String>() | ||
55 | |||
23 | for(scopeSpecification : specification.scopes) { | 56 | for(scopeSpecification : specification.scopes) { |
24 | setSpecification(scopeSpecification,res,ecore2Logic,trace) | 57 | setSpecification(scopeSpecification,res,knownElements,ecore2Logic,trace,inconsistencies) |
25 | } | 58 | } |
26 | return res | 59 | |
60 | return res -> inconsistencies | ||
61 | } | ||
62 | |||
63 | def protected initialiseknownElements(LogicProblem p, TypeScopes s) { | ||
64 | val Map<Type,Set<DefinedElement>> res = new HashMap | ||
65 | for(definedType : p.types.filter(TypeDefinition)) { | ||
66 | val supertypes = definedType.<Type>transitiveClosureStar[x|x.supertypes] | ||
67 | for(supertype : supertypes) { | ||
68 | for(element : definedType.elements) { | ||
69 | res.putOrAddToSet(supertype,element) | ||
70 | } | ||
71 | } | ||
72 | } | ||
73 | val partailModelContents = p.annotations.filter(PartialModelRelation2Assertion).map[target].toList.map[eAllContents.toIterable].flatten.toList | ||
74 | s.knownIntegers += partailModelContents.filter(IntLiteral).map[it.value] | ||
75 | s.knownReals += partailModelContents.filter(RealLiteral).map[it.value] | ||
76 | s.knownStrings += partailModelContents.filter(StringLiteral).map[it.value] | ||
77 | |||
78 | res | ||
79 | } | ||
80 | |||
81 | def dispatch getElements(UnaryElementRelationLink link) { | ||
82 | #[link.param1] | ||
83 | } | ||
84 | def dispatch getElements(BinaryElementRelationLink link) { | ||
85 | #[link.param1,link.param2] | ||
86 | } | ||
87 | def dispatch getElements(NaryRelationLink link) { | ||
88 | link.elements | ||
27 | } | 89 | } |
28 | 90 | ||
29 | def dispatch setSpecification(ObjectTypeScope scope, TypeScopes aggregated, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { | 91 | def dispatch setSpecification(ObjectTypeScope scope, TypeScopes aggregated, Map<Type, Set<DefinedElement>> knownElements, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace, List<String> inconsistencies) { |
30 | //val existingObjects = | 92 | val numberOfKnownElements = knownElements.values.flatten.toSet.size |
31 | aggregated.minNewElements = getLowerLimit(scope.number) | 93 | |
32 | aggregated.maxNewElements = getUpperLimit(scope.number) | 94 | aggregated.minNewElements = updateLowerLimit(scope.isSetsNew,numberOfKnownElements,aggregated.minNewElements,getLowerLimit(scope.number)) |
95 | aggregated.maxNewElements = updateUpperLimit(scope.isSetsNew,numberOfKnownElements,aggregated.maxNewElements,getUpperLimit(scope.number)) | ||
33 | } | 96 | } |
34 | def dispatch setSpecification(ClassTypeScope scope, TypeScopes aggregated, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { | 97 | def dispatch setSpecification(ClassTypeScope scope, TypeScopes aggregated, Map<Type, Set<DefinedElement>> knownElements, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace, List<String> inconsistencies) { |
35 | val target = scope.type.element | 98 | val target = scope.type.element |
36 | if(target.feature != null) { | 99 | if(target.feature !== null) { |
37 | throw new IllegalArgumentException('''Feature scopes are not supported: "«target.feature.name»"!''') | 100 | throw new IllegalArgumentException('''Feature scopes are not supported: "«target.feature.name»"!''') |
38 | } else { | 101 | } else { |
39 | val targetClassifier = target.classifier | 102 | val targetClassifier = target.classifier |
40 | if(targetClassifier instanceof EClass) { | 103 | if(targetClassifier instanceof EClass) { |
41 | val type = ecore2Logic.TypeofEClass(trace,targetClassifier) | 104 | val type = ecore2Logic.TypeofEClass(trace,targetClassifier) |
42 | aggregated.minNewElementsByType.put(type,getLowerLimit(scope.number)) | 105 | val known = type.lookup(knownElements).size |
43 | aggregated.maxNewElementsByType.put(type,getUpperLimit(scope.number)) | 106 | aggregated.minNewElementsByType.put(type, |
107 | updateLowerLimit( | ||
108 | scope.setsNew, | ||
109 | known, | ||
110 | type.lookup(aggregated.minNewElementsByType), | ||
111 | getLowerLimit(scope.number) | ||
112 | ) | ||
113 | ) | ||
114 | aggregated.maxNewElementsByType.put(type, | ||
115 | updateUpperLimit( | ||
116 | scope.setsNew, | ||
117 | known, | ||
118 | type.lookup(aggregated.minNewElementsByType), | ||
119 | getUpperLimit(scope.number) | ||
120 | ) | ||
121 | ) | ||
44 | } else { | 122 | } else { |
45 | throw new IllegalArgumentException('''Non-EClass scopes are not supported: "«targetClassifier.name»"!''') | 123 | throw new IllegalArgumentException('''Non-EClass scopes are not supported: "«targetClassifier.name»"!''') |
46 | } | 124 | } |
47 | } | 125 | } |
48 | } | 126 | } |
49 | def dispatch setSpecification(IntegerTypeScope scope, TypeScopes aggregated, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { | 127 | def dispatch setSpecification(IntegerTypeScope scope, TypeScopes aggregated, Map<Type, Set<DefinedElement>> knownElements, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace, List<String> inconsistencies) { |
50 | aggregated.minNewIntegers = scope.number.lowerLimit | 128 | val number = scope.number |
51 | aggregated.maxNewIntegers = scope.number.upperLimit | 129 | if(number instanceof IntEnumberation) { |
130 | addToKnownCollection(aggregated.knownIntegers,number.entry,scope.isSetsNew,inconsistencies) | ||
131 | } else { | ||
132 | aggregated.minNewIntegers = updateLowerLimit(scope.isSetsNew,aggregated.knownIntegers.size,aggregated.minNewIntegers,number.lowerLimit) | ||
133 | aggregated.maxNewIntegers = updateLowerLimit(scope.isSetsNew,aggregated.knownIntegers.size,aggregated.maxNewIntegers,number.upperLimit) | ||
134 | } | ||
135 | } | ||
136 | |||
137 | def dispatch setSpecification(RealTypeScope scope, TypeScopes aggregated, Map<Type, Set<DefinedElement>> knownElements, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace, List<String> inconsistencies) { | ||
138 | val number = scope.number | ||
139 | if(number instanceof RealEnumeration) { | ||
140 | val x = number.entry; | ||
141 | <BigDecimal>addToKnownCollection(aggregated.knownReals,x,scope.isSetsNew,inconsistencies) | ||
142 | } else { | ||
143 | aggregated.minNewReals = updateLowerLimit(scope.isSetsNew,aggregated.knownReals.size,aggregated.minNewReals,number.lowerLimit) | ||
144 | aggregated.maxNewReals = updateLowerLimit(scope.isSetsNew,aggregated.knownReals.size,aggregated.maxNewReals,number.upperLimit) | ||
145 | } | ||
146 | } | ||
147 | def dispatch setSpecification(StringTypeScope scope, TypeScopes aggregated, Map<Type, Set<DefinedElement>> knownElements, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace, List<String> inconsistencies) { | ||
148 | val number = scope.number | ||
149 | if(number instanceof StringEnumeration) { | ||
150 | <String>addToKnownCollection(aggregated.knownStrings,number.entry,scope.isSetsNew,inconsistencies) | ||
151 | } else { | ||
152 | aggregated.minNewStrings = updateLowerLimit(scope.isSetsNew,aggregated.knownStrings.size,aggregated.minNewStrings,number.lowerLimit) | ||
153 | aggregated.maxNewStrings = updateLowerLimit(scope.isSetsNew,aggregated.knownStrings.size,aggregated.maxNewStrings,number.upperLimit) | ||
154 | } | ||
155 | } | ||
156 | def <Type> addToKnownCollection(Set<Type> known, List<Type> definedInScope, boolean isSetNew, List<String> inconsistencies) { | ||
157 | if(isSetNew) { | ||
158 | known += definedInScope | ||
159 | } else { | ||
160 | if(!definedInScope.containsAll(known)) { | ||
161 | val notDefinedInScope = known.filter[!definedInScope.contains(it)] | ||
162 | inconsistencies += '''Inconsistent scope: problem already contains literal«IF notDefinedInScope.size > 0»s«ENDIF» that excluded by a scope: «FOR e: notDefinedInScope SEPARATOR ", "»«e»«ENDFOR».''' | ||
163 | } | ||
164 | known.clear | ||
165 | known += definedInScope | ||
166 | } | ||
52 | } | 167 | } |
53 | def dispatch setSpecification(RealTypeScope scope, TypeScopes aggregated, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { | 168 | |
54 | aggregated.minNewReals = scope.number.lowerLimit | 169 | def updateLowerLimit(boolean isAdditional, int known, int original, int value) { |
55 | aggregated.maxNewReals = scope.number.upperLimit | 170 | if(isAdditional) { |
171 | return Math.max(original,value) | ||
172 | } else { | ||
173 | return Math.max(original,value-known) | ||
174 | } | ||
56 | } | 175 | } |
57 | def dispatch setSpecification(StringTypeScope scope, TypeScopes aggregated, Ecore2Logic ecore2Logic, Ecore2Logic_Trace trace) { | 176 | def updateUpperLimit(boolean isAdditional, int known, int original, int value) { |
58 | aggregated.minNewStrings = scope.number.lowerLimit | 177 | if(isAdditional) { |
59 | aggregated.maxNewStrings = scope.number.upperLimit | 178 | return Math.min(original,value) |
179 | } else { | ||
180 | val target = if(value == Integer.MAX_VALUE) { Integer.MAX_VALUE } else {value-known} | ||
181 | return Math.min(original,target) | ||
182 | } | ||
60 | } | 183 | } |
61 | 184 | ||
62 | def dispatch getLowerLimit(IntervallNumber specification) { | 185 | def dispatch getLowerLimit(IntervallNumber specification) { |
@@ -70,14 +193,12 @@ class ScopeLoader { | |||
70 | def dispatch getLowerLimit(RealEnumeration specification) { 0 } | 193 | def dispatch getLowerLimit(RealEnumeration specification) { 0 } |
71 | def dispatch getLowerLimit(StringEnumeration specification) { 0 } | 194 | def dispatch getLowerLimit(StringEnumeration specification) { 0 } |
72 | def dispatch getUpperLimit(IntervallNumber specification) { | 195 | def dispatch getUpperLimit(IntervallNumber specification) { |
73 | if(specification.isMaxUnlimited) return -1 | 196 | if(specification.isMaxUnlimited) return Integer.MAX_VALUE |
74 | else return specification.maxNumber | 197 | else return specification.maxNumber |
75 | } | 198 | } |
76 | def dispatch getUpperLimit(ExactNumber specification) { | 199 | def dispatch getUpperLimit(ExactNumber specification) { |
77 | if(specification.isExactUnlimited) return -1 | 200 | if(specification.isExactUnlimited) return Integer.MAX_VALUE |
78 | else return specification.exactNumber | 201 | else return specification.exactNumber |
79 | } | 202 | } |
80 | def dispatch getUpperLimit(IntEnumberation specification) { 0 } | 203 | |
81 | def dispatch getUpperLimit(RealEnumeration specification) { 0 } | ||
82 | def dispatch getUpperLimit(StringEnumeration specification) { 0 } | ||
83 | } \ No newline at end of file | 204 | } \ No newline at end of file |