diff options
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app')
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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app | 1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app |
2 | 2 | ||
3 | enum Domain{ | 3 | enum 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 | |||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph |
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter | 4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter |
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader | 5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader |
6 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation.ViolationCheck | ||
6 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl | 7 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl |
8 | import java.io.File | ||
7 | import java.util.ArrayList | 9 | import java.util.ArrayList |
10 | import org.eclipse.emf.ecore.EPackage | ||
8 | import org.eclipse.emf.ecore.EcorePackage | 11 | import org.eclipse.emf.ecore.EcorePackage |
12 | import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine | ||
13 | import org.eclipse.emf.ecore.impl.EcorePackageImpl | ||
14 | import org.eclipse.emf.ecore.EReference | ||
9 | 15 | ||
10 | //import yakindumm2.impl.Yakindumm2PackageImpl | 16 | //import yakindumm2.impl.Yakindumm2PackageImpl |
11 | 17 | ||
12 | class Main { | 18 | class 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 | |||
20 | import java.util.Map | 20 | import java.util.Map |
21 | import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression | 21 | import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression |
22 | import org.eclipse.xtend.lib.annotations.Accessors | 22 | import org.eclipse.xtend.lib.annotations.Accessors |
23 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.EdgeTypeMetric | ||
23 | 24 | ||
24 | class PartialInterpretationMetricDistance { | 25 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app; | ||
2 | |||
3 | import java.util.ArrayList; | ||
4 | import java.util.List; | ||
5 | |||
6 | import weka.core.matrix.LinearRegression; | ||
7 | import weka.core.matrix.Matrix; | ||
8 | |||
9 | public 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 | } | ||