aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app
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/app')
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend4
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend71
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend10
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java31
4 files changed, 56 insertions, 60 deletions
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend
index 8351e96b..c8fd435b 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend
@@ -1,5 +1,7 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app 1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app
2 2
3enum Domain{ 3enum Domain{
4 Yakinduum 4 Yakindumm,
5 Ecore,
6 Github
5} \ No newline at end of file 7} \ 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 062d69fa..ab187b3a 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
@@ -3,13 +3,25 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter 4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader 5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader
6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation.ViolationCheck
6import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl 7import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl
8import java.io.File
7import java.util.ArrayList 9import java.util.ArrayList
10import org.eclipse.emf.ecore.EPackage
8import org.eclipse.emf.ecore.EcorePackage 11import org.eclipse.emf.ecore.EcorePackage
12import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine
13import org.eclipse.emf.ecore.impl.EcorePackageImpl
14import org.eclipse.emf.ecore.EReference
9 15
10//import yakindumm2.impl.Yakindumm2PackageImpl 16//import yakindumm2.impl.Yakindumm2PackageImpl
11 17
12class Main { 18class Main {
19 var static Domain d = Domain.Ecore;
20 val static String suffix = '.ecore'
21 val static String OUTPUT_FOLDER = "Inputs/human/";
22 val static String INPUT_FOLDER = "outputs/human/";
23 val static int NUM_RUNS = 1;
24
13 static class RWInformation{ 25 static class RWInformation{
14 public var String inputFolder; 26 public var String inputFolder;
15 public var String outputFolder; 27 public var String outputFolder;
@@ -24,36 +36,32 @@ class Main {
24 36
25 def static void main(String[] args){ 37 def static void main(String[] args){
26 //init model 38 //init model
27 YakindummPackageImpl.eINSTANCE.eClass; 39 var EPackage metamodel;
28 EcorePackage.eINSTANCE.eClass;
29// Yakindumm2PackageImpl.eINSTANCE.eClass;
30 //val infos = initData();
31
32 println("Start Reading Models...");
33 var reader = new GraphReader(EcorePackage.eINSTANCE, ".xmi");
34// for(info : infos){
35// calculateAllModels(info.inputFolder, info.outputFolder,info.numRuns, reader);
36// }
37 40
38 //human input has different package declaration 41 //init viatra engine for the violation checker
39// reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE); 42 ReteEngine.getClass();
40 val human = new RWInformation("Inputs/viatra75/", "outputs/", 50);
41 calculateAllModels(human.inputFolder, human.outputFolder,human.numRuns, reader);
42 43
44 if(d == Domain.Yakindumm){
45 YakindummPackageImpl.eINSTANCE.eClass;
46 metamodel = YakindummPackageImpl.eINSTANCE;
47 }else if (d == Domain.Ecore){
48 EcorePackage.eINSTANCE.eClass;
49 metamodel = EcorePackageImpl.eINSTANCE;
50 }else if (d == Domain.Github){
51 //TODO: Initialize Github Package
52 }
43 53
54
55 println("Start Reading Models...");
56 var reader = new GraphReader(metamodel, suffix);
57
58 val models = new RWInformation(OUTPUT_FOLDER, INPUT_FOLDER, NUM_RUNS);
59 calculateAllModels(models.inputFolder, models.outputFolder,models.numRuns, reader);
44 println("finished"); 60 println("finished");
45 } 61 }
46 62
47 static def initData(){
48 val infos = new ArrayList<RWInformation>();
49 infos.add(new RWInformation("inputs/alloyInput/models/", "../plot/statistics/alloyOutput/", 20));
50 infos.add(new RWInformation("inputs/randomInput/models/", "../plot/statistics/randomOutput/", 20));
51 infos.add(new RWInformation("inputs/viatraInput30/", "../plot/statistics/viatraOutput30/", 20));
52 infos.add(new RWInformation("inputs/viatraInput100/", "../plot/statistics/viatraOutput100/", 10));
53 return infos;
54 }
55
56 static def calculateAllModels(String inputFolder, String outputFolder, int numRuns, GraphReader reader){ 63 static def calculateAllModels(String inputFolder, String outputFolder, int numRuns, GraphReader reader){
64 (new File(outputFolder)).mkdir();
57 for(var i = 1; i <= numRuns; i++){ 65 for(var i = 1; i <= numRuns; i++){
58 val models = new ArrayList<EMFGraph>(); 66 val models = new ArrayList<EMFGraph>();
59 models.addAll(reader.readModels(inputFolder + "run" + i)); 67 models.addAll(reader.readModels(inputFolder + "run" + i));
@@ -67,8 +75,21 @@ class Main {
67 } 75 }
68 76
69 static def calculateAndOutputMetrics(EMFGraph model, String metaModel, String fileName){ 77 static def calculateAndOutputMetrics(EMFGraph model, String metaModel, String fileName){
70 //println("evaluating for " + model.name); 78 //println("evaluating for " + model.name);
71 model.metaModel = metaModel; 79 model.metaModel = metaModel;
72 CsvFileWriter.write(model.evaluateAllMetrics(), fileName); 80
81 //remove eGenericType for Ecore domain
82 if(d == Domain.Ecore){
83 var refsToRemove = EcorePackageImpl.eINSTANCE.eAllContents.filter(EReference).filter[
84 it.name.equals('eGenericType') || it.name.equals('eGenericSuperTypes') || it.name.equals('eFactoryInstance')||
85 it.name.equals('eGenericExceptions') || it.name.equals('references') || it.name.equals('contents');
86 ];
87 refsToRemove.forEach[model.removeReference(it)];
88 }
89
90 var outputs = model.evaluateAllMetrics();
91 var violationsOutput = newArrayList('violations', ViolationCheck.calculateViolationCounts(model.root, d)+'');
92 outputs.add(violationsOutput);
93 CsvFileWriter.write(outputs, fileName);
73 } 94 }
74} \ No newline at end of file 95} \ 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/PartialInterpretationMetricDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
index 66dcdff6..b2288f52 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
@@ -20,6 +20,7 @@ import java.util.List
20import java.util.Map 20import java.util.Map
21import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression 21import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression
22import org.eclipse.xtend.lib.annotations.Accessors 22import org.eclipse.xtend.lib.annotations.Accessors
23import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.EdgeTypeMetric
23 24
24class PartialInterpretationMetricDistance { 25class PartialInterpretationMetricDistance {
25 26
@@ -34,8 +35,8 @@ class PartialInterpretationMetricDistance {
34 var LinearModel linearModel; 35 var LinearModel linearModel;
35 36
36 37
37 new(){ 38 new(Domain d){
38 var metrics = RepMetricsReader.read(Domain.Yakinduum); 39 var metrics = RepMetricsReader.read(d);
39 this.g = metrics; 40 this.g = metrics;
40 ks = new KSDistance(g); 41 ks = new KSDistance(g);
41 js = new JSDistance(g); 42 js = new JSDistance(g);
@@ -53,6 +54,7 @@ class PartialInterpretationMetricDistance {
53 metrics.add(new NodeActivityMetric()); 54 metrics.add(new NodeActivityMetric());
54 metrics.add(new MultiplexParticipationCoefficientMetric()); 55 metrics.add(new MultiplexParticipationCoefficientMetric());
55 metrics.add(new NodeTypeMetric()); 56 metrics.add(new NodeTypeMetric());
57 metrics.add(new EdgeTypeMetric());
56 val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); 58 val metricCalculator = new PartialInterpretationGraph(partial, metrics, null);
57 var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); 59 var metricSamples = metricCalculator.evaluateAllMetricsToSamples();
58 60
@@ -63,6 +65,7 @@ class PartialInterpretationMetricDistance {
63 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); 65 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples);
64 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); 66 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType);
65 distance.nodeTypeInfo = metricSamples.nodeTypeSamples; 67 distance.nodeTypeInfo = metricSamples.nodeTypeSamples;
68 distance.edgeTypeDistance = ks.edgeTypeDistance(metricSamples.edgeTypeSamples);
66 return distance; 69 return distance;
67 } 70 }
68 71
@@ -177,7 +180,8 @@ class MetricDistanceGroup{
177 var double outDegreeDistance; 180 var double outDegreeDistance;
178 var double nodeTypeDistance; 181 var double nodeTypeDistance;
179 protected var HashMap<String, Double> nodeTypeInfo; 182 protected var HashMap<String, Double> nodeTypeInfo;
180 183 public var double edgeTypeDistance;
184
181 new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){ 185 new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){
182 this.mpcDistance = mpcDistance; 186 this.mpcDistance = mpcDistance;
183 this.naDistance = naDistance; 187 this.naDistance = naDistance;
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java
deleted file mode 100644
index f06b377f..00000000
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java
+++ /dev/null
@@ -1,31 +0,0 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import weka.core.matrix.LinearRegression;
7import weka.core.matrix.Matrix;
8
9public class Test {
10 public static void main(String[] args) {
11 linearRegressionTest();
12 }
13
14 public static void linearRegressionTest() {
15 double[][] x = {{1,1,2,3}, {1,2,3,4}, {1,3,5,7}, {1,1,5,7}};
16 double[] y = {10, 13, 19, 17};
17 double[] valueToPredict = {1,1,1,1};
18 Matrix m = new Matrix(x);
19 Matrix n = new Matrix(y, y.length);
20
21 LinearRegression regression = new LinearRegression(m, n, 0);
22 double[] coef = regression.getCoefficients();
23
24 //predict
25 double a = 0;
26 for(int i = 0; i < coef.length; i++) {
27 a += coef[i] * valueToPredict[i];
28 }
29 System.out.println(a);
30 }
31}