From f25435a9f151f0b24fd7f410f153ed76f8da9633 Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Thu, 5 Nov 2020 01:49:20 -0500 Subject: fix node type distance measure --- .../realistic/metrics/calculator/app/Main.xtend | 14 ++++++--- .../metrics/calculator/distance/KSDistance.xtend | 13 +++++---- .../calculator/validation/ViolationCheck.xtend | 34 +++++++++++----------- 3 files changed, 34 insertions(+), 27 deletions(-) (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/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 dfde6593..8d936a88 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 @@ -16,11 +16,13 @@ import org.eclipse.emf.ecore.EReference //import yakindumm2.impl.Yakindumm2PackageImpl class Main { - var static Domain d = Domain.Yakindumm; + var static Domain d = Domain.Ecore; val static String suffix = '.xmi' - val static String OUTPUT_FOLDER = "Inputs/measurement2/yakindu/Alloy/"; - val static String INPUT_FOLDER = "outputs/measurement2/yakindu/Alloy/"; + val static String OUTPUT_FOLDER = "Inputs/random/ecore/"; + val static String INPUT_FOLDER = "outputs/random/ecore/"; val static int NUM_RUNS = 1; + var static validFiles = 0; + var static totalFiles = 0; static class RWInformation{ public var String inputFolder; @@ -56,6 +58,7 @@ class Main { val models = new RWInformation(OUTPUT_FOLDER, INPUT_FOLDER, NUM_RUNS); calculateAllModels(models.inputFolder, models.outputFolder,models.numRuns, reader); + println("Valid File Ratio: " + (validFiles as double) / totalFiles) println("finished"); } @@ -88,7 +91,10 @@ class Main { var outputs = model.evaluateAllMetrics(); var violations = ViolationCheck.calculateViolationCounts(model.root, d); - println(violations); + if (violations == 0) { + validFiles += 1; + } + totalFiles += 1; var violationsOutput = newArrayList('violations', violations+''); outputs.add(violationsOutput); CsvFileWriter.write(outputs, fileName); diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend index c486a328..eec3a880 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend @@ -60,17 +60,18 @@ class KSDistance extends CostDistance { return value; } + // actually calculates Manhattan Distance due to KS-Distance does not make sense for discrete distributions def nodeTypeDistance(HashMap samples){ var typesDistMap = g.nodeTypeSamples; - var sourceDist = newArrayList(); - var instanceDist = newArrayList(); + var keys = new HashSet(typesDistMap.keySet()); + keys.addAll(samples.keySet()); + var distance = 0.0; - for(key : typesDistMap.keySet()){ - sourceDist.add(typesDistMap.get(key)); - instanceDist.add(samples.getOrDefault(key, 0.0)); + for(key : keys){ + distance += Math.abs(typesDistMap.getOrDefault(key, 0.0) - samples.getOrDefault(key, 0.0)); } - return ks_distance_two_dist(sourceDist, instanceDist); + return distance; } def edgeTypeDistance(HashMap samples){ 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 4db5f940..5e660111 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 @@ -12,50 +12,50 @@ class ViolationCheck { /** * Return the total number of violations */ - def static int calculateViolationCounts(EObject root, Domain d){ + def static int calculateViolationCounts(EObject root, Domain d) { var packageName = ''; - if(d == Domain.Yakindumm){ + if (d == Domain.Yakindumm) { packageName = 'constraints.yakindumm'; - }else if (d == Domain.Ecore){ + } else if (d == Domain.Ecore) { packageName = 'constraints.ecore'; - }else if (d == Domain.Github){ + } else if (d == Domain.Github) { return -1; } - + var constriants = loadConstraints(packageName); var collections = new ConstraintCollection(constriants, Ecore.instance); collections.addModel(root); var results = collections.calculateViolations(); - if(results.size > 0){ + if (results.size > 0) { return results.get(0); - }else{ + } else { throw new IllegalArgumentException("Calculate Violation Failed"); } } - + /** * return a map contain the count for each type of violation */ - def static violationMaps(EObject root){ + def static violationMaps(EObject root) { var constriants = loadConstraints('hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu'); var collections = new ConstraintCollection(constriants, Patterns.instance); collections.addModel(root); var results = collections.calculateViolationMaps(); - if(results.size > 0){ + if (results.size > 0) { return results.get(0); - }else{ + } else { throw new IllegalArgumentException("Calculate Violation Failed"); } } - - def static loadConstraints(String packageName){ + + def static loadConstraints(String packageName) { val constraints = new ArrayList(); - + val classPath = ClassPath.from(ClassLoader.systemClassLoader); val classInfos = classPath.getTopLevelClasses(packageName); - for(info : classInfos){ - if(info.load.interfaces.contains(IConstraintSpecification)){ - //IConstraintSpecification only has one constructor with empty argument list + for (info : classInfos) { + if (info.load.interfaces.contains(IConstraintSpecification)) { + // IConstraintSpecification only has one constructor with empty argument list var constructor = info.load.constructors.get(0); var instance = constructor.newInstance(); constraints.add(instance as IConstraintSpecification); -- cgit v1.2.3-54-g00ecf