- private void updateVODGraph(int currChoiceValue) {
- // Update the graph when we have the current choice value
- HashSet<Integer> choiceSet;
- if (vodGraphMap.containsKey(prevChoiceValue)) {
- // If the key already exists, just retrieve it
- choiceSet = vodGraphMap.get(prevChoiceValue);
- } else {
- // Create a new entry
- choiceSet = new HashSet<>();
- vodGraphMap.put(prevChoiceValue, choiceSet);
+ private void resetStatesForNewExecution(IntChoiceFromSet icsCG, VM vm) {
+ if (choices == null || choices != icsCG.getAllChoices()) {
+ // Reset state variables
+ choiceCounter = 0;
+ choices = icsCG.getAllChoices();
+ refChoices = copyChoices(choices);
+ // Clearing data structures
+ conflictPairMap.clear();
+ readWriteFieldsMap.clear();
+ stateToEventMap.clear();
+ isEndOfExecution = false;
+ backtrackPointList.clear();
+ }
+ }
+
+ private void setBacktrackCG(int stateId, IntChoiceFromSet backtrackCG) {
+ // Set a backtrack CG based on a state ID
+ LinkedList<Integer[]> backtrackChoices = backtrackMap.get(stateId);
+ backtrackCG.setNewValues(backtrackChoices.removeLast()); // Get the last from the queue
+ backtrackCG.setStateId(stateId);
+ backtrackCG.reset();
+ // Remove from the queue if we don't have more backtrack points for that state
+ if (backtrackChoices.isEmpty()) {
+ backtrackMap.remove(stateId);
+ backtrackStateQ.remove(stateId);
+ }
+ }
+
+ // --- Functions related to the reachability analysis when there is a state match
+
+ // We use backtrackPointsList to analyze the reachable states/events when there is a state match:
+ // 1) Whenever there is state match, there is a cycle of events
+ // 2) We need to analyze and find conflicts for the reachable choices/events in the cycle
+ // 3) Then we create a new backtrack point for every new conflict
+ private void analyzeReachabilityAndCreateBacktrackPoints(VM vm, int stateId) {
+ // Perform this analysis only when:
+ // 1) there is a state match,
+ // 2) this is not during a switch to a new execution,
+ // 3) at least 2 choices/events have been explored (choiceCounter > 1),
+ // 4) the matched state has been encountered in the current execution, and
+ // 5) state > 0 (state 0 is for boolean CG)
+ if (!vm.isNewState() && !isEndOfExecution && choiceCounter > 1 &&
+ currVisitedStates.contains(stateId) && (stateId > 0)) {
+ // Find the choice/event that marks the start of this cycle: first choice we explore for conflicts
+ int conflictChoice = stateToChoiceCounterMap.get(stateId);
+ int currentChoice = choiceCounter - 1;
+ // Find conflicts between choices/events in this cycle (we scan forward in the cycle, not backward)
+ while (conflictChoice < currentChoice) {
+ for (int eventCounter = conflictChoice + 1; eventCounter <= currentChoice; eventCounter++) {
+ if (isConflictFound(eventCounter, conflictChoice) && isNewConflict(conflictChoice, eventCounter)) {
+ createBacktrackingPoint(conflictChoice, eventCounter);
+ }
+ }
+ conflictChoice++;
+ }