diff options
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend')
-rw-r--r-- | Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend | 69 |
1 files changed, 44 insertions, 25 deletions
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 58e0a8a3..86f5f23c 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 | |||
@@ -2,46 +2,65 @@ 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.app.Domain |
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | 4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader |
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | ||
6 | import java.util.HashMap | ||
7 | import java.util.HashSet | ||
5 | import java.util.List | 8 | import java.util.List |
9 | import java.util.Set | ||
6 | import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest | 10 | import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest |
7 | 11 | ||
8 | class KSDistance { | 12 | class KSDistance extends CostDistance { |
9 | var static ksTester = new KolmogorovSmirnovTest(); | 13 | var static ksTester = new KolmogorovSmirnovTest(); |
10 | var double[] mpcSamples; | 14 | var MetricSampleGroup g; |
11 | var double[] naSamples; | ||
12 | var double[] outDegreeSamples; | ||
13 | |||
14 | new(Domain d){ | 15 | new(Domain d){ |
15 | var metrics = RepMetricsReader.read(d); | 16 | var metrics = RepMetricsReader.read(d); |
16 | mpcSamples = metrics.mpcSamples; | 17 | this.g = metrics; |
17 | naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); | ||
18 | outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray(); | ||
19 | } | 18 | } |
20 | 19 | ||
21 | def double mpcDistance(List<Double> samples){ | 20 | override double mpcDistance(List<Double> samples){ |
22 | // map list to array | ||
23 | var arr = samples.stream.mapToDouble([it]).toArray(); | ||
24 | |||
25 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 | 21 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 |
26 | if(arr.size < 2) return 1; | 22 | if(samples.size < 2) return 1; |
27 | return ksTester.kolmogorovSmirnovStatistic(mpcSamples, arr); | 23 | return ksTester.kolmogorovSmirnovStatistic(g.mpcSamples, samples); |
28 | } | 24 | } |
29 | 25 | ||
30 | def double naDistance(List<Double> samples){ | 26 | override double naDistance(List<Double> samples){ |
31 | // map list to array | ||
32 | var arr = samples.stream.mapToDouble([it]).toArray(); | ||
33 | |||
34 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 | 27 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 |
35 | if(arr.size < 2) return 1; | 28 | if(samples.size < 2) return 1; |
36 | return ksTester.kolmogorovSmirnovStatistic(naSamples as double[], arr); | 29 | return ksTester.kolmogorovSmirnovStatistic(g.naSamples as double[], samples); |
37 | } | 30 | } |
38 | 31 | ||
39 | def double outDegreeDistance(List<Double> samples){ | 32 | override double outDegreeDistance(List<Double> samples){ |
33 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 | ||
34 | if(samples.size < 2) return 1; | ||
35 | return ksTester.kolmogorovSmirnovStatistic(g.outDegreeSamples, samples); | ||
36 | } | ||
37 | |||
38 | def double typedOutDegreeDistance(HashMap<String, List<Integer>> map){ | ||
39 | var value = 0.0; | ||
40 | // map list to array | 40 | // map list to array |
41 | var arr = samples.stream.mapToDouble([it]).toArray(); | 41 | val keySet = new HashSet<String>(map.keySet); |
42 | keySet.addAll(g.typedOutDegreeSamples.keySet); | ||
43 | for(key : keySet){ | ||
44 | if(!map.containsKey(key) ){ | ||
45 | value += 1; | ||
46 | }else if(!g.typedOutDegreeSamples.containsKey(key)){ | ||
47 | value += map.get(key).size * 100; | ||
48 | }else{ | ||
49 | var double[] rep = g.typedOutDegreeSamples.get(key).stream().mapToDouble([it|it]).toArray(); | ||
50 | var double[] ins = map.get(key).stream().mapToDouble([it|it]).toArray(); | ||
51 | if((rep.size < 2 || ins.size < 2) ){ | ||
52 | if(rep.size < 2 && rep.containsAll(ins)){ | ||
53 | value += 0; | ||
54 | }else{ | ||
55 | value += 1; | ||
56 | } | ||
57 | }else if(rep.size >= 2 && ins.size >= 2){ | ||
58 | value += ksTester.kolmogorovSmirnovStatistic(rep, ins); | ||
59 | } | ||
60 | } | ||
61 | } | ||
42 | 62 | ||
43 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 | 63 | |
44 | if(arr.size < 2) return 1; | 64 | return value; |
45 | return ksTester.kolmogorovSmirnovStatistic(outDegreeSamples, arr); | ||
46 | } | 65 | } |
47 | } \ No newline at end of file | 66 | } \ No newline at end of file |