@ -31,7 +31,7 @@
// local function prototypes
// local function prototypes
static void mtbdd_to_double_vector_rec ( DdManager * ddman , DdNode * dd , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o , double * res ) ;
static void mtbdd_to_double_vector_rec ( DdManager * ddman , DdNode * dd , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o , long n , double * res ) ;
static DdNode * double_vector_to_mtbdd_rec ( DdManager * ddman , double * vec , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o ) ;
static DdNode * double_vector_to_mtbdd_rec ( DdManager * ddman , double * vec , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o ) ;
static DdNode * double_vector_to_bdd_rec ( DdManager * ddman , double * vec , int rel_op , double value1 , double value2 , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o ) ;
static DdNode * double_vector_to_bdd_rec ( DdManager * ddman , double * vec , int rel_op , double value1 , double value2 , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o ) ;
static void filter_double_vector_rec ( DdManager * ddman , double * vec , DdNode * filter , double d , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o ) ;
static void filter_double_vector_rec ( DdManager * ddman , double * vec , DdNode * filter , double d , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o ) ;
@ -62,7 +62,7 @@ EXPORT double *mtbdd_to_double_vector(DdManager *ddman, DdNode *dd, DdNode **var
EXPORT double * mtbdd_to_double_vector ( DdManager * ddman , DdNode * dd , DdNode * * vars , int num_vars , ODDNode * odd , double * res )
EXPORT double * mtbdd_to_double_vector ( DdManager * ddman , DdNode * dd , DdNode * * vars , int num_vars , ODDNode * odd , double * res )
{
{
int i , n ;
long i , n ;
// determine size
// determine size
n = odd - > eoff + odd - > toff ;
n = odd - > eoff + odd - > toff ;
@ -73,18 +73,22 @@ EXPORT double *mtbdd_to_double_vector(DdManager *ddman, DdNode *dd, DdNode **var
res [ i ] = 0.0 ;
res [ i ] = 0.0 ;
}
}
// build array recursively
// build array recursively
mtbdd_to_double_vector_rec ( ddman , dd , vars , num_vars , 0 , odd , 0 , res ) ;
mtbdd_to_double_vector_rec ( ddman , dd , vars , num_vars , 0 , odd , 0 , n , res ) ;
return res ;
return res ;
}
}
void mtbdd_to_double_vector_rec ( DdManager * ddman , DdNode * dd , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o , double * res )
void mtbdd_to_double_vector_rec ( DdManager * ddman , DdNode * dd , DdNode * * vars , int num_vars , int level , ODDNode * odd , long o , long n , double * res )
{
{
DdNode * e , * t ;
DdNode * e , * t ;
if ( dd = = Cudd_ReadZero ( ddman ) ) return ;
if ( dd = = Cudd_ReadZero ( ddman ) ) return ;
if ( level = = num_vars ) {
if ( level = = num_vars ) {
if ( o < 0 | | o > = n ) {
printf ( " Internal error: Can not convert MTBDD to double vector: Value out of range of the ODD (does the MTBDD encode non-reachable states?) \n " ) ;
exit ( 1 ) ;
}
res [ o ] = Cudd_V ( dd ) ;
res [ o ] = Cudd_V ( dd ) ;
return ;
return ;
}
}
@ -96,8 +100,8 @@ void mtbdd_to_double_vector_rec(DdManager *ddman, DdNode *dd, DdNode **vars, int
t = Cudd_T ( dd ) ;
t = Cudd_T ( dd ) ;
}
}
mtbdd_to_double_vector_rec ( ddman , e , vars , num_vars , level + 1 , odd - > e , o , res ) ;
mtbdd_to_double_vector_rec ( ddman , t , vars , num_vars , level + 1 , odd - > t , o + odd - > eoff , res ) ;
mtbdd_to_double_vector_rec ( ddman , e , vars , num_vars , level + 1 , odd - > e , o , n , res ) ;
mtbdd_to_double_vector_rec ( ddman , t , vars , num_vars , level + 1 , odd - > t , o + odd - > eoff , n , res ) ;
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------