aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill
diff options
context:
space:
mode:
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill')
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend14
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend13
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend34
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
18class Main { 18class 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);