diff options
author | 2020-11-05 01:49:20 -0500 | |
---|---|---|
committer | 2020-11-05 01:49:20 -0500 | |
commit | f25435a9f151f0b24fd7f410f153ed76f8da9633 (patch) | |
tree | 00645d317175ef96f766666466eb6e99c5432d4f /Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic | |
parent | fix merging issue (diff) | |
download | VIATRA-Generator-f25435a9f151f0b24fd7f410f153ed76f8da9633.tar.gz VIATRA-Generator-f25435a9f151f0b24fd7f410f153ed76f8da9633.tar.zst VIATRA-Generator-f25435a9f151f0b24fd7f410f153ed76f8da9633.zip |
fix node type distance measure
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic')
3 files changed, 34 insertions, 27 deletions
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 | |||
16 | //import yakindumm2.impl.Yakindumm2PackageImpl | 16 | //import yakindumm2.impl.Yakindumm2PackageImpl |
17 | 17 | ||
18 | class Main { | 18 | class Main { |
19 | var static Domain d = Domain.Yakindumm; | 19 | var static Domain d = Domain.Ecore; |
20 | val static String suffix = '.xmi' | 20 | val static String suffix = '.xmi' |
21 | val static String OUTPUT_FOLDER = "Inputs/measurement2/yakindu/Alloy/"; | 21 | val static String OUTPUT_FOLDER = "Inputs/random/ecore/"; |
22 | val static String INPUT_FOLDER = "outputs/measurement2/yakindu/Alloy/"; | 22 | val static String INPUT_FOLDER = "outputs/random/ecore/"; |
23 | val static int NUM_RUNS = 1; | 23 | val static int NUM_RUNS = 1; |
24 | var static validFiles = 0; | ||
25 | var static totalFiles = 0; | ||
24 | 26 | ||
25 | static class RWInformation{ | 27 | static class RWInformation{ |
26 | public var String inputFolder; | 28 | public var String inputFolder; |
@@ -56,6 +58,7 @@ class Main { | |||
56 | 58 | ||
57 | val models = new RWInformation(OUTPUT_FOLDER, INPUT_FOLDER, NUM_RUNS); | 59 | val models = new RWInformation(OUTPUT_FOLDER, INPUT_FOLDER, NUM_RUNS); |
58 | calculateAllModels(models.inputFolder, models.outputFolder,models.numRuns, reader); | 60 | calculateAllModels(models.inputFolder, models.outputFolder,models.numRuns, reader); |
61 | println("Valid File Ratio: " + (validFiles as double) / totalFiles) | ||
59 | println("finished"); | 62 | println("finished"); |
60 | } | 63 | } |
61 | 64 | ||
@@ -88,7 +91,10 @@ class Main { | |||
88 | 91 | ||
89 | var outputs = model.evaluateAllMetrics(); | 92 | var outputs = model.evaluateAllMetrics(); |
90 | var violations = ViolationCheck.calculateViolationCounts(model.root, d); | 93 | var violations = ViolationCheck.calculateViolationCounts(model.root, d); |
91 | println(violations); | 94 | if (violations == 0) { |
95 | validFiles += 1; | ||
96 | } | ||
97 | totalFiles += 1; | ||
92 | var violationsOutput = newArrayList('violations', violations+''); | 98 | var violationsOutput = newArrayList('violations', violations+''); |
93 | outputs.add(violationsOutput); | 99 | outputs.add(violationsOutput); |
94 | CsvFileWriter.write(outputs, fileName); | 100 | 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 { | |||
60 | return value; | 60 | return value; |
61 | } | 61 | } |
62 | 62 | ||
63 | // actually calculates Manhattan Distance due to KS-Distance does not make sense for discrete distributions | ||
63 | def nodeTypeDistance(HashMap<String, Double> samples){ | 64 | def nodeTypeDistance(HashMap<String, Double> samples){ |
64 | var typesDistMap = g.nodeTypeSamples; | 65 | var typesDistMap = g.nodeTypeSamples; |
65 | var sourceDist = newArrayList(); | 66 | var keys = new HashSet<String>(typesDistMap.keySet()); |
66 | var instanceDist = newArrayList(); | 67 | keys.addAll(samples.keySet()); |
68 | var distance = 0.0; | ||
67 | 69 | ||
68 | for(key : typesDistMap.keySet()){ | 70 | for(key : keys){ |
69 | sourceDist.add(typesDistMap.get(key)); | 71 | distance += Math.abs(typesDistMap.getOrDefault(key, 0.0) - samples.getOrDefault(key, 0.0)); |
70 | instanceDist.add(samples.getOrDefault(key, 0.0)); | ||
71 | } | 72 | } |
72 | 73 | ||
73 | return ks_distance_two_dist(sourceDist, instanceDist); | 74 | return distance; |
74 | } | 75 | } |
75 | 76 | ||
76 | def edgeTypeDistance(HashMap<String, Double> samples){ | 77 | def edgeTypeDistance(HashMap<String, Double> 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 { | |||
12 | /** | 12 | /** |
13 | * Return the total number of violations | 13 | * Return the total number of violations |
14 | */ | 14 | */ |
15 | def static int calculateViolationCounts(EObject root, Domain d){ | 15 | def static int calculateViolationCounts(EObject root, Domain d) { |
16 | var packageName = ''; | 16 | var packageName = ''; |
17 | if(d == Domain.Yakindumm){ | 17 | if (d == Domain.Yakindumm) { |
18 | packageName = 'constraints.yakindumm'; | 18 | packageName = 'constraints.yakindumm'; |
19 | }else if (d == Domain.Ecore){ | 19 | } else if (d == Domain.Ecore) { |
20 | packageName = 'constraints.ecore'; | 20 | packageName = 'constraints.ecore'; |
21 | }else if (d == Domain.Github){ | 21 | } else if (d == Domain.Github) { |
22 | return -1; | 22 | return -1; |
23 | } | 23 | } |
24 | 24 | ||
25 | var constriants = loadConstraints(packageName); | 25 | var constriants = loadConstraints(packageName); |
26 | var collections = new ConstraintCollection(constriants, Ecore.instance); | 26 | var collections = new ConstraintCollection(constriants, Ecore.instance); |
27 | collections.addModel(root); | 27 | collections.addModel(root); |
28 | var results = collections.calculateViolations(); | 28 | var results = collections.calculateViolations(); |
29 | if(results.size > 0){ | 29 | if (results.size > 0) { |
30 | return results.get(0); | 30 | return results.get(0); |
31 | }else{ | 31 | } else { |
32 | throw new IllegalArgumentException("Calculate Violation Failed"); | 32 | throw new IllegalArgumentException("Calculate Violation Failed"); |
33 | } | 33 | } |
34 | } | 34 | } |
35 | 35 | ||
36 | /** | 36 | /** |
37 | * return a map contain the count for each type of violation | 37 | * return a map contain the count for each type of violation |
38 | */ | 38 | */ |
39 | def static violationMaps(EObject root){ | 39 | def static violationMaps(EObject root) { |
40 | var constriants = loadConstraints('hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu'); | 40 | var constriants = loadConstraints('hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu'); |
41 | var collections = new ConstraintCollection(constriants, Patterns.instance); | 41 | var collections = new ConstraintCollection(constriants, Patterns.instance); |
42 | collections.addModel(root); | 42 | collections.addModel(root); |
43 | var results = collections.calculateViolationMaps(); | 43 | var results = collections.calculateViolationMaps(); |
44 | if(results.size > 0){ | 44 | if (results.size > 0) { |
45 | return results.get(0); | 45 | return results.get(0); |
46 | }else{ | 46 | } else { |
47 | throw new IllegalArgumentException("Calculate Violation Failed"); | 47 | throw new IllegalArgumentException("Calculate Violation Failed"); |
48 | } | 48 | } |
49 | } | 49 | } |
50 | 50 | ||
51 | def static loadConstraints(String packageName){ | 51 | def static loadConstraints(String packageName) { |
52 | val constraints = new ArrayList<IConstraintSpecification>(); | 52 | val constraints = new ArrayList<IConstraintSpecification>(); |
53 | 53 | ||
54 | val classPath = ClassPath.from(ClassLoader.systemClassLoader); | 54 | val classPath = ClassPath.from(ClassLoader.systemClassLoader); |
55 | val classInfos = classPath.getTopLevelClasses(packageName); | 55 | val classInfos = classPath.getTopLevelClasses(packageName); |
56 | for(info : classInfos){ | 56 | for (info : classInfos) { |
57 | if(info.load.interfaces.contains(IConstraintSpecification)){ | 57 | if (info.load.interfaces.contains(IConstraintSpecification)) { |
58 | //IConstraintSpecification only has one constructor with empty argument list | 58 | // IConstraintSpecification only has one constructor with empty argument list |
59 | var constructor = info.load.constructors.get(0); | 59 | var constructor = info.load.constructors.get(0); |
60 | var instance = constructor.newInstance(); | 60 | var instance = constructor.newInstance(); |
61 | constraints.add(instance as IConstraintSpecification); | 61 | constraints.add(instance as IConstraintSpecification); |