aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java
blob: 261f32cc16bb61104f274f5df0b3b17eb740174a (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package ca.mcgill.ecse.socialnetwork.runner;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Map;

import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain;
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance;
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph;
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter;
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader;
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup;
import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor;
import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.validation.ViolationCheck;
import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage;
import socialnetwork.Person;

public class Main {
	
	private static String runWithPath(String path) {
		String message = StandaloneScriptExecutor.executeScript(path);
		return message;
	}
	
	private static String configFolder = "yakinduum/config15/";
	private static String configFileName = configFolder + "info_new_metric.csv";
	private static String aggregateViolationMeasureFileName = configFolder + "aggregateInfo.csv";
	private static String fileReadFolder = "output/Viatra_100/";
	
	public static void main(String args[]) {
		
		
		long begin = System.currentTimeMillis();
		String message = runWithPath("yakinduGeneration.vsconfig");
		long elapsed = System.currentTimeMillis() - begin;

		if(message != null) {
			return;
		}
		ArrayList<ArrayList<String>> output = new ArrayList<ArrayList<String>>();
		String time = formatTime(elapsed);
		ArrayList<String> infoOutput = new ArrayList<String>();
		infoOutput.add(time);
		output.add(infoOutput);
		System.out.println(time);
		CsvFileWriter.write(output, configFileName);
		
		
		output = new ArrayList<ArrayList<String>>();
		output.add(prepareInfo());
		CsvFileWriter.append(output, configFileName);
		
		for(int i = 0; i < 50; i++) {
			generateModel(i+1);
		}
		//aggregateViolationMeasure(50);
		System.out.println("Finished");
	}

	public static void generateModel(int run) {
		String filename = run+"_1.xmi";
		//prepare initial info
		ArrayList<ArrayList<String>> output = new ArrayList<ArrayList<String>>();
		ArrayList<String> infoOutput = new ArrayList<String>();
		infoOutput.add(run+ "");
		infoOutput.addAll(calculateMetric(run));

		YakinduumModel model = new YakinduumModel(fileReadFolder +"run" +run + "/" + filename);
		int violationCount = ViolationCheck.calculateViolationCounts(model.yakinduum);
		infoOutput.add(violationCount + "");

		
		
		//save model to another directory
		model.save(configFolder + run + ".xmi");
		output.add(infoOutput);
		CsvFileWriter.append(output, configFileName);
	}
	
	public static void singleModelViolationMeasure(int run) {
		String filename = run+"_1.xmi";
		//prepare initial info
		ArrayList<ArrayList<String>> output = new ArrayList<ArrayList<String>>();
		ArrayList<String> infoOutput = new ArrayList<String>();
		infoOutput.add(run+ "");

		YakinduumModel model = new YakinduumModel("output/Viatra_100/run"+run+"/"+ filename);
		
		//parse map of violation counts to two list and add them to the result list 
		Map<String, Integer> map = ViolationCheck.violationMaps(model.yakinduum);
		ArrayList<String> counts = new ArrayList<String>();
		ArrayList<String> violationNames = new ArrayList<String>(map.keySet());
		for(int i = 0; i < violationNames.size(); i++) {
			String name = violationNames.get(i);
			int total = map.get(name);
			counts.add(total + "");
		}
		output.add(infoOutput);
		output.add(violationNames);
		output.add(counts);
		
		CsvFileWriter.append(output, configFileName);
	}
	
	public static void aggregateViolationMeasure(int size) {
		ArrayList<ArrayList<String>> output = new ArrayList<ArrayList<String>>();
		ArrayList<String> counts = new ArrayList<String>();
		ArrayList<String> violationNames = null;
		for(int run = 1; run < size+1; run++) {
			String filename = run+"_1.xmi";
			YakinduumModel model = new YakinduumModel("output/Viatra_100/run"+run+"/"+ filename);

			Map<String, Integer> map = ViolationCheck.violationMaps(model.yakinduum);
			if(run == 1) {
				violationNames = new ArrayList<String>(map.keySet());
				for(int i = 0; i < violationNames.size(); i++) {
					String name = violationNames.get(i);
					int total = map.get(name);
					counts.add(total + "");
				}
			}else {
				for(int i = 0; i < violationNames.size(); i++) {
					int count = Integer.parseInt(counts.get(i));
					String name = violationNames.get(i);
					int total = count + map.get(name);
					counts.set(i, total + "");
				}
			}
		}
		
		for(int i = 0; i < counts.size(); i++) {
			double count = Integer.parseInt(counts.get(i)) / (double) size;
			counts.set(i, count + "");
		}
		
		output.add(violationNames);
		output.add(counts);
		CsvFileWriter.write(output, aggregateViolationMeasureFileName);
	}
	
	public static ArrayList<String> calculateMetric(int run) {
		//read model and metric
		ArrayList<String> output = new ArrayList<String>();
		GraphReader reader = new GraphReader(YakindummPackage.eINSTANCE);
		EMFGraph graph = reader.readModel(fileReadFolder+"/run"+run, run + "_1.xmi");
		
		//KS distance
		KSDistance ks = new KSDistance(Domain.Yakinduum);
		
		//calculate and put metric data to output array
		MetricSampleGroup samples = graph.evaluateAllMetricsToSamples();
		output.add(graph.getStatistic().getAllNodes().size() + "");
		output.add(ks.outDegreeDistance(samples.outDegreeSamples) + "");
		output.add(ks.naDistance(samples.naSamples)+ "");
		output.add(ks.mpcDistance(samples.mpcSamples) + "");
		output.add(ks.typedOutDegreeDistance(samples.typedOutDegreeSamples) + "");
		return output;
	}
	
	public static ArrayList<String> prepareInfo() {
		ArrayList<String> info = new ArrayList<String>();
		info.add("ID");
		info.add("# of Nodes");
		info.add("Out Degree");
		info.add("Node Activity");
		info.add("MPC");
		info.add("Typed Out Degree");
		info.add("Violations");
		return info;
	}
	
	public static String formatTime(long time) {
		long mili = time % 1000;
		long second = (time / 1000) % 60;
		long minute = (time / (1000 * 60));
		return String.format("%d : %d.%d", minute, second, mili);
	}
	
	public static void statistics() {
		String uri = "output/1.xmi";
		SocialNetworkModel socialNetwork = new SocialNetworkModel(uri);
		System.out.println(socialNetwork.getPersons().size());
		
		File file = new File("model/statistics/output.txt");
		try {
			@SuppressWarnings("resource")
			PrintStream out = new PrintStream(file);
			for(Person p : socialNetwork.getPersons()) {
				out.println(p.getFriends().size());
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		System.out.println("Output Finished");
	}
}