1 /**
2 *
3 */
4 package org.softevo.jdynpur.eval;
5
6 import java.io.File;
7 import java.io.IOException;
8 import java.io.Serializable;
9 import java.text.DecimalFormat;
10 import java.text.NumberFormat;
11 import java.util.Vector;
12
13 import org.apache.commons.io.FileUtils;
14 import org.softevo.util.io.ObjectReaderWriter;
15
16 public class AnalysisLog implements Serializable {
17
18 private static final long serialVersionUID = -8424142076625414879L;
19
20 private Vector<Vector<Long>> innerTraceChanges = new Vector<Vector<Long>>();
21
22 private Vector<Integer> innerTracePureMethods = new Vector<Integer>();
23
24 private Vector<Integer> innerTraceImpureMethods = new Vector<Integer>();
25
26 private Vector<Integer> innerTraceExecutedMethods = new Vector<Integer>();
27
28 private Vector<Integer> overallPureMethods = new Vector<Integer>();
29
30 private Vector<Integer> overallImpureMethods = new Vector<Integer>();
31
32 private Vector<Integer> overallExecutedMethods = new Vector<Integer>();
33
34 private Vector<Integer> oldPurityRevised = new Vector<Integer>();
35
36 private Vector<Integer> newPurityKilled = new Vector<Integer>();
37
38 private Vector<Integer> overallParameterFlips = new Vector<Integer>();
39
40 private Vector<Integer> overallImmutableParameters = new Vector<Integer>();
41
42 private Vector<Integer> overallMutableParameters = new Vector<Integer>();
43
44 private Vector<Vector<Long>> innerTraceParameterFlips = new Vector<Vector<Long>>();
45
46 private Vector<int[]> traceComparisonResults = new Vector<int[]>();
47
48 private Vector<int[]> overallComparisonResults = new Vector<int[]>();
49
50 public AnalysisLog() {
51 }
52
53 public void addOverallImmutableParameter(int data) {
54 overallImmutableParameters.add(data);
55 }
56
57 public void addOverallMutableParameter(int data) {
58 overallMutableParameters.add(data);
59 }
60
61 public void addOverallComparisonResults(int[] results) {
62 overallComparisonResults.add(results);
63 }
64
65 public void addTraceComparisonResults(int[] results) {
66 traceComparisonResults.add(results);
67 }
68
69 public void addInnerTraceParameterFlips(Vector<Long> data) {
70 innerTraceParameterFlips.add(data);
71 }
72
73 public void addOverallParameterFlips(int value) {
74 overallParameterFlips.add(value);
75 }
76
77 public void addNewPurityKilled(int value) {
78 newPurityKilled.add(value);
79 }
80
81 public void addOldPurityRevised(int value) {
82 oldPurityRevised.add(value);
83 }
84
85 public void addInnerTraceChanges(Vector<Long> changes) {
86 innerTraceChanges.add(changes);
87 }
88
89 public void addInnerTracePureMethods(int value) {
90 innerTracePureMethods.add(value);
91 }
92 public void addInnerTraceImpureMethods(int value) {
93 innerTraceImpureMethods.add(value);
94 }
95 public void addInnerTraceExecutedMethods(int value) {
96 innerTraceExecutedMethods.add(value);
97 }
98 public void addOverallPureMethods(int value) {
99 overallPureMethods.add(value);
100 }
101 public void addOverallImpureMethods(int value) {
102 overallImpureMethods.add(value);
103 }
104 public void addOverallExecutedMethods(int value) {
105 overallExecutedMethods.add(value);
106 }
107
108 public static long getSerialVersionUID() {
109 return serialVersionUID;
110 }
111
112 public Vector<Vector<Long>> getInnerTraceChanges() {
113 return innerTraceChanges;
114 }
115
116 public Vector<Integer> getInnerTracePureMethods() {
117 return innerTracePureMethods;
118 }
119
120 public Vector<Integer> getInnerTraceImpureMethods() {
121 return innerTraceImpureMethods;
122 }
123
124 public Vector<Integer> getInnerTraceExecutedMethods() {
125 return innerTraceExecutedMethods;
126 }
127
128 public Vector<Integer> getOverallPureMethods() {
129 return overallPureMethods;
130 }
131
132 public Vector<Integer> getOverallImpureMethods() {
133 return overallImpureMethods;
134 }
135
136 public Vector<Integer> getOverallExecutedMethods() {
137 return overallExecutedMethods;
138 }
139
140 public Vector<Integer> getOldPurityRevised() {
141 return oldPurityRevised;
142 }
143
144 public Vector<Integer> getNewPurityKilled() {
145 return newPurityKilled;
146 }
147
148 public Vector<Integer> getOverallParameterFlips() {
149 return overallParameterFlips;
150 }
151
152 public Vector<Vector<Long>> getInnerTraceParameterFlips() {
153 return innerTraceParameterFlips;
154 }
155
156 public Vector<int[]> getTraceComparisonResults() {
157 return traceComparisonResults;
158 }
159
160 public Vector<int[]> getOverallComparisonResults() {
161 return overallComparisonResults;
162 }
163
164 private static final NumberFormat formatter = new DecimalFormat("0.000");
165
166 public String getPurityErrorDataFile() {
167 StringBuffer result = new StringBuffer();
168 result.append("# index\tcorrectimpure\n");
169 for (int i = 0; i < overallComparisonResults.size(); i++) {
170 double secondPercentage = (1.0d * overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfCorrectlyImpureMethods]) /
171 (overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitImpureMethods] * 1.0d);
172 result.append(i + "\t" +
173 formatter.format(secondPercentage) + "\n");
174 }
175 return result.toString();
176 }
177
178 static int parameterSum = 0;
179
180 public String getParameterErrorDataFile() {
181 StringBuffer result = new StringBuffer();
182 result.append("# index\tcorrectmutable\n");
183 for (int i = 0; i < overallComparisonResults.size(); i++) {
184 int difference = overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitImmutableParamters] -
185 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfCorrectlyImmutableParameters];
186 parameterSum += difference;
187 double secondPercentage = (1.0d * difference)/
188 (overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitMutableParameters] * 1.0);
189 result.append(i + "\t" +
190 difference + "\n");
191 }
192 return result.toString();
193 }
194
195
196 public String getParameterCompletenessPlotDataFile() {
197 StringBuffer result = new StringBuffer();
198 result.append("# index\toverall\texamined\tkitimmutable\tanalysisimmutable\n");
199 for (int i = 0; i < overallComparisonResults.size(); i++) {
200 int dynpurClassifiedParameters = overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitImmutableParamters] +
201 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitMutableParameters];
202 int dynpurImmutableParameters = overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfCorrectlyImmutableParameters] +
203 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfParametersClassifiedImmutableButMutable];
204 result.append(i + "\t" +
205 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitParameters] + "\t" +
206 dynpurClassifiedParameters + "\t" +
207 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfAllKitImutableParameters] + "\t" +
208 dynpurImmutableParameters + "\t" +
209 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfCorrectlyMutableParameters] + "\t" +
210 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitMutableParameters] + "\n");
211 }
212 return result.toString();
213 }
214
215 public String getPurityCompletenessPlotDataFile() {
216 StringBuffer result = new StringBuffer();
217 result.append("# index\toverall\texecuted\tkitpure\tanalysispure\n");
218 for (int i = 0; i < overallExecutedMethods.size(); i++) {
219 result.append(i + "\t" +
220 overallComparisonResults.get(i)[MutabilityResultsComparer.INDEX_numberOfKitMethods] + "\t" +
221 overallExecutedMethods.get(i) + "\t" +
222 2736 + "\t" +
223 overallPureMethods.get(i) + "\n");
224 }
225 return result.toString();
226 }
227
228 public String getParameterFlipPlotDataFile() {
229 StringBuffer result = new StringBuffer();
230 result.append("# index\tparameterflips\n");
231 for (int i = 0; i < overallParameterFlips.size(); i++) {
232 result.append(i + "\t" + overallParameterFlips.get(i) + "\n");
233 }
234 return result.toString();
235 }
236
237 public String getPurityFlipPlotDataFile() {
238 StringBuffer result = new StringBuffer();
239 result.append("# index\tmethodflips\n");
240 for (int i = 0; i < oldPurityRevised.size(); i++) {
241 result.append(i + "\t" + oldPurityRevised.get(i) + "\n");
242 }
243 return result.toString();
244 }
245
246 public void writeAllResultFilesToDirectory(File targetDirectory) throws IOException {
247 FileUtils.writeStringToFile(new File(targetDirectory.getAbsolutePath() + "/parametercomplete.data"),
248 getParameterCompletenessPlotDataFile(), "ISO-8859-1");
249 FileUtils.writeStringToFile(new File(targetDirectory.getAbsolutePath() + "/parameterflip.data"),
250 getParameterFlipPlotDataFile(), "ISO-8859-1");
251 FileUtils.writeStringToFile(new File(targetDirectory.getAbsolutePath() + "/parametererror.data"),
252 getParameterErrorDataFile(), "ISO-8859-1");
253 FileUtils.writeStringToFile(new File(targetDirectory.getAbsolutePath() + "/puritycomplete.data"),
254 getPurityCompletenessPlotDataFile(), "ISO-8859-1");
255 FileUtils.writeStringToFile(new File(targetDirectory.getAbsolutePath() + "/purityflip.data"),
256 getPurityFlipPlotDataFile(), "ISO-8859-1");
257 FileUtils.writeStringToFile(new File(targetDirectory.getAbsolutePath() + "/purityerror.data"),
258 getPurityErrorDataFile(), "ISO-8859-1");
259
260 }
261
262 public static void main(String[] args) throws IOException {
263 File logFile = new File(args[0]);
264 File targetDirectory = new File(args[1]);
265 ObjectReaderWriter<AnalysisLog> reader = new ObjectReaderWriter<AnalysisLog>();
266 AnalysisLog log = reader.read(logFile);
267 int sum = 0;
268 for (int value : log.oldPurityRevised) {
269 sum += value;
270 }
271 System.out.println("Purity flips: " + sum);
272 sum = 0;
273 for (int value : log.overallParameterFlips) {
274 sum += value;
275 }
276 System.out.println("Parameter flips: " + sum);
277 log.writeAllResultFilesToDirectory(targetDirectory);
278 System.out.println("Parameters: " + parameterSum);
279 }
280 }