aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend
diff options
context:
space:
mode:
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.xtend73
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 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance
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
6import com.google.common.collect.Sets
7import java.text.DecimalFormat
8import java.util.ArrayList
9import java.util.HashMap
10import java.util.List
11import java.util.Map
12import java.util.Set
13
14class 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