aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.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/app/PartialInterpretationMetric.xtend')
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend124
1 files changed, 124 insertions, 0 deletions
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend
new file mode 100644
index 00000000..cdd06027
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend
@@ -0,0 +1,124 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app
2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter
6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric
7import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric
8import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric
9import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric
10import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
11import java.io.File
12import java.io.FileNotFoundException
13import java.io.PrintWriter
14import java.util.ArrayList
15import java.util.List
16import org.eclipse.emf.ecore.util.EcoreUtil
17import org.eclipse.viatra.dse.api.Solution
18
19class PartialInterpretationMetric {
20 var static state = 0;
21 var static KSDistance ks;
22
23 def static void initPaths(){
24 new File("debug/metric/").mkdir();
25 new File("debug/metric/trajectories/").mkdir();
26 ks = new KSDistance(Domain.Yakinduum);
27 }
28
29 def static MetricDistanceGroup calculateMetricDistance(PartialInterpretation partial){
30 val metrics = new ArrayList<Metric>();
31 metrics.add(new OutDegreeMetric());
32 metrics.add(new NodeActivityMetric());
33 metrics.add(new MultiplexParticipationCoefficientMetric());
34
35 val metricCalculator = new PartialInterpretationGraph(partial, metrics, null);
36 var metricSamples = metricCalculator.evaluateAllMetricsToSamples();
37
38 var mpc = ks.mpcDistance(metricSamples.mpcSamples);
39 var na = ks.naDistance(metricSamples.naSamples);
40 var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples);
41
42 return new MetricDistanceGroup(mpc, na, outDegree);
43 }
44
45 // calculate the metrics for a state
46 def static void calculateMetric(PartialInterpretation partial, String path, String currentStateId, Integer counter){
47 val metrics = new ArrayList<Metric>();
48 metrics.add(new OutDegreeMetric());
49 metrics.add(new NodeActivityMetric());
50 metrics.add(new MultiplexParticipationCoefficientMetric());
51
52 //make dir since the folder can be none existing
53 new File(path).mkdir();
54 val filename = path + "/state_"+currentStateId+"-"+counter+".csv";
55 state++;
56 val metricCalculator = new PartialInterpretationGraph(partial, metrics, currentStateId);
57
58 CsvFileWriter.write(metricCalculator.evaluateAllMetrics(), filename);
59 }
60
61 def static void outputTrajectories(PartialInterpretation empty, List<Solution> solutions){
62 for(solution : solutions){
63 //need to copy the empty solution because the transition directly worked on the graph
64 val emptySolutionCopy = EcoreUtil.copy(empty)
65 val trajectory = solution.shortestTrajectory;
66 trajectory.modelWithEditingDomain = emptySolutionCopy
67
68 // state codes that will record the trajectory
69 val stateCodes = newArrayList()
70
71 var counter = 0
72 //transform and record the state codes for each state
73 while(trajectory.doNextTransformation){
74 //println(trajectory.stateCoder.createStateCode)
75 val stateId = trajectory.stateCoder.createStateCode.toString
76 val interpretation = trajectory.getModel();
77 //calculate metrics of current state
78 calculateMetric(interpretation as PartialInterpretation, "debug/metric/output", stateId, counter)
79 stateCodes.add(stateId)
80 counter++
81 }
82
83
84 //output the trajectory
85 try{
86 new File("debug/metric/trajectories/").mkdir();
87 val path = "debug/metric/trajectories/trajectory"+trajectory.stateCoder.createStateCode.toString+".csv"
88 val PrintWriter writer = new PrintWriter(new File(path))
89 val output = new StringBuilder
90 for(stateCode : stateCodes){
91 output.append(stateCode+'\n')
92 }
93 writer.write(output.toString())
94 writer.close()
95 }catch(FileNotFoundException e) {
96 e.printStackTrace()
97 }
98 }
99 }
100}
101
102class MetricDistanceGroup{
103 var double mpcDistance;
104 var double naDistance;
105 var double outDegreeDistance;
106
107 new(double mpcDistance, double naDistance, double outDegreeDistance){
108 this.mpcDistance = mpcDistance;
109 this.naDistance = naDistance;
110 this.outDegreeDistance = outDegreeDistance;
111 }
112
113 def double getMPCDistance(){
114 return this.mpcDistance
115 }
116
117 def double getNADistance(){
118 return this.naDistance
119 }
120
121 def double getOutDegreeDistance(){
122 return this.outDegreeDistance
123 }
124} \ No newline at end of file