You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.0 KiB
180 lines
5.0 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2002-
|
|
// Authors:
|
|
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford)
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// 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 pta;
|
|
|
|
/**
|
|
* Helper class for encapsulation of difference bound as an integer.
|
|
* We use the least significant bit to encode strictness in the bound
|
|
* (1 = non-strict, 0 = strict); the rest is for the (integer) bound.
|
|
* Upper bound of infinity is encoded as Integer.MAX_VALUE.
|
|
*/
|
|
public class DB
|
|
{
|
|
// Bit masks, etc.
|
|
protected final static int NON_STRICT = 0x1;
|
|
protected final static int DIFF_MASK = ~0x1;
|
|
protected final static int INFTY = Integer.MAX_VALUE;
|
|
protected final static int LEQ_ZERO = 0x1;
|
|
protected final static int LT_ZERO = 0x0;
|
|
protected final static int LEQ_MINUS_ONE = (-1 << 1) | NON_STRICT;
|
|
|
|
// Created bound <=v
|
|
protected static int createLeq(int v)
|
|
{
|
|
return (v << 1) | NON_STRICT;
|
|
}
|
|
|
|
// Create bound <v
|
|
protected static int createLt(int v)
|
|
{
|
|
return (v << 1);
|
|
}
|
|
|
|
// Get (signed) difference part of bound
|
|
protected static int getSignedDiff(int d)
|
|
{
|
|
return (DIFF_MASK & d) >> 1;
|
|
}
|
|
|
|
// Is bound strict?
|
|
protected static boolean isStrict(int d)
|
|
{
|
|
return (NON_STRICT & d) == 0;
|
|
}
|
|
|
|
// Is infinity
|
|
protected static boolean isInfty(int d)
|
|
{
|
|
return (d == INFTY);
|
|
}
|
|
|
|
// Add two bounds
|
|
protected static int add(int d1, int d2)
|
|
{
|
|
// Anything + inf = inf
|
|
if (d1 == INFTY || d2 == INFTY)
|
|
return INFTY;
|
|
// Both leq: <=m + <=n = <=m+n; else: <m+n
|
|
return d1 + d2 - ((d1 & NON_STRICT) | (d2 & NON_STRICT));
|
|
}
|
|
|
|
// Compute dual bound: flip both strictness and sign
|
|
protected static int dual(int d)
|
|
{
|
|
if (d == INFTY)
|
|
return d;
|
|
// TODO: probably a more efficient way to do this
|
|
return isStrict(d) ? createLeq(-getSignedDiff(d)) : createLt(-getSignedDiff(d));
|
|
}
|
|
|
|
// Get bound as a string
|
|
protected static String toString(int d)
|
|
{
|
|
if (d == INFTY)
|
|
return "<inf";
|
|
return (isStrict(d) ? "<" : "<=") + getSignedDiff(d);
|
|
}
|
|
|
|
// Get bound as a string, multiplied by -1 and flipped, e.g. "<v" -> "-v<"
|
|
protected static String toStringFlipped(int d)
|
|
{
|
|
if (d == INFTY)
|
|
return "-inf<";
|
|
return (-getSignedDiff(d)) + (isStrict(d) ? "<" : "<=");
|
|
}
|
|
|
|
// Get constraint as a string
|
|
protected static String constraintToString(int i, int j, int d, PTA pta)
|
|
{
|
|
String s;
|
|
if (i > 0) {
|
|
// x-y < v
|
|
if (j > 0) {
|
|
s = pta.getClockName(i);
|
|
// x-y < inf
|
|
if (isInfty(d))
|
|
s += "-" + pta.getClockName(j) + "<inf";
|
|
// x-y < 0 -> x < y
|
|
else if (getSignedDiff(d) == 0)
|
|
s += (isStrict(d) ? "<" : "<=") + pta.getClockName(j);
|
|
// x-y < v
|
|
else
|
|
s += "-" + pta.getClockName(j) + (isStrict(d) ? "<" : "<=") + getSignedDiff(d);
|
|
// x-0 < v
|
|
} else {
|
|
s = pta.getClockName(i);
|
|
if (isInfty(d))
|
|
s += "<inf";
|
|
else
|
|
s += (isStrict(d) ? "<" : "<=") + getSignedDiff(d);
|
|
}
|
|
}
|
|
// 0-y < v -> y > -v
|
|
else {
|
|
s = pta.getClockName(j);
|
|
if (isInfty(d))
|
|
s += ">-inf";
|
|
else
|
|
s += (isStrict(d) ? ">" : ">=") + (-getSignedDiff(d));
|
|
}
|
|
return s;
|
|
}
|
|
|
|
// Get constraint pair as a string
|
|
// (x - y < v2 and y - x < v1, i.e. -v1 < x - y < v2) where x,y are clocks i,j and vk is from dk
|
|
protected static String constraintPairToString(int i, int j, int d2, int d1, PTA pta)
|
|
{
|
|
String s;
|
|
if (i > 0) {
|
|
// -v1 < x-y < v2
|
|
if (j > 0) {
|
|
if (!isInfty(d2) && (-getSignedDiff(d1) == getSignedDiff(d2))) {
|
|
if (getSignedDiff(d1) == 0)
|
|
s = pta.getClockName(i) + "=" + pta.getClockName(j);
|
|
else
|
|
s = pta.getClockName(i) + "-" + pta.getClockName(j) + "=" + getSignedDiff(d2);
|
|
} else {
|
|
s = toStringFlipped(d1) + pta.getClockName(i) + "-" + pta.getClockName(j) + toString(d2);
|
|
}
|
|
// -v1 < x-0 < v2
|
|
} else {
|
|
if (!isInfty(d2) && (-getSignedDiff(d1) == getSignedDiff(d2)))
|
|
s = pta.getClockName(i) + "=" + getSignedDiff(d2);
|
|
else
|
|
s = toStringFlipped(d1) + pta.getClockName(i) + toString(d2);
|
|
}
|
|
}
|
|
// -v1 < 0-y < v2 -> -v2 < y < v1
|
|
else {
|
|
if (!isInfty(d2) && (-getSignedDiff(d1) == getSignedDiff(d2)))
|
|
s = pta.getClockName(j) + "=" + getSignedDiff(d1);
|
|
else
|
|
s = toStringFlipped(d2) + pta.getClockName(j) + toString(d1);
|
|
}
|
|
return s;
|
|
}
|
|
}
|