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.xtend72
1 files changed, 72 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..d6adcc9a
--- /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,72 @@
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(MetricSampleGroup g){
22 this.g = g;
23
24 var mpcSamples = g.mpcSamples;
25 var naSamples = g.naSamples.stream.mapToDouble([it]).toArray();
26 var outDegreeSamples = g.outDegreeSamples.stream.mapToDouble([it]).toArray();
27
28 //needs to format the number to string avoid precision issue
29 formatter = new DecimalFormat("#0.00000");
30
31 mpcPMF = pmfFromSamples(mpcSamples, formatter);
32 naPMF = pmfFromSamples(naSamples, formatter);
33 outDegreePMF = pmfFromSamples(outDegreeSamples, formatter);
34 }
35
36 override naDistance(List<Double> samples) {
37 var pmfMap = pmfFromSamples(samples, formatter);
38 return euclideanDistance(pmfMap, naPMF);
39 }
40
41 override mpcDistance(List<Double> samples) {
42 var pmfMap = pmfFromSamples(samples, formatter);
43 return euclideanDistance(pmfMap, mpcPMF);
44 }
45
46 override outDegreeDistance(List<Double> samples) {
47 var pmfMap = pmfFromSamples(samples, formatter);
48 return euclideanDistance(pmfMap, outDegreePMF);
49 }
50
51
52 def private euclideanDistance(HashMap<String, Double> pmf1, HashMap<String, Double> pmf2){
53 var keys = Sets.union(pmf1.keySet(), pmf2.keySet());
54 var pmfList1 = pmfMapToList(pmf1, keys);
55 var pmfList2 = pmfMapToList(pmf2, keys);
56 var distance = 0.0;
57 for(var i = 0; i < pmfList1.size(); i++){
58 distance += Math.pow(pmfList1.get(i) + pmfList2.get(i), 2);
59 }
60
61 return Math.sqrt(distance);
62 }
63
64 def private pmfMapToList(Map<String, Double> map, Set<String> keys){
65 var list = new ArrayList<Double>();
66 for(key : keys){
67 var value = map.getOrDefault(key, 0.0);
68 list.add(value);
69 }
70 return list;
71 }
72} \ No newline at end of file