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.
338 lines
10 KiB
338 lines
10 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2002-
|
|
// Authors:
|
|
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford, formerly University of Birmingham)
|
|
// Description: Java wrapper class for double vector
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// 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 dv;
|
|
|
|
import prism.*;
|
|
import jdd.*;
|
|
import odd.*;
|
|
|
|
public class DoubleVector
|
|
{
|
|
//------------------------------------------------------------------------------
|
|
// load jni stuff from shared library
|
|
//------------------------------------------------------------------------------
|
|
|
|
static
|
|
{
|
|
try {
|
|
System.loadLibrary("dv");
|
|
}
|
|
catch (UnsatisfiedLinkError e) {
|
|
System.out.println(e);
|
|
System.exit(1);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// cudd manager
|
|
//------------------------------------------------------------------------------
|
|
|
|
// cudd manager
|
|
|
|
// jni method to set cudd manager for native code
|
|
private static native void DV_SetCUDDManager(long ddm);
|
|
public static void setCUDDManager()
|
|
{
|
|
DV_SetCUDDManager(JDD.GetCUDDManager());
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// instance variables/methods
|
|
//------------------------------------------------------------------------------
|
|
|
|
// data
|
|
private long v; // vector (actually a C/C++ pointer cast to a long)
|
|
private int n; // size
|
|
|
|
// constructors
|
|
|
|
private native long DV_CreateZeroVector(int n);
|
|
public DoubleVector(int size) throws PrismException
|
|
{
|
|
v = DV_CreateZeroVector(size);
|
|
if (v == 0) throw new PrismException("Out of memory");
|
|
n = size;
|
|
}
|
|
|
|
public DoubleVector(long vector, int size)
|
|
{
|
|
v = vector;
|
|
n = size;
|
|
}
|
|
|
|
private native long DV_ConvertMTBDD(long dd, long vars, int num_vars, long odd);
|
|
public DoubleVector(JDDNode dd, JDDVars vars, ODDNode odd)
|
|
{
|
|
v = DV_ConvertMTBDD(dd.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
n = (int)(odd.getEOff() + odd.getTOff());
|
|
}
|
|
|
|
// get methods
|
|
|
|
public long getPtr()
|
|
{
|
|
return v;
|
|
}
|
|
|
|
public int getSize()
|
|
{
|
|
return n;
|
|
}
|
|
|
|
// get element
|
|
private native double DV_GetElement(long v, int n, int i);
|
|
public double getElement(int i)
|
|
{
|
|
return DV_GetElement(v, n, i);
|
|
}
|
|
|
|
// set element
|
|
private native void DV_SetElement(long v, int n, int i, double d);
|
|
public void setElement(int i, double d)
|
|
{
|
|
DV_SetElement(v, n, i, d);
|
|
}
|
|
|
|
// round off
|
|
private native void DV_RoundOff(long v, int n, int places);
|
|
public void roundOff(int places)
|
|
{
|
|
DV_RoundOff(v, n, places);
|
|
}
|
|
|
|
// subtract all values from 1
|
|
private native void DV_SubtractFromOne(long v, int n);
|
|
public void subtractFromOne()
|
|
{
|
|
DV_SubtractFromOne(v, n);
|
|
}
|
|
|
|
// add another vector to this one
|
|
private native void DV_Add(long v, int n, long v2);
|
|
public void add(DoubleVector dv)
|
|
{
|
|
DV_Add(v, n, dv.v);
|
|
}
|
|
|
|
// multiply vector by a constant
|
|
private native void DV_TimesConstant(long v, int n, double d);
|
|
public void timesConstant(double d)
|
|
{
|
|
DV_TimesConstant(v, n, d);
|
|
}
|
|
|
|
// filter vector using a bdd (set elements not in filter to 0)
|
|
private native void DV_Filter(long v, long filter, long vars, int num_vars, long odd);
|
|
public void filter(JDDNode filter, JDDVars vars, ODDNode odd)
|
|
{
|
|
DV_Filter(v, filter.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
}
|
|
|
|
// apply max operator, i.e. v[i] = max(v[i], v2[i]), where v2 is an mtbdd
|
|
private native void DV_MaxMTBDD(long v, long v2, long vars, int num_vars, long odd);
|
|
public void maxMTBDD(JDDNode v2, JDDVars vars, ODDNode odd)
|
|
{
|
|
DV_MaxMTBDD(v, v2.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
}
|
|
|
|
// clear (free memory)
|
|
private native void DV_Clear(long v);
|
|
public void clear()
|
|
{
|
|
DV_Clear(v);
|
|
}
|
|
|
|
// get number of non zeros
|
|
private native int DV_GetNNZ(long v, int n);
|
|
public int getNNZ()
|
|
{
|
|
return DV_GetNNZ(v, n);
|
|
}
|
|
|
|
// get value of first element in BDD filter
|
|
private native double DV_FirstFromBDD(long v, long filter, long vars, int num_vars, long odd);
|
|
public double firstFromBDD(JDDNode filter, JDDVars vars, ODDNode odd)
|
|
{
|
|
return DV_FirstFromBDD(v, filter.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
}
|
|
|
|
// get min value over BDD filter
|
|
private native double DV_MinOverBDD(long v, long filter, long vars, int num_vars, long odd);
|
|
public double minOverBDD(JDDNode filter, JDDVars vars, ODDNode odd)
|
|
{
|
|
return DV_MinOverBDD(v, filter.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
}
|
|
|
|
// get max value over BDD filter
|
|
private native double DV_MaxOverBDD(long v, long filter, long vars, int num_vars, long odd);
|
|
public double maxOverBDD(JDDNode filter, JDDVars vars, ODDNode odd)
|
|
{
|
|
return DV_MaxOverBDD(v, filter.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
}
|
|
|
|
// sum elements of vector according to a bdd (used for csl steady state operator)
|
|
private native double DV_SumOverBDD(long v, long filter, long vars, int num_vars, long odd);
|
|
public double sumOverBDD(JDDNode filter, JDDVars vars, ODDNode odd)
|
|
{
|
|
return DV_SumOverBDD(v, filter.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
}
|
|
|
|
// do a weighted sum of the elements of a double array and the values the mtbdd passed in
|
|
// (used for csl reward steady state operator)
|
|
private native double DV_SumOverMTBDD(long v, long mult, long vars, int num_vars, long odd);
|
|
public double sumOverMTBDD(JDDNode mult, JDDVars vars, ODDNode odd)
|
|
{
|
|
return DV_SumOverMTBDD(v, mult.ptr(), vars.array(), vars.n(), odd.ptr());
|
|
}
|
|
|
|
// sum up the elements of a double array, over a subset of its dd vars
|
|
// the dd var subset must be a continuous range of vars, identified by indices: first_var, last_var
|
|
// store the result in a new DoubleVector (whose indices are given by odd2)
|
|
private native void DV_SumOverDDVars(long vec, long vec2, long vars, int num_vars, int first_var, int last_var, long odd, long odd2);
|
|
// throws PrismException on out-of-memory
|
|
public DoubleVector sumOverDDVars(JDDVars vars, ODDNode odd, ODDNode odd2, int first_var, int last_var) throws PrismException
|
|
{
|
|
DoubleVector dv2 = new DoubleVector((int)(odd2.getEOff() + odd2.getTOff()));
|
|
DV_SumOverDDVars(v, dv2.v, vars.array(), vars.n(), first_var, last_var, odd.ptr(), odd2.ptr());
|
|
return dv2;
|
|
}
|
|
|
|
/**
|
|
* Generate BDD for states in the given interval
|
|
* (interval specified as relational operator and bound)
|
|
*/
|
|
public JDDNode getBDDFromInterval(String relOp, double bound, JDDVars vars, ODDNode odd)
|
|
{
|
|
JDDNode sol = null;
|
|
|
|
if (relOp.equals(">=")) {
|
|
sol = new JDDNode(
|
|
DV_BDDGreaterThanEquals(v, bound, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
}
|
|
else if (relOp.equals(">")) {
|
|
sol = new JDDNode(
|
|
DV_BDDGreaterThan(v, bound, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
}
|
|
else if (relOp.equals("<=")) {
|
|
sol = new JDDNode(
|
|
DV_BDDLessThanEquals(v, bound, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
}
|
|
else if (relOp.equals("<")) {
|
|
sol = new JDDNode(
|
|
DV_BDDLessThan(v, bound, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
}
|
|
|
|
return sol;
|
|
}
|
|
private native long DV_BDDGreaterThanEquals(long v, double bound, long vars, int num_vars, long odd);
|
|
private native long DV_BDDGreaterThan(long v, double bound, long vars, int num_vars, long odd);
|
|
private native long DV_BDDLessThanEquals(long v, double bound, long vars, int num_vars, long odd);
|
|
private native long DV_BDDLessThan(long v, double bound, long vars, int num_vars, long odd);
|
|
|
|
/**
|
|
* Generate BDD for states in the given interval
|
|
* (interval specified as lower/upper bound)
|
|
*/
|
|
public JDDNode getBDDFromInterval(double lo, double hi, JDDVars vars, ODDNode odd)
|
|
{
|
|
JDDNode sol;
|
|
|
|
sol = new JDDNode(
|
|
DV_BDDInterval(v, lo, hi, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
|
|
return sol;
|
|
}
|
|
private native long DV_BDDInterval(long v, double lo, double hi, long vars, int num_vars, long odd);
|
|
|
|
/**
|
|
* Generate BDD for states whose value is close to 'value'
|
|
* (within absolute error 'epsilon')
|
|
*/
|
|
public JDDNode getBDDFromCloseValueAbs(double value, double epsilon, JDDVars vars, ODDNode odd)
|
|
{
|
|
JDDNode sol;
|
|
|
|
sol = new JDDNode(
|
|
DV_BDDCloseValueAbs(v, value, epsilon, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
|
|
return sol;
|
|
}
|
|
private native long DV_BDDCloseValueAbs(long v, double value, double epsilon, long vars, int num_vars, long odd);
|
|
|
|
/**
|
|
* Generate BDD for states whose value is close to 'value'
|
|
* (within relative error 'epsilon')
|
|
*/
|
|
public JDDNode getBDDFromCloseValueRel(double value, double epsilon, JDDVars vars, ODDNode odd)
|
|
{
|
|
JDDNode sol;
|
|
|
|
sol = new JDDNode(
|
|
DV_BDDCloseValueRel(v, value, epsilon, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
|
|
return sol;
|
|
}
|
|
private native long DV_BDDCloseValueRel(long v, double value, double epsilon, long vars, int num_vars, long odd);
|
|
|
|
/**
|
|
* Convert to an MTBDD representation.
|
|
*/
|
|
private native long DV_ConvertToMTBDD(long v, long vars, int num_vars, long odd);
|
|
public JDDNode convertToMTBDD(JDDVars vars, ODDNode odd)
|
|
{
|
|
JDDNode sol;
|
|
|
|
sol = new JDDNode(
|
|
DV_ConvertToMTBDD(v, vars.array(), vars.n(), odd.ptr())
|
|
);
|
|
|
|
return sol;
|
|
}
|
|
|
|
// print (all, including nonzeros)
|
|
public void print(PrismLog log)
|
|
{
|
|
int i;
|
|
double d;
|
|
|
|
for (i = 0; i < n; i++) {
|
|
d = DV_GetElement(v, n, i);
|
|
log.print(d + " ");
|
|
}
|
|
log.println();
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|