Skip to content

Commit c17051d

Browse files
committed
[PEx] Adds modes for stateful backtracking
Adds CLI option --stateful-backtrack none|intra-task|all to limit stateful backtracking to OFF|within-a-task|ON
1 parent c150243 commit c17051d

File tree

9 files changed

+51
-17
lines changed

9 files changed

+51
-17
lines changed

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/commandline/PExplicitConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.Setter;
55
import pexplicit.runtime.machine.buffer.BufferSemantics;
66
import pexplicit.runtime.scheduler.explicit.StateCachingMode;
7+
import pexplicit.runtime.scheduler.explicit.StatefulBacktrackingMode;
78
import pexplicit.runtime.scheduler.explicit.strategy.SearchStrategyMode;
89

910
/**
@@ -52,9 +53,9 @@ public class PExplicitConfig {
5253
// state caching mode
5354
@Setter
5455
StateCachingMode stateCachingMode = StateCachingMode.Murmur3_128;
55-
// use stateful backtracking
56+
// stateful backtracking mode
5657
@Setter
57-
boolean statefulBacktrackEnabled = true;
58+
StatefulBacktrackingMode statefulBacktrackingMode = StatefulBacktrackingMode.IntraTask;
5859
// search strategy mode
5960
@Setter
6061
SearchStrategyMode searchStrategyMode = SearchStrategyMode.Random;

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/commandline/PExplicitOptions.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.apache.commons.cli.*;
44
import pexplicit.runtime.scheduler.explicit.StateCachingMode;
5+
import pexplicit.runtime.scheduler.explicit.StatefulBacktrackingMode;
56
import pexplicit.runtime.scheduler.explicit.strategy.SearchStrategyMode;
67

78
import java.io.PrintWriter;
@@ -165,13 +166,15 @@ public class PExplicitOptions {
165166
addHiddenOption(stateCachingMode);
166167

167168
// whether or not to disable stateful backtracking
168-
Option backtrack =
169+
Option backtrackMode =
169170
Option.builder()
170-
.longOpt("no-backtrack")
171-
.desc("Disable stateful backtracking")
172-
.numberOfArgs(0)
171+
.longOpt("stateful-backtrack")
172+
.desc("Stateful backtracking mode: none, intra-task, all (default: intra-task)")
173+
.numberOfArgs(1)
174+
.hasArg()
175+
.argName("Backtrack Mode (string)")
173176
.build();
174-
addHiddenOption(backtrack);
177+
addHiddenOption(backtrackMode);
175178

176179
// max number of schedules to explore per search task
177180
Option maxSchedulesPerTask =
@@ -363,8 +366,22 @@ public static PExplicitConfig ParseCommandlineArgs(String[] args) {
363366
String.format("Unrecognized state caching mode, got %s", option.getValue()));
364367
}
365368
break;
366-
case "no-backtrack":
367-
config.setStatefulBacktrackEnabled(false);
369+
case "stateful-backtrack":
370+
switch (option.getValue()) {
371+
case "none":
372+
config.setStatefulBacktrackingMode(StatefulBacktrackingMode.None);
373+
break;
374+
case "intra-task":
375+
config.setStatefulBacktrackingMode(StatefulBacktrackingMode.IntraTask);
376+
break;
377+
case "all":
378+
config.setStatefulBacktrackingMode(StatefulBacktrackingMode.All);
379+
break;
380+
default:
381+
optionError(
382+
option,
383+
String.format("Unrecognized stateful backtrack mode, got %s", option.getValue()));
384+
}
368385
break;
369386
case "schedules-per-task":
370387
try {

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/scheduler/Schedule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import pexplicit.runtime.scheduler.choice.Choice;
88
import pexplicit.runtime.scheduler.choice.DataChoice;
99
import pexplicit.runtime.scheduler.choice.ScheduleChoice;
10+
import pexplicit.runtime.scheduler.explicit.StatefulBacktrackingMode;
1011
import pexplicit.runtime.scheduler.explicit.StepState;
1112
import pexplicit.values.PValue;
1213

@@ -71,7 +72,7 @@ public void setScheduleChoice(int stepNum, int choiceNum, PMachineId current) {
7172
choices.add(null);
7273
}
7374
assert (choiceNum < choices.size());
74-
if (PExplicitGlobal.getConfig().isStatefulBacktrackEnabled()
75+
if (PExplicitGlobal.getConfig().getStatefulBacktrackingMode() != StatefulBacktrackingMode.None
7576
&& stepNum != 0) {
7677
assert (stepBeginState != null);
7778
choices.set(choiceNum, new ScheduleChoice(stepNum, choiceNum, current, stepBeginState));

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/scheduler/choice/Choice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void clearCurrent() {
2929
*
3030
* @return Choice object with the copied current choice
3131
*/
32-
abstract public Choice copyCurrent();
32+
abstract public Choice copyCurrent(boolean copyState);
3333

3434
abstract public String toString();
3535
}

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/scheduler/choice/DataChoice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public DataChoice(PValue<?> c) {
1414
super(c);
1515
}
1616

17-
public Choice copyCurrent() {
17+
public Choice copyCurrent(boolean copyState) {
1818
return new DataChoice(this.current);
1919
}
2020

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/scheduler/choice/ScheduleChoice.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.Getter;
44
import lombok.Setter;
5+
import pexplicit.commandline.PExplicitConfig;
56
import pexplicit.runtime.machine.PMachineId;
67
import pexplicit.runtime.scheduler.explicit.StepState;
78

@@ -32,8 +33,12 @@ public ScheduleChoice(int stepNum, int choiceNum, PMachineId c, StepState s) {
3233
this.choiceState = s;
3334
}
3435

35-
public Choice copyCurrent() {
36-
return new ScheduleChoice(this.stepNumber, this.choiceNumber, this.current, this.choiceState);
36+
public Choice copyCurrent(boolean copyState) {
37+
if (copyState) {
38+
return new ScheduleChoice(this.stepNumber, this.choiceNumber, this.current, this.choiceState);
39+
} else {
40+
return new ScheduleChoice(this.stepNumber, this.choiceNumber, this.current, null);
41+
}
3742
}
3843

3944
@Override

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/scheduler/explicit/ExplicitSearchScheduler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ protected void runStep() throws TimeoutException {
193193
return;
194194
}
195195

196-
if (PExplicitGlobal.getConfig().isStatefulBacktrackEnabled()
196+
if (PExplicitGlobal.getConfig().getStatefulBacktrackingMode() != StatefulBacktrackingMode.None
197197
&& stepNumber != 0) {
198198
schedule.setStepBeginState(stepState.copyState());
199199
}
@@ -528,7 +528,7 @@ private void postIterationCleanup() {
528528
backtrackChoiceNumber = cIdx;
529529
int newStepNumber = 0;
530530
ScheduleChoice scheduleChoice = null;
531-
if (PExplicitGlobal.getConfig().isStatefulBacktrackEnabled()) {
531+
if (PExplicitGlobal.getConfig().getStatefulBacktrackingMode() != StatefulBacktrackingMode.None) {
532532
scheduleChoice = schedule.getScheduleChoiceAt(cIdx);
533533
if (scheduleChoice != null && scheduleChoice.getChoiceState() != null) {
534534
newStepNumber = scheduleChoice.getStepNumber();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package pexplicit.runtime.scheduler.explicit;
2+
3+
public enum StatefulBacktrackingMode {
4+
None,
5+
IntraTask,
6+
All
7+
}

Src/PRuntimes/PExplicitRuntime/src/main/java/pexplicit/runtime/scheduler/explicit/strategy/SearchTask.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package pexplicit.runtime.scheduler.explicit.strategy;
22

33
import lombok.Getter;
4+
import pexplicit.runtime.PExplicitGlobal;
45
import pexplicit.runtime.machine.PMachineId;
56
import pexplicit.runtime.scheduler.choice.*;
7+
import pexplicit.runtime.scheduler.explicit.StatefulBacktrackingMode;
68
import pexplicit.values.PValue;
79

810
import java.io.Serializable;
@@ -41,7 +43,8 @@ public void cleanup() {
4143
}
4244

4345
public void addPrefixChoice(Choice choice) {
44-
prefixChoices.add(choice.copyCurrent());
46+
boolean copyState = (PExplicitGlobal.getConfig().getStatefulBacktrackingMode() == StatefulBacktrackingMode.All);
47+
prefixChoices.add(choice.copyCurrent(copyState));
4548
}
4649

4750
public void addSuffixSearchUnit(int choiceNum, SearchUnit unit) {

0 commit comments

Comments
 (0)