aboutsummaryrefslogtreecommitdiffstats
path: root/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/logic/model/statistics/StatisticSections2CSV.xtend
blob: 442de6d9727d56677bd3626b4e7f5c6f4ff0421c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package hu.bme.mit.inf.dslreasoner.logic.model.statistics

import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.IntStatisticEntry
import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.RealStatisticEntry
import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.Statistics
import java.util.ArrayList
import java.util.HashMap
import java.util.LinkedList
import java.util.List
import java.util.Map

class StatisticsData {
	public var List<Pair<String,String>> inputConfiguration
	public var List<Pair<String,String>> outputMetrics
	public var Statistics solverStatistics
}

class StatisticSections2CSV {
	static val separator = ';'
	static val empty = ""
	
	private def getValue(Map<String, String> map,String key) {
		if(map.containsKey(key)) return map.get(key)
		else return empty
	}
	private def addKey(List<String> list, String newValue) {
		if(! list.contains(newValue)) list+=newValue
	}
	
	public def CharSequence transformStatisticDatas2CSV(
		List<StatisticsData> statistics)
	{
		val inputConfigurationColumns = new LinkedList
		val inputConfigurationValues = new ArrayList(statistics.length)
		val solverStatisticColumns = new LinkedList
		val solverStatisticValues = new ArrayList(statistics.length)
		val outputMetricColumns = new LinkedList
		val outputMetricValues = new ArrayList(statistics.length)
		
		statistics.map[inputConfiguration].indexColumnsForPairs(inputConfigurationColumns, inputConfigurationValues)
		statistics.map[it.solverStatistics].indexColumnsForEntries(solverStatisticColumns, solverStatisticValues)
		statistics.map[outputMetrics].indexColumnsForPairs(outputMetricColumns,outputMetricValues)
				
		return '''
		ID« // Header
		IF inputConfigurationColumns.length>0»«separator»«FOR name : inputConfigurationColumns SEPARATOR separator»«name»«ENDFOR»«ENDIF»«
		separator»Transformation_Time«separator»Solver_Time«separator»Solver_Memory«
		IF solverStatisticColumns.length>0»«separator»«ENDIF»«
		FOR name:solverStatisticColumns SEPARATOR separator»«name»«ENDFOR»«
		IF outputMetricColumns.length>0»«separator»«ENDIF»«
		FOR name:outputMetricColumns SEPARATOR separator»«name»«ENDFOR»
		« // Table
		FOR index : 0..<statistics.size»
		«index+1 /*ID*/»«
			IF inputConfigurationColumns.size>0»«separator»«ENDIF»«
			FOR name : inputConfigurationColumns SEPARATOR separator»«inputConfigurationValues.get(index).getValue(name)»«ENDFOR»«
				separator»«statistics.get(index).solverStatistics.transformationTime»«
				separator»«statistics.get(index).solverStatistics.solverTime»«
				separator»«statistics.get(index).solverStatistics.solverMemory»«
			IF solverStatisticColumns.size>0»«separator»«ENDIF»«
			FOR name:solverStatisticColumns SEPARATOR separator»«solverStatisticValues.get(index).getValue(name)»«ENDFOR»«
			IF outputMetricColumns.size>0»«separator»«ENDIF»«
			FOR name:outputMetricColumns SEPARATOR separator»«outputMetricValues.get(index).getValue(name)»«ENDFOR»
		«ENDFOR»'''
	}
	
	def private indexColumnsForPairs(List<List<Pair<String, String>>> datas, List<String> columns, List<Map<String, String>> values) {
		for(inputConfiguration : datas) {
			val map = new HashMap
			for(entry : inputConfiguration) {
				columns.addKey(entry.key)
				map.put(entry.key,entry.value)	
			}
			values+=map
		}
	}
	def private indexColumnsForEntries(List<Statistics> datas, List<String> columns, List<Map<String, String>> values) {
		for(inputConfiguration : datas) {
			val map = new HashMap
			for(entry : inputConfiguration.entries) {
				columns.addKey(entry.name)
				map.put(entry.name,entry.readValue)	
			}
			values+=map
		}
	}
	private def dispatch String readValue(IntStatisticEntry e) { return e.value.toString }
	private def dispatch String readValue(RealStatisticEntry e){ return e.value.toString }
}