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}