aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src
diff options
context:
space:
mode:
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src')
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend6
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend28
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend11
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend18
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend33
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend12
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend17
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend12
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend18
9 files changed, 99 insertions, 56 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 b1986d50..062d69fa 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
@@ -5,6 +5,7 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader 5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader
6import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl 6import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl
7import java.util.ArrayList 7import java.util.ArrayList
8import org.eclipse.emf.ecore.EcorePackage
8 9
9//import yakindumm2.impl.Yakindumm2PackageImpl 10//import yakindumm2.impl.Yakindumm2PackageImpl
10 11
@@ -24,18 +25,19 @@ class Main {
24 def static void main(String[] args){ 25 def static void main(String[] args){
25 //init model 26 //init model
26 YakindummPackageImpl.eINSTANCE.eClass; 27 YakindummPackageImpl.eINSTANCE.eClass;
28 EcorePackage.eINSTANCE.eClass;
27// Yakindumm2PackageImpl.eINSTANCE.eClass; 29// Yakindumm2PackageImpl.eINSTANCE.eClass;
28 //val infos = initData(); 30 //val infos = initData();
29 31
30 println("Start Reading Models..."); 32 println("Start Reading Models...");
31 var reader = new GraphReader(YakindummPackageImpl.eINSTANCE); 33 var reader = new GraphReader(EcorePackage.eINSTANCE, ".xmi");
32// for(info : infos){ 34// for(info : infos){
33// calculateAllModels(info.inputFolder, info.outputFolder,info.numRuns, reader); 35// calculateAllModels(info.inputFolder, info.outputFolder,info.numRuns, reader);
34// } 36// }
35 37
36 //human input has different package declaration 38 //human input has different package declaration
37// reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE); 39// reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE);
38 val human = new RWInformation("Inputs/config15/", "outputs/", 1); 40 val human = new RWInformation("Inputs/viatra75/", "outputs/", 50);
39 calculateAllModels(human.inputFolder, human.outputFolder,human.numRuns, reader); 41 calculateAllModels(human.inputFolder, human.outputFolder,human.numRuns, reader);
40 42
41 43
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
index d68eb9d2..66dcdff6 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
@@ -5,11 +5,13 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.JSDistan
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance 5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance
6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.StateData 6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.StateData
7import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph 7import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph
8import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader
8import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric 9import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric
10import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
9import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric 11import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric
10import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric 12import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric
13import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric
11import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric 14import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric
12import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedOutDegree
13import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.predictor.LinearModel 15import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.predictor.LinearModel
14import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation 16import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
15import java.util.ArrayList 17import java.util.ArrayList
@@ -18,7 +20,6 @@ import java.util.List
18import java.util.Map 20import java.util.Map
19import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression 21import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression
20import org.eclipse.xtend.lib.annotations.Accessors 22import org.eclipse.xtend.lib.annotations.Accessors
21import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric
22 23
23class PartialInterpretationMetricDistance { 24class PartialInterpretationMetricDistance {
24 25
@@ -28,15 +29,17 @@ class PartialInterpretationMetricDistance {
28 var Map<Object, StateData> stateAndHistory; 29 var Map<Object, StateData> stateAndHistory;
29 var OLSMultipleLinearRegression regression; 30 var OLSMultipleLinearRegression regression;
30 List<StateData> samples; 31 List<StateData> samples;
31 32 var MetricSampleGroup g;
32 @Accessors(PUBLIC_GETTER) 33 @Accessors(PUBLIC_GETTER)
33 var LinearModel linearModel; 34 var LinearModel linearModel;
34 35
35 36
36 new(){ 37 new(){
37 ks = new KSDistance(Domain.Yakinduum); 38 var metrics = RepMetricsReader.read(Domain.Yakinduum);
38 js = new JSDistance(Domain.Yakinduum); 39 this.g = metrics;
39 ed = new EuclideanDistance(Domain.Yakinduum); 40 ks = new KSDistance(g);
41 js = new JSDistance(g);
42 ed = new EuclideanDistance(g);
40 regression = new OLSMultipleLinearRegression(); 43 regression = new OLSMultipleLinearRegression();
41 regression.noIntercept = false; 44 regression.noIntercept = false;
42 stateAndHistory = new HashMap<Object, StateData>(); 45 stateAndHistory = new HashMap<Object, StateData>();
@@ -56,8 +59,9 @@ class PartialInterpretationMetricDistance {
56 var mpc = ks.mpcDistance(metricSamples.mpcSamples); 59 var mpc = ks.mpcDistance(metricSamples.mpcSamples);
57 var na = ks.naDistance(metricSamples.naSamples); 60 var na = ks.naDistance(metricSamples.naSamples);
58 var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples); 61 var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples);
62 var nodeType = ks.nodeTypeDistance(metricSamples.nodeTypeSamples);
59 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); 63 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples);
60 var distance = new MetricDistanceGroup(mpc, na, outDegree); 64 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType);
61 distance.nodeTypeInfo = metricSamples.nodeTypeSamples; 65 distance.nodeTypeInfo = metricSamples.nodeTypeSamples;
62 return distance; 66 return distance;
63 } 67 }
@@ -171,14 +175,14 @@ class MetricDistanceGroup{
171 var double mpcDistance; 175 var double mpcDistance;
172 var double naDistance; 176 var double naDistance;
173 var double outDegreeDistance; 177 var double outDegreeDistance;
174 var double typedOutDegreeDistance; 178 var double nodeTypeDistance;
175 protected var HashMap<String, Double> nodeTypeInfo; 179 protected var HashMap<String, Double> nodeTypeInfo;
176 180
177 new(double mpcDistance, double naDistance, double outDegreeDistance, double typedOutDegreeDistance){ 181 new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){
178 this.mpcDistance = mpcDistance; 182 this.mpcDistance = mpcDistance;
179 this.naDistance = naDistance; 183 this.naDistance = naDistance;
180 this.outDegreeDistance = outDegreeDistance; 184 this.outDegreeDistance = outDegreeDistance;
181 this.typedOutDegreeDistance = typedOutDegreeDistance; 185 this.nodeTypeDistance = nodeTypeDistance;
182 } 186 }
183 187
184 new(double mpcDistance, double naDistance, double outDegreeDistance){ 188 new(double mpcDistance, double naDistance, double outDegreeDistance){
@@ -187,8 +191,8 @@ class MetricDistanceGroup{
187 this.outDegreeDistance = outDegreeDistance; 191 this.outDegreeDistance = outDegreeDistance;
188 } 192 }
189 193
190 def double getTypedOutDegreeDistance(){ 194 def double getNodeTypeDistance(){
191 return this.typedOutDegreeDistance; 195 return this.nodeTypeDistance;
192 } 196 }
193 197
194 def double getMPCDistance(){ 198 def double getMPCDistance(){
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend
index b945d97b..d6adcc9a 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend
@@ -18,13 +18,12 @@ class EuclideanDistance extends CostDistance{
18 var HashMap<String, Double> outDegreePMF; 18 var HashMap<String, Double> outDegreePMF;
19 var DecimalFormat formatter; 19 var DecimalFormat formatter;
20 20
21 new(Domain d){ 21 new(MetricSampleGroup g){
22 var metrics = RepMetricsReader.read(d); 22 this.g = g;
23 this.g = metrics;
24 23
25 var mpcSamples = metrics.mpcSamples; 24 var mpcSamples = g.mpcSamples;
26 var naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); 25 var naSamples = g.naSamples.stream.mapToDouble([it]).toArray();
27 var outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray(); 26 var outDegreeSamples = g.outDegreeSamples.stream.mapToDouble([it]).toArray();
28 27
29 //needs to format the number to string avoid precision issue 28 //needs to format the number to string avoid precision issue
30 formatter = new DecimalFormat("#0.00000"); 29 formatter = new DecimalFormat("#0.00000");
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend
index df65b81f..4a0a0dc3 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend
@@ -1,7 +1,6 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance 1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance
2 2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader
5import com.google.common.collect.Sets 4import com.google.common.collect.Sets
6import java.text.DecimalFormat 5import java.text.DecimalFormat
7import java.util.HashMap 6import java.util.HashMap
@@ -11,13 +10,13 @@ class JSDistance extends CostDistance {
11 var HashMap<String, Double> mpcPMF; 10 var HashMap<String, Double> mpcPMF;
12 var HashMap<String, Double> naPMF; 11 var HashMap<String, Double> naPMF;
13 var HashMap<String, Double> outDegreePMF; 12 var HashMap<String, Double> outDegreePMF;
13 var HashMap<String, Double> nodeTypesPMF;
14 var DecimalFormat formatter; 14 var DecimalFormat formatter;
15 15
16 new(Domain d){ 16 new(MetricSampleGroup g){
17 var metrics = RepMetricsReader.read(d); 17 var mpcSamples = g.mpcSamples;
18 var mpcSamples = metrics.mpcSamples; 18 var naSamples = g.naSamples.stream.mapToDouble([it]).toArray();
19 var naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); 19 var outDegreeSamples = g.outDegreeSamples.stream.mapToDouble([it]).toArray();
20 var outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray();
21 20
22 //needs to format the number to string avoid precision issue 21 //needs to format the number to string avoid precision issue
23 formatter = new DecimalFormat("#0.00000"); 22 formatter = new DecimalFormat("#0.00000");
@@ -25,6 +24,7 @@ class JSDistance extends CostDistance {
25 mpcPMF = pmfFromSamples(mpcSamples, formatter); 24 mpcPMF = pmfFromSamples(mpcSamples, formatter);
26 naPMF = pmfFromSamples(naSamples, formatter); 25 naPMF = pmfFromSamples(naSamples, formatter);
27 outDegreePMF = pmfFromSamples(outDegreeSamples, formatter); 26 outDegreePMF = pmfFromSamples(outDegreeSamples, formatter);
27 nodeTypesPMF = g.nodeTypeSamples;
28 } 28 }
29 29
30 def private combinePMF(HashMap<String, Double> pmf1, HashMap<String, Double> pmf2){ 30 def private combinePMF(HashMap<String, Double> pmf1, HashMap<String, Double> pmf2){
@@ -81,4 +81,8 @@ class JSDistance extends CostDistance {
81 if(map.size < 2) return 1; 81 if(map.size < 2) return 1;
82 return jsDivergence(map, outDegreePMF); 82 return jsDivergence(map, outDegreePMF);
83 } 83 }
84
85 def nodeTypeDistance(HashMap<String, Double> samples){
86 return klDivergence(samples, nodeTypesPMF);
87 }
84} \ No newline at end of file 88} \ 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/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 86f5f23c..08d8704a 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
@@ -1,22 +1,18 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance 1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance
2 2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
6import java.util.HashMap 4import java.util.HashMap
7import java.util.HashSet 5import java.util.HashSet
8import java.util.List 6import java.util.List
9import java.util.Set
10import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest 7import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest
11 8
12class KSDistance extends CostDistance { 9class KSDistance extends CostDistance {
13 var static ksTester = new KolmogorovSmirnovTest(); 10 var static ksTester = new KolmogorovSmirnovTest();
14 var MetricSampleGroup g; 11 var MetricSampleGroup g;
15 new(Domain d){
16 var metrics = RepMetricsReader.read(d);
17 this.g = metrics;
18 }
19 12
13 new(MetricSampleGroup g){
14 this.g = g;
15 }
20 override double mpcDistance(List<Double> samples){ 16 override double mpcDistance(List<Double> samples){
21 //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 17 //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1
22 if(samples.size < 2) return 1; 18 if(samples.size < 2) return 1;
@@ -63,4 +59,27 @@ class KSDistance extends CostDistance {
63 59
64 return value; 60 return value;
65 } 61 }
62
63 def nodeTypeDistance(HashMap<String, Double> samples){
64 var typesDistMap = g.nodeTypeSamples;
65 var sourceDist = newArrayList();
66 var instanceDist = newArrayList();
67
68 for(key : typesDistMap.keySet()){
69 sourceDist.add(typesDistMap.get(key));
70 instanceDist.add(samples.getOrDefault(key, 0.0));
71 }
72
73 // Since we already know the pdf, we compute the ks-test manully
74 var ksStatistics = 0.0;
75 var sum1 = 0.0;
76 var sum2 = 0.0;
77 for(var i = 0; i < sourceDist.size(); i++){
78 sum1 += sourceDist.get(i);
79 sum2 += instanceDist.get(i);
80
81 ksStatistics = Math.max(ksStatistics, Math.abs(sum1 - sum2));
82 }
83 return ksStatistics;
84 }
66} \ No newline at end of file 85} \ 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/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 4ebd59b7..959006f4 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
@@ -24,7 +24,8 @@ class EMFGraph extends Graph{
24 */ 24 */
25 def void init(List<EObject> objects, List<Metric> metrics, String name, List<EReference> referenceTypes){ 25 def void init(List<EObject> objects, List<Metric> metrics, String name, List<EReference> referenceTypes){
26 objects.forEach[it| 26 objects.forEach[it|
27 var types = new HashSet(it.eClass.EAllSuperTypes.map[it|it.name]); 27 // TODO: Maybe want to consider all the super types as well
28 var types = new HashSet();
28 types.add(it.eClass.name); 29 types.add(it.eClass.name);
29 statistic.addNodeWithAllTypes(it, types); 30 statistic.addNodeWithAllTypes(it, types);
30 ] 31 ]
@@ -38,18 +39,13 @@ class EMFGraph extends Graph{
38// )){ 39// )){
39// typeToAdd = it.EOpposite; 40// typeToAdd = it.EOpposite;
40// } 41// }
41 //if(!typeToAdd.name.equals('incomingTransitions')){ 42//
42 statistic.addEdgeType(typeToAdd.name); 43 statistic.addEdgeType(typeToAdd.name);
43 //}
44 ]; 44 ];
45 45
46 objects.forEach[source| 46 objects.forEach[source|
47 source.eClass.EAllReferences.forEach[r| 47 source.eClass.EAllReferences.forEach[r|
48 //add the type first (if it is not added already)
49 //many references 48 //many references
50// if(r.name.equals('incomingTransitions')){
51// return;
52// }
53 if(r.isMany){ 49 if(r.isMany){
54 source.getNeighbours(r).forEach[target| 50 source.getNeighbours(r).forEach[target|
55 addEdge(source, target, r); 51 addEdge(source, target, r);
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend
index bb679bf6..ef68f366 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend
@@ -21,16 +21,19 @@ class PartialInterpretationGraph extends Graph{
21 //only need the name of the reference type (remove everything with and after "reference") 21 //only need the name of the reference type (remove everything with and after "reference")
22 var n = it.name.split(" ").get(0); 22 var n = it.name.split(" ").get(0);
23 // TODO: Here is to only consider one part of opposite edges 23 // TODO: Here is to only consider one part of opposite edges
24 //if(!n.equals('target') && !n.equals('source') /* && !n.equals('incomingTransitions')*/){ 24 if(!n.equals('target') && !n.equals('source') /* && !n.equals('incomingTransitions')*/){
25 this.statistic.addEdgeType(n); 25 this.statistic.addEdgeType(n);
26 //} 26 }
27 ] 27 ]
28 // add all elements 28 // add all elements
29 val typeInterpretations = getTypes(partial); 29 val typeInterpretations = getTypes(partial);
30 for(type : typeInterpretations){ 30 for(type : typeInterpretations){
31 var typeName = type.interpretationOf.name.replace(classSuffix, ''); 31 //Only consider the most concrete class
32 for(node : type.elements){ 32 if(type.interpretationOf.subtypes.size == 0){
33 this.statistic.addNodeWithType(node, typeName); 33 var typeName = type.interpretationOf.name.replace(classSuffix, '');
34 for(node : type.elements){
35 this.statistic.addNodeWithType(node, typeName);
36 }
34 } 37 }
35 } 38 }
36 39
@@ -38,11 +41,11 @@ class PartialInterpretationGraph extends Graph{
38 //only need the name of the reference type (remove everything with and after "reference") 41 //only need the name of the reference type (remove everything with and after "reference")
39 val type = relationInterpretation.interpretationOf.name.split(" ").get(0); 42 val type = relationInterpretation.interpretationOf.name.split(" ").get(0);
40 // TODO: Here is to only consider one part of opposite edges 43 // TODO: Here is to only consider one part of opposite edges
41 //if(!type.equals('target') && !type.equals('source') /*&& !type.equals('incomingTransitions')*/){ 44 if(!type.equals('target') && !type.equals('source') /*&& !type.equals('incomingTransitions')*/){
42 for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ 45 for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){
43 statistic.addEdge(edge.param1, edge.param2, type); 46 statistic.addEdge(edge.param1, edge.param2, type);
44 } 47 }
45 //} 48 }
46 } 49 }
47 50
48 this.name = name; 51 this.name = name;
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 ffec372b..491501b0 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
@@ -24,9 +24,11 @@ import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
24class GraphReader{ 24class GraphReader{
25 val ResourceSet resSet = new ResourceSetImpl(); 25 val ResourceSet resSet = new ResourceSetImpl();
26 val referenceTypes = new ArrayList<EReference>(); 26 val referenceTypes = new ArrayList<EReference>();
27 var String suffix;
27 28
28 new(EPackage metaModel) { 29 new(EPackage metaModel, String suffix) {
29 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl) 30 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl)
31 this.suffix = suffix;
30 32
31 //find all reference types in the meta model 33 //find all reference types in the meta model
32 metaModel.eAllContents.forEach[ 34 metaModel.eAllContents.forEach[
@@ -52,14 +54,14 @@ class GraphReader{
52 metrics.add(new NodeTypeMetric()); 54 metrics.add(new NodeTypeMetric());
53 metrics.add(new EdgeTypeMetric()); 55 metrics.add(new EdgeTypeMetric());
54 56
55 //check all files in the directory with xmi 57 //check all files in the directory with suffix
56 for(String name : dir.list.filter[it| it.endsWith(".xmi")]){ 58 for(String name : dir.list.filter[it| it.endsWith(suffix)]){
57 val file = new File(name); 59 val file = new File(name);
58 val roots = readModel(EObject, path, file.name); 60 val roots = readModel(EObject, path, file.name);
59 //add a list of metrics 61 //add a list of metrics
60 val g = new EMFGraph(); 62 val g = new EMFGraph();
61 for(root : roots){ 63 for(root : roots){
62 g.init(root, metrics, name.replaceFirst(".xmi", ""), referenceTypes); 64 g.init(root, metrics, name.replaceFirst(suffix, ""), referenceTypes);
63 } 65 }
64 66
65 graphs.add(g); 67 graphs.add(g);
@@ -82,7 +84,7 @@ class GraphReader{
82 //add a list of metrics 84 //add a list of metrics
83 val g = new EMFGraph(); 85 val g = new EMFGraph();
84 for(root : roots){ 86 for(root : roots){
85 g.init(root, metrics, filename.replaceFirst(".xmi", ""), referenceTypes); 87 g.init(root, metrics, filename.replaceFirst(suffix, ""), referenceTypes);
86 } 88 }
87 return g 89 return g
88 } 90 }
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
index 2ea12581..6af0b6c7 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
@@ -3,13 +3,14 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup 4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
5import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl 5import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl
6import java.util.HashMap
6 7
7/** 8/**
8 * Read the sample of the distribution of a metric provided the csv file of the metric 9 * Read the sample of the distribution of a metric provided the csv file of the metric
9 */ 10 */
10class RepMetricsReader { 11class RepMetricsReader {
11 static def read(Domain d){ 12 static def read(Domain d){
12 var reader = new GraphReader(YakindummPackageImpl.eINSTANCE); 13 var reader = new GraphReader(YakindummPackageImpl.eINSTANCE, '.xmi');
13 14
14 15
15 var domainRepPath = DataName.REP_PATH + d.name + '/'; 16 var domainRepPath = DataName.REP_PATH + d.name + '/';
@@ -20,7 +21,20 @@ class RepMetricsReader {
20 rep.naSamples = readMetrics(reader, domainRepPath + DataName.NA_REP).naSamples; 21 rep.naSamples = readMetrics(reader, domainRepPath + DataName.NA_REP).naSamples;
21 rep.typedOutDegreeSamples = out_d.typedOutDegreeSamples; 22 rep.typedOutDegreeSamples = out_d.typedOutDegreeSamples;
22 rep.edgeTypeSamples = out_d.edgeTypeSamples; 23 rep.edgeTypeSamples = out_d.edgeTypeSamples;
23 rep.nodeTypeSamples = out_d.nodeTypeSamples; 24
25 //TODO: Parameterize the prior node distribution
26 var nodeTypeSamples = new HashMap<String, Double>();
27 nodeTypeSamples.put('Entry', 0.04257802080554814);
28 nodeTypeSamples.put('Choice', 0.1267671379034409);
29 nodeTypeSamples.put('State', 0.1596092291277674);
30 nodeTypeSamples.put('Transition', 0.6138636969858629);
31 nodeTypeSamples.put('Statechart', 0.010136036276340358);
32 nodeTypeSamples.put('Region', 0.04467858095492131);
33 nodeTypeSamples.put('Exit', 0.0018338223526273673);
34 nodeTypeSamples.put('FinalState', 0.0005334755934915977);
35
36
37 rep.nodeTypeSamples = nodeTypeSamples;
24 return rep; 38 return rep;
25 } 39 }
26 40