From: rtrimana Date: Thu, 28 Jan 2021 23:23:11 +0000 (-0800) Subject: Fixing the counter for unique transitions. X-Git-Url: http://demsky.eecs.uci.edu/git/?p=jpf-core.git;a=commitdiff_plain;h=5b5f4e395544de9213d47ac5ab2106d2cae2f4b3 Fixing the counter for unique transitions. --- diff --git a/src/main/gov/nasa/jpf/listener/DPORStateReducerWithSummary.java b/src/main/gov/nasa/jpf/listener/DPORStateReducerWithSummary.java index 9a4af0c..9e232bb 100755 --- a/src/main/gov/nasa/jpf/listener/DPORStateReducerWithSummary.java +++ b/src/main/gov/nasa/jpf/listener/DPORStateReducerWithSummary.java @@ -67,7 +67,7 @@ public class DPORStateReducerWithSummary extends ListenerAdapter { private HashSet nonRelevantClasses;// Class info objects of non-relevant classes private HashSet nonRelevantFields; // Field info objects of non-relevant fields private HashSet relevantFields; // Field info objects of relevant fields - private HashMap> stateToEventMap; + private HashMap> stateToEventMap; // Map state ID to events // Data structure to analyze field Read/Write accesses and conflicts private HashMap> backtrackMap; // Track created backtracking points private PriorityQueue backtrackStateQ; // Heap that returns the latest state @@ -85,7 +85,7 @@ public class DPORStateReducerWithSummary extends ListenerAdapter { // Statistics private int numOfTransitions; - private int numOfUniqueTransitions; + private HashMap> stateToUniqueEventMap; public DPORStateReducerWithSummary(Config config, JPF jpf) { verboseMode = config.getBoolean("printout_state_transition", false); @@ -106,12 +106,12 @@ public class DPORStateReducerWithSummary extends ListenerAdapter { isNotCheckedForEventsYet = true; mainSummary = new MainSummary(); numOfTransitions = 0; - numOfUniqueTransitions = 0; nonRelevantClasses = new HashSet<>(); nonRelevantFields = new HashSet<>(); relevantFields = new HashSet<>(); restorableStateMap = new HashMap<>(); stateToPredInfo = new HashMap<>(); + stateToUniqueEventMap = new HashMap<>(); initializeStatesVariables(); } @@ -182,12 +182,12 @@ public class DPORStateReducerWithSummary extends ListenerAdapter { out.println("\n==> DEBUG: ----------------------------------- search finished"); out.println("\n==> DEBUG: State reduction mode : " + stateReductionMode); out.println("\n==> DEBUG: Number of transitions : " + numOfTransitions); - out.println("\n==> DEBUG: Number of unique transitions (DPOR) : " + numOfUniqueTransitions); + out.println("\n==> DEBUG: Number of unique transitions (DPOR) : " + summarizeUniqueStateIds()); out.println("\n==> DEBUG: ----------------------------------- search finished" + "\n"); fileWriter.println("==> DEBUG: State reduction mode : " + stateReductionMode); fileWriter.println("==> DEBUG: Number of transitions : " + numOfTransitions); - fileWriter.println("==> DEBUG: Number of unique transitions : " + numOfUniqueTransitions); + fileWriter.println("==> DEBUG: Number of unique transitions : " + summarizeUniqueStateIds()); fileWriter.println(); fileWriter.close(); } @@ -265,9 +265,7 @@ public class DPORStateReducerWithSummary extends ListenerAdapter { exploreNextBacktrackPoints(vm, icsCG); } else { numOfTransitions++; - if (choiceCounter < choices.length) { - numOfUniqueTransitions++; - } + countUniqueStateId(vm.getStateId(), icsCG.getNextChoice()); } // Map state to event mapStateToEvent(icsCG.getNextChoice()); @@ -275,10 +273,39 @@ public class DPORStateReducerWithSummary extends ListenerAdapter { choiceCounter++; } } else { - if (currentCG instanceof IntChoiceFromSet) { - numOfTransitions++; - } + numOfTransitions++; + } + } + + // Count unique state IDs + private void countUniqueStateId(int stateId, int nextChoiceValue) { + HashSet events; + // Get the set of events + if (!stateToUniqueEventMap.containsKey(stateId)) { + events = new HashSet<>(); + stateToUniqueEventMap.put(stateId, events); + } else { + events = stateToUniqueEventMap.get(stateId); } + // Insert the event + if (!events.contains(nextChoiceValue)) { + events.add(nextChoiceValue); + } + } + + // Summarize unique state IDs + private int summarizeUniqueStateIds() { + // Just count the set size of each of entry map and sum them up + int numOfUniqueTransitions = 0; + for (Map.Entry> entry : stateToUniqueEventMap.entrySet()) { + numOfUniqueTransitions = numOfUniqueTransitions + entry.getValue().size(); + } + // We also need to count root and boolean CG if this is in state reduction mode (DPOR) + if (stateReductionMode) { + numOfUniqueTransitions = numOfUniqueTransitions + 3; + } + + return numOfUniqueTransitions; } @Override