Browse Source

Convert ExpressionQuant from interface to abstract class and push some shared code in ExpressionProb/Reward/SS into it.

git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@10031 bbc10eb1-c90d-0410-af57-cb519fbb1720
master
Dave Parker 11 years ago
parent
commit
5c8439c0e6
  1. 108
      prism/src/parser/ast/ExpressionProb.java
  2. 107
      prism/src/parser/ast/ExpressionQuant.java
  3. 101
      prism/src/parser/ast/ExpressionReward.java
  4. 92
      prism/src/parser/ast/ExpressionSS.java

108
prism/src/parser/ast/ExpressionProb.java

@ -33,75 +33,39 @@ import prism.OpRelOpBound;
import prism.PrismException; import prism.PrismException;
import prism.PrismLangException; import prism.PrismLangException;
public class ExpressionProb extends Expression implements ExpressionQuant
public class ExpressionProb extends ExpressionQuant
{ {
RelOp relOp = null;
Expression prob = null;
Expression expression = null;
// Note: this "old-style" filter is just for display purposes
// The parser creates an (invisible) new-style filter around this expression
Filter filter = null;
// Constructors // Constructors
public ExpressionProb() public ExpressionProb()
{ {
} }
public ExpressionProb(Expression e, String r, Expression p)
public ExpressionProb(Expression expression, String relOpString, Expression p)
{ {
expression = e;
relOp = RelOp.parseSymbol(r);
prob = p;
setExpression(expression);
setRelOp(relOpString);
setBound(p);
} }
// Set methods // Set methods
public void setRelOp(RelOp relOp)
{
this.relOp = relOp;
}
public void setRelOp(String r)
{
relOp = RelOp.parseSymbol(r);
}
/**
* Set the probability bound. Equivalent to {@code setBound(p)}.
*/
public void setProb(Expression p) public void setProb(Expression p)
{ {
prob = p;
}
public void setExpression(Expression e)
{
expression = e;
}
public void setFilter(Filter f)
{
filter = f;
setBound(p);
} }
// Get methods // Get methods
public RelOp getRelOp()
{
return relOp;
}
/**
* Get the probability bound. Equivalent to {@code getBound()}.
*/
public Expression getProb() public Expression getProb()
{ {
return prob;
}
public Expression getExpression()
{
return expression;
}
public Filter getFilter()
{
return filter;
return getBound();
} }
/** /**
@ -110,25 +74,21 @@ public class ExpressionProb extends Expression implements ExpressionQuant
public String getTypeOfPOperator() public String getTypeOfPOperator()
{ {
String s = ""; String s = "";
s += "P" + relOp;
s += (prob == null) ? "?" : "p";
s += "P" + getRelOp();
s += (getBound() == null) ? "?" : "p";
return s; return s;
} }
/**
* Get info about the operator and bound.
* Does some checks, e.g., throws an exception if probability is out of range.
* @param constantValues Values for constants in order to evaluate any bound
*/
@Override
public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException
{ {
if (prob != null) {
double bound = prob.evaluateDouble(constantValues);
if (bound < 0 || bound > 1)
throw new PrismException("Invalid probability bound " + bound + " in P operator");
return new OpRelOpBound("P", relOp, bound);
if (getBound() != null) {
double boundVal = getBound().evaluateDouble(constantValues);
if (boundVal < 0 || boundVal > 1)
throw new PrismException("Invalid probability bound " + boundVal + " in P operator");
return new OpRelOpBound("P", getRelOp(), boundVal);
} else { } else {
return new OpRelOpBound("P", relOp, null);
return new OpRelOpBound("P", getRelOp(), null);
} }
} }
@ -162,11 +122,11 @@ public class ExpressionProb extends Expression implements ExpressionQuant
*/ */
public String getResultName() public String getResultName()
{ {
if (prob != null)
if (getBound() != null)
return "Result"; return "Result";
else if (relOp == RelOp.MIN)
else if (getRelOp() == RelOp.MIN)
return "Minimum probability"; return "Minimum probability";
else if (relOp == RelOp.MAX)
else if (getRelOp() == RelOp.MAX)
return "Maximum probability"; return "Maximum probability";
else else
return "Probability"; return "Probability";
@ -195,11 +155,11 @@ public class ExpressionProb extends Expression implements ExpressionQuant
{ {
String s = ""; String s = "";
s += "P" + relOp;
s += (prob == null) ? "?" : prob.toString();
s += " [ " + expression;
if (filter != null)
s += " " + filter;
s += "P" + getRelOp();
s += (getBound() == null) ? "?" : getBound().toString();
s += " [ " + getExpression();
if (getFilter() != null)
s += " " + getFilter();
s += " ]"; s += " ]";
return s; return s;
@ -211,10 +171,10 @@ public class ExpressionProb extends Expression implements ExpressionQuant
public Expression deepCopy() public Expression deepCopy()
{ {
ExpressionProb expr = new ExpressionProb(); ExpressionProb expr = new ExpressionProb();
expr.setExpression(expression == null ? null : expression.deepCopy());
expr.setRelOp(relOp);
expr.setProb(prob == null ? null : prob.deepCopy());
expr.setFilter(filter == null ? null : (Filter)filter.deepCopy());
expr.setExpression(getExpression() == null ? null : getExpression().deepCopy());
expr.setRelOp(getRelOp());
expr.setBound(getBound() == null ? null : getBound().deepCopy());
expr.setFilter(getFilter() == null ? null : (Filter)getFilter().deepCopy());
expr.setType(type); expr.setType(type);
expr.setPosition(this); expr.setPosition(this);
return expr; return expr;

107
prism/src/parser/ast/ExpressionQuant.java

@ -31,14 +31,109 @@ import prism.OpRelOpBound;
import prism.PrismException; import prism.PrismException;
/** /**
* Interface containing (some) common features of "quantitative" operators (P,R,S),
* i.e., classes ExpressionProb, ExpressionReward, ExpressionSS
* Abstract class for representing "quantitative" operators (P,R,S),
* i.e., a superclass of ExpressionProb, ExpressionReward, ExpressionSS.
*/ */
public interface ExpressionQuant
public abstract class ExpressionQuant extends Expression
{ {
public RelOp getRelOp();
public Expression getExpression();
public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException;
/** The attached relational operator (e.g. "<" in "P<0.1"). */
protected RelOp relOp = null;
/** The attached (probability/reward) bound, as an expression (e.g. "p" in "P<p"). Null if absent (e.g. "P=?"). */
protected Expression bound = null;
/** The main operand of the operator (e.g. "F target=true" in "P<0.1[F target=true]. */
protected Expression expression = null;
/** Optional "old-style" filter. This is just for display purposes since
* the parser creates an (invisible) new-style filter around this expression. */
protected Filter filter = null;
// Set methods
/**
* Set the attached relational operator (e.g. "<" in "P<0.1").
* Uses the enum {@link RelOp}. For example: {@code setRelOp(RelOp.GT);}
*/
public void setRelOp(RelOp relOp)
{
this.relOp = relOp;
}
/**
* Set the attached relational operator (e.g. "<" in "P<0.1").
* The operator is passed as a string, e.g. "<" or ">=".
*/
public void setRelOp(String relOpString)
{
relOp = RelOp.parseSymbol(relOpString);
}
/**
* Set the attached bound, as an expression (e.g. "p" in "P<p"). Should be null if absent (e.g. "P=?").
*/
public void setBound(Expression bound)
{
this.bound = bound;
}
/**
* Set the main operand of the operator (e.g. "F target=true" in "P<0.1[F target=true].
*/
public void setExpression(Expression expression)
{
this.expression = expression;
}
/**
* Set the optional "old-style" filter. This is just for display purposes since
* the parser creates an (invisible) new-style filter around this expression.
*/
public void setFilter(Filter f)
{
filter = f;
}
// Get methods
/**
* Get the attached relational operator (e.g. "<" in "P<0.1"), as a {@link RelOp}.
*/
public RelOp getRelOp()
{
return relOp;
}
/**
* Get the attached bound, as an expression (e.g. "p" in "P<p"). Should be null if absent (e.g. "P=?").
*/
public Expression getBound()
{
return bound;
}
/**
* Get the main operand of the operator (e.g. "F target=true" in "P<0.1[F target=true].
*/
public Expression getExpression()
{
return expression;
}
/**
* Get an object storing info about the attached relational operator and bound, after evaluating the bound to a double.
* For example "<0.1" in "P<p" where p=0.5 in {@code constantValues}.
* Does some checks, e.g., throws an exception if a probability is not in the range [0,1]
*
* @param constantValues Values for constants in order to evaluate any bound
*/
public abstract OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException;
/**
* Get the optional "old-style" filter. This is just for display purposes since
* the parser creates an (invisible) new-style filter around this expression.
*/
public Filter getFilter()
{
return filter;
}
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

101
prism/src/parser/ast/ExpressionReward.java

@ -33,16 +33,10 @@ import prism.OpRelOpBound;
import prism.PrismException; import prism.PrismException;
import prism.PrismLangException; import prism.PrismLangException;
public class ExpressionReward extends Expression implements ExpressionQuant
public class ExpressionReward extends ExpressionQuant
{ {
Object rewardStructIndex = null;
Object rewardStructIndexDiv = null;
RelOp relOp = null;
Expression reward = null;
Expression expression = null;
// Note: this "old-style" filter is just for display purposes
// The parser creates an (invisible) new-style filter around this expression
Filter filter = null;
protected Object rewardStructIndex = null;
protected Object rewardStructIndexDiv = null;
// Constructors // Constructors
@ -50,11 +44,11 @@ public class ExpressionReward extends Expression implements ExpressionQuant
{ {
} }
public ExpressionReward(Expression e, String r, Expression p)
public ExpressionReward(Expression expression, String relOpString, Expression r)
{ {
expression = e;
relOp = RelOp.parseSymbol(r);
reward = p;
setExpression(expression);
setRelOp(relOpString);
setBound(r);
} }
// Set methods // Set methods
@ -69,29 +63,12 @@ public class ExpressionReward extends Expression implements ExpressionQuant
rewardStructIndexDiv = o; rewardStructIndexDiv = o;
} }
public void setRelOp(RelOp relOp)
{
this.relOp = relOp;
}
public void setRelOp(String r)
{
relOp = RelOp.parseSymbol(r);
}
public void setReward(Expression p)
{
reward = p;
}
public void setExpression(Expression e)
{
expression = e;
}
public void setFilter(Filter f)
/**
* Set the reward bound. Equivalent to {@code setBound(r)}.
*/
public void setReward(Expression r)
{ {
filter = f;
setBound(r);
} }
// Get methods // Get methods
@ -106,24 +83,12 @@ public class ExpressionReward extends Expression implements ExpressionQuant
return rewardStructIndexDiv; return rewardStructIndexDiv;
} }
public RelOp getRelOp()
{
return relOp;
}
/**
* Get the reward bound. Equivalent to {@code getBound()}.
*/
public Expression getReward() public Expression getReward()
{ {
return reward;
}
public Expression getExpression()
{
return expression;
}
public Filter getFilter()
{
return filter;
return getBound();
} }
// Other methods // Other methods
@ -134,8 +99,8 @@ public class ExpressionReward extends Expression implements ExpressionQuant
public String getTypeOfROperator() public String getTypeOfROperator()
{ {
String s = ""; String s = "";
s += "R" + relOp;
s += (reward == null) ? "?" : "r";
s += "R" + getRelOp();
s += (getBound() == null) ? "?" : "r";
return s; return s;
} }
@ -191,11 +156,11 @@ public class ExpressionReward extends Expression implements ExpressionQuant
*/ */
public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException
{ {
if (reward != null) {
double bound = reward.evaluateDouble(constantValues);
return new OpRelOpBound("R", relOp, bound);
if (getBound() != null) {
double boundValue = getBound().evaluateDouble(constantValues);
return new OpRelOpBound("R", getRelOp(), boundValue);
} else { } else {
return new OpRelOpBound("R", relOp, null);
return new OpRelOpBound("R", getRelOp(), null);
} }
} }
@ -230,10 +195,10 @@ public class ExpressionReward extends Expression implements ExpressionQuant
public String getResultName() public String getResultName()
{ {
// For R=? properties, use name of reward structure where applicable // For R=? properties, use name of reward structure where applicable
if (reward == null) {
if (getBound() == null) {
String s = "E"; String s = "E";
if (relOp == RelOp.MIN) s = "Minimum e";
else if (relOp == RelOp.MAX) s = "Maximum e";
if (getRelOp() == RelOp.MIN) s = "Minimum e";
else if (getRelOp() == RelOp.MAX) s = "Maximum e";
else s = "E"; else s = "E";
if (rewardStructIndex instanceof String) { if (rewardStructIndex instanceof String) {
if (rewardStructIndexDiv instanceof String) if (rewardStructIndexDiv instanceof String)
@ -286,10 +251,10 @@ public class ExpressionReward extends Expression implements ExpressionQuant
else if (rewardStructIndexDiv instanceof String) s += "{\""+rewardStructIndexDiv+"\"}"; else if (rewardStructIndexDiv instanceof String) s += "{\""+rewardStructIndexDiv+"\"}";
} }
} }
s += relOp;
s += (reward==null) ? "?" : reward.toString();
s += " [ " + expression;
if (filter != null) s += " "+filter;
s += getRelOp();
s += (getBound()==null) ? "?" : getBound().toString();
s += " [ " + getExpression();
if (getFilter() != null) s += " "+getFilter();
s += " ]"; s += " ]";
return s; return s;
@ -301,14 +266,14 @@ public class ExpressionReward extends Expression implements ExpressionQuant
public Expression deepCopy() public Expression deepCopy()
{ {
ExpressionReward expr = new ExpressionReward(); ExpressionReward expr = new ExpressionReward();
expr.setExpression(expression == null ? null : expression.deepCopy());
expr.setRelOp(relOp);
expr.setReward(reward == null ? null : reward.deepCopy());
expr.setExpression(getExpression() == null ? null : getExpression().deepCopy());
expr.setRelOp(getRelOp());
expr.setBound(getBound() == null ? null : getBound().deepCopy());
if (rewardStructIndex != null && rewardStructIndex instanceof Expression) expr.setRewardStructIndex(((Expression)rewardStructIndex).deepCopy()); if (rewardStructIndex != null && rewardStructIndex instanceof Expression) expr.setRewardStructIndex(((Expression)rewardStructIndex).deepCopy());
else expr.setRewardStructIndex(rewardStructIndex); else expr.setRewardStructIndex(rewardStructIndex);
if (rewardStructIndexDiv != null && rewardStructIndexDiv instanceof Expression) expr.setRewardStructIndexDiv(((Expression)rewardStructIndexDiv).deepCopy()); if (rewardStructIndexDiv != null && rewardStructIndexDiv instanceof Expression) expr.setRewardStructIndexDiv(((Expression)rewardStructIndexDiv).deepCopy());
else expr.setRewardStructIndexDiv(rewardStructIndexDiv); else expr.setRewardStructIndexDiv(rewardStructIndexDiv);
expr.setFilter(filter == null ? null : (Filter)filter.deepCopy());
expr.setFilter(getFilter() == null ? null : (Filter)getFilter().deepCopy());
expr.setType(type); expr.setType(type);
expr.setPosition(this); expr.setPosition(this);
return expr; return expr;

92
prism/src/parser/ast/ExpressionSS.java

@ -33,75 +33,39 @@ import prism.OpRelOpBound;
import prism.PrismException; import prism.PrismException;
import prism.PrismLangException; import prism.PrismLangException;
public class ExpressionSS extends Expression implements ExpressionQuant
public class ExpressionSS extends ExpressionQuant
{ {
RelOp relOp = null;
Expression prob = null;
Expression expression = null;
// Note: this "old-style" filter is just for display purposes
// The parser creates an (invisible) new-style filter around this expression
Filter filter = null;
// Constructors // Constructors
public ExpressionSS() public ExpressionSS()
{ {
} }
public ExpressionSS(Expression e, String r, Expression p)
public ExpressionSS(Expression expression, String relOpString, Expression p)
{ {
expression = e;
relOp = RelOp.parseSymbol(r);
prob = p;
setExpression(expression);
setRelOp(relOpString);
setBound(p);
} }
// Set methods // Set methods
public void setRelOp(RelOp relOp)
{
this.relOp = relOp;
}
public void setRelOp(String r)
{
relOp = RelOp.parseSymbol(r);
}
/**
* Set the probability bound. Equivalent to {@code setBound(p)}.
*/
public void setProb(Expression p) public void setProb(Expression p)
{ {
prob = p;
}
public void setExpression(Expression e)
{
expression = e;
}
public void setFilter(Filter f)
{
filter = f;
setBound(p);
} }
// Get methods // Get methods
public RelOp getRelOp()
{
return relOp;
}
/**
* Get the probability bound. Equivalent to {@code getBound()}.
*/
public Expression getProb() public Expression getProb()
{ {
return prob;
}
public Expression getExpression()
{
return expression;
}
public Filter getFilter()
{
return filter;
return getBound();
} }
/** /**
@ -111,13 +75,13 @@ public class ExpressionSS extends Expression implements ExpressionQuant
*/ */
public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException public OpRelOpBound getRelopBoundInfo(Values constantValues) throws PrismException
{ {
if (prob != null) {
double bound = prob.evaluateDouble(constantValues);
if (bound < 0 || bound > 1)
throw new PrismException("Invalid probability bound " + bound + " in P operator");
return new OpRelOpBound("S", relOp, bound);
if (getBound() != null) {
double boundValue = getBound().evaluateDouble(constantValues);
if (boundValue < 0 || boundValue > 1)
throw new PrismException("Invalid probability bound " + boundValue + " in P operator");
return new OpRelOpBound("S", getRelOp(), boundValue);
} else { } else {
return new OpRelOpBound("S", relOp, null);
return new OpRelOpBound("S", getRelOp(), null);
} }
} }
@ -151,7 +115,7 @@ public class ExpressionSS extends Expression implements ExpressionQuant
*/ */
public String getResultName() public String getResultName()
{ {
return (prob == null) ? "Probability" : "Result";
return (getBound() == null) ? "Probability" : "Result";
} }
@Override @Override
@ -177,10 +141,10 @@ public class ExpressionSS extends Expression implements ExpressionQuant
{ {
String s = ""; String s = "";
s += "S" + relOp;
s += (prob==null) ? "?" : prob.toString();
s += " [ " + expression;
if (filter != null) s += " "+filter;
s += "S" + getRelOp();
s += (getBound()==null) ? "?" : getBound().toString();
s += " [ " + getExpression();
if (getFilter() != null) s += " "+getFilter();
s += " ]"; s += " ]";
return s; return s;
@ -192,10 +156,10 @@ public class ExpressionSS extends Expression implements ExpressionQuant
public Expression deepCopy() public Expression deepCopy()
{ {
ExpressionSS expr = new ExpressionSS(); ExpressionSS expr = new ExpressionSS();
expr.setExpression(expression == null ? null : expression.deepCopy());
expr.setRelOp(relOp);
expr.setProb(prob == null ? null : prob.deepCopy());
expr.setFilter(filter == null ? null : (Filter)filter.deepCopy());
expr.setExpression(getExpression() == null ? null : getExpression().deepCopy());
expr.setRelOp(getRelOp());
expr.setBound(getBound() == null ? null : getBound().deepCopy());
expr.setFilter(getFilter() == null ? null : (Filter)getFilter().deepCopy());
expr.setType(type); expr.setType(type);
expr.setPosition(this); expr.setPosition(this);
return expr; return expr;

Loading…
Cancel
Save