public abstract class AbstractFixedPointSolver<T extends IVariable<T>> extends Object implements IFixedPointSolver<T>, FixedPointConstants, VerboseAction
IFixedPointStatements to be solved by a IFixedPointSolver
Implementation Note:
The set of steps and variables is internally represented as a graph. Each step and each variable is a node in the graph. If a step produces a variable that is used by another step, the graph has a directed edge from the producer to the consumer. Fixed-point iteration proceeds in a topological order according to these edges.
| Modifier and Type | Class and Description |
|---|---|
protected class |
AbstractFixedPointSolver.Statement |
| Modifier and Type | Field and Description |
|---|---|
static int |
DEFAULT_PERIODIC_MAINTENANCE_INTERVAL |
static int |
DEFAULT_VERBOSE_INTERVAL |
static boolean |
verbose |
protected Worklist |
workList
worklist for the iterative solver
|
CHANGED, CHANGED_AND_FIXED, CHANGED_MASK, FIXED_MASK, NOT_CHANGED, NOT_CHANGED_AND_FIXED, SIDE_EFFECT_MASK| Constructor and Description |
|---|
AbstractFixedPointSolver() |
| Modifier and Type | Method and Description |
|---|---|
void |
addAllStatementsToWorkList()
Add all to the work list.
|
void |
addToWorkList(AbstractStatement s)
Add a step to the work list.
|
void |
changedVariable(T v)
Call this method when the contents of a variable changes.
|
boolean |
emptyWorkList() |
int |
getMaxEvalBetweenTopo() |
int |
getMinSizeForTopSort() |
int |
getNumberOfEvaluations() |
protected int |
getPeriodicMaintainInterval()
subclasses should override as desired.
|
Iterator<? extends INodeWithNumber> |
getStatements() |
double |
getTopologicalGrowthFactor() |
protected int |
getVerboseInterval()
subclasses should override as desired.
|
void |
incNumberOfEvaluations() |
void |
initForFirstSolve()
Some setup which occurs only before the first solve
|
protected abstract void |
initializeVariables()
Initialize all lattice vars in the system.
|
protected abstract void |
initializeWorkList()
Initialize the work list for iteration.j
|
static boolean |
isChanged(byte code) |
static boolean |
isFixed(byte code) |
static boolean |
isSideEffect(byte code) |
static String |
lineBreak(String string,
int wrap) |
protected abstract T[] |
makeStmtRHS(int size) |
boolean |
newStatement(T lhs,
AbstractOperator<T> operator,
T[] rhs,
boolean toWorkList,
boolean eager)
Add a step to the system with an arbitrary number of operands on the right-hand side.
|
boolean |
newStatement(T lhs,
AbstractOperator<T> operator,
T op1,
T op2,
boolean toWorkList,
boolean eager)
Add an equation with two operands on the right-hand side.
|
boolean |
newStatement(T lhs,
AbstractOperator<T> operator,
T op1,
T op2,
T op3,
boolean toWorkList,
boolean eager)
Add a step with three operands on the right-hand side.
|
boolean |
newStatement(T lhs,
NullaryOperator<T> operator,
boolean toWorkList,
boolean eager)
Add a step with zero operands on the right-hand side.
|
boolean |
newStatement(T lhs,
UnaryOperator<T> operator,
T rhs,
boolean toWorkList,
boolean eager)
Add a step with one operand on the right-hand side.
|
void |
orderStatements() |
void |
performVerboseAction()
optional method used for performance debugging
|
protected void |
periodicMaintenance()
a method that will be called every N evaluations.
|
void |
removeStatement(AbstractStatement<T,?> s) |
void |
setMaxEvalBetweenTopo(int i) |
void |
setMinEquationsForTopSort(int i) |
void |
setTopologicalGrowthFactor(double d) |
boolean |
solve(MonitorUtil.IProgressMonitor monitor)
Solve the set of dataflow graph.
|
String |
toString() |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitgetFixedPointSystempublic static final boolean verbose
public static final int DEFAULT_VERBOSE_INTERVAL
public static final int DEFAULT_PERIODIC_MAINTENANCE_INTERVAL
protected Worklist workList
protected abstract T[] makeStmtRHS(int size)
public void initForFirstSolve()
public boolean emptyWorkList()
public boolean solve(MonitorUtil.IProgressMonitor monitor) throws CancelException
PRECONDITION: graph is set up
solve in interface IFixedPointSolver<T extends IVariable<T>>CancelExceptionpublic void performVerboseAction()
VerboseActionperformVerboseAction in interface VerboseActionpublic void removeStatement(AbstractStatement<T,?> s)
public Iterator<? extends INodeWithNumber> getStatements()
public void addToWorkList(AbstractStatement s)
s - the step to addpublic void addAllStatementsToWorkList()
public void changedVariable(T v)
v - the variable that has changedpublic boolean newStatement(T lhs, NullaryOperator<T> operator, boolean toWorkList, boolean eager)
TODO: this is a little odd, in that this equation will never fire unless explicitly added to a work list. I think in most cases we shouldn't be creating this nullary form.
lhs - the variable set by this equationoperator - the step operatorIllegalArgumentException - if lhs is nullpublic boolean newStatement(T lhs, UnaryOperator<T> operator, T rhs, boolean toWorkList, boolean eager)
lhs - the lattice variable set by this equationoperator - the step's operatorrhs - first operand on the rhsIllegalArgumentException - if operator is nullpublic boolean newStatement(T lhs, AbstractOperator<T> operator, T op1, T op2, boolean toWorkList, boolean eager)
lhs - the lattice variable set by this equationoperator - the equation operatorop1 - first operand on the rhsop2 - second operand on the rhspublic boolean newStatement(T lhs, AbstractOperator<T> operator, T op1, T op2, T op3, boolean toWorkList, boolean eager)
lhs - the lattice variable set by this equationoperator - the equation operatorop1 - first operand on the rhsop2 - second operand on the rhsop3 - third operand on the rhsIllegalArgumentException - if lhs is nullpublic boolean newStatement(T lhs, AbstractOperator<T> operator, T[] rhs, boolean toWorkList, boolean eager)
lhs - lattice variable set by this equationoperator - the operatorrhs - the operands on the rhsprotected abstract void initializeVariables()
protected abstract void initializeWorkList()
public void orderStatements()
public static boolean isChanged(byte code)
public static boolean isSideEffect(byte code)
public static boolean isFixed(byte code)
public int getMinSizeForTopSort()
public void setMinEquationsForTopSort(int i)
public int getMaxEvalBetweenTopo()
public double getTopologicalGrowthFactor()
public void setMaxEvalBetweenTopo(int i)
public void setTopologicalGrowthFactor(double d)
public int getNumberOfEvaluations()
public void incNumberOfEvaluations()
protected void periodicMaintenance()
protected int getVerboseInterval()
protected int getPeriodicMaintainInterval()