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 }