diff options
author | 20001LastOrder <boqi.chen@mail.mcgill.ca> | 2019-07-31 14:45:06 -0400 |
---|---|---|
committer | 20001LastOrder <boqi.chen@mail.mcgill.ca> | 2019-07-31 14:45:06 -0400 |
commit | 5e8b8c3a817dd9f7ae46338b6dbd3684dfb885fe (patch) | |
tree | 61b473589e5e43a58481ea28b7bbeeaf0860dcdb /Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill | |
parent | consider node types during generation (diff) | |
download | VIATRA-Generator-5e8b8c3a817dd9f7ae46338b6dbd3684dfb885fe.tar.gz VIATRA-Generator-5e8b8c3a817dd9f7ae46338b6dbd3684dfb885fe.tar.zst VIATRA-Generator-5e8b8c3a817dd9f7ae46338b6dbd3684dfb885fe.zip |
Further development of realistic solver, create generation config for ecore models
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill')
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 | |||
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader | 5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader |
6 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl | 6 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl |
7 | import java.util.ArrayList | 7 | import java.util.ArrayList |
8 | import 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 | |||
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance | 5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance |
6 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.StateData | 6 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.StateData |
7 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph | 7 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph |
8 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | ||
8 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric | 9 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric |
10 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | ||
9 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric | 11 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric |
10 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric | 12 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric |
13 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric | ||
11 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric | 14 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric |
12 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedOutDegree | ||
13 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.predictor.LinearModel | 15 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.predictor.LinearModel |
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | 16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation |
15 | import java.util.ArrayList | 17 | import java.util.ArrayList |
@@ -18,7 +20,6 @@ import java.util.List | |||
18 | import java.util.Map | 20 | import java.util.Map |
19 | import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression | 21 | import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression |
20 | import org.eclipse.xtend.lib.annotations.Accessors | 22 | import org.eclipse.xtend.lib.annotations.Accessors |
21 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric | ||
22 | 23 | ||
23 | class PartialInterpretationMetricDistance { | 24 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance | 1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance |
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup |
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | ||
5 | import com.google.common.collect.Sets | 4 | import com.google.common.collect.Sets |
6 | import java.text.DecimalFormat | 5 | import java.text.DecimalFormat |
7 | import java.util.HashMap | 6 | import 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance | 1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance |
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain | ||
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | ||
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup |
6 | import java.util.HashMap | 4 | import java.util.HashMap |
7 | import java.util.HashSet | 5 | import java.util.HashSet |
8 | import java.util.List | 6 | import java.util.List |
9 | import java.util.Set | ||
10 | import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest | 7 | import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest |
11 | 8 | ||
12 | class KSDistance extends CostDistance { | 9 | class 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 | |||
24 | class GraphReader{ | 24 | class 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 | |||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain |
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | 4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup |
5 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl | 5 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl |
6 | import 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 | */ |
10 | class RepMetricsReader { | 11 | class 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 | ||