001// Global variables 002 003package daikon; 004 005import static java.util.logging.Level.FINE; 006import static java.util.logging.Level.INFO; 007 008import java.io.PrintWriter; 009import java.util.LinkedHashMap; 010import java.util.List; 011import java.util.Map; 012import java.util.Random; 013import java.util.logging.Logger; 014import java.util.regex.Pattern; 015import java.util.regex.PatternSyntaxException; 016import org.checkerframework.checker.mustcall.qual.Owning; 017import org.checkerframework.checker.nullness.qual.MonotonicNonNull; 018import org.plumelib.util.FuzzyFloat; 019 020public final class Global { 021 022 // There are some other variables in the Daikon class. Probably move 023 // them here eventually. 024 025 static { 026 daikon.config.Configuration.getInstance(); 027 } 028 029 /** Do not instantiate. */ 030 private Global() { 031 throw new Error("Do not instantiate."); 032 } 033 034 // /////////////////////////////////////////////////////////////////////////// 035 // Constants 036 // 037 038 public static final String lineSep = System.lineSeparator(); 039 040 // Regular expressions 041 public static final java.util.regex.Pattern ws_regexp; 042 043 static { 044 try { 045 ws_regexp = Pattern.compile("[ \\t]+"); 046 } catch (PatternSyntaxException e) { 047 // this can't happen 048 throw new Error(e); 049 } 050 } 051 052 public static final Random random = new Random(); 053 054 // /////////////////////////////////////////////////////////////////////////// 055 // Variables 056 // 057 058 // Perhaps I shouldn't have anything in this category (i.e., no global 059 // variables)? 060 061 // /////////////////////////////////////////////////////////////////////////// 062 // Statistics-gathering 063 // 064 065 // All these different variables is a little out of control, true. 066 // Maybe turn it into a structure or an array of integers (which is 067 // easier to output and to initialize, both by looping). 068 069 public static final boolean output_statistics = true; 070 071 // Invariant inference or variable derivation 072 // These I will compute from a final postpass over each Ppt. 073 public static int non_canonical_variables = 0; 074 public static int can_be_missing_variables = 0; 075 public static int canonical_variables = 0; 076 077 // Variable derivation 078 public static int nonsensical_suppressed_derived_variables = 0; 079 public static int tautological_suppressed_derived_variables = 0; 080 // Can be set by a postpass. (Might be instructive to compute on the 081 // fly, too, to see what I missed.) 082 public static int derived_variables = 0; 083 084 // Invariant inference 085 public static int implied_noninstantiated_invariants = 0; 086 public static int implied_false_noninstantiated_invariants = 0; 087 public static int subexact_noninstantiated_invariants = 0; 088 // These also appear in falsified_invariants or non_falsified_invariants; 089 // they shouldn't be added to other things. 090 public static int partially_implied_invariants = 0; 091 // instantiated_invariants == falsified_invariants + non_falsified_invariants 092 public static int instantiated_invariants = 0; 093 public static int falsified_invariants = 0; 094 // non_falsified_invariants should be the sum of all the below 095 public static int non_falsified_invariants = 0; 096 public static int too_few_samples_invariants = 0; 097 public static int non_canonical_invariants = 0; 098 public static int obvious_invariants = 0; 099 public static int unjustified_invariants = 0; 100 public static int reported_invariants = 0; 101 102 public static void output_statistics() { 103 if (!output_statistics) { 104 return; 105 } 106 107 System.out.println( 108 "==========================================================================="); 109 System.out.println("Variables:"); 110 System.out.println(" non_canonical_variables = " + non_canonical_variables); 111 System.out.println(" can_be_missing_variables = " + can_be_missing_variables); 112 System.out.println(" canonical_variables = " + canonical_variables); 113 System.out.println( 114 " total variables = " 115 + (non_canonical_variables + can_be_missing_variables + canonical_variables)); 116 117 System.out.println("Derivation:"); 118 System.out.println(" derived_variables = " + derived_variables); 119 System.out.println( 120 " suppressed derived variables = " 121 + (nonsensical_suppressed_derived_variables 122 + tautological_suppressed_derived_variables)); 123 System.out.println( 124 " nonsensical_suppressed_derived_variables = " 125 + nonsensical_suppressed_derived_variables); 126 System.out.println( 127 " tautological_suppressed_derived_variables = " 128 + tautological_suppressed_derived_variables); 129 130 System.out.println("Inference:"); 131 System.out.println( 132 "Non-instantiated: " 133 + ((implied_noninstantiated_invariants + subexact_noninstantiated_invariants) 134 + (implied_false_noninstantiated_invariants + partially_implied_invariants))); 135 System.out.println( 136 " true = " + (implied_noninstantiated_invariants + subexact_noninstantiated_invariants)); 137 System.out.println( 138 " implied_noninstantiated_invariants = " + implied_noninstantiated_invariants); 139 System.out.println( 140 " subexact_noninstantiated_invariants = " + subexact_noninstantiated_invariants); 141 System.out.println( 142 " false = " + (implied_false_noninstantiated_invariants + partially_implied_invariants)); 143 System.out.println( 144 " implied_false_noninstantiated_invariants = " 145 + implied_false_noninstantiated_invariants); 146 System.out.println(" partially_implied_invariants = " + partially_implied_invariants); 147 System.out.println( 148 "Instantiated: " 149 + instantiated_invariants 150 + " = " 151 + (falsified_invariants + non_falsified_invariants)); 152 System.out.println(" falsified_invariants = " + falsified_invariants); 153 System.out.println( 154 " non_falsified_invariants = " 155 + non_falsified_invariants 156 + " = " 157 + ((too_few_samples_invariants + unjustified_invariants) 158 + (non_canonical_invariants + obvious_invariants) 159 + reported_invariants)); 160 System.out.println( 161 " unjustified = " + (too_few_samples_invariants + unjustified_invariants)); 162 System.out.println(" too_few_samples_invariants = " + too_few_samples_invariants); 163 System.out.println(" unjustified_invariants = " + unjustified_invariants); 164 System.out.println(" implied = " + (non_canonical_invariants + obvious_invariants)); 165 System.out.println(" non_canonical_invariants = " + non_canonical_invariants); 166 System.out.println(" obvious_invariants = " + obvious_invariants); 167 System.out.println(" reported_invariants = " + reported_invariants); 168 } 169 170 // /////////////////////////////////////////////////////////////////////////// 171 // Debugging 172 // Anything that's commented in the false section is now implemented 173 // via the logger. 174 175 public static boolean debugAll = false; 176 177 static { 178 // Set up debug traces. 179 // Better to do this here than in each separate program. 180 LogHelper.setupLogs(debugAll ? FINE : INFO); 181 } 182 183 /** Debug tracer for debugging statistics output. */ 184 public static final Logger debugStatistics = Logger.getLogger("daikon.statistics"); 185 186 /** Debug tracer for debugging Simplify output. */ 187 public static final Logger debugSimplify = Logger.getLogger("daikon.simplify"); 188 189 /** Debug tracer for debugging derived vars. */ 190 public static Logger debugDerive = Logger.getLogger("daikon.derive"); 191 192 /** Debug tracer for debugging splitting. */ 193 public static Logger debugSplit = Logger.getLogger("daikon.split"); 194 195 /** Debug tracer for debugging general invariant inference. */ 196 public static Logger debugInfer = Logger.getLogger("daikon.infer"); 197 198 /** Debug tracer for debugging invariant suppression. */ 199 public static Logger debugSuppress = Logger.getLogger("daikon.suppress"); 200 201 /** Debug tracer for debugging invariant suppression by using parameters. */ 202 public static Logger debugSuppressParam = Logger.getLogger("daikon.suppress.param"); 203 204 /** Debug tracer for debugging invariant printing. */ 205 public static Logger debugPrint = Logger.getLogger("daikon.print"); 206 207 /** If true, print logging information about printing of dtrace files. */ 208 public static final boolean debugPrintDtrace = false; 209 210 /** Used only if debugPrintDtrace is true. Users need not set this. */ 211 public static @Owning @MonotonicNonNull PrintWriter dtraceWriter = null; 212 213 // Global Fuzzy Float comparator to use 214 public static FuzzyFloat fuzzy = new FuzzyFloat(); 215 216 /* Map of statistics for each ppt. */ 217 public static Map<PptTopLevel, List<PptTopLevel.Stats>> stats_map = new LinkedHashMap<>(); 218}