Browse Source
imported patch rewardcounter-TemporalOperatorBound.patch
tud-infrastructure-2018-10-12
imported patch rewardcounter-TemporalOperatorBound.patch
tud-infrastructure-2018-10-12
4 changed files with 365 additions and 0 deletions
-
341prism/src/parser/ast/TemporalOperatorBound.java
-
11prism/src/parser/visitor/ASTTraverse.java
-
12prism/src/parser/visitor/ASTTraverseModify.java
-
1prism/src/parser/visitor/ASTVisitor.java
@ -0,0 +1,341 @@ |
|||
//============================================================================== |
|||
// |
|||
// Copyright (c) 2015- |
|||
// Authors: |
|||
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden) |
|||
// |
|||
//------------------------------------------------------------------------------ |
|||
// |
|||
// This file is part of PRISM. |
|||
// |
|||
// PRISM is free software; you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation; either version 2 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// PRISM is distributed in the hope that it will be useful, |
|||
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
// GNU General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with PRISM; if not, write to the Free Software Foundation, |
|||
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
// |
|||
//============================================================================== |
|||
|
|||
package parser.ast; |
|||
|
|||
import parser.type.TypeInt; |
|||
import parser.visitor.ASTVisitor; |
|||
import prism.PrismLangException; |
|||
|
|||
/** |
|||
* A bound on a temporal operator. |
|||
* <br> |
|||
* There are three types of bounds that can be stored: |
|||
* <ul> |
|||
* <li>TIME_BOUND, e.g., time <= 4 goal</li> |
|||
* <li>STEP_BOUND, e.g., steps <= 4 goal</li> |
|||
* <li>REWARD_BOUND, e.g., reward{"rew"} <= 4 goal</li> |
|||
* </ul> |
|||
* A DEFAULT_BOUND is a bound that does not explicitly specify the |
|||
* type of bound. The type for this has to be derived from the context. |
|||
* <br> |
|||
* For continous-time models, time and step bounds differ. For |
|||
* discrete-time models, they are the same. |
|||
*/ |
|||
public class TemporalOperatorBound extends ASTElement { |
|||
/** The type of the bound */ |
|||
public enum BoundType { |
|||
/** |
|||
* A default bound, i.e., specified without explicitly marking |
|||
* the type. The type has to be deduced from the context. |
|||
*/ |
|||
DEFAULT_BOUND, |
|||
/** |
|||
* A bound on the time. |
|||
*/ |
|||
TIME_BOUND, |
|||
/** |
|||
* A bound on the number of steps. |
|||
*/ |
|||
STEP_BOUND, |
|||
/** |
|||
* A bound on the accumulated reward. |
|||
*/ |
|||
REWARD_BOUND |
|||
}; |
|||
|
|||
/** The expression for the lower bound, {@code null} for "none", i.e., zero */ |
|||
protected Expression lBound = null; |
|||
/** The expression for the upper bound, {@code null} for "none", i.e., infinity */ |
|||
protected Expression uBound = null; |
|||
|
|||
/** Strictness of the lower bound comparator: true: >, false: >= */ |
|||
protected boolean lBoundStrict = false; |
|||
/** Strictness of the upper bound comparator: true: <, false: <= */ |
|||
protected boolean uBoundStrict = false; |
|||
|
|||
/** Display as =T rather than [T,T] ? */ |
|||
protected boolean equals = false; |
|||
|
|||
/** For reward bounds the reward structure index */ |
|||
protected Object rewardStructureIndex = null; |
|||
|
|||
/** The bound type */ |
|||
protected BoundType boundType = BoundType.DEFAULT_BOUND; |
|||
|
|||
/** Is this a default bound? */ |
|||
public boolean isDefaultBound() {return boundType == BoundType.DEFAULT_BOUND;} |
|||
/** Is this a time bound? */ |
|||
public boolean isTimeBound() {return boundType == BoundType.TIME_BOUND;} |
|||
/** Is this a step bound? */ |
|||
public boolean isStepBound() {return boundType == BoundType.STEP_BOUND;} |
|||
/** Is this a reward bound? */ |
|||
public boolean isRewardBound() {return boundType == BoundType.REWARD_BOUND;} |
|||
|
|||
/** Returns true if the bounds are integer valued. Presumes that the types are annotated. */ |
|||
public boolean isIntegerValued() { |
|||
if (hasUpperBound() && !(getUpperBound().getType() instanceof TypeInt)) { |
|||
return false; |
|||
} |
|||
if (hasLowerBound() && !(getLowerBound().getType() instanceof TypeInt)) { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
/** Do we have a lower bound? */ |
|||
public boolean hasLowerBound() { |
|||
return lBound != null; |
|||
} |
|||
|
|||
/** Do we have an upper bound? */ |
|||
public boolean hasUpperBound() { |
|||
return uBound != null; |
|||
} |
|||
|
|||
/** Get the lower bound expression (may be {@code null}) */ |
|||
public Expression getLowerBound() |
|||
{ |
|||
return lBound; |
|||
} |
|||
|
|||
/** Is the lower bound strict, i.e., > instead of >= ? */ |
|||
public boolean lowerBoundIsStrict() |
|||
{ |
|||
return lBoundStrict; |
|||
} |
|||
|
|||
/** Get the upper bound expression (may be {@code null}) */ |
|||
public Expression getUpperBound() |
|||
{ |
|||
return uBound; |
|||
} |
|||
|
|||
/** Is the upper bound strict, i.e., < instead of <= ? */ |
|||
public boolean upperBoundIsStrict() |
|||
{ |
|||
return uBoundStrict; |
|||
} |
|||
|
|||
/** |
|||
* Returns true if lower/upper bound are equal and should be displayed as =T |
|||
*/ |
|||
public boolean getEquals() |
|||
{ |
|||
return equals; |
|||
} |
|||
|
|||
/** |
|||
* Set lower time bound to be of form >= e |
|||
* ({@code null} denotes no lower bound, i.e. zero) |
|||
*/ |
|||
public void setLowerBound(Expression e) |
|||
{ |
|||
setLowerBound(e, false); |
|||
} |
|||
|
|||
/** |
|||
* Set lower time bound to be of form >= e or > e |
|||
* ({@code null} denotes no lower bound, i.e. zero) |
|||
*/ |
|||
public void setLowerBound(Expression e, boolean strict) |
|||
{ |
|||
lBound = e; |
|||
lBoundStrict = strict; |
|||
} |
|||
|
|||
/** |
|||
* Set upper time bound to be of form <= e |
|||
* ({@code null} denotes no upper bound, i.e. infinity) |
|||
*/ |
|||
public void setUpperBound(Expression e) |
|||
{ |
|||
setUpperBound(e, false); |
|||
} |
|||
|
|||
/** |
|||
* Set upper time bound to be of form <= e or < e |
|||
* ({@code null} denotes no upper bound, i.e. infinity) |
|||
*/ |
|||
public void setUpperBound(Expression e, boolean strict) |
|||
{ |
|||
uBound = e; |
|||
uBoundStrict = strict; |
|||
} |
|||
|
|||
/** |
|||
* Set both lower/upper time bound to e, i.e. "=e". |
|||
*/ |
|||
public void setEqualBounds(Expression e) |
|||
{ |
|||
lBound = e; |
|||
lBoundStrict = false; |
|||
uBound = e; |
|||
uBoundStrict = false; |
|||
equals = true; |
|||
} |
|||
|
|||
/** Get the type of this bound */ |
|||
public BoundType getBoundType() { |
|||
return boundType; |
|||
} |
|||
|
|||
/** Set the type of this bound */ |
|||
public void setBoundType(BoundType boundType) { |
|||
this.boundType = boundType; |
|||
} |
|||
|
|||
/** Set the reward structure index */ |
|||
public void setRewardStructureIndex(Object index) { |
|||
rewardStructureIndex = index; |
|||
} |
|||
|
|||
/** Get the reward structure index */ |
|||
public Object getRewardStructureIndex() { |
|||
return rewardStructureIndex; |
|||
} |
|||
|
|||
@Override |
|||
public Object accept(ASTVisitor v) throws PrismLangException { |
|||
return v.visit(this); |
|||
} |
|||
|
|||
@Override |
|||
public String toString() { |
|||
String result =""; |
|||
switch (boundType) { |
|||
case DEFAULT_BOUND: |
|||
result=""; |
|||
break; |
|||
case REWARD_BOUND: |
|||
result="reward"; |
|||
if (rewardStructureIndex!=null) { |
|||
result+="{"; |
|||
if (rewardStructureIndex instanceof String){ |
|||
result+="\"" + rewardStructureIndex+ "\""; |
|||
} else { |
|||
result+=rewardStructureIndex; |
|||
} |
|||
result+="}"; |
|||
} |
|||
break; |
|||
case STEP_BOUND: |
|||
result="steps"; |
|||
break; |
|||
case TIME_BOUND: |
|||
result="time"; |
|||
break; |
|||
} |
|||
|
|||
if (!hasLowerBound()) { |
|||
if (hasUpperBound()) |
|||
result += "<" + (upperBoundIsStrict() ? "" : "=") + getUpperBound(); |
|||
else |
|||
return "<empty-bound>"; |
|||
} else { |
|||
if (!hasUpperBound()) |
|||
result += ">" + (lowerBoundIsStrict() ? "" : "=") + getLowerBound(); |
|||
else { |
|||
if (getEquals()) |
|||
result += "=" + getLowerBound(); |
|||
else |
|||
result += "[" + getLowerBound() + "," + getUpperBound() + "]"; |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
@Override |
|||
public TemporalOperatorBound deepCopy() { |
|||
TemporalOperatorBound result = new TemporalOperatorBound(); |
|||
|
|||
if (lBound != null) { |
|||
result.lBound = lBound.deepCopy(); |
|||
} |
|||
if (uBound != null) { |
|||
result.uBound = uBound.deepCopy(); |
|||
} |
|||
result.lBoundStrict = lBoundStrict; |
|||
result.uBoundStrict = uBoundStrict; |
|||
result.equals = equals; |
|||
result.boundType = boundType; |
|||
result.rewardStructureIndex = rewardStructureIndex; |
|||
|
|||
return result; |
|||
} |
|||
|
|||
@Override |
|||
public int hashCode() |
|||
{ |
|||
final int prime = 31; |
|||
int result = 1; |
|||
result = prime * result + ((boundType == null) ? 0 : boundType.hashCode()); |
|||
result = prime * result + (equals ? 1231 : 1237); |
|||
result = prime * result + ((lBound == null) ? 0 : lBound.hashCode()); |
|||
result = prime * result + (lBoundStrict ? 1231 : 1237); |
|||
result = prime * result + ((rewardStructureIndex == null) ? 0 : rewardStructureIndex.hashCode()); |
|||
result = prime * result + ((uBound == null) ? 0 : uBound.hashCode()); |
|||
result = prime * result + (uBoundStrict ? 1231 : 1237); |
|||
return result; |
|||
} |
|||
|
|||
@Override |
|||
public boolean equals(Object obj) |
|||
{ |
|||
if (this == obj) |
|||
return true; |
|||
if (obj == null) |
|||
return false; |
|||
if (!(obj instanceof TemporalOperatorBound)) |
|||
return false; |
|||
TemporalOperatorBound other = (TemporalOperatorBound) obj; |
|||
if (boundType != other.boundType) |
|||
return false; |
|||
if (equals != other.equals) |
|||
return false; |
|||
if (lBound == null) { |
|||
if (other.lBound != null) |
|||
return false; |
|||
} else if (!lBound.equals(other.lBound)) |
|||
return false; |
|||
if (lBoundStrict != other.lBoundStrict) |
|||
return false; |
|||
if (rewardStructureIndex == null) { |
|||
if (other.rewardStructureIndex != null) |
|||
return false; |
|||
} else if (!rewardStructureIndex.equals(other.rewardStructureIndex)) |
|||
return false; |
|||
if (uBound == null) { |
|||
if (other.uBound != null) |
|||
return false; |
|||
} else if (!uBound.equals(other.uBound)) |
|||
return false; |
|||
if (uBoundStrict != other.uBoundStrict) |
|||
return false; |
|||
return true; |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue