diff options
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend')
-rw-r--r-- | Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend | 73 |
1 files changed, 73 insertions, 0 deletions
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 new file mode 100644 index 00000000..b945d97b --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend | |||
@@ -0,0 +1,73 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance | ||
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 | ||
6 | import com.google.common.collect.Sets | ||
7 | import java.text.DecimalFormat | ||
8 | import java.util.ArrayList | ||
9 | import java.util.HashMap | ||
10 | import java.util.List | ||
11 | import java.util.Map | ||
12 | import java.util.Set | ||
13 | |||
14 | class EuclideanDistance extends CostDistance{ | ||
15 | var MetricSampleGroup g; | ||
16 | var HashMap<String, Double> mpcPMF; | ||
17 | var HashMap<String, Double> naPMF; | ||
18 | var HashMap<String, Double> outDegreePMF; | ||
19 | var DecimalFormat formatter; | ||
20 | |||
21 | new(Domain d){ | ||
22 | var metrics = RepMetricsReader.read(d); | ||
23 | this.g = metrics; | ||
24 | |||
25 | var mpcSamples = metrics.mpcSamples; | ||
26 | var naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); | ||
27 | var outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray(); | ||
28 | |||
29 | //needs to format the number to string avoid precision issue | ||
30 | formatter = new DecimalFormat("#0.00000"); | ||
31 | |||
32 | mpcPMF = pmfFromSamples(mpcSamples, formatter); | ||
33 | naPMF = pmfFromSamples(naSamples, formatter); | ||
34 | outDegreePMF = pmfFromSamples(outDegreeSamples, formatter); | ||
35 | } | ||
36 | |||
37 | override naDistance(List<Double> samples) { | ||
38 | var pmfMap = pmfFromSamples(samples, formatter); | ||
39 | return euclideanDistance(pmfMap, naPMF); | ||
40 | } | ||
41 | |||
42 | override mpcDistance(List<Double> samples) { | ||
43 | var pmfMap = pmfFromSamples(samples, formatter); | ||
44 | return euclideanDistance(pmfMap, mpcPMF); | ||
45 | } | ||
46 | |||
47 | override outDegreeDistance(List<Double> samples) { | ||
48 | var pmfMap = pmfFromSamples(samples, formatter); | ||
49 | return euclideanDistance(pmfMap, outDegreePMF); | ||
50 | } | ||
51 | |||
52 | |||
53 | def private euclideanDistance(HashMap<String, Double> pmf1, HashMap<String, Double> pmf2){ | ||
54 | var keys = Sets.union(pmf1.keySet(), pmf2.keySet()); | ||
55 | var pmfList1 = pmfMapToList(pmf1, keys); | ||
56 | var pmfList2 = pmfMapToList(pmf2, keys); | ||
57 | var distance = 0.0; | ||
58 | for(var i = 0; i < pmfList1.size(); i++){ | ||
59 | distance += Math.pow(pmfList1.get(i) + pmfList2.get(i), 2); | ||
60 | } | ||
61 | |||
62 | return Math.sqrt(distance); | ||
63 | } | ||
64 | |||
65 | def private pmfMapToList(Map<String, Double> map, Set<String> keys){ | ||
66 | var list = new ArrayList<Double>(); | ||
67 | for(key : keys){ | ||
68 | var value = map.getOrDefault(key, 0.0); | ||
69 | list.add(value); | ||
70 | } | ||
71 | return list; | ||
72 | } | ||
73 | } \ No newline at end of file | ||