From 1cfc2e98ffbba1dc2a489ad415c81264b76d8c14 Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Sun, 15 Nov 2020 21:56:45 -0500 Subject: code for paper --- .../calculator/app/EcoreMetricDistance.xtend | 44 ++++++++++++++++++++++ .../realistic/metrics/calculator/app/Main.xtend | 21 +++++++---- .../metrics/calculator/graph/EMFGraph.xtend | 11 +++++- .../metrics/calculator/io/GraphReader.xtend | 7 +--- .../calculator/validation/ViolationCheck.xtend | 24 +++++++----- 5 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/EcoreMetricDistance.xtend (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic') 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 @@ +package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app + +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric +import java.util.ArrayList +import org.eclipse.emf.ecore.EObject + +class EcoreMetricDistance { + var KSDistance ks; + var MetricSampleGroup g; + + + new(Domain d){ + var metrics = RepMetricsReader.read(d); + this.g = metrics; + ks = new KSDistance(g); + } + + def MetricDistanceGroup calculateMetricDistanceKS(EObject root){ + val metrics = new ArrayList(); + metrics.add(new OutDegreeMetric()); + metrics.add(new NodeActivityMetric()); + metrics.add(new MultiplexParticipationCoefficientMetric()); + metrics.add(new NodeTypeMetric()); + val metricCalculator = new EMFGraph(); + metricCalculator.init(root, metrics, null); + var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); + + var mpc = ks.mpcDistance(metricSamples.mpcSamples); + var na = ks.naDistance(metricSamples.naSamples); + var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples); + var nodeType = ks.nodeTypeDistance(metricSamples.nodeTypeSamples); + var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); + distance.nodeTypeInfo = metricSamples.nodeTypeSamples; + return distance; + } +} \ 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 import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine import org.eclipse.emf.ecore.impl.EcorePackageImpl import org.eclipse.emf.ecore.EReference +import github.impl.GithubPackageImpl //import yakindumm2.impl.Yakindumm2PackageImpl class Main { - var static Domain d = Domain.Ecore; + var static Domain d = Domain.Github; val static String suffix = '.xmi' - val static String OUTPUT_FOLDER = "Inputs/random/ecore/"; - val static String INPUT_FOLDER = "outputs/random/ecore/"; + val static String OUTPUT_FOLDER = "Inputs/Github/Alloy/"; + val static String INPUT_FOLDER = "outputs/Github/Alloy/"; val static int NUM_RUNS = 1; var static validFiles = 0; var static totalFiles = 0; + var static ViolationCheck checker; + var static EPackage metamodel; static class RWInformation{ public var String inputFolder; @@ -38,7 +41,6 @@ class Main { def static void main(String[] args){ //init model - var EPackage metamodel; //init viatra engine for the violation checker ReteEngine.getClass(); @@ -49,10 +51,10 @@ class Main { EcorePackage.eINSTANCE.eClass; metamodel = EcorePackageImpl.eINSTANCE; }else if (d == Domain.Github){ - //TODO: Initialize Github Package + metamodel = GithubPackageImpl.eINSTANCE; } - + checker = new ViolationCheck(d); println("Start Reading Models..."); var reader = new GraphReader(metamodel, suffix); @@ -68,7 +70,7 @@ class Main { val models = new ArrayList(); models.addAll(reader.readModels(inputFolder + "run" + i)); for(model : models){ - calculateAndOutputMetrics(model, YakindummPackageImpl.eNAME, outputFolder+model.name+"_run_"+i+".csv"); + calculateAndOutputMetrics(model, metamodel.name, outputFolder+model.name+"_run_"+i+".csv"); } } println("output results Ended for: " + outputFolder); @@ -90,7 +92,10 @@ class Main { } var outputs = model.evaluateAllMetrics(); - var violations = ViolationCheck.calculateViolationCounts(model.root, d); + var violations = checker.calculateViolationCounts(model.root); + var map = checker.violationMaps(model.root); + + println(violations); if (violations == 0) { validFiles += 1; } 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{ @Accessors(PUBLIC_GETTER) var EObject root; - def void init (EObject root, List metrics, String name, List referenceTypes){ + def void init (EObject root, List metrics, String name){ val otherContents = root.eAllContents.toList(); + val metaModel = root.eClass.EPackage; + val referenceTypes = new ArrayList; this.root = root; otherContents.add(root); + + metaModel.eAllContents.forEach[ + if(it instanceof EReference){ + referenceTypes.add(it); + } + ] + init(otherContents, metrics, name, referenceTypes); } 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 import org.eclipse.emf.ecore.resource.ResourceSet import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl -import org.eclipse.emf.ecore.EGenericType -import org.eclipse.emf.ecore.EStructuralFeature -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedClusteringCoefficientMetric class GraphReader{ val ResourceSet resSet = new ResourceSetImpl(); @@ -64,7 +61,7 @@ class GraphReader{ //add a list of metrics val g = new EMFGraph(); for(root : roots){ - g.init(root, metrics, name.replaceFirst(suffix, ""), referenceTypes); + g.init(root, metrics, name.replaceFirst(suffix, "")); } count ++; @@ -88,7 +85,7 @@ class GraphReader{ //add a list of metrics val g = new EMFGraph(); for(root : roots){ - g.init(root, metrics, filename.replaceFirst(suffix, ""), referenceTypes); + g.init(root, metrics, filename.replaceFirst(suffix, "")); } return g } 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 import ecore.Ecore import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns import java.util.ArrayList +import java.util.List import org.eclipse.emf.ecore.EObject import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification +import queries.Github class ViolationCheck { /** * Return the total number of violations */ - def static int calculateViolationCounts(EObject root, Domain d) { - var packageName = ''; + var List constraints; + + new(Domain d) { + var packageName = ''; if (d == Domain.Yakindumm) { packageName = 'constraints.yakindumm'; } else if (d == Domain.Ecore) { packageName = 'constraints.ecore'; } else if (d == Domain.Github) { - return -1; + packageName = 'constraints.github' } - var constriants = loadConstraints(packageName); - var collections = new ConstraintCollection(constriants, Ecore.instance); + constraints = loadConstraints(packageName); + } + + def int calculateViolationCounts(EObject root) { + var collections = new ConstraintCollection(constraints, Ecore.instance); collections.addModel(root); var results = collections.calculateViolations(); if (results.size > 0) { @@ -36,9 +43,8 @@ class ViolationCheck { /** * return a map contain the count for each type of violation */ - def static violationMaps(EObject root) { - var constriants = loadConstraints('hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu'); - var collections = new ConstraintCollection(constriants, Patterns.instance); + def violationMaps(EObject root) { + var collections = new ConstraintCollection(constraints, Ecore.instance); collections.addModel(root); var results = collections.calculateViolationMaps(); if (results.size > 0) { @@ -48,7 +54,7 @@ class ViolationCheck { } } - def static loadConstraints(String packageName) { + def loadConstraints(String packageName) { val constraints = new ArrayList(); val classPath = ClassPath.from(ClassLoader.systemClassLoader); -- cgit v1.2.3-54-g00ecf