aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io
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/io')
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/CsvFileWriter.xtend37
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend81
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend79
3 files changed, 197 insertions, 0 deletions
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/CsvFileWriter.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/CsvFileWriter.xtend
new file mode 100644
index 00000000..bed356e9
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/CsvFileWriter.xtend
@@ -0,0 +1,37 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io;
2
3import java.io.File
4import java.io.FileNotFoundException
5import java.io.PrintWriter
6import java.util.ArrayList
7import java.util.List
8
9class CsvFileWriter {
10 def static void write(ArrayList<ArrayList<String>> datas, String uri) {
11 if(datas.size() <= 0) {
12 return;
13 }
14
15 //println("Output csv for " + uri);
16 try {
17 val PrintWriter writer = new PrintWriter(new File(uri));
18 val output = new StringBuilder;
19 for(List<String> datarow : datas){
20 for(var i = 0; i < datarow.size() - 1; i++){
21 output.append(datarow.get(i) + ',');
22 }
23
24 if(datarow.size > 1){
25 output.append(datarow.get(datarow.size() - 1));
26 output.append('\n');
27 }
28 }
29
30 writer.write(output.toString());
31 writer.close();
32 //println("Output csv finished");
33 }catch(FileNotFoundException e) {
34 e.printStackTrace();
35 }
36 }
37}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
new file mode 100644
index 00000000..fc56e142
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
@@ -0,0 +1,81 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io;
2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric
6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric
7import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric
8import java.io.File
9import java.io.FileNotFoundException
10import java.util.ArrayList
11import java.util.List
12import org.eclipse.emf.common.util.URI
13import org.eclipse.emf.ecore.EObject
14import org.eclipse.emf.ecore.EPackage
15import org.eclipse.emf.ecore.EReference
16import org.eclipse.emf.ecore.resource.Resource
17import org.eclipse.emf.ecore.resource.ResourceSet
18import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
19import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
20
21class GraphReader{
22 val ResourceSet resSet = new ResourceSetImpl();
23 val referenceTypes = new ArrayList<String>();
24
25 new(EPackage metaModel) {
26 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl)
27
28 //find all reference types in the meta model
29 metaModel.eAllContents.forEach[
30 if(it instanceof EReference){
31 referenceTypes.add(it.name);
32 }
33 ]
34 }
35
36 def List<EMFGraph> readModels(String path){
37 val dir = new File(path);
38 if(!dir.isDirectory){
39 throw new Exception("expecting a directory");
40 }
41
42 val graphs = new ArrayList<EMFGraph>();
43
44 val metrics = new ArrayList<Metric>();
45 metrics.add(new OutDegreeMetric());
46 metrics.add(new NodeActivityMetric());
47 metrics.add(new MultiplexParticipationCoefficientMetric());
48
49 //check all files in the directory with xmi
50 for(String name : dir.list.filter[it| it.endsWith(".xmi")]){
51 val file = new File(name);
52 val roots = readModel(EObject, path, file.name);
53 //add a list of metrics
54 val g = new EMFGraph();
55 for(root : roots){
56 g.init(root, metrics, name.replaceFirst(".xmi", ""), referenceTypes);
57 }
58
59 graphs.add(g);
60 }
61
62 return graphs;
63 }
64
65 def <RootType extends EObject> List<RootType> readModel(Class<RootType> type, String path, String name) {
66 try {
67 val resource = resSet.getResource(getURI(path, name),true);
68 if(resource === null) throw new FileNotFoundException(getURI(path, name).toString)
69 else {
70 return resource.contents as List<RootType>
71 }
72 } catch(Exception e) {
73 e.printStackTrace();
74 throw new FileNotFoundException(getURI(path, name).toString + "reason: " + e.message)
75 }
76 }
77
78 def static getURI(String path, String name) {
79 URI.createFileURI(path + "/" + name)
80 }
81} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
new file mode 100644
index 00000000..867ddd1a
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
@@ -0,0 +1,79 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io
2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric
6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric
7import java.io.File
8import java.util.List
9import java.util.Scanner
10import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
11
12/**
13 * Read the sample of the distribution of a metric provided the csv file of the metric
14 */
15class RepMetricsReader {
16 static def read(Domain d){
17 var domainRepPath = CsvDataName.REP_PATH + d.name + '/';
18 var rep = new MetricSampleGroup()
19 rep.mpcSamples = readFile(domainRepPath + CsvDataName.MPC_REP, MultiplexParticipationCoefficientMetric.valueName,
20 MultiplexParticipationCoefficientMetric.countName).map[Double.parseDouble(it)];
21 rep.naSamples = readFile(domainRepPath+CsvDataName.NA_REP, NodeActivityMetric.valueName, NodeActivityMetric.countName
22 ).map[Double.parseDouble(it)];
23 rep.outDegreeSamples = readFile(domainRepPath+CsvDataName.OUT_D_REP, OutDegreeMetric.valueName, OutDegreeMetric.countName
24 ).map[Double.parseDouble(it)];
25 return rep;
26 }
27
28 /**
29 * read metric data and parse it to samples
30 */
31 private static def List<String> readFile(String filename, String valueDataName, String countDataName){
32 var s = new Scanner(new File(filename));
33 val counts = newArrayList();
34 val values = newArrayList();
35 //read data from csv
36 while(s.hasNext()){
37 var data = s.nextLine().split(',');
38
39 if(data.size >= 1){
40 if(data.get(0).equals(countDataName)){
41 //add all data with parsing them as integers
42 counts.addAll(data.subList(1, data.size()).map[Integer.parseInt(it)]);
43 }else if(data.get(0).equals(valueDataName)){
44 //add all data without parsing (there can be either double or string, to be parsed later)
45 values.addAll(data.subList(1, data.size()));
46 }
47 }
48 }
49
50 return createSamples(counts, values);
51 }
52
53 // create samples from values and counts
54 private static def List<String> createSamples(List<Integer> counts, List<String> values){
55 val samples = newArrayList();
56
57 if(counts.size() != values.size()){
58 throw new RuntimeException("counts and values should have the same size!");
59 }
60
61 for(var i = 0; i < counts.size(); i++){
62 for(var j = 0; j < counts.get(i); j++){
63 samples.add(values.get(i));
64 }
65 }
66
67 return samples;
68 }
69
70
71}
72
73class CsvDataName{
74 public static val REP_PATH = 'data/';
75 public static val MPC_REP = 'mpc_rep.csv';
76 public static val NA_REP = 'na_rep.csv';
77 public static val OUT_D_REP = 'out_d_rep.csv';
78}
79