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.
 
 
 
 
 
 

167 lines
5.0 KiB

//==============================================================================
//
// Copyright (c) 2013-
// Authors:
// * Ernst Moritz Hahn <emhahn@cs.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 param;
import java.util.ArrayList;
/**
* A region represents a subset of the valid parameter values.
* New regions can be produced using the corresponding {@code RegionFactory},
* or by applying operations on existing ones.
*
* @author Ernst Moritz Hahn <emhahn@cs.ox.ac.uk> (University of Oxford)
* @see RegionFactory
*/
abstract class Region {
static final int IMPLIES = 1;
static final int IFF = 2;
static final int OR = 3;
static final int AND = 4;
static final int EQ = 5;
static final int NE = 6;
static final int GT = 7;
static final int GE = 8;
static final int LT = 9;
static final int LE = 10;
static final int PLUS = 11;
static final int MINUS = 12;
static final int TIMES = 13;
static final int DIVIDE = 14;
static final int FIRST = 15;
static final int AVG = 16;
static final int COUNT = 17;
static final int UMINUS = 18;
static final int NOT = 19;
static final int PARENTH = 20;
static final int FORALL = 21;
static final int EXISTS = 22;
static final String opSymbols[] = { "", "=>", "<=>", "|", "&", "=", "!=", ">", ">=", "<", "<=", "+", "-", "*", "/", "1st", "avg", "-", "!", "()", "forall", "exists"};
/** region factory to which this region belongs */
protected RegionFactory factory;
abstract int getDimensions();
/**
* Get lower bound of the volume of the region.
* The volumes of disjoint region which cover the whole parameter
* space sum up to 1. This implies that the volumes are normalised
* according to the upper and lower bounds of the parameters.
*
* @return lower bound of the volume of this region
*/
abstract BigRational volume();
/**
* Checks whether this region contains the point {@code point}.
*
* @param point point to check whether contained in this region
* @return true if the point is contained in this region, false else
*/
abstract boolean contains(Point point);
/**
* Checks whether region {@code other} is contained in this region.
*
* @param other check whether contained in this region
* @return true iff {@code other} is contained in this region
*/
abstract boolean contains(Region other);
abstract RegionValues binaryOp(int op, StateValues values1, StateValues values2);
/**
* Splits this region into several parts.
* How this is done exactly depends on the implementation in derived
* classes. Can take constraint into account.
*
* @param constraint
*/
abstract ArrayList<Region> split(Function constraint);
/**
* Splits this region into several parts.
* How this is done exactly depends on the implementation in derived
* classes.
*/
abstract ArrayList<Region> split();
abstract ArrayList<Point> specialPoints();
abstract Point randomPoint();
/**
* Returns the region factory of this region.
*
* @return region factory of this region
*/
RegionFactory getFactory() {
return factory;
}
/**
* Returns the region operator by its string representation.
* If the string is not a valid operator, a {@code RuntimeException}
* will result.
*
* @param opString string to convert to operator
* @return operator from string
*/
static int getOp(String opString) {
for (int symNr = 0; symNr < Region.opSymbols.length; symNr++) {
if (opString.equals(Region.opSymbols[symNr])) {
return symNr;
}
}
throw new RuntimeException("bad operator");
}
/**
* Returns the region which is the conjunction of this and {@code other} region.
*
* @param other region to build conjunction with
* @return conjunction of this and the other region
*/
abstract Region conjunct(Region other);
/**
* Checks whether this region is adjacent to another region.
* In this case, both can be glued by @{code glue}.
*
* @param other region to check whether adjacent to
* @return true iff regions are adjacent
*/
abstract boolean adjacent(Region other);
/**
* Glues this region with the adjacent region other.
*
* @param other region to glue this region with
* @return combined region
*/
abstract Region glue(Region other);
}