aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator
diff options
context:
space:
mode:
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator')
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/EcoreMetricDistance.xtend44
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend21
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend11
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend7
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend24
5 files changed, 84 insertions, 23 deletions
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/EcoreMetricDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/EcoreMetricDistance.xtend
new file mode 100644
index 00000000..67bf14b4
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/EcoreMetricDistance.xtend
@@ -0,0 +1,44 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app
2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader
6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric
7import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
8import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric
9import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric
10import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric
11import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric
12import java.util.ArrayList
13import org.eclipse.emf.ecore.EObject
14
15class EcoreMetricDistance {
16 var KSDistance ks;
17 var MetricSampleGroup g;
18
19
20 new(Domain d){
21 var metrics = RepMetricsReader.read(d);
22 this.g = metrics;
23 ks = new KSDistance(g);
24 }
25
26 def MetricDistanceGroup calculateMetricDistanceKS(EObject root){
27 val metrics = new ArrayList<Metric>();
28 metrics.add(new OutDegreeMetric());
29 metrics.add(new NodeActivityMetric());
30 metrics.add(new MultiplexParticipationCoefficientMetric());
31 metrics.add(new NodeTypeMetric());
32 val metricCalculator = new EMFGraph();
33 metricCalculator.init(root, metrics, null);
34 var metricSamples = metricCalculator.evaluateAllMetricsToSamples();
35
36 var mpc = ks.mpcDistance(metricSamples.mpcSamples);
37 var na = ks.naDistance(metricSamples.naSamples);
38 var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples);
39 var nodeType = ks.nodeTypeDistance(metricSamples.nodeTypeSamples);
40 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType);
41 distance.nodeTypeInfo = metricSamples.nodeTypeSamples;
42 return distance;
43 }
44} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend
index 8d936a88..010e8f87 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend
@@ -12,17 +12,20 @@ import org.eclipse.emf.ecore.EcorePackage
12import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine 12import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine
13import org.eclipse.emf.ecore.impl.EcorePackageImpl 13import org.eclipse.emf.ecore.impl.EcorePackageImpl
14import org.eclipse.emf.ecore.EReference 14import org.eclipse.emf.ecore.EReference
15import github.impl.GithubPackageImpl
15 16
16//import yakindumm2.impl.Yakindumm2PackageImpl 17//import yakindumm2.impl.Yakindumm2PackageImpl
17 18
18class Main { 19class Main {
19 var static Domain d = Domain.Ecore; 20 var static Domain d = Domain.Github;
20 val static String suffix = '.xmi' 21 val static String suffix = '.xmi'
21 val static String OUTPUT_FOLDER = "Inputs/random/ecore/"; 22 val static String OUTPUT_FOLDER = "Inputs/Github/Alloy/";
22 val static String INPUT_FOLDER = "outputs/random/ecore/"; 23 val static String INPUT_FOLDER = "outputs/Github/Alloy/";
23 val static int NUM_RUNS = 1; 24 val static int NUM_RUNS = 1;
24 var static validFiles = 0; 25 var static validFiles = 0;
25 var static totalFiles = 0; 26 var static totalFiles = 0;
27 var static ViolationCheck checker;
28 var static EPackage metamodel;
26 29
27 static class RWInformation{ 30 static class RWInformation{
28 public var String inputFolder; 31 public var String inputFolder;
@@ -38,7 +41,6 @@ class Main {
38 41
39 def static void main(String[] args){ 42 def static void main(String[] args){
40 //init model 43 //init model
41 var EPackage metamodel;
42 //init viatra engine for the violation checker 44 //init viatra engine for the violation checker
43 ReteEngine.getClass(); 45 ReteEngine.getClass();
44 46
@@ -49,10 +51,10 @@ class Main {
49 EcorePackage.eINSTANCE.eClass; 51 EcorePackage.eINSTANCE.eClass;
50 metamodel = EcorePackageImpl.eINSTANCE; 52 metamodel = EcorePackageImpl.eINSTANCE;
51 }else if (d == Domain.Github){ 53 }else if (d == Domain.Github){
52 //TODO: Initialize Github Package 54 metamodel = GithubPackageImpl.eINSTANCE;
53 } 55 }
54 56
55 57 checker = new ViolationCheck(d);
56 println("Start Reading Models..."); 58 println("Start Reading Models...");
57 var reader = new GraphReader(metamodel, suffix); 59 var reader = new GraphReader(metamodel, suffix);
58 60
@@ -68,7 +70,7 @@ class Main {
68 val models = new ArrayList<EMFGraph>(); 70 val models = new ArrayList<EMFGraph>();
69 models.addAll(reader.readModels(inputFolder + "run" + i)); 71 models.addAll(reader.readModels(inputFolder + "run" + i));
70 for(model : models){ 72 for(model : models){
71 calculateAndOutputMetrics(model, YakindummPackageImpl.eNAME, outputFolder+model.name+"_run_"+i+".csv"); 73 calculateAndOutputMetrics(model, metamodel.name, outputFolder+model.name+"_run_"+i+".csv");
72 } 74 }
73 } 75 }
74 println("output results Ended for: " + outputFolder); 76 println("output results Ended for: " + outputFolder);
@@ -90,7 +92,10 @@ class Main {
90 } 92 }
91 93
92 var outputs = model.evaluateAllMetrics(); 94 var outputs = model.evaluateAllMetrics();
93 var violations = ViolationCheck.calculateViolationCounts(model.root, d); 95 var violations = checker.calculateViolationCounts(model.root);
96 var map = checker.violationMaps(model.root);
97
98 println(violations);
94 if (violations == 0) { 99 if (violations == 0) {
95 validFiles += 1; 100 validFiles += 1;
96 } 101 }
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 8fa29fe6..2baaa929 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
@@ -13,10 +13,19 @@ class EMFGraph extends Graph{
13 @Accessors(PUBLIC_GETTER) 13 @Accessors(PUBLIC_GETTER)
14 var EObject root; 14 var EObject root;
15 15
16 def void init (EObject root, List<Metric> metrics, String name, List<EReference> referenceTypes){ 16 def void init (EObject root, List<Metric> metrics, String name){
17 val otherContents = root.eAllContents.toList(); 17 val otherContents = root.eAllContents.toList();
18 val metaModel = root.eClass.EPackage;
19 val referenceTypes = new ArrayList<EReference>;
18 this.root = root; 20 this.root = root;
19 otherContents.add(root); 21 otherContents.add(root);
22
23 metaModel.eAllContents.forEach[
24 if(it instanceof EReference){
25 referenceTypes.add(it);
26 }
27 ]
28
20 init(otherContents, metrics, name, referenceTypes); 29 init(otherContents, metrics, name, referenceTypes);
21 } 30 }
22 31
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
index 053e0da3..afa10259 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
@@ -20,9 +20,6 @@ import org.eclipse.emf.ecore.resource.Resource
20import org.eclipse.emf.ecore.resource.ResourceSet 20import org.eclipse.emf.ecore.resource.ResourceSet
21import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl 21import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
22import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl 22import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
23import org.eclipse.emf.ecore.EGenericType
24import org.eclipse.emf.ecore.EStructuralFeature
25import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedClusteringCoefficientMetric
26 23
27class GraphReader{ 24class GraphReader{
28 val ResourceSet resSet = new ResourceSetImpl(); 25 val ResourceSet resSet = new ResourceSetImpl();
@@ -64,7 +61,7 @@ class GraphReader{
64 //add a list of metrics 61 //add a list of metrics
65 val g = new EMFGraph(); 62 val g = new EMFGraph();
66 for(root : roots){ 63 for(root : roots){
67 g.init(root, metrics, name.replaceFirst(suffix, ""), referenceTypes); 64 g.init(root, metrics, name.replaceFirst(suffix, ""));
68 } 65 }
69 66
70 count ++; 67 count ++;
@@ -88,7 +85,7 @@ class GraphReader{
88 //add a list of metrics 85 //add a list of metrics
89 val g = new EMFGraph(); 86 val g = new EMFGraph();
90 for(root : roots){ 87 for(root : roots){
91 g.init(root, metrics, filename.replaceFirst(suffix, ""), referenceTypes); 88 g.init(root, metrics, filename.replaceFirst(suffix, ""));
92 } 89 }
93 return g 90 return g
94 } 91 }
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
index 5e660111..e5feae2b 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
@@ -5,25 +5,32 @@ import com.google.common.reflect.ClassPath
5import ecore.Ecore 5import ecore.Ecore
6import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns 6import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns
7import java.util.ArrayList 7import java.util.ArrayList
8import java.util.List
8import org.eclipse.emf.ecore.EObject 9import org.eclipse.emf.ecore.EObject
9import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification 10import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification
11import queries.Github
10 12
11class ViolationCheck { 13class ViolationCheck {
12 /** 14 /**
13 * Return the total number of violations 15 * Return the total number of violations
14 */ 16 */
15 def static int calculateViolationCounts(EObject root, Domain d) { 17 var List<IConstraintSpecification> constraints;
16 var packageName = ''; 18
19 new(Domain d) {
20 var packageName = '';
17 if (d == Domain.Yakindumm) { 21 if (d == Domain.Yakindumm) {
18 packageName = 'constraints.yakindumm'; 22 packageName = 'constraints.yakindumm';
19 } else if (d == Domain.Ecore) { 23 } else if (d == Domain.Ecore) {
20 packageName = 'constraints.ecore'; 24 packageName = 'constraints.ecore';
21 } else if (d == Domain.Github) { 25 } else if (d == Domain.Github) {
22 return -1; 26 packageName = 'constraints.github'
23 } 27 }
24 28
25 var constriants = loadConstraints(packageName); 29 constraints = loadConstraints(packageName);
26 var collections = new ConstraintCollection(constriants, Ecore.instance); 30 }
31
32 def int calculateViolationCounts(EObject root) {
33 var collections = new ConstraintCollection(constraints, Ecore.instance);
27 collections.addModel(root); 34 collections.addModel(root);
28 var results = collections.calculateViolations(); 35 var results = collections.calculateViolations();
29 if (results.size > 0) { 36 if (results.size > 0) {
@@ -36,9 +43,8 @@ class ViolationCheck {
36 /** 43 /**
37 * return a map contain the count for each type of violation 44 * return a map contain the count for each type of violation
38 */ 45 */
39 def static violationMaps(EObject root) { 46 def violationMaps(EObject root) {
40 var constriants = loadConstraints('hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu'); 47 var collections = new ConstraintCollection(constraints, Ecore.instance);
41 var collections = new ConstraintCollection(constriants, Patterns.instance);
42 collections.addModel(root); 48 collections.addModel(root);
43 var results = collections.calculateViolationMaps(); 49 var results = collections.calculateViolationMaps();
44 if (results.size > 0) { 50 if (results.size > 0) {
@@ -48,7 +54,7 @@ class ViolationCheck {
48 } 54 }
49 } 55 }
50 56
51 def static loadConstraints(String packageName) { 57 def loadConstraints(String packageName) {
52 val constraints = new ArrayList<IConstraintSpecification>(); 58 val constraints = new ArrayList<IConstraintSpecification>();
53 59
54 val classPath = ClassPath.from(ClassLoader.systemClassLoader); 60 val classPath = ClassPath.from(ClassLoader.systemClassLoader);