aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.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/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.xtend69
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
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader 4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
6import java.util.HashMap
7import java.util.HashSet
5import java.util.List 8import java.util.List
9import java.util.Set
6import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest 10import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest
7 11
8class KSDistance { 12class 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