diff options
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator')
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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance | ||
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph | ||
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | ||
6 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric | ||
7 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | ||
8 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric | ||
9 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric | ||
10 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric | ||
11 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric | ||
12 | import java.util.ArrayList | ||
13 | import org.eclipse.emf.ecore.EObject | ||
14 | |||
15 | class 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 | |||
12 | import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine | 12 | import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine |
13 | import org.eclipse.emf.ecore.impl.EcorePackageImpl | 13 | import org.eclipse.emf.ecore.impl.EcorePackageImpl |
14 | import org.eclipse.emf.ecore.EReference | 14 | import org.eclipse.emf.ecore.EReference |
15 | import github.impl.GithubPackageImpl | ||
15 | 16 | ||
16 | //import yakindumm2.impl.Yakindumm2PackageImpl | 17 | //import yakindumm2.impl.Yakindumm2PackageImpl |
17 | 18 | ||
18 | class Main { | 19 | class 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 | |||
20 | import org.eclipse.emf.ecore.resource.ResourceSet | 20 | import org.eclipse.emf.ecore.resource.ResourceSet |
21 | import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl | 21 | import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl |
22 | import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl | 22 | import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl |
23 | import org.eclipse.emf.ecore.EGenericType | ||
24 | import org.eclipse.emf.ecore.EStructuralFeature | ||
25 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedClusteringCoefficientMetric | ||
26 | 23 | ||
27 | class GraphReader{ | 24 | class 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 | |||
5 | import ecore.Ecore | 5 | import ecore.Ecore |
6 | import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns | 6 | import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns |
7 | import java.util.ArrayList | 7 | import java.util.ArrayList |
8 | import java.util.List | ||
8 | import org.eclipse.emf.ecore.EObject | 9 | import org.eclipse.emf.ecore.EObject |
9 | import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification | 10 | import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification |
11 | import queries.Github | ||
10 | 12 | ||
11 | class ViolationCheck { | 13 | class 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); |