diff options
author | 2019-07-10 10:56:00 -0400 | |
---|---|---|
committer | 2019-07-10 10:56:00 -0400 | |
commit | 991dacefdb8f78fccc359d3d2ec836dc2e7fc80a (patch) | |
tree | 6b18aa59c5f711a845aa9e3e5cf3fd3632ad7a33 /Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph | |
parent | add sample domain for measuring realistic metrics (diff) | |
download | VIATRA-Generator-991dacefdb8f78fccc359d3d2ec836dc2e7fc80a.tar.gz VIATRA-Generator-991dacefdb8f78fccc359d3d2ec836dc2e7fc80a.tar.zst VIATRA-Generator-991dacefdb8f78fccc359d3d2ec836dc2e7fc80a.zip |
measurements for the different violation types, comparison for differenct generation config
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph')
4 files changed, 69 insertions, 31 deletions
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend index 5c161f4b..b4c57bd8 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend | |||
@@ -2,13 +2,14 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph | |||
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric |
4 | import java.util.ArrayList | 4 | import java.util.ArrayList |
5 | import java.util.HashSet | ||
5 | import java.util.List | 6 | import java.util.List |
6 | import org.eclipse.emf.common.util.EList | 7 | import org.eclipse.emf.common.util.EList |
7 | import org.eclipse.emf.ecore.EObject | 8 | import org.eclipse.emf.ecore.EObject |
8 | import org.eclipse.emf.ecore.EReference | 9 | import org.eclipse.emf.ecore.EReference |
9 | 10 | ||
10 | class EMFGraph extends Graph{ | 11 | class EMFGraph extends Graph{ |
11 | def void init (EObject root, List<Metric> metrics, String name, List<String> referenceTypes){ | 12 | def void init (EObject root, List<Metric> metrics, String name, List<EReference> referenceTypes){ |
12 | val otherContents = root.eAllContents.toList(); | 13 | val otherContents = root.eAllContents.toList(); |
13 | otherContents.add(root); | 14 | otherContents.add(root); |
14 | init(otherContents, metrics, name, referenceTypes); | 15 | init(otherContents, metrics, name, referenceTypes); |
@@ -21,13 +22,15 @@ class EMFGraph extends Graph{ | |||
21 | * @param name: name of the instance model | 22 | * @param name: name of the instance model |
22 | * @param ReferenceTypes: reference types defined in the meta model | 23 | * @param ReferenceTypes: reference types defined in the meta model |
23 | */ | 24 | */ |
24 | def void init(List<EObject> objects, List<Metric> metrics, String name, List<String> referenceTypes){ | 25 | def void init(List<EObject> objects, List<Metric> metrics, String name, List<EReference> referenceTypes){ |
25 | objects.forEach[it| | 26 | objects.forEach[it| |
26 | statistic.addNode(it); | 27 | var types = new HashSet(it.eClass.EAllSuperTypes.map[it|it.name]); |
28 | types.add(it.eClass.name); | ||
29 | statistic.addNodeWithAllTypes(it, types); | ||
27 | ] | 30 | ] |
28 | 31 | ||
29 | referenceTypes.forEach[it| | 32 | referenceTypes.forEach[it| |
30 | statistic.addType(it); | 33 | statistic.addEdgeType(it.name); |
31 | ]; | 34 | ]; |
32 | 35 | ||
33 | objects.forEach[source| | 36 | objects.forEach[source| |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/Graph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/Graph.xtend index cf4aedba..6b400b0d 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/Graph.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/Graph.xtend | |||
@@ -2,11 +2,15 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph | |||
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric |
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | 4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup |
5 | import java.util.ArrayList | ||
6 | import java.util.List | ||
7 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric | 5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric |
8 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric | 6 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric |
9 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric | 7 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric |
8 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedOutDegree | ||
9 | import java.util.ArrayList | ||
10 | import java.util.HashMap | ||
11 | import java.util.List | ||
12 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric | ||
13 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.EdgeTypeMetric | ||
10 | 14 | ||
11 | abstract class Graph { | 15 | abstract class Graph { |
12 | 16 | ||
@@ -42,11 +46,17 @@ abstract class Graph { | |||
42 | 46 | ||
43 | for(metric : this.metrics){ | 47 | for(metric : this.metrics){ |
44 | if(metric instanceof MultiplexParticipationCoefficientMetric){ | 48 | if(metric instanceof MultiplexParticipationCoefficientMetric){ |
45 | sample.mpcSamples = metric.evaluateSamples(this.statistic); | 49 | sample.mpcSamples = metric.evaluateSamples(this.statistic) as ArrayList<Double>; |
46 | }else if(metric instanceof NodeActivityMetric){ | 50 | }else if(metric instanceof NodeActivityMetric){ |
47 | sample.naSamples = metric.evaluateSamples(this.statistic); | 51 | sample.naSamples = metric.evaluateSamples(this.statistic) as ArrayList<Double>; |
48 | }else if(metric instanceof OutDegreeMetric){ | 52 | }else if(metric instanceof OutDegreeMetric){ |
49 | sample.outDegreeSamples = metric.evaluateSamples(this.statistic); | 53 | sample.outDegreeSamples = metric.evaluateSamples(this.statistic) as ArrayList<Double>; |
54 | }else if(metric instanceof TypedOutDegree){ | ||
55 | sample.typedOutDegreeSamples = metric.evaluateSamples(this.statistic) as HashMap<String, List<Integer>>; | ||
56 | }else if(metric instanceof NodeTypeMetric){ | ||
57 | sample.nodeTypeSamples = metric.evaluateSamples(this.statistic) as HashMap<String, Double>; | ||
58 | }else if (metric instanceof EdgeTypeMetric){ | ||
59 | sample.edgeTypeSamples = metric.evaluateSamples(this.statistic) as HashMap<String, Double>; | ||
50 | } | 60 | } |
51 | } | 61 | } |
52 | 62 | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend index 7ed58094..9b8fd0e3 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend | |||
@@ -5,20 +5,22 @@ import com.google.common.collect.Multimap | |||
5 | import java.util.HashMap | 5 | import java.util.HashMap |
6 | import java.util.HashSet | 6 | import java.util.HashSet |
7 | import java.util.List | 7 | import java.util.List |
8 | import java.util.Map | ||
9 | import java.util.Set | ||
8 | import org.eclipse.emf.ecore.EObject | 10 | import org.eclipse.emf.ecore.EObject |
9 | 11 | ||
10 | class GraphStatistic { | 12 | class GraphStatistic { |
11 | val incomingEdges = new HashMap<String, Multimap<EObject, EObject>>; | 13 | val incomingEdges = new HashMap<String, Multimap<EObject, EObject>>; |
12 | val outcomingEdges = new HashMap<String, Multimap<EObject, EObject>>; | 14 | val outcomingEdges = new HashMap<String, Multimap<EObject, EObject>>; |
13 | 15 | ||
14 | val edgeTypes = new HashSet<String>(); | 16 | val edgeTypes = new HashSet<String>(); |
15 | val nodes = new HashSet<EObject>(); | 17 | val nodeToType = new HashMap<EObject, Set<String>>(); |
16 | 18 | ||
17 | /** | 19 | /** |
18 | * Add an edge type to to the graph | 20 | * Add an edge type to to the graph |
19 | * @param type: type to add | 21 | * @param type: type to add |
20 | */ | 22 | */ |
21 | def void addType(String type){ | 23 | def void addEdgeType(String type){ |
22 | if(edgeTypes.contains(type)){ | 24 | if(edgeTypes.contains(type)){ |
23 | return; | 25 | return; |
24 | } | 26 | } |
@@ -28,15 +30,20 @@ class GraphStatistic { | |||
28 | } | 30 | } |
29 | 31 | ||
30 | /** | 32 | /** |
31 | * Add a node to he graph | 33 | * Add a node to the graph with one type in its type hierarchy |
32 | * @param node: node to add | 34 | * @param node: node to add |
33 | */ | 35 | */ |
34 | def void addNode(EObject n){ | 36 | def void addNodeWithType(EObject n, String Type){ |
35 | if(nodes.contains(n)){ | 37 | var types = nodeToType.getOrDefault(n, new HashSet<String>()); |
36 | return; | 38 | types.add(Type); |
37 | } | 39 | nodeToType.put(n, types); |
38 | 40 | } | |
39 | nodes.add(n); | 41 | |
42 | /** | ||
43 | * Add a node to the graph with all types in its type hierarchy | ||
44 | */ | ||
45 | def void addNodeWithAllTypes(EObject n, Set<String> types){ | ||
46 | nodeToType.put(n, types); | ||
40 | } | 47 | } |
41 | 48 | ||
42 | /** | 49 | /** |
@@ -82,7 +89,7 @@ class GraphStatistic { | |||
82 | } | 89 | } |
83 | 90 | ||
84 | /** | 91 | /** |
85 | * calculate the number of edge types for a given degree. | 92 | * calculate the number of edge types for a given node. |
86 | */ | 93 | */ |
87 | def int numOfEdgeTypes(EObject o){ | 94 | def int numOfEdgeTypes(EObject o){ |
88 | var count = 0; | 95 | var count = 0; |
@@ -100,8 +107,17 @@ class GraphStatistic { | |||
100 | return edgeTypes.toList(); | 107 | return edgeTypes.toList(); |
101 | } | 108 | } |
102 | 109 | ||
110 | def Map<EObject, Set<String>> getNodeToTypesMap(){ | ||
111 | return nodeToType; | ||
112 | } | ||
113 | |||
103 | def List<EObject> getAllNodes(){ | 114 | def List<EObject> getAllNodes(){ |
104 | return nodes.toList(); | 115 | return nodeToType.keySet().toList(); |
105 | } | 116 | } |
117 | |||
118 | def HashMap<String, Multimap<EObject, EObject>> getOutgoingEdges(){ | ||
119 | return outcomingEdges; | ||
120 | } | ||
121 | |||
106 | } | 122 | } |
107 | 123 | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend index 14337ab0..91d7c5f9 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend | |||
@@ -4,11 +4,13 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric | |||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration | 4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration |
5 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink | 5 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink |
6 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | 6 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation |
7 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.BooleanElementImpl | 7 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialComplexTypeInterpretationImpl |
8 | import java.util.ArrayList | 8 | import java.util.ArrayList |
9 | import java.util.List | 9 | import java.util.List |
10 | 10 | ||
11 | class PartialInterpretationGraph extends Graph{ | 11 | class PartialInterpretationGraph extends Graph{ |
12 | val typeToExclude = "undefinedpart"; | ||
13 | val classSuffix = " class"; | ||
12 | 14 | ||
13 | /** | 15 | /** |
14 | * Define a new PartialInterpretationGraph by parse every element from a PartialInterpretation | 16 | * Define a new PartialInterpretationGraph by parse every element from a PartialInterpretation |
@@ -16,17 +18,21 @@ class PartialInterpretationGraph extends Graph{ | |||
16 | new(PartialInterpretation partial, List<Metric> metrics, String name){ | 18 | new(PartialInterpretation partial, List<Metric> metrics, String name){ |
17 | //the edge types are defined in terms of RelationDeclaration | 19 | //the edge types are defined in terms of RelationDeclaration |
18 | partial.problem.relations.filter(RelationDeclaration).forEach[ | 20 | partial.problem.relations.filter(RelationDeclaration).forEach[ |
19 | this.statistic.addType(it.name); | 21 | //only need the name of the reference type (remove everything with and after "reference") |
22 | this.statistic.addEdgeType(it.name.split(" ").get(0)); | ||
20 | ] | 23 | ] |
21 | // add all elements | 24 | // add all elements |
22 | val elements = getElements(partial); | 25 | val typeInterpretations = getTypes(partial); |
23 | for(element : elements){ | 26 | for(type : typeInterpretations){ |
24 | statistic.addNode(element) | 27 | var typeName = type.interpretationOf.name.replace(classSuffix, ''); |
28 | for(node : type.elements){ | ||
29 | this.statistic.addNodeWithType(node, typeName); | ||
30 | } | ||
25 | } | 31 | } |
26 | 32 | ||
27 | for(relationInterpretation : partial.partialrelationinterpretation) { | 33 | for(relationInterpretation : partial.partialrelationinterpretation) { |
28 | val type = relationInterpretation.interpretationOf.name | 34 | //only need the name of the reference type (remove everything with and after "reference") |
29 | 35 | val type = relationInterpretation.interpretationOf.name.split(" ").get(0); | |
30 | for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ | 36 | for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ |
31 | statistic.addEdge(edge.param1, edge.param2, type); | 37 | statistic.addEdge(edge.param1, edge.param2, type); |
32 | } | 38 | } |
@@ -62,8 +68,11 @@ class PartialInterpretationGraph extends Graph{ | |||
62 | output.add(stateInfo); | 68 | output.add(stateInfo); |
63 | } | 69 | } |
64 | 70 | ||
65 | private def getElements(PartialInterpretation partial){ | 71 | private def getTypes(PartialInterpretation partial){ |
66 | return partial.newElements.filter[!(it instanceof BooleanElementImpl)] + partial.problem.elements; | 72 | //only the complex type interpretations are the ones defined in meta model |
73 | //do not care about undefined types as it will be included in the class type | ||
74 | return partial.partialtypeinterpratation.filter(PartialComplexTypeInterpretationImpl) | ||
75 | .filter[!it.interpretationOf.name.toLowerCase.contains(typeToExclude)]; | ||
67 | } | 76 | } |
68 | 77 | ||
69 | override getStatistic() { | 78 | override getStatistic() { |