View Javadoc

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 }