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.
 
 
 
 

6331 lines
119 KiB

/**
@file
@ingroup cplusplus
@brief Functions for the C++ object-oriented encapsulation of CUDD.
@author Fabio Somenzi
@copyright@parblock
Copyright (c) 1995-2015, Regents of the University of Colorado
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
Neither the name of the University of Colorado nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
@endparblock
*/
#include <iostream>
#include <sstream>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <stdexcept>
#include "epdInt.h"
#include "cuddInt.h"
#include "cuddObj.hh"
using std::cout;
using std::cerr;
using std::ostream;
using std::endl;
using std::hex;
using std::dec;
using std::string;
using std::vector;
using std::sort;
namespace cudd {
// ---------------------------------------------------------------------------
// Variable declarations
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// Members of class Capsule
// ---------------------------------------------------------------------------
/**
@brief Class for reference counting of CUDD managers.
@see Cudd DD ABDD ADD BDD ZDD
*/
class Capsule {
public:
Capsule(unsigned int numVars, unsigned int numVarsZ,
unsigned int numSlots, unsigned int cacheSize,
unsigned long maxMemory, PFC defaultHandler);
~Capsule();
#if HAVE_MODERN_CXX == 1
Capsule(Capsule const &) = delete;
Capsule & operator=(Capsule const &) = delete;
#else
private:
Capsule(Capsule const &); // not defined
Capsule & operator=(Capsule const &); // not defined
public:
#endif
DdManager *manager;
PFC errorHandler;
PFC timeoutHandler;
PFC terminationHandler;
std::vector<char *> varnames;
int ref;
bool verbose;
};
Capsule::Capsule(
unsigned int numVars,
unsigned int numVarsZ,
unsigned int numSlots,
unsigned int cacheSize,
unsigned long maxMemory,
PFC defaultHandler)
{
errorHandler = defaultHandler;
timeoutHandler = defaultHandler;
terminationHandler = defaultHandler;
manager = Cudd_Init(numVars, numVarsZ, numSlots, cacheSize, maxMemory);
if (!manager)
errorHandler("Out of memory");
verbose = 0; // initially terse
ref = 1;
} // Capsule::Capsule
Capsule::~Capsule()
{
#ifdef DD_DEBUG
if (manager) {
int retval = Cudd_CheckZeroRef(manager);
if (retval != 0) {
cerr << retval << " unexpected non-zero reference counts" << endl;
} else if (verbose) {
cerr << "All went well" << endl;
}
}
#endif
for (vector<char *>::iterator it = varnames.begin();
it != varnames.end(); ++it) {
delete [] *it;
}
Cudd_Quit(manager);
} // Capsule::~Capsule
// ---------------------------------------------------------------------------
// Members of class DD
// ---------------------------------------------------------------------------
DD::DD() : p(0), node(0) {}
DD::DD(Capsule *cap, DdNode *ddNode) : p(cap), node(ddNode) {
if (node) Cudd_Ref(node);
if (p->verbose) {
cout << "Standard DD constructor for node " << hex << node << dec <<
" ref = " << Cudd_Regular(node)->ref << "\n";
}
} // DD::DD
DD::DD(Cudd const & manager, DdNode *ddNode) : p(manager.p), node(ddNode) {
checkReturnValue(ddNode);
if (node) Cudd_Ref(node);
if (p->verbose) {
cout << "Standard DD constructor for node " << hex << node << dec <<
" ref = " << Cudd_Regular(node)->ref << "\n";
}
} // DD::DD
DD::DD(const DD &from) {
p = from.p;
node = from.node;
if (node) {
Cudd_Ref(node);
if (p->verbose) {
cout << "Copy DD constructor for node " << hex << node << dec <<
" ref = " << Cudd_Regular(node)->ref << "\n";
}
}
} // DD::DD
DD::~DD() {}
inline DdManager *
DD::checkSameManager(
const DD &other) const
{
DdManager *mgr = p->manager;
if (mgr != other.p->manager) {
p->errorHandler("Operands come from different manager.");
}
return mgr;
} // DD::checkSameManager
inline void
DD::checkReturnValue(
const void *result) const
{
if (result == 0) {
DdManager *mgr = p->manager;
Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
switch (errType) {
case CUDD_MEMORY_OUT:
p->errorHandler("Out of memory.");
break;
case CUDD_TOO_MANY_NODES:
break;
case CUDD_MAX_MEM_EXCEEDED:
p->errorHandler("Maximum memory exceeded.");
break;
case CUDD_TIMEOUT_EXPIRED:
{
std::ostringstream msg;
unsigned long lag =
Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
msg << "Timeout expired. Lag = " << lag << " ms.";
p->timeoutHandler(msg.str());
}
break;
case CUDD_TERMINATION:
{
std::ostringstream msg;
msg << "Terminated.\n";
p->terminationHandler(msg.str());
}
break;
case CUDD_INVALID_ARG:
p->errorHandler("Invalid argument.");
break;
case CUDD_INTERNAL_ERROR:
p->errorHandler("Internal error.");
break;
case CUDD_NO_ERROR:
p->errorHandler("Unexpected error.");
break;
}
}
} // DD::checkReturnValue
inline void
DD::checkReturnValue(
int result,
int expected) const
{
if (result != expected) {
DdManager *mgr = p->manager;
Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
switch (errType) {
case CUDD_MEMORY_OUT:
p->errorHandler("Out of memory.");
break;
case CUDD_TOO_MANY_NODES:
break;
case CUDD_MAX_MEM_EXCEEDED:
p->errorHandler("Maximum memory exceeded.");
break;
case CUDD_TIMEOUT_EXPIRED:
{
std::ostringstream msg;
unsigned long lag =
Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
msg << "Timeout expired. Lag = " << lag << " ms.\n";
p->timeoutHandler(msg.str());
}
break;
case CUDD_TERMINATION:
{
std::ostringstream msg;
msg << "Terminated.\n";
p->terminationHandler(msg.str());
}
break;
case CUDD_INVALID_ARG:
p->errorHandler("Invalid argument.");
break;
case CUDD_INTERNAL_ERROR:
p->errorHandler("Internal error.");
break;
case CUDD_NO_ERROR:
p->errorHandler("Unexpected error.");
break;
}
}
} // DD::checkReturnValue
DdManager *
DD::manager() const
{
return p->manager;
} // DD::manager
DdNode *
DD::getNode() const
{
return node;
} // DD::getNode
DdNode *
DD::getRegularNode() const
{
return Cudd_Regular(node);
} // DD::getRegularNode
int
DD::nodeCount() const
{
return Cudd_DagSize(node);
} // DD::nodeCount
unsigned int
DD::NodeReadIndex() const
{
return Cudd_NodeReadIndex(node);
} // DD::NodeReadIndex
// ---------------------------------------------------------------------------
// Members of class ABDD
// ---------------------------------------------------------------------------
ABDD::ABDD() : DD() {}
ABDD::ABDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {}
ABDD::ABDD(Cudd const & manager, DdNode *bddNode) : DD(manager,bddNode) {}
ABDD::ABDD(const ABDD &from) : DD(from) {}
ABDD::~ABDD() {
if (node) {
Cudd_RecursiveDeref(p->manager,node);
if (p->verbose) {
cout << "ADD/BDD destructor called for node " << hex << dec <<
node << " ref = " << Cudd_Regular(node)->ref << "\n";
}
}
} // ABDD::~ABDD
bool
ABDD::operator==(
const ABDD& other) const
{
checkSameManager(other);
return node == other.node;
} // ABDD::operator==
bool
ABDD::operator!=(
const ABDD& other) const
{
checkSameManager(other);
return node != other.node;
} // ABDD::operator!=
bool
ABDD::IsOne() const
{
return node == Cudd_ReadOne(p->manager);
} // ABDD::IsOne
void
ABDD::print(
int nvars,
int verbosity) const
{
cout.flush();
if (!node) defaultError("empty DD.");
int retval = Cudd_PrintDebug(p->manager,node,nvars,verbosity);
fflush(Cudd_ReadStdout(p->manager));
checkReturnValue(retval);
//if (retval == 0) p->errorHandler("print failed");
} // ABDD::print
void
ABDD::summary(
int nvars,
int mode) const
{
cout.flush();
if (!node) defaultError("empty DD.");
int retval = Cudd_PrintSummary(p->manager,node,nvars,mode);
fflush(Cudd_ReadStdout(p->manager));
checkReturnValue(retval);
} // ABDD::summary
// ---------------------------------------------------------------------------
// Members of class BDD
// ---------------------------------------------------------------------------
BDD::BDD() : ABDD() {}
BDD::BDD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {}
BDD::BDD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {}
BDD::BDD(const BDD &from) : ABDD(from) {}
BDD
BDD::operator=(
const BDD& right)
{
if (this == &right) return *this;
if (right.node) Cudd_Ref(right.node);
if (node) {
Cudd_RecursiveDeref(p->manager,node);
if (p->verbose) {
cout << "BDD dereferencing for node " << hex << node << dec <<
" ref = " << Cudd_Regular(node)->ref << "\n";
}
}
node = right.node;
p = right.p;
if (node && p->verbose) {
cout << "BDD assignment for node " << hex << node << dec <<
" ref = " << Cudd_Regular(node)->ref << "\n";
}
return *this;
} // BDD::operator=
bool
BDD::operator<=(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
return Cudd_bddLeq(mgr,node,other.node);
} // BDD::operator<=
bool
BDD::operator>=(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
return Cudd_bddLeq(mgr,other.node,node);
} // BDD::operator>=
bool
BDD::operator<(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
return node != other.node && Cudd_bddLeq(mgr,node,other.node);
} // BDD::operator<
bool
BDD::operator>(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
return node != other.node && Cudd_bddLeq(mgr,other.node,node);
} // BDD::operator>
BDD
BDD::operator!() const
{
return BDD(p, Cudd_Not(node));
} // BDD::operator!
BDD
BDD::operator~() const
{
return BDD(p, Cudd_Not(node));
} // BDD::operator~
BDD
BDD::operator*(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddAnd(mgr,node,other.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::operator*
BDD
BDD::operator*=(
const BDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddAnd(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // BDD::operator*=
BDD
BDD::operator&(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddAnd(mgr,node,other.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::operator&
BDD
BDD::operator&=(
const BDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddAnd(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // BDD::operator&=
BDD
BDD::operator+(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddOr(mgr,node,other.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::operator+
BDD
BDD::operator+=(
const BDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddOr(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // BDD::operator+=
BDD
BDD::operator|(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddOr(mgr,node,other.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::operator|
BDD
BDD::operator|=(
const BDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddOr(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // BDD::operator|=
BDD
BDD::operator^(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddXor(mgr,node,other.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::operator^
BDD
BDD::operator^=(
const BDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddXor(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // BDD::operator^=
BDD
BDD::operator-(
const BDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node));
checkReturnValue(result);
return BDD(p, result);
} // BDD::operator-
BDD
BDD::operator-=(
const BDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node));
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // BDD::operator-=
ostream & operator<<(ostream & os, BDD const & f)
{
if (!f.node) defaultError("empty DD.");
DdManager *mgr = f.p->manager;
vector<char *> const & vn = f.p->varnames;
char const * const *inames = vn.size() == (size_t) Cudd_ReadSize(mgr) ?
&vn[0] : 0;
char * str = Cudd_FactoredFormString(mgr, f.node, inames);
f.checkReturnValue(str);
os << string(str);
free(str);
return os;
} // operator<<
bool
BDD::IsZero() const
{
return node == Cudd_ReadLogicZero(p->manager);
} // BDD::IsZero
bool
BDD::IsVar() const
{
return Cudd_bddIsVar(p->manager, node);
} // BDD::IsVar
// ---------------------------------------------------------------------------
// Members of class ADD
// ---------------------------------------------------------------------------
ADD::ADD() : ABDD() {}
ADD::ADD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {}
ADD::ADD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {}
ADD::ADD(const ADD &from) : ABDD(from) {}
ADD
ADD::operator=(
const ADD& right)
{
if (this == &right) return *this;
if (right.node) Cudd_Ref(right.node);
if (node) {
Cudd_RecursiveDeref(p->manager,node);
}
node = right.node;
p = right.p;
return *this;
} // ADD::operator=
bool
ADD::operator<=(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
return Cudd_addLeq(mgr,node,other.node);
} // ADD::operator<=
bool
ADD::operator>=(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
return Cudd_addLeq(mgr,other.node,node);
} // ADD::operator>=
bool
ADD::operator<(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
return node != other.node && Cudd_addLeq(mgr,node,other.node);
} // ADD::operator<
bool
ADD::operator>(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
return node != other.node && Cudd_addLeq(mgr,other.node,node);
} // ADD::operator>
ADD
ADD::operator-() const
{
return ADD(p, Cudd_addNegate(p->manager,node));
} // ADD::operator-
ADD
ADD::operator*(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::operator*
ADD
ADD::operator*=(
const ADD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // ADD::operator*=
ADD
ADD::operator+(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::operator+
ADD
ADD::operator+=(
const ADD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // ADD::operator+=
ADD
ADD::operator-(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::operator-
ADD
ADD::operator-=(
const ADD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // ADD::operator-=
ADD
ADD::operator~() const
{
return ADD(p, Cudd_addCmpl(p->manager,node));
} // ADD::operator~
ADD
ADD::operator&(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::operator&
ADD
ADD::operator&=(
const ADD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // ADD::operator&=
ADD
ADD::operator|(
const ADD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::operator|
ADD
ADD::operator|=(
const ADD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDeref(mgr,node);
node = result;
return *this;
} // ADD::operator|=
bool
ADD::IsZero() const
{
return node == Cudd_ReadZero(p->manager);
} // ADD::IsZero
// ---------------------------------------------------------------------------
// Members of class ZDD
// ---------------------------------------------------------------------------
ZDD::ZDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {}
ZDD::ZDD() : DD() {}
ZDD::ZDD(const ZDD &from) : DD(from) {}
ZDD::~ZDD() {
if (node) {
Cudd_RecursiveDerefZdd(p->manager,node);
if (p->verbose) {
cout << "ZDD destructor called for node " << hex << node << dec <<
" ref = " << Cudd_Regular(node)->ref << "\n";
}
}
} // ZDD::~ZDD
ZDD
ZDD::operator=(
const ZDD& right)
{
if (this == &right) return *this;
if (right.node) Cudd_Ref(right.node);
if (node) {
Cudd_RecursiveDerefZdd(p->manager,node);
if (p->verbose) {
cout << "ZDD dereferencing for node " << hex << node << dec <<
" ref = " << node->ref << "\n";
}
}
node = right.node;
p = right.p;
if (node && p->verbose) {
cout << "ZDD assignment for node " << hex << node << dec <<
" ref = " << node->ref << "\n";
}
return *this;
} // ZDD::operator=
bool
ZDD::operator==(
const ZDD& other) const
{
checkSameManager(other);
return node == other.node;
} // ZDD::operator==
bool
ZDD::operator!=(
const ZDD& other) const
{
checkSameManager(other);
return node != other.node;
} // ZDD::operator!=
bool
ZDD::operator<=(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
return Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr);
} // ZDD::operator<=
bool
ZDD::operator>=(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
return Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr);
} // ZDD::operator>=
bool
ZDD::operator<(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
return node != other.node &&
Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr);
} // ZDD::operator<
bool
ZDD::operator>(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
return node != other.node &&
Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr);
} // ZDD::operator>
void
ZDD::print(
int nvars,
int verbosity) const
{
cout.flush();
int retval = Cudd_zddPrintDebug(p->manager,node,nvars,verbosity);
fflush(Cudd_ReadStdout(p->manager));
if (retval == 0) p->errorHandler("print failed");
} // ZDD::print
ZDD
ZDD::operator*(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::operator*
ZDD
ZDD::operator*=(
const ZDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDerefZdd(mgr,node);
node = result;
return *this;
} // ZDD::operator*=
ZDD
ZDD::operator&(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::operator&
ZDD
ZDD::operator&=(
const ZDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDerefZdd(mgr,node);
node = result;
return *this;
} // ZDD::operator&=
ZDD
ZDD::operator+(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddUnion(mgr,node,other.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::operator+
ZDD
ZDD::operator+=(
const ZDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddUnion(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDerefZdd(mgr,node);
node = result;
return *this;
} // ZDD::operator+=
ZDD
ZDD::operator|(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddUnion(mgr,node,other.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::operator|
ZDD
ZDD::operator|=(
const ZDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddUnion(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDerefZdd(mgr,node);
node = result;
return *this;
} // ZDD::operator|=
ZDD
ZDD::operator-(
const ZDD& other) const
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddDiff(mgr,node,other.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::operator-
ZDD
ZDD::operator-=(
const ZDD& other)
{
DdManager *mgr = checkSameManager(other);
DdNode *result = Cudd_zddDiff(mgr,node,other.node);
checkReturnValue(result);
Cudd_Ref(result);
Cudd_RecursiveDerefZdd(mgr,node);
node = result;
return *this;
} // ZDD::operator-=
// ---------------------------------------------------------------------------
// Members of class Cudd
// ---------------------------------------------------------------------------
Cudd::Cudd(
unsigned int numVars,
unsigned int numVarsZ,
unsigned int numSlots,
unsigned int cacheSize,
unsigned long maxMemory,
PFC defaultHandler)
{
p = new Capsule(numVars,numVarsZ,numSlots,cacheSize,maxMemory,defaultHandler);
} // Cudd::Cudd
Cudd::Cudd(
const Cudd& x)
{
p = x.p;
x.p->ref++;
if (p->verbose)
cout << "Cudd Copy Constructor" << endl;
} // Cudd::Cudd
Cudd::~Cudd()
{
if (--p->ref == 0) {
delete p;
}
} // Cudd::~Cudd
DdManager *
Cudd::getManager(void) const
{
return p->manager;
} // Cudd::getManager
void
Cudd::makeVerbose(void) const
{
p->verbose = 1;
} // Cudd::makeVerbose
void
Cudd::makeTerse(void) const
{
p->verbose = 0;
} // Cudd::makeTerse
bool
Cudd::isVerbose(void) const
{
return p->verbose;
} // Cudd::isVerbose
Cudd&
Cudd::operator=(
const Cudd& right)
{
right.p->ref++;
if (--p->ref == 0) { // disconnect self
delete p;
}
p = right.p;
return *this;
} // Cudd::operator=
PFC
Cudd::setHandler(
PFC newHandler) const
{
PFC oldHandler = p->errorHandler;
p->errorHandler = newHandler;
return oldHandler;
} // Cudd::setHandler
PFC
Cudd::getHandler() const
{
return p->errorHandler;
} // Cudd::getHandler
PFC
Cudd::setTimeoutHandler(
PFC newHandler) const
{
PFC oldHandler = p->timeoutHandler;
p->timeoutHandler = newHandler;
return oldHandler;
} // Cudd::setTimeoutHandler
PFC
Cudd::getTimeoutHandler() const
{
return p->timeoutHandler;
} // Cudd::getTimeourHandler
PFC
Cudd::setTerminationHandler(
PFC newHandler) const
{
PFC oldHandler = p->terminationHandler;
p->terminationHandler = newHandler;
return oldHandler;
} // Cudd::setTerminationHandler
PFC
Cudd::getTerminationHandler() const
{
return p->terminationHandler;
} // Cudd::getTerminationHandler
void
Cudd::pushVariableName(std::string s) const
{
char * cstr = new char[s.length() + 1];
strcpy(cstr, s.c_str());
p->varnames.push_back(cstr);
}
void
Cudd::clearVariableNames(void) const
{
for (vector<char *>::iterator it = p->varnames.begin();
it != p->varnames.end(); ++it) {
delete [] *it;
}
p->varnames.clear();
}
std::string
Cudd::getVariableName(size_t i) const
{
return std::string(p->varnames.at(i));
}
inline void
Cudd::checkReturnValue(
const void *result) const
{
if (result == 0) {
if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
p->errorHandler("Out of memory.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) {
p->errorHandler("Too many nodes.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) {
p->errorHandler("Maximum memory exceeded.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) {
std::ostringstream msg;
DdManager *mgr = p->manager;
unsigned long lag =
Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
msg << "Timeout expired. Lag = " << lag << " ms.\n";
p->timeoutHandler(msg.str());
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) {
std::ostringstream msg;
msg << "Terminated.\n";
p->terminationHandler(msg.str());
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) {
p->errorHandler("Invalid argument.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) {
p->errorHandler("Internal error.");
} else {
p->errorHandler("Unexpected error.");
}
}
} // Cudd::checkReturnValue
inline void
Cudd::checkReturnValue(
const int result) const
{
if (result == 0) {
if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
p->errorHandler("Out of memory.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) {
p->errorHandler("Too many nodes.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) {
p->errorHandler("Maximum memory exceeded.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) {
std::ostringstream msg;
DdManager *mgr = p->manager;
unsigned long lag =
Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
msg << "Timeout expired. Lag = " << lag << " ms.\n";
p->timeoutHandler(msg.str());
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) {
std::ostringstream msg;
msg << "Terminated.\n";
p->terminationHandler(msg.str());
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) {
p->errorHandler("Invalid argument.");
} else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) {
p->errorHandler("Internal error.");
} else {
p->errorHandler("Unexpected error.");
}
}
} // Cudd::checkReturnValue
void
Cudd::info() const
{
cout.flush();
int retval = Cudd_PrintInfo(p->manager,stdout);
checkReturnValue(retval);
} // Cudd::info
BDD
Cudd::bddVar() const
{
DdNode *result = Cudd_bddNewVar(p->manager);
checkReturnValue(result);
return BDD(p, result);
} // Cudd::bddVar
BDD
Cudd::bddVar(
int index) const
{
DdNode *result = Cudd_bddIthVar(p->manager,index);
checkReturnValue(result);
return BDD(p, result);
} // Cudd::bddVar
BDD
Cudd::bddOne() const
{
DdNode *result = Cudd_ReadOne(p->manager);
checkReturnValue(result);
return BDD(p, result);
} // Cudd::bddOne
BDD
Cudd::bddZero() const
{
DdNode *result = Cudd_ReadLogicZero(p->manager);
checkReturnValue(result);
return BDD(p, result);
} // Cudd::bddZero
ADD
Cudd::addVar() const
{
DdNode *result = Cudd_addNewVar(p->manager);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::addVar
ADD
Cudd::addVar(
int index) const
{
DdNode *result = Cudd_addIthVar(p->manager,index);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::addVar
ADD
Cudd::addOne() const
{
DdNode *result = Cudd_ReadOne(p->manager);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::addOne
ADD
Cudd::addZero() const
{
DdNode *result = Cudd_ReadZero(p->manager);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::addZero
ADD
Cudd::constant(
CUDD_VALUE_TYPE c) const
{
DdNode *result = Cudd_addConst(p->manager, c);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::constant
ADD
Cudd::plusInfinity() const
{
DdNode *result = Cudd_ReadPlusInfinity(p->manager);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::plusInfinity
ADD
Cudd::minusInfinity() const
{
DdNode *result = Cudd_ReadMinusInfinity(p->manager);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::minusInfinity
ZDD
Cudd::zddVar(
int index) const
{
DdNode *result = Cudd_zddIthVar(p->manager,index);
checkReturnValue(result);
return ZDD(p, result);
} // Cudd::zddVar
ZDD
Cudd::zddOne(
int i) const
{
DdNode *result = Cudd_ReadZddOne(p->manager,i);
checkReturnValue(result);
return ZDD(p, result);
} // Cudd::zddOne
ZDD
Cudd::zddZero() const
{
DdNode *result = Cudd_ReadZero(p->manager);
checkReturnValue(result);
return ZDD(p, result);
} // Cudd::zddZero
void
defaultError(
string message)
{
throw std::logic_error(message);
} // defaultError
// ---------------------------------------------------------------------------
// All the rest
// ---------------------------------------------------------------------------
ADD
Cudd::addNewVarAtLevel(
int level) const
{
DdNode *result = Cudd_addNewVarAtLevel(p->manager, level);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::addNewVarAtLevel
BDD
Cudd::bddNewVarAtLevel(
int level) const
{
DdNode *result = Cudd_bddNewVarAtLevel(p->manager, level);
checkReturnValue(result);
return BDD(p, result);
} // Cudd::bddNewVarAtLevel
void
Cudd::zddVarsFromBddVars(
int multiplicity) const
{
int result = Cudd_zddVarsFromBddVars(p->manager, multiplicity);
checkReturnValue(result);
} // Cudd::zddVarsFromBddVars
unsigned long
Cudd::ReadStartTime() const
{
return Cudd_ReadStartTime(p->manager);
} // Cudd::ReadStartTime
unsigned long
Cudd::ReadElapsedTime() const
{
return Cudd_ReadElapsedTime(p->manager);
} // Cudd::ReadElapsedTime
void
Cudd::SetStartTime(
unsigned long st) const
{
Cudd_SetStartTime(p->manager, st);
} // Cudd::SetStartTime
void
Cudd::ResetStartTime() const
{
Cudd_ResetStartTime(p->manager);
} // Cudd::ResetStartTime
unsigned long
Cudd::ReadTimeLimit() const
{
return Cudd_ReadTimeLimit(p->manager);
} // Cudd::ReadTimeLimit
unsigned long
Cudd::SetTimeLimit(
unsigned long tl) const
{
return Cudd_SetTimeLimit(p->manager, tl);
} // Cudd::SetTimeLimit
void
Cudd::UpdateTimeLimit() const
{
Cudd_UpdateTimeLimit(p->manager);
} // Cudd::UpdateTimeLimit
void
Cudd::IncreaseTimeLimit(
unsigned long increase) const
{
Cudd_IncreaseTimeLimit(p->manager, increase);
} // Cudd::IncreaseTimeLimit
void
Cudd::UnsetTimeLimit() const
{
Cudd_UnsetTimeLimit(p->manager);
} // Cudd::UnsetTimeLimit
bool
Cudd::TimeLimited() const
{
return Cudd_TimeLimited(p->manager);
} // Cudd::TimeLimited
void
Cudd::RegisterTerminationCallback(
DD_THFP callback,
void * callback_arg) const
{
Cudd_RegisterTerminationCallback(p->manager, callback, callback_arg);
} // Cudd::RegisterTerminationCallback
void
Cudd::UnregisterTerminationCallback() const
{
Cudd_UnregisterTerminationCallback(p->manager);
} // Cudd::UnregisterTerminationCallback
DD_OOMFP
Cudd::RegisterOutOfMemoryCallback(
DD_OOMFP callback) const
{
return Cudd_RegisterOutOfMemoryCallback(p->manager, callback);
} // Cudd::RegisterOutOfMemoryCallback
void
Cudd::UnregisterOutOfMemoryCallback() const
{
Cudd_UnregisterOutOfMemoryCallback(p->manager);
} // Cudd::UnregisterOutOfMemoryCallback
void
Cudd::AutodynEnable(
Cudd_ReorderingType method) const
{
Cudd_AutodynEnable(p->manager, method);
} // Cudd::AutodynEnable
void
Cudd::AutodynDisable() const
{
Cudd_AutodynDisable(p->manager);
} // Cudd::AutodynDisable
bool
Cudd::ReorderingStatus(
Cudd_ReorderingType * method) const
{
return Cudd_ReorderingStatus(p->manager, method);
} // Cudd::ReorderingStatus
void
Cudd::AutodynEnableZdd(
Cudd_ReorderingType method) const
{
Cudd_AutodynEnableZdd(p->manager, method);
} // Cudd::AutodynEnableZdd
void
Cudd::AutodynDisableZdd() const
{
Cudd_AutodynDisableZdd(p->manager);
} // Cudd::AutodynDisableZdd
bool
Cudd::ReorderingStatusZdd(
Cudd_ReorderingType * method) const
{
return Cudd_ReorderingStatusZdd(p->manager, method);
} // Cudd::ReorderingStatusZdd
bool
Cudd::zddRealignmentEnabled() const
{
return Cudd_zddRealignmentEnabled(p->manager);
} // Cudd::zddRealignmentEnabled
void
Cudd::zddRealignEnable() const
{
Cudd_zddRealignEnable(p->manager);
} // Cudd::zddRealignEnable
void
Cudd::zddRealignDisable() const
{
Cudd_zddRealignDisable(p->manager);
} // Cudd::zddRealignDisable
bool
Cudd::bddRealignmentEnabled() const
{
return Cudd_bddRealignmentEnabled(p->manager);
} // Cudd::bddRealignmentEnabled
void
Cudd::bddRealignEnable() const
{
Cudd_bddRealignEnable(p->manager);
} // Cudd::bddRealignEnable
void
Cudd::bddRealignDisable() const
{
Cudd_bddRealignDisable(p->manager);
} // Cudd::bddRealignDisable
ADD
Cudd::background() const
{
DdNode *result = Cudd_ReadBackground(p->manager);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::background
void
Cudd::SetBackground(
ADD bg) const
{
DdManager *mgr = p->manager;
if (mgr != bg.manager()) {
p->errorHandler("Background comes from different manager.");
}
Cudd_SetBackground(mgr, bg.getNode());
} // Cudd::SetBackground
unsigned int
Cudd::ReadCacheSlots() const
{
return Cudd_ReadCacheSlots(p->manager);
} // Cudd::ReadCacheSlots
double
Cudd::ReadCacheLookUps() const
{
return Cudd_ReadCacheLookUps(p->manager);
} // Cudd::ReadCacheLookUps
double
Cudd::ReadCacheUsedSlots() const
{
return Cudd_ReadCacheUsedSlots(p->manager);
} // Cudd::ReadCacheUsedSlots
double
Cudd::ReadCacheHits() const
{
return Cudd_ReadCacheHits(p->manager);
} // Cudd::ReadCacheHits
unsigned int
Cudd::ReadMinHit() const
{
return Cudd_ReadMinHit(p->manager);
} // Cudd::ReadMinHit
void
Cudd::SetMinHit(
unsigned int hr) const
{
Cudd_SetMinHit(p->manager, hr);
} // Cudd::SetMinHit
unsigned int
Cudd::ReadLooseUpTo() const
{
return Cudd_ReadLooseUpTo(p->manager);
} // Cudd::ReadLooseUpTo
void
Cudd::SetLooseUpTo(
unsigned int lut) const
{
Cudd_SetLooseUpTo(p->manager, lut);
} // Cudd::SetLooseUpTo
unsigned int
Cudd::ReadMaxCache() const
{
return Cudd_ReadMaxCache(p->manager);
} // Cudd::ReadMaxCache
unsigned int
Cudd::ReadMaxCacheHard() const
{
return Cudd_ReadMaxCacheHard(p->manager);
} // Cudd::ReadMaxCacheHard
void
Cudd::SetMaxCacheHard(
unsigned int mc) const
{
Cudd_SetMaxCacheHard(p->manager, mc);
} // Cudd::SetMaxCacheHard
int
Cudd::ReadSize() const
{
return Cudd_ReadSize(p->manager);
} // Cudd::ReadSize
int
Cudd::ReadZddSize() const
{
return Cudd_ReadZddSize(p->manager);
} // Cudd::ReadZddSize
unsigned int
Cudd::ReadSlots() const
{
return Cudd_ReadSlots(p->manager);
} // Cudd::ReadSlots
unsigned int
Cudd::ReadKeys() const
{
return Cudd_ReadKeys(p->manager);
} // Cudd::ReadKeys
unsigned int
Cudd::ReadDead() const
{
return Cudd_ReadDead(p->manager);
} // Cudd::ReadDead
unsigned int
Cudd::ReadMinDead() const
{
return Cudd_ReadMinDead(p->manager);
} // Cudd::ReadMinDead
unsigned int
Cudd::ReadReorderings() const
{
return Cudd_ReadReorderings(p->manager);
} // Cudd::ReadReorderings
unsigned int
Cudd::ReadMaxReorderings() const
{
return Cudd_ReadMaxReorderings(p->manager);
} // Cudd::ReadMaxReorderings
void
Cudd::SetMaxReorderings(
unsigned int mr) const
{
Cudd_SetMaxReorderings(p->manager, mr);
} // Cudd::SetMaxReorderings
long
Cudd::ReadReorderingTime() const
{
return Cudd_ReadReorderingTime(p->manager);
} // Cudd::ReadReorderingTime
int
Cudd::ReadGarbageCollections() const
{
return Cudd_ReadGarbageCollections(p->manager);
} // Cudd::ReadGarbageCollections
long
Cudd::ReadGarbageCollectionTime() const
{
return Cudd_ReadGarbageCollectionTime(p->manager);
} // Cudd::ReadGarbageCollectionTime
int
Cudd::ReadSiftMaxVar() const
{
return Cudd_ReadSiftMaxVar(p->manager);
} // Cudd::ReadSiftMaxVar
void
Cudd::SetSiftMaxVar(
int smv) const
{
Cudd_SetSiftMaxVar(p->manager, smv);
} // Cudd::SetSiftMaxVar
int
Cudd::ReadSiftMaxSwap() const
{
return Cudd_ReadSiftMaxSwap(p->manager);
} // Cudd::ReadSiftMaxSwap
void
Cudd::SetSiftMaxSwap(
int sms) const
{
Cudd_SetSiftMaxSwap(p->manager, sms);
} // Cudd::SetSiftMaxSwap
double
Cudd::ReadMaxGrowth() const
{
return Cudd_ReadMaxGrowth(p->manager);
} // Cudd::ReadMaxGrowth
void
Cudd::SetMaxGrowth(
double mg) const
{
Cudd_SetMaxGrowth(p->manager, mg);
} // Cudd::SetMaxGrowth
MtrNode *
Cudd::ReadTree() const
{
return Cudd_ReadTree(p->manager);
} // Cudd::ReadTree
void
Cudd::SetTree(
MtrNode * tree) const
{
Cudd_SetTree(p->manager, tree);
} // Cudd::SetTree
void
Cudd::FreeTree() const
{
Cudd_FreeTree(p->manager);
} // Cudd::FreeTree
MtrNode *
Cudd::ReadZddTree() const
{
return Cudd_ReadZddTree(p->manager);
} // Cudd::ReadZddTree
void
Cudd::SetZddTree(
MtrNode * tree) const
{
Cudd_SetZddTree(p->manager, tree);
} // Cudd::SetZddTree
void
Cudd::FreeZddTree() const
{
Cudd_FreeZddTree(p->manager);
} // Cudd::FreeZddTree
int
Cudd::ReadPerm(
int i) const
{
return Cudd_ReadPerm(p->manager, i);
} // Cudd::ReadPerm
int
Cudd::ReadPermZdd(
int i) const
{
return Cudd_ReadPermZdd(p->manager, i);
} // Cudd::ReadPermZdd
int
Cudd::ReadInvPerm(
int i) const
{
return Cudd_ReadInvPerm(p->manager, i);
} // Cudd::ReadInvPerm
int
Cudd::ReadInvPermZdd(
int i) const
{
return Cudd_ReadInvPermZdd(p->manager, i);
} // Cudd::ReadInvPermZdd
BDD
Cudd::ReadVars(
int i) const
{
DdNode *result = Cudd_ReadVars(p->manager, i);
checkReturnValue(result);
return BDD(p, result);
} // Cudd::ReadVars
CUDD_VALUE_TYPE
Cudd::ReadEpsilon() const
{
return Cudd_ReadEpsilon(p->manager);
} // Cudd::ReadEpsilon
void
Cudd::SetEpsilon(
CUDD_VALUE_TYPE ep) const
{
Cudd_SetEpsilon(p->manager, ep);
} // Cudd::SetEpsilon
Cudd_AggregationType
Cudd::ReadGroupcheck() const
{
return Cudd_ReadGroupcheck(p->manager);
} // Cudd::ReadGroupcheck
void
Cudd::SetGroupcheck(
Cudd_AggregationType gc) const
{
Cudd_SetGroupcheck(p->manager, gc);
} // Cudd::SetGroupcheck
bool
Cudd::GarbageCollectionEnabled() const
{
return Cudd_GarbageCollectionEnabled(p->manager);
} // Cudd::GarbageCollectionEnabled
void
Cudd::EnableGarbageCollection() const
{
Cudd_EnableGarbageCollection(p->manager);
} // Cudd::EnableGarbageCollection
void
Cudd::DisableGarbageCollection() const
{
Cudd_DisableGarbageCollection(p->manager);
} // Cudd::DisableGarbageCollection
bool
Cudd::DeadAreCounted() const
{
return Cudd_DeadAreCounted(p->manager);
} // Cudd::DeadAreCounted
void
Cudd::TurnOnCountDead() const
{
Cudd_TurnOnCountDead(p->manager);
} // Cudd::TurnOnCountDead
void
Cudd::TurnOffCountDead() const
{
Cudd_TurnOffCountDead(p->manager);
} // Cudd::TurnOffCountDead
int
Cudd::ReadRecomb() const
{
return Cudd_ReadRecomb(p->manager);
} // Cudd::ReadRecomb
void
Cudd::SetRecomb(
int recomb) const
{
Cudd_SetRecomb(p->manager, recomb);
} // Cudd::SetRecomb
int
Cudd::ReadSymmviolation() const
{
return Cudd_ReadSymmviolation(p->manager);
} // Cudd::ReadSymmviolation
void
Cudd::SetSymmviolation(
int symmviolation) const
{
Cudd_SetSymmviolation(p->manager, symmviolation);
} // Cudd::SetSymmviolation
int
Cudd::ReadArcviolation() const
{
return Cudd_ReadArcviolation(p->manager);
} // Cudd::ReadArcviolation
void
Cudd::SetArcviolation(
int arcviolation) const
{
Cudd_SetArcviolation(p->manager, arcviolation);
} // Cudd::SetArcviolation
int
Cudd::ReadPopulationSize() const
{
return Cudd_ReadPopulationSize(p->manager);
} // Cudd::ReadPopulationSize
void
Cudd::SetPopulationSize(
int populationSize) const
{
Cudd_SetPopulationSize(p->manager, populationSize);
} // Cudd::SetPopulationSize
int
Cudd::ReadNumberXovers() const
{
return Cudd_ReadNumberXovers(p->manager);
} // Cudd::ReadNumberXovers
void
Cudd::SetNumberXovers(
int numberXovers) const
{
Cudd_SetNumberXovers(p->manager, numberXovers);
} // Cudd::SetNumberXovers
unsigned int
Cudd::ReadOrderRandomization() const
{
return Cudd_ReadOrderRandomization(p->manager);
} // Cudd::ReadOrderRandomization
void
Cudd::SetOrderRandomization(
unsigned int factor) const
{
Cudd_SetOrderRandomization(p->manager, factor);
} // Cudd::SetOrderRandomization
unsigned long
Cudd::ReadMemoryInUse() const
{
return Cudd_ReadMemoryInUse(p->manager);
} // Cudd::ReadMemoryInUse
long
Cudd::ReadPeakNodeCount() const
{
return Cudd_ReadPeakNodeCount(p->manager);
} // Cudd::ReadPeakNodeCount
long
Cudd::ReadNodeCount() const
{
return Cudd_ReadNodeCount(p->manager);
} // Cudd::ReadNodeCount
long
Cudd::zddReadNodeCount() const
{
return Cudd_zddReadNodeCount(p->manager);
} // Cudd::zddReadNodeCount
void
Cudd::AddHook(
DD_HFP f,
Cudd_HookType where) const
{
int result = Cudd_AddHook(p->manager, f, where);
checkReturnValue(result);
} // Cudd::AddHook
void
Cudd::RemoveHook(
DD_HFP f,
Cudd_HookType where) const
{
int result = Cudd_RemoveHook(p->manager, f, where);
checkReturnValue(result);
} // Cudd::RemoveHook
bool
Cudd::IsInHook(
DD_HFP f,
Cudd_HookType where) const
{
return Cudd_IsInHook(p->manager, f, where);
} // Cudd::IsInHook
void
Cudd::EnableReorderingReporting() const
{
int result = Cudd_EnableReorderingReporting(p->manager);
checkReturnValue(result);
} // Cudd::EnableReorderingReporting
void
Cudd::DisableReorderingReporting() const
{
int result = Cudd_DisableReorderingReporting(p->manager);
checkReturnValue(result);
} // Cudd::DisableReorderingReporting
bool
Cudd::ReorderingReporting() const
{
return Cudd_ReorderingReporting(p->manager);
} // Cudd::ReorderingReporting
int
Cudd::ReadErrorCode() const
{
return Cudd_ReadErrorCode(p->manager);
} // Cudd::ReadErrorCode
void
Cudd::ClearErrorCode() const
{
Cudd_ClearErrorCode(p->manager);
} // Cudd::ClearErrorCode
DD_OOMFP Cudd::InstallOutOfMemoryHandler(DD_OOMFP newHandler) const
{
return Cudd_InstallOutOfMemoryHandler(newHandler);
} // Cudd::InstallOutOfMemoryHandler
FILE *
Cudd::ReadStdout() const
{
return Cudd_ReadStdout(p->manager);
} // Cudd::ReadStdout
void
Cudd::SetStdout(FILE *fp) const
{
Cudd_SetStdout(p->manager, fp);
} // Cudd::SetStdout
FILE *
Cudd::ReadStderr() const
{
return Cudd_ReadStderr(p->manager);
} // Cudd::ReadStderr
void
Cudd::SetStderr(FILE *fp) const
{
Cudd_SetStderr(p->manager, fp);
} // Cudd::SetStderr
unsigned int
Cudd::ReadNextReordering() const
{
return Cudd_ReadNextReordering(p->manager);
} // Cudd::ReadNextReordering
void
Cudd::SetNextReordering(
unsigned int next) const
{
Cudd_SetNextReordering(p->manager, next);
} // Cudd::SetNextReordering
double
Cudd::ReadSwapSteps() const
{
return Cudd_ReadSwapSteps(p->manager);
} // Cudd::ReadSwapSteps
unsigned int
Cudd::ReadMaxLive() const
{
return Cudd_ReadMaxLive(p->manager);
} // Cudd::ReadMaxLive
void
Cudd::SetMaxLive(unsigned int maxLive) const
{
Cudd_SetMaxLive(p->manager, maxLive);
} // Cudd::SetMaxLive
size_t
Cudd::ReadMaxMemory() const
{
return Cudd_ReadMaxMemory(p->manager);
} // Cudd::ReadMaxMemory
size_t
Cudd::SetMaxMemory(size_t maxMem) const
{
return Cudd_SetMaxMemory(p->manager, maxMem);
} // Cudd::SetMaxMemory
int
Cudd::bddBindVar(int index) const
{
return Cudd_bddBindVar(p->manager, index);
} // Cudd::bddBindVar
int
Cudd::bddUnbindVar(int index) const
{
return Cudd_bddUnbindVar(p->manager, index);
} // Cudd::bddUnbindVar
bool
Cudd::bddVarIsBound(int index) const
{
return Cudd_bddVarIsBound(p->manager, index);
} // Cudd::bddVarIsBound
ADD
ADD::ExistAbstract(
const ADD& cube) const
{
DdManager *mgr = checkSameManager(cube);
DdNode *result = Cudd_addExistAbstract(mgr, node, cube.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::ExistAbstract
ADD
ADD::UnivAbstract(
const ADD& cube) const
{
DdManager *mgr = checkSameManager(cube);
DdNode *result = Cudd_addUnivAbstract(mgr, node, cube.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::UnivAbstract
ADD
ADD::OrAbstract(
const ADD& cube) const
{
DdManager *mgr = checkSameManager(cube);
DdNode *result = Cudd_addOrAbstract(mgr, node, cube.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::OrAbstract
ADD
ADD::MinAbstract(const ADD& cube) const
{
DdManager *mgr = checkSameManager(cube);
DdNode *result = Cudd_addMinAbstract(mgr, node, cube.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::MinAbstract
ADD
ADD::MaxAbstract(const ADD& cube) const
{
DdManager *mgr = checkSameManager(cube);
DdNode *result = Cudd_addMaxAbstract(mgr, node, cube.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::MaxAbstract
ADD
ADD::Plus(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addPlus, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Plus
ADD
ADD::Times(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addTimes, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Times
ADD
ADD::Threshold(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addThreshold, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Threshold
ADD
ADD::SetNZ(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addSetNZ, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::SetNZ
ADD
ADD::Divide(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addDivide, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Divide
ADD
ADD::Minus(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addMinus, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Minus
ADD
ADD::Minimum(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addMinimum, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Minimum
ADD
ADD::Maximum(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addMaximum, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Maximum
ADD
ADD::OneZeroMaximum(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addOneZeroMaximum, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::OneZeroMaximum
ADD
ADD::Diff(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addDiff, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Diff
ADD
ADD::Agreement(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addAgreement, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Agreement
ADD
ADD::Or(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addOr, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Or
ADD
ADD::Nand(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addNand, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Nand
ADD
ADD::Nor(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addNor, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Nor
ADD
ADD::Xor(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addXor, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Xor
ADD
ADD::Xnor(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addXnor, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Xnor
ADD
ADD::Pow(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addPow, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Pow
ADD
ADD::Mod(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addMod, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Mod
ADD
ADD::LogXY(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addLogXY, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::LogXY
ADD
ADD::Log() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addLog, node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Log
ADD
ADD::Floor() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addFloor, node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Floor
ADD
ADD::Ceil() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addCeil, node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Ceil
ADD
ADD::FindMax() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addFindMax(mgr, node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::FindMax
ADD
ADD::FindMin() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addFindMin(mgr, node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::FindMin
ADD
ADD::IthBit(
int bit) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addIthBit(mgr, node, bit);
checkReturnValue(result);
return ADD(p, result);
} // ADD::IthBit
ADD
ADD::ScalarInverse(
const ADD& epsilon) const
{
DdManager *mgr = checkSameManager(epsilon);
DdNode *result = Cudd_addScalarInverse(mgr, node, epsilon.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::ScalarInverse
ADD
ADD::Ite(
const ADD& g,
const ADD& h) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(h);
DdNode *result = Cudd_addIte(mgr, node, g.node, h.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Ite
ADD
ADD::IteConstant(
const ADD& g,
const ADD& h) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(h);
DdNode *result = Cudd_addIteConstant(mgr, node, g.node, h.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::IteConstant
ADD
ADD::EvalConst(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addEvalConst(mgr, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::EvalConst
bool
ADD::Leq(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
return Cudd_addLeq(mgr, node, g.node);
} // ADD::Leq
ADD
ADD::Cmpl() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addCmpl(mgr, node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Cmpl
ADD
ADD::Negate() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addNegate(mgr, node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Negate
ADD
ADD::RoundOff(
int N) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addRoundOff(mgr, node, N);
checkReturnValue(result);
return ADD(p, result);
} // ADD::RoundOff
ADD
Cudd::Walsh(
std::vector<ADD> x,
std::vector<ADD> y) const
{
size_t n = x.size();
DdNode **X = new DdNode *[n];
DdNode **Y = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
}
DdNode *result = Cudd_addWalsh(p->manager, X, Y, (int) n);
delete [] X;
delete [] Y;
checkReturnValue(result);
return ADD(p, result);
} // ADD::Walsh
ADD
Cudd::addResidue(
int n,
int m,
int options,
int top) const
{
DdNode *result = Cudd_addResidue(p->manager, n, m, options, top);
checkReturnValue(result);
return ADD(p, result);
} // Cudd::addResidue
ADD
ADD::Equals(const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addEquals, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Equals
ADD
ADD::NotEquals(const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addNotEquals, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::NotEquals
ADD
ADD::LessThan(const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addLessThan, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::LessThan
ADD
ADD::LessThanOrEqual(const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addLessThanEquals, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::LessThanOrEqual
ADD
ADD::GreaterThan(const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addGreaterThan, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::GreaterThan
ADD
ADD::GreaterThanOrEqual(const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addApply(mgr, Cudd_addGreaterThanEquals, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::GreaterThanOrEqual
BDD
BDD::AndAbstract(
const BDD& g,
const BDD& cube,
unsigned int limit) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(cube);
DdNode *result;
if (limit == 0)
result = Cudd_bddAndAbstract(mgr, node, g.node, cube.node);
else
result = Cudd_bddAndAbstractLimit(mgr, node, g.node,
cube.node, limit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::AndAbstract
int
Cudd::ApaNumberOfDigits(
int binaryDigits) const
{
return Cudd_ApaNumberOfDigits(binaryDigits);
} // Cudd::ApaNumberOfDigits
DdApaNumber
Cudd::NewApaNumber(
int digits) const
{
return Cudd_NewApaNumber(digits);
} // Cudd::NewApaNumber
void
Cudd::ApaCopy(
int digits,
DdApaNumber source,
DdApaNumber dest) const
{
Cudd_ApaCopy(digits, source, dest);
} // Cudd::ApaCopy
DdApaDigit
Cudd::ApaAdd(
int digits,
DdApaNumber a,
DdApaNumber b,
DdApaNumber sum) const
{
return Cudd_ApaAdd(digits, a, b, sum);
} // Cudd::ApaAdd
DdApaDigit
Cudd::ApaSubtract(
int digits,
DdApaNumber a,
DdApaNumber b,
DdApaNumber diff) const
{
return Cudd_ApaSubtract(digits, a, b, diff);
} // Cudd::ApaSubtract
DdApaDigit
Cudd::ApaShortDivision(
int digits,
DdApaNumber dividend,
DdApaDigit divisor,
DdApaNumber quotient) const
{
return Cudd_ApaShortDivision(digits, dividend, divisor, quotient);
} // Cudd::ApaShortDivision
void
Cudd::ApaShiftRight(
int digits,
DdApaDigit in,
DdApaNumber a,
DdApaNumber b) const
{
Cudd_ApaShiftRight(digits, in, a, b);
} // Cudd::ApaShiftRight
void
Cudd::ApaSetToLiteral(
int digits,
DdApaNumber number,
DdApaDigit literal) const
{
Cudd_ApaSetToLiteral(digits, number, literal);
} // Cudd::ApaSetToLiteral
void
Cudd::ApaPowerOfTwo(
int digits,
DdApaNumber number,
int power) const
{
Cudd_ApaPowerOfTwo(digits, number, power);
} // Cudd::ApaPowerOfTwo
void
Cudd::ApaPrintHex(
int digits,
DdApaNumber number,
FILE * fp) const
{
cout.flush();
int result = Cudd_ApaPrintHex(fp, digits, number);
checkReturnValue(result);
} // Cudd::ApaPrintHex
void
Cudd::ApaPrintDecimal(
int digits,
DdApaNumber number,
FILE * fp) const
{
cout.flush();
int result = Cudd_ApaPrintDecimal(fp, digits, number);
checkReturnValue(result);
} // Cudd::ApaPrintDecimal
std::string
Cudd::ApaStringDecimal(
int digits,
DdApaNumber number) const
{
char * result = Cudd_ApaStringDecimal(digits, number);
checkReturnValue(result);
std::string ret = std::string(result);
free(result);
return ret;
} // Cudd::ApaStringDecimal
void
Cudd::ApaPrintExponential(
int digits,
DdApaNumber number,
int precision,
FILE * fp) const
{
cout.flush();
int result = Cudd_ApaPrintExponential(fp, digits, number, precision);
checkReturnValue(result);
} // Cudd::ApaPrintExponential
DdApaNumber
ABDD::ApaCountMinterm(
int nvars,
int * digits) const
{
DdManager *mgr = p->manager;
return Cudd_ApaCountMinterm(mgr, node, nvars, digits);
} // ABDD::ApaCountMinterm
void
ABDD::ApaPrintMinterm(
int nvars,
FILE * fp) const
{
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_ApaPrintMinterm(fp, mgr, node, nvars);
checkReturnValue(result);
} // ABDD::ApaPrintMinterm
void
ABDD::ApaPrintMintermExp(
int nvars,
int precision,
FILE * fp) const
{
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_ApaPrintMintermExp(fp, mgr, node, nvars, precision);
checkReturnValue(result);
} // ABDD::ApaPrintMintermExp
void
ABDD::EpdPrintMinterm(
int nvars,
FILE * fp) const
{
EpDouble count;
char str[24];
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_EpdCountMinterm(mgr, node, nvars, &count);
checkReturnValue(result,0);
EpdGetString(&count, str);
fprintf(fp, "%s", str);
} // ABDD::EpdPrintMinterm
long double
ABDD::LdblCountMinterm(
int nvars) const
{
cout.flush();
DdManager *mgr = p->manager;
long double result = Cudd_LdblCountMinterm(mgr, node, nvars);
checkReturnValue(result != (long double) CUDD_OUT_OF_MEM);
return result;
} // ABDD::LdblCountMinterm
BDD
BDD::UnderApprox(
int numVars,
int threshold,
bool safe,
double quality) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_UnderApprox(mgr, node, numVars, threshold, safe, quality);
checkReturnValue(result);
return BDD(p, result);
} // BDD::UnderApprox
BDD
BDD::OverApprox(
int numVars,
int threshold,
bool safe,
double quality) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_OverApprox(mgr, node, numVars, threshold, safe, quality);
checkReturnValue(result);
return BDD(p, result);
} // BDD::OverApprox
BDD
BDD::RemapUnderApprox(
int numVars,
int threshold,
double quality) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_RemapUnderApprox(mgr, node, numVars, threshold, quality);
checkReturnValue(result);
return BDD(p, result);
} // BDD::RemapUnderApprox
BDD
BDD::RemapOverApprox(
int numVars,
int threshold,
double quality) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_RemapOverApprox(mgr, node, numVars, threshold, quality);
checkReturnValue(result);
return BDD(p, result);
} // BDD::RemapOverApprox
BDD
BDD::BiasedUnderApprox(
const BDD& bias,
int numVars,
int threshold,
double quality1,
double quality0) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_BiasedUnderApprox(mgr, node, bias.node, numVars,
threshold, quality1, quality0);
checkReturnValue(result);
return BDD(p, result);
} // BDD::BiasedUnderApprox
BDD
BDD::BiasedOverApprox(
const BDD& bias,
int numVars,
int threshold,
double quality1,
double quality0) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_BiasedOverApprox(mgr, node, bias.node, numVars,
threshold, quality1, quality0);
checkReturnValue(result);
return BDD(p, result);
} // BDD::BiasedOverApprox
BDD
BDD::ExistAbstract(
const BDD& cube,
unsigned int limit) const
{
DdManager *mgr = checkSameManager(cube);
DdNode *result;
if (limit == 0)
result = Cudd_bddExistAbstract(mgr, node, cube.node);
else
result = Cudd_bddExistAbstractLimit(mgr, node, cube.node, limit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::ExistAbstract
BDD
BDD::XorExistAbstract(
const BDD& g,
const BDD& cube) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(cube);
DdNode *result = Cudd_bddXorExistAbstract(mgr, node, g.node, cube.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::XorExistAbstract
BDD
BDD::UnivAbstract(
const BDD& cube) const
{
DdManager *mgr = checkSameManager(cube);
DdNode *result = Cudd_bddUnivAbstract(mgr, node, cube.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::UnivAbstract
BDD
BDD::BooleanDiff(
int x) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_bddBooleanDiff(mgr, node, x);
checkReturnValue(result);
return BDD(p, result);
} // BDD::BooleanDiff
bool
BDD::VarIsDependent(
const BDD& var) const
{
DdManager *mgr = p->manager;
return Cudd_bddVarIsDependent(mgr, node, var.node);
} // BDD::VarIsDependent
double
BDD::Correlation(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
return Cudd_bddCorrelation(mgr, node, g.node);
} // BDD::Correlation
double
BDD::CorrelationWeights(
const BDD& g,
double * prob) const
{
DdManager *mgr = checkSameManager(g);
return Cudd_bddCorrelationWeights(mgr, node, g.node, prob);
} // BDD::CorrelationWeights
BDD
BDD::Ite(
const BDD& g,
const BDD& h,
unsigned int limit) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(h);
DdNode *result;
if (limit == 0)
result = Cudd_bddIte(mgr, node, g.node, h.node);
else
result = Cudd_bddIteLimit(mgr, node, g.node, h.node, limit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Ite
BDD
BDD::IteConstant(
const BDD& g,
const BDD& h) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(h);
DdNode *result = Cudd_bddIteConstant(mgr, node, g.node, h.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::IteConstant
BDD
BDD::Intersect(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddIntersect(mgr, node, g.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Intersect
BDD
BDD::And(
const BDD& g,
unsigned int limit) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result;
if (limit == 0)
result = Cudd_bddAnd(mgr, node, g.node);
else
result = Cudd_bddAndLimit(mgr, node, g.node, limit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::And
BDD
BDD::Or(
const BDD& g,
unsigned int limit) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result;
if (limit == 0)
result = Cudd_bddOr(mgr, node, g.node);
else
result = Cudd_bddOrLimit(mgr, node, g.node, limit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Or
BDD
BDD::Nand(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddNand(mgr, node, g.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Nand
BDD
BDD::Nor(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddNor(mgr, node, g.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Nor
BDD
BDD::Xor(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddXor(mgr, node, g.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Xor
BDD
BDD::Xnor(
const BDD& g,
unsigned int limit) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result;
if (limit == 0)
result = Cudd_bddXnor(mgr, node, g.node);
else
result = Cudd_bddXnorLimit(mgr, node, g.node, limit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Xnor
bool
BDD::Leq(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
return Cudd_bddLeq(mgr, node, g.node);
} // BDD::Leq
BDD
ADD::BddThreshold(
CUDD_VALUE_TYPE value) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addBddThreshold(mgr, node, value);
checkReturnValue(result);
return BDD(p, result);
} // ADD::BddThreshold
BDD
ADD::BddStrictThreshold(
CUDD_VALUE_TYPE value) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addBddStrictThreshold(mgr, node, value);
checkReturnValue(result);
return BDD(p, result);
} // ADD::BddStrictThreshold
BDD
ADD::BddInterval(
CUDD_VALUE_TYPE lower,
CUDD_VALUE_TYPE upper) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addBddInterval(mgr, node, lower, upper);
checkReturnValue(result);
return BDD(p, result);
} // ADD::BddInterval
BDD
ADD::BddIthBit(
int bit) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addBddIthBit(mgr, node, bit);
checkReturnValue(result);
return BDD(p, result);
} // ADD::BddIthBit
ADD
BDD::Add() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_BddToAdd(mgr, node);
checkReturnValue(result);
return ADD(p, result);
} // BDD::Add
BDD
ADD::BddPattern() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addBddPattern(mgr, node);
checkReturnValue(result);
return BDD(p, result);
} // ADD::BddPattern
BDD
BDD::Transfer(
Cudd& destination) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_bddTransfer(mgr, destination.p->manager, node);
checkReturnValue(result);
return BDD(destination.p, result);
} // BDD::Transfer
void
Cudd::DebugCheck() const
{
int result = Cudd_DebugCheck(p->manager);
checkReturnValue(result == 0);
} // Cudd::DebugCheck
void
Cudd::CheckKeys() const
{
int result = Cudd_CheckKeys(p->manager);
checkReturnValue(result == 0);
} // Cudd::CheckKeys
BDD
BDD::ClippingAnd(
const BDD& g,
int maxDepth,
int direction) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddClippingAnd(mgr, node, g.node, maxDepth,
direction);
checkReturnValue(result);
return BDD(p, result);
} // BDD::ClippingAnd
BDD
BDD::ClippingAndAbstract(
const BDD& g,
const BDD& cube,
int maxDepth,
int direction) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(cube);
DdNode *result = Cudd_bddClippingAndAbstract(mgr, node, g.node, cube.node,
maxDepth, direction);
checkReturnValue(result);
return BDD(p, result);
} // BDD::ClippingAndAbstract
ADD
ADD::Cofactor(
const ADD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_Cofactor(mgr, node, g.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Cofactor
BDD
BDD::Cofactor(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_Cofactor(mgr, node, g.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Cofactor
bool
BDD::VarAreSymmetric(int index1, int index2) const
{
return Cudd_VarsAreSymmetric(p->manager, node, index1, index2);
} // BDD::VarAreSymmetric
BDD
BDD::Compose(
const BDD& g,
int v) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddCompose(mgr, node, g.node, v);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Compose
ADD
ADD::Compose(
const ADD& g,
int v) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_addCompose(mgr, node, g.node, v);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Compose
ADD
ADD::Permute(
int * permut) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_addPermute(mgr, node, permut);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Permute
ADD
ADD::SwapVariables(
std::vector<ADD> x,
std::vector<ADD> y) const
{
size_t n = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[n];
DdNode **Y = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = x[i].node;
Y[i] = y[i].node;
}
DdNode *result = Cudd_addSwapVariables(mgr, node, X, Y, (int) n);
delete [] X;
delete [] Y;
checkReturnValue(result);
return ADD(p, result);
} // ADD::SwapVariables
BDD
BDD::Permute(
int * permut) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_bddPermute(mgr, node, permut);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Permute
BDD
BDD::SwapVariables(
std::vector<BDD> x,
std::vector<BDD> y) const
{
size_t n = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[n];
DdNode **Y = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = x[i].node;
Y[i] = y[i].node;
}
DdNode *result = Cudd_bddSwapVariables(mgr, node, X, Y, (int) n);
delete [] X;
delete [] Y;
checkReturnValue(result);
return BDD(p, result);
} // BDD::SwapVariables
BDD
BDD::AdjPermuteX(
std::vector<BDD> x) const
{
size_t n = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = x[i].node;
}
DdNode *result = Cudd_bddAdjPermuteX(mgr, node, X, (int) n);
delete [] X;
checkReturnValue(result);
return BDD(p, result);
} // BDD::AdjPermuteX
ADD
ADD::VectorCompose(
std::vector<ADD> vect) const
{
DdManager *mgr = p->manager;
size_t n = (size_t) Cudd_ReadSize(mgr);
DdNode **X = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = vect[i].node;
}
DdNode *result = Cudd_addVectorCompose(mgr, node, X);
delete [] X;
checkReturnValue(result);
return ADD(p, result);
} // ADD::VectorCompose
ADD
ADD::NonSimCompose(
std::vector<ADD> vect) const
{
DdManager *mgr = p->manager;
size_t n = (size_t) Cudd_ReadSize(mgr);
DdNode **X = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = vect[i].node;
}
DdNode *result = Cudd_addNonSimCompose(mgr, node, X);
delete [] X;
checkReturnValue(result);
return ADD(p, result);
} // ADD::NonSimCompose
BDD
BDD::VectorCompose(
std::vector<BDD> vect) const
{
DdManager *mgr = p->manager;
size_t n = (size_t) Cudd_ReadSize(mgr);
DdNode **X = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = vect[i].node;
}
DdNode *result = Cudd_bddVectorCompose(mgr, node, X);
delete [] X;
checkReturnValue(result);
return BDD(p, result);
} // BDD::VectorCompose
void
BDD::ApproxConjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddApproxConjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::ApproxConjDecomp
void
BDD::ApproxDisjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddApproxDisjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::ApproxDisjDecomp
void
BDD::IterConjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddIterConjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::IterConjDecomp
void
BDD::IterDisjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddIterDisjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::IterDisjDecomp
void
BDD::GenConjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddGenConjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::GenConjDecomp
void
BDD::GenDisjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddGenDisjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::GenDisjDecomp
void
BDD::VarConjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddVarConjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::VarConjDecomp
void
BDD::VarDisjDecomp(
BDD* g,
BDD* h) const
{
DdManager *mgr = p->manager;
DdNode **pieces;
int result = Cudd_bddVarDisjDecomp(mgr, node, &pieces);
checkReturnValue(result == 2);
*g = BDD(p, pieces[0]);
*h = BDD(p, pieces[1]);
Cudd_RecursiveDeref(mgr,pieces[0]);
Cudd_RecursiveDeref(mgr,pieces[1]);
free(pieces);
} // BDD::VarDisjDecomp
bool
ABDD::IsCube() const
{
DdManager *mgr = p->manager;
return Cudd_CheckCube(mgr, node);
} // ABDD::IsCube
BDD
ABDD::FindEssential() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_FindEssential(mgr, node);
checkReturnValue(result);
return BDD(p, result);
} // ABDD::FindEssential
bool
BDD::IsVarEssential(
int id,
int phase) const
{
DdManager *mgr = p->manager;
return Cudd_bddIsVarEssential(mgr, node, id, phase);
} // BDD::IsVarEssential
void
ABDD::PrintTwoLiteralClauses(
char **names,
FILE *fp) const
{
DdManager *mgr = p->manager;
int result = Cudd_PrintTwoLiteralClauses(mgr, node, names, fp);
checkReturnValue(result);
} // ABDD::PrintTwoLiteralClauses
void
Cudd::DumpBlif(
const std::vector<BDD>& nodes,
char const * const * inames,
char const * const * onames,
char * mname,
FILE * fp,
int mv) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i ++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_DumpBlif(mgr, (int) n, F, inames, onames, mname, fp, mv);
delete [] F;
checkReturnValue(result);
} // Cudd::DumpBlif
void
Cudd::DumpDot(
const std::vector<BDD>& nodes,
char const * const * inames,
char const * const * onames,
FILE * fp) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i ++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp);
delete [] F;
checkReturnValue(result);
} // Cudd::DumpDot
void
Cudd::DumpDot(
const std::vector<ADD>& nodes,
char const * const * inames,
char const * const * onames,
FILE * fp) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i ++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp);
delete [] F;
checkReturnValue(result);
} // Cudd::DumpDot
void
Cudd::DumpDaVinci(
const std::vector<BDD>& nodes,
char const * const * inames,
char const * const * onames,
FILE * fp) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i ++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp);
delete [] F;
checkReturnValue(result);
} // Cudd::DumpDaVinci
void
Cudd::DumpDaVinci(
const std::vector<ADD>& nodes,
char const * const * inames,
char const * const * onames,
FILE * fp) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i ++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp);
delete [] F;
checkReturnValue(result);
} // Cudd::DumpDaVinci
void
Cudd::DumpDDcal(
const std::vector<BDD>& nodes,
char const * const * inames,
char const * const * onames,
FILE * fp) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i ++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_DumpDDcal(mgr, (int) n, F, inames, onames, fp);
delete [] F;
checkReturnValue(result);
} // Cudd::DumpDDcal
void
Cudd::DumpFactoredForm(
const std::vector<BDD>& nodes,
char const * const * inames,
char const * const * onames,
FILE * fp) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i ++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_DumpFactoredForm(mgr, (int) n, F, inames, onames, fp);
delete [] F;
checkReturnValue(result);
} // Cudd::DumpFactoredForm
void
BDD::PrintFactoredForm(
char const * const * inames,
FILE * fp) const
{
DdManager *mgr = p->manager;
DdNode *f = node;
int result = Cudd_DumpFactoredForm(mgr, 0, &f, inames, 0, fp);
checkReturnValue(result);
} // BDD::PrintFactoredForm
string
BDD::FactoredFormString(char const * const * inames) const
{
DdManager *mgr = p->manager;
DdNode *f = node;
char *cstr = Cudd_FactoredFormString(mgr, f, inames);
checkReturnValue(cstr);
string str(cstr);
free(cstr);
return str;
} // BDD::FactoredFormString
BDD
BDD::Constrain(
const BDD& c) const
{
DdManager *mgr = checkSameManager(c);
DdNode *result = Cudd_bddConstrain(mgr, node, c.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Constrain
BDD
BDD::Restrict(
const BDD& c) const
{
DdManager *mgr = checkSameManager(c);
DdNode *result = Cudd_bddRestrict(mgr, node, c.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Restrict
BDD
BDD::NPAnd(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddNPAnd(mgr, node, g.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::NPAnd
ADD
ADD::Constrain(
const ADD& c) const
{
DdManager *mgr = checkSameManager(c);
DdNode *result = Cudd_addConstrain(mgr, node, c.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Constrain
std::vector<BDD>
BDD::ConstrainDecomp() const
{
DdManager *mgr = p->manager;
DdNode **result = Cudd_bddConstrainDecomp(mgr, node);
checkReturnValue(result);
int size = Cudd_ReadSize(mgr);
vector<BDD> vect;
for (int i = 0; i < size; i++) {
Cudd_Deref(result[i]);
vect.push_back(BDD(p, result[i]));
}
free(result);
return vect;
} // BDD::ConstrainDecomp
ADD
ADD::Restrict(
const ADD& c) const
{
DdManager *mgr = checkSameManager(c);
DdNode *result = Cudd_addRestrict(mgr, node, c.node);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Restrict
std::vector<BDD>
BDD::CharToVect() const
{
DdManager *mgr = p->manager;
DdNode **result = Cudd_bddCharToVect(mgr, node);
checkReturnValue(result);
int size = Cudd_ReadSize(mgr);
vector<BDD> vect;
for (int i = 0; i < size; i++) {
Cudd_Deref(result[i]);
vect.push_back(BDD(p, result[i]));
}
free(result);
return vect;
} // BDD::CharToVect
BDD
BDD::LICompaction(
const BDD& c) const
{
DdManager *mgr = checkSameManager(c);
DdNode *result = Cudd_bddLICompaction(mgr, node, c.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::LICompaction
BDD
BDD::Squeeze(
const BDD& u) const
{
DdManager *mgr = checkSameManager(u);
DdNode *result = Cudd_bddSqueeze(mgr, node, u.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Squeeze
BDD
BDD::Interpolate(
const BDD& u) const
{
DdManager *mgr = checkSameManager(u);
DdNode *result = Cudd_bddInterpolate(mgr, node, u.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Interpolate
BDD
BDD::Minimize(
const BDD& c) const
{
DdManager *mgr = checkSameManager(c);
DdNode *result = Cudd_bddMinimize(mgr, node, c.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Minimize
BDD
BDD::SubsetCompress(
int nvars,
int threshold) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_SubsetCompress(mgr, node, nvars, threshold);
checkReturnValue(result);
return BDD(p, result);
} // BDD::SubsetCompress
BDD
BDD::SupersetCompress(
int nvars,
int threshold) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_SupersetCompress(mgr, node, nvars, threshold);
checkReturnValue(result);
return BDD(p, result);
} // BDD::SupersetCompress
MtrNode *
Cudd::MakeTreeNode(
unsigned int low,
unsigned int size,
unsigned int type) const
{
return Cudd_MakeTreeNode(p->manager, low, size, type);
} // Cudd::MakeTreeNode
ADD
Cudd::Harwell(
FILE * fp,
std::vector<ADD>& x,
std::vector<ADD>& y,
std::vector<ADD>& xn,
std::vector<ADD>& yn_,
int * m,
int * n,
int bx,
int sx,
int by,
int sy,
int pr) const
{
DdManager *mgr = p->manager;
DdNode *E;
DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0;
int nx = x.size(), ny = y.size();
if (nx > 0) {
xa = (DdNode **) malloc(nx * sizeof(DdNode *));
if (!xa) {
p->errorHandler("Out of memory.");
}
xna = (DdNode **) malloc(nx * sizeof(DdNode *));
if (!xna) {
free(xa);
p->errorHandler("Out of memory.");
}
for (int i = 0; i < nx; ++i) {
xa[i] = x.at(i).node;
xna[i] = xn.at(i).node;
}
}
if (ny > 0) {
ya = (DdNode **) malloc(ny * sizeof(DdNode *));
if (!ya) {
free(xa);
free(xna);
p->errorHandler("Out of memory.");
}
yna = (DdNode **) malloc(ny * sizeof(DdNode *));
if (!yna) {
free(xa);
free(xna);
free(ya);
p->errorHandler("Out of memory.");
}
for (int j = 0; j < ny; ++j) {
ya[j] = y.at(j).node;
yna[j] = yn_.at(j).node;
}
}
int result = Cudd_addHarwell(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny,
m, n, bx, sx, by, sy, pr);
checkReturnValue(result);
for (int i = x.size(); i < nx; ++i) {
x.push_back(ADD(p, xa[i]));
xn.push_back(ADD(p, xna[i]));
}
free(xa);
free(xna);
for (int j = y.size(); j < ny; ++j) {
y.push_back(ADD(p, ya[j]));
yn_.push_back(ADD(p, yna[j]));
}
free(ya);
free(yna);
Cudd_Deref(E);
return ADD(p, E);
} // Cudd::Harwell
void
Cudd::PrintLinear(void) const
{
cout.flush();
int result = Cudd_PrintLinear(p->manager);
checkReturnValue(result);
} // Cudd::PrintLinear
int
Cudd::ReadLinear(
int x,
int y) const
{
return Cudd_ReadLinear(p->manager, x, y);
} // Cudd::ReadLinear
BDD
BDD::LiteralSetIntersection(
const BDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_bddLiteralSetIntersection(mgr, node, g.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::LiteralSetIntersection
ADD
ADD::MatrixMultiply(
const ADD& B,
std::vector<ADD> z) const
{
size_t nz = z.size();
DdManager *mgr = checkSameManager(B);
DdNode **Z = new DdNode *[nz];
for (size_t i = 0; i < nz; i++) {
Z[i] = z[i].node;
}
DdNode *result = Cudd_addMatrixMultiply(mgr, node, B.node, Z, (int) nz);
delete [] Z;
checkReturnValue(result);
return ADD(p, result);
} // ADD::MatrixMultiply
ADD
ADD::TimesPlus(
const ADD& B,
std::vector<ADD> z) const
{
size_t nz = z.size();
DdManager *mgr = checkSameManager(B);
DdNode **Z = new DdNode *[nz];
for (size_t i = 0; i < nz; i++) {
Z[i] = z[i].node;
}
DdNode *result = Cudd_addTimesPlus(mgr, node, B.node, Z, (int) nz);
delete [] Z;
checkReturnValue(result);
return ADD(p, result);
} // ADD::TimesPlus
ADD
ADD::Triangle(
const ADD& g,
std::vector<ADD> z) const
{
size_t nz = z.size();
DdManager *mgr = checkSameManager(g);
DdNode **Z = new DdNode *[nz];
for (size_t i = 0; i < nz; i++) {
Z[i] = z[i].node;
}
DdNode *result = Cudd_addTriangle(mgr, node, g.node, Z, (int) nz);
delete [] Z;
checkReturnValue(result);
return ADD(p, result);
} // ADD::Triangle
BDD
BDD::PrioritySelect(
std::vector<BDD> x,
std::vector<BDD> y,
std::vector<BDD> z,
const BDD& Pi,
DD_PRFP Pifunc) const
{
size_t n = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[n];
DdNode **Y = new DdNode *[n];
DdNode **Z = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = x[i].node;
Y[i] = y[i].node;
Z[i] = z[i].node;
}
DdNode *result = Cudd_PrioritySelect(mgr, node, X, Y, Z, Pi.node,
(int) n, Pifunc);
delete [] X;
delete [] Y;
delete [] Z;
checkReturnValue(result);
return BDD(p, result);
} // BDD::PrioritySelect
BDD
Cudd::Xgty(
std::vector<BDD> z,
std::vector<BDD> x,
std::vector<BDD> y) const
{
size_t N = z.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
DdNode **Y = new DdNode *[N];
DdNode **Z = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
Z[i] = z[i].getNode();
}
DdNode *result = Cudd_Xgty(mgr, (int) N, Z, X, Y);
delete [] X;
delete [] Y;
delete [] Z;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::Xgty
BDD
Cudd::Xeqy(
std::vector<BDD> x,
std::vector<BDD> y) const
{
size_t N = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
DdNode **Y = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
}
DdNode *result = Cudd_Xeqy(mgr, (int) N, X, Y);
delete [] X;
delete [] Y;
checkReturnValue(result);
return BDD(p, result);
} // BDD::Xeqy
ADD
Cudd::Xeqy(
std::vector<ADD> x,
std::vector<ADD> y) const
{
size_t N = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
DdNode **Y = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
}
DdNode *result = Cudd_addXeqy(mgr, (int) N, X, X);
delete [] X;
delete [] Y;
checkReturnValue(result);
return ADD(p, result);
} // ADD::Xeqy
BDD
Cudd::Dxygtdxz(
std::vector<BDD> x,
std::vector<BDD> y,
std::vector<BDD> z) const
{
size_t N = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
DdNode **Y = new DdNode *[N];
DdNode **Z = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
Z[i] = z[i].getNode();
}
DdNode *result = Cudd_Dxygtdxz(mgr, (int) N, X, Y, Z);
delete [] X;
delete [] Y;
delete [] Z;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::Dxygtdxz
BDD
Cudd::Dxygtdyz(
std::vector<BDD> x,
std::vector<BDD> y,
std::vector<BDD> z) const
{
size_t N = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
DdNode **Y = new DdNode *[N];
DdNode **Z = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
Z[i] = z[i].getNode();
}
DdNode *result = Cudd_Dxygtdyz(mgr, (int) N, X, Y, Z);
delete [] X;
delete [] Y;
delete [] Z;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::Dxygtdyz
BDD
Cudd::Inequality(
int c,
std::vector<BDD> x,
std::vector<BDD> y) const
{
size_t N = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
DdNode **Y = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
}
DdNode *result = Cudd_Inequality(mgr, (int) N, c, X, Y);
delete [] X;
delete [] Y;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::Inequality
BDD
Cudd::Disequality(
int c,
std::vector<BDD> x,
std::vector<BDD> y) const
{
size_t N = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
DdNode **Y = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
Y[i] = y[i].getNode();
}
DdNode *result = Cudd_Disequality(mgr, (int) N, c, X, Y);
delete [] X;
delete [] Y;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::Disequality
BDD
Cudd::Interval(
std::vector<BDD> x,
unsigned int lowerB,
unsigned int upperB) const
{
size_t N = x.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[N];
for (size_t i = 0; i < N; i++) {
X[i] = x[i].getNode();
}
DdNode *result = Cudd_bddInterval(mgr, (int) N, X, lowerB, upperB);
delete [] X;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::Interval
BDD
BDD::CProjection(
const BDD& Y) const
{
DdManager *mgr = checkSameManager(Y);
DdNode *result = Cudd_CProjection(mgr, node, Y.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::CProjection
int
BDD::MinHammingDist(
int *minterm,
int upperBound) const
{
DdManager *mgr = p->manager;
int result = Cudd_MinHammingDist(mgr, node, minterm, upperBound);
return result;
} // BDD::MinHammingDist
ADD
Cudd::Hamming(
std::vector<ADD> xVars,
std::vector<ADD> yVars) const
{
size_t nVars = xVars.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[nVars];
DdNode **Y = new DdNode *[nVars];
for (size_t i = 0; i < nVars; i++) {
X[i] = xVars[i].getNode();
Y[i] = yVars[i].getNode();
}
DdNode *result = Cudd_addHamming(mgr, X, Y, (int) nVars);
delete [] X;
delete [] Y;
checkReturnValue(result);
return ADD(p, result);
} // Cudd::Hamming
ADD
Cudd::Read(
FILE * fp,
std::vector<ADD>& x,
std::vector<ADD>& y,
std::vector<ADD>& xn,
std::vector<ADD>& yn_,
int * m,
int * n,
int bx,
int sx,
int by,
int sy) const
{
DdManager *mgr = p->manager;
DdNode *E;
DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0;
int nx = x.size(), ny = y.size();
if (nx > 0) {
xa = (DdNode **) malloc(nx * sizeof(DdNode *));
if (!xa) {
p->errorHandler("Out of memory.");
}
xna = (DdNode **) malloc(nx * sizeof(DdNode *));
if (!xna) {
free(xa);
p->errorHandler("Out of memory.");
}
for (int i = 0; i < nx; ++i) {
xa[i] = x.at(i).node;
xna[i] = xn.at(i).node;
}
}
if (ny > 0) {
ya = (DdNode **) malloc(ny * sizeof(DdNode *));
if (!ya) {
free(xa);
free(xna);
p->errorHandler("Out of memory.");
}
yna = (DdNode **) malloc(ny * sizeof(DdNode *));
if (!yna) {
free(xa);
free(xna);
free(ya);
p->errorHandler("Out of memory.");
}
for (int j = 0; j < ny; ++j) {
ya[j] = y.at(j).node;
yna[j] = yn_.at(j).node;
}
}
int result = Cudd_addRead(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny,
m, n, bx, sx, by, sy);
checkReturnValue(result);
for (int i = x.size(); i < nx; ++i) {
x.push_back(ADD(p, xa[i]));
xn.push_back(ADD(p, xna[i]));
}
free(xa);
free(xna);
for (int j = y.size(); j < ny; ++j) {
y.push_back(ADD(p, ya[j]));
yn_.push_back(ADD(p, yna[j]));
}
free(ya);
free(yna);
Cudd_Deref(E);
return ADD(p, E);
} // Cudd::Read
BDD
Cudd::Read(
FILE * fp,
std::vector<BDD>& x,
std::vector<BDD>& y,
int * m,
int * n,
int bx,
int sx,
int by,
int sy) const
{
DdManager *mgr = p->manager;
DdNode *E;
DdNode **xa = 0, **ya = 0;
int nx = x.size(), ny = y.size();
if (nx > 0) {
xa = (DdNode **) malloc(nx * sizeof(DdNode *));
if (!xa) {
p->errorHandler("Out of memory.");
}
for (int i = 0; i < nx; ++i) {
xa[i] = x.at(i).node;
}
}
if (ny > 0) {
ya = (DdNode **) malloc(ny * sizeof(DdNode *));
if (!ya) {
free(xa);
p->errorHandler("Out of memory.");
}
for (int j = 0; j < nx; ++j) {
ya[j] = y.at(j).node;
}
}
int result = Cudd_bddRead(fp, mgr, &E, &xa, &ya, &nx, &ny,
m, n, bx, sx, by, sy);
checkReturnValue(result);
for (int i = x.size(); i < nx; ++i) {
x.push_back(BDD(p, xa[i]));
}
free(xa);
for (int j = y.size(); j < ny; ++j) {
y.push_back(BDD(p, ya[j]));
}
free(ya);
Cudd_Deref(E);
return BDD(p, E);
} // Cudd::Read
void
Cudd::ReduceHeap(
Cudd_ReorderingType heuristic,
int minsize) const
{
int result = Cudd_ReduceHeap(p->manager, heuristic, minsize);
checkReturnValue(result);
} // Cudd::ReduceHeap
void
Cudd::ShuffleHeap(
int * permutation) const
{
int result = Cudd_ShuffleHeap(p->manager, permutation);
checkReturnValue(result);
} // Cudd::ShuffleHeap
ADD
ADD::Eval(
int * inputs) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_Eval(mgr, node, inputs);
checkReturnValue(result);
return ADD(p, result);
} // ADD::Eval
BDD
BDD::Eval(
int * inputs) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_Eval(mgr, node, inputs);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Eval
BDD
ABDD::ShortestPath(
int * weight,
int * support,
int * length) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_ShortestPath(mgr, node, weight, support, length);
checkReturnValue(result);
return BDD(p, result);
} // ABDD::ShortestPath
BDD
ABDD::LargestCube(
int * length) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_LargestCube(mgr, node, length);
checkReturnValue(result);
return BDD(p, result);
} // ABDD::LargestCube
int
ABDD::ShortestLength(
int * weight) const
{
DdManager *mgr = p->manager;
int result = Cudd_ShortestLength(mgr, node, weight);
checkReturnValue(result != CUDD_OUT_OF_MEM);
return result;
} // ABDD::ShortestLength
BDD
BDD::Decreasing(
int i) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_Decreasing(mgr, node, i);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Decreasing
BDD
BDD::Increasing(
int i) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_Increasing(mgr, node, i);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Increasing
bool
ABDD::EquivDC(
const ABDD& G,
const ABDD& D) const
{
DdManager *mgr = checkSameManager(G);
checkSameManager(D);
return Cudd_EquivDC(mgr, node, G.node, D.node);
} // ABDD::EquivDC
bool
BDD::LeqUnless(
const BDD& G,
const BDD& D) const
{
DdManager *mgr = checkSameManager(G);
checkSameManager(D);
int res = Cudd_bddLeqUnless(mgr, node, G.node, D.node);
return res;
} // BDD::LeqUnless
bool
ADD::EqualSupNorm(
const ADD& g,
CUDD_VALUE_TYPE tolerance,
int pr) const
{
DdManager *mgr = checkSameManager(g);
return Cudd_EqualSupNorm(mgr, node, g.node, tolerance, pr);
} // ADD::EqualSupNorm
bool
ADD::EqualSupNormRel(
const ADD& g,
CUDD_VALUE_TYPE tolerance,
int pr) const
{
DdManager *mgr = checkSameManager(g);
return Cudd_EqualSupNormRel(mgr, node, g.node, tolerance, pr) != 0;
} // ADD::EqualSupNormRel
BDD
BDD::MakePrime(
const BDD& F) const
{
DdManager *mgr = checkSameManager(F);
if (!Cudd_CheckCube(mgr, node)) {
p->errorHandler("Invalid argument.");
}
DdNode *result = Cudd_bddMakePrime(mgr, node, F.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD:MakePrime
BDD
BDD::MaximallyExpand(
const BDD& ub,
const BDD& f)
{
DdManager *mgr = checkSameManager(ub);
checkSameManager(f);
DdNode *result = Cudd_bddMaximallyExpand(mgr, node, ub.node, f.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::MaximallyExpand
BDD
BDD::LargestPrimeUnate(
const BDD& phases)
{
DdManager *mgr = checkSameManager(phases);
DdNode *result = Cudd_bddLargestPrimeUnate(mgr, node, phases.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::LargestPrimeUnate
double *
ABDD::CofMinterm() const
{
DdManager *mgr = p->manager;
double *result = Cudd_CofMinterm(mgr, node);
checkReturnValue(result);
return result;
} // ABDD::CofMinterm
BDD
BDD::SolveEqn(
const BDD& Y,
std::vector<BDD> & G,
int ** yIndex,
int n) const
{
DdManager *mgr = checkSameManager(Y);
DdNode **g = new DdNode *[n];
DdNode *result = Cudd_SolveEqn(mgr, node, Y.node, g, yIndex, n);
checkReturnValue(result);
for (int i = 0; i < n; i++) {
G.push_back(BDD(p, g[i]));
Cudd_RecursiveDeref(mgr,g[i]);
}
delete [] g;
return BDD(p, result);
} // BDD::SolveEqn
BDD
BDD::VerifySol(
std::vector<BDD> const & G,
int * yIndex) const
{
size_t n = G.size();
DdManager *mgr = p->manager;
DdNode **g = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
g[i] = G[i].node;
}
DdNode *result = Cudd_VerifySol(mgr, node, g, yIndex, (int) n);
delete [] g;
checkReturnValue(result);
return BDD(p, result);
} // BDD::VerifySol
BDD
BDD::SplitSet(
std::vector<BDD> xVars,
double m) const
{
size_t n = xVars.size();
DdManager *mgr = p->manager;
DdNode **X = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
X[i] = xVars[i].node;
}
DdNode *result = Cudd_SplitSet(mgr, node, X, (int) n, m);
delete [] X;
checkReturnValue(result);
return BDD(p, result);
} // BDD::SplitSet
BDD
BDD::SubsetHeavyBranch(
int numVars,
int threshold) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_SubsetHeavyBranch(mgr, node, numVars, threshold);
checkReturnValue(result);
return BDD(p, result);
} // BDD::SubsetHeavyBranch
BDD
BDD::SupersetHeavyBranch(
int numVars,
int threshold) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_SupersetHeavyBranch(mgr, node, numVars, threshold);
checkReturnValue(result);
return BDD(p, result);
} // BDD::SupersetHeavyBranch
BDD
BDD::SubsetShortPaths(
int numVars,
int threshold,
bool hardlimit) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_SubsetShortPaths(mgr, node, numVars, threshold, hardlimit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::SubsetShortPaths
BDD
BDD::SupersetShortPaths(
int numVars,
int threshold,
bool hardlimit) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_SupersetShortPaths(mgr, node, numVars, threshold, hardlimit);
checkReturnValue(result);
return BDD(p, result);
} // BDD::SupersetShortPaths
void
Cudd::SymmProfile(
int lower,
int upper) const
{
Cudd_SymmProfile(p->manager, lower, upper);
} // Cudd::SymmProfile
unsigned int
Cudd::Prime(
unsigned int pr) const
{
return Cudd_Prime(pr);
} // Cudd::Prime
void
Cudd::Reserve(
int amount) const
{
int result = Cudd_Reserve(p->manager, amount);
checkReturnValue(result);
} // Cudd::Reserve
void
ABDD::PrintMinterm() const
{
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_PrintMinterm(mgr, node);
checkReturnValue(result);
} // ABDD::PrintMinterm
void
BDD::PrintCover() const
{
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_bddPrintCover(mgr, node, node);
checkReturnValue(result);
} // BDD::PrintCover
void
BDD::PrintCover(
const BDD& u) const
{
checkSameManager(u);
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_bddPrintCover(mgr, node, u.node);
checkReturnValue(result);
} // BDD::PrintCover
int
BDD::EstimateCofactor(
int i,
int phase) const
{
DdManager *mgr = p->manager;
int result = Cudd_EstimateCofactor(mgr, node, i, phase);
checkReturnValue(result != CUDD_OUT_OF_MEM);
return result;
} // BDD::EstimateCofactor
int
BDD::EstimateCofactorSimple(
int i) const
{
int result = Cudd_EstimateCofactorSimple(node, i);
return result;
} // BDD::EstimateCofactorSimple
int
Cudd::SharingSize(
DD* nodes,
int n) const
{
DdNode **nodeArray = new DdNode *[n];
for (int i = 0; i < n; i++) {
nodeArray[i] = nodes[i].getNode();
}
int result = Cudd_SharingSize(nodeArray, n);
delete [] nodeArray;
checkReturnValue(n == 0 || result > 0);
return result;
} // Cudd::SharingSize
int
Cudd::SharingSize(
const std::vector<BDD>& v) const
{
vector<BDD>::size_type n = v.size();
DdNode **nodeArray = new DdNode *[n];
for (vector<BDD>::size_type i = 0; i != n; ++i) {
nodeArray[i] = v[i].getNode();
}
int result = Cudd_SharingSize(nodeArray, (int) n);
delete [] nodeArray;
checkReturnValue(n == 0 || result > 0);
return result;
} // Cudd::SharingSize
double
ABDD::CountMinterm(
int nvars) const
{
DdManager *mgr = p->manager;
double result = Cudd_CountMinterm(mgr, node, nvars);
checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
return result;
} // ABDD::CountMinterm
double
ABDD::CountPath() const
{
double result = Cudd_CountPath(node);
checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
return result;
} // ABDD::CountPath
BDD
ABDD::Support() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_Support(mgr, node);
checkReturnValue(result);
return BDD(p, result);
} // ABDD::Support
int
ABDD::SupportSize() const
{
DdManager *mgr = p->manager;
int result = Cudd_SupportSize(mgr, node);
checkReturnValue(result != CUDD_OUT_OF_MEM);
return result;
} // ABDD::SupportSize
BDD
Cudd::VectorSupport(const std::vector<BDD>& roots) const
{
size_t n = roots.size();
DdManager *mgr = p->manager;
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
F[i] = roots[i].getNode();
}
DdNode *result = Cudd_VectorSupport(mgr, F, (int) n);
delete [] F;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::VectorSupport
std::vector<unsigned int>
ABDD::SupportIndices() const
{
unsigned int *support;
DdManager *mgr = p->manager;
int size = Cudd_SupportIndices(mgr, node, (int **)&support);
checkReturnValue(size >= 0);
// size could be 0, in which case support is 0 too!
vector<unsigned int> indices(support, support+size);
if (support) free(support);
return indices;
} // ABDD::SupportIndices
std::vector<unsigned int>
Cudd::SupportIndices(const std::vector<BDD>& roots) const
{
unsigned int *support;
size_t n = roots.size();
DdManager *mgr = p->manager;
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
F[i] = roots[i].getNode();
}
int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support);
delete [] F;
checkReturnValue(size >= 0);
// size could be 0, in which case support is 0 too!
vector<unsigned int> indices(support, support+size);
if (support) free(support);
return indices;
} // Cudd::SupportIndices
std::vector<unsigned int>
Cudd::SupportIndices(const std::vector<ADD>& roots) const
{
unsigned int *support;
size_t n = roots.size();
DdManager *mgr = p->manager;
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
F[i] = roots[i].getNode();
}
int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support);
delete [] F;
checkReturnValue(size >= 0);
// size could be 0, in which case support is 0 too!
vector<unsigned int> indices(support, support+size);
if (support) free(support);
return indices;
} // Cudd::SupportIndices
int
Cudd::nodeCount(const std::vector<BDD>& roots) const
{
size_t n = roots.size();
DdNode **nodeArray = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
nodeArray[i] = roots[i].getNode();
}
int result = Cudd_SharingSize(nodeArray, (int) n);
delete [] nodeArray;
checkReturnValue(result > 0);
return result;
} // Cudd::nodeCount
BDD
Cudd::VectorSupport(const std::vector<ADD>& roots) const
{
size_t n = roots.size();
DdManager *mgr = p->manager;
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
F[i] = roots[i].getNode();
}
DdNode *result = Cudd_VectorSupport(mgr, F, (int) n);
delete [] F;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::VectorSupport
int
Cudd::VectorSupportSize(const std::vector<BDD>& roots) const
{
size_t n = roots.size();
DdManager *mgr = p->manager;
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
F[i] = roots[i].getNode();
}
int result = Cudd_VectorSupportSize(mgr, F, (int) n);
delete [] F;
checkReturnValue(result != CUDD_OUT_OF_MEM);
return result;
} // Cudd::VectorSupportSize
int
Cudd::VectorSupportSize(const std::vector<ADD>& roots) const
{
size_t n = roots.size();
DdManager *mgr = p->manager;
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
F[i] = roots[i].getNode();
}
int result = Cudd_VectorSupportSize(mgr, F, (int) n);
delete [] F;
checkReturnValue(result != CUDD_OUT_OF_MEM);
return result;
} // Cudd::VectorSupportSize
void
ABDD::ClassifySupport(
const ABDD& g,
BDD* common,
BDD* onlyF,
BDD* onlyG) const
{
DdManager *mgr = checkSameManager(g);
DdNode *C, *F, *G;
int result = Cudd_ClassifySupport(mgr, node, g.node, &C, &F, &G);
checkReturnValue(result);
*common = BDD(p, C);
*onlyF = BDD(p, F);
*onlyG = BDD(p, G);
} // ABDD::ClassifySupport
int
ABDD::CountLeaves() const
{
return Cudd_CountLeaves(node);
} // ABDD::CountLeaves
DdGen *
ABDD::FirstCube(
int ** cube,
CUDD_VALUE_TYPE * value) const
{
DdManager *mgr = p->manager;
DdGen *result = Cudd_FirstCube(mgr, node, cube, value);
checkReturnValue((DdNode *)result);
return result;
} // ABDD::FirstCube
int
ABDD::NextCube(
DdGen * gen,
int ** cube,
CUDD_VALUE_TYPE * value)
{
return Cudd_NextCube(gen, cube, value);
} // ABDD::NextCube
void
BDD::PickOneCube(
char * string) const
{
DdManager *mgr = p->manager;
int result = Cudd_bddPickOneCube(mgr, node, string);
checkReturnValue(result);
} // BDD::PickOneCube
BDD
BDD::PickOneMinterm(
std::vector<BDD> vars) const
{
size_t n = vars.size();
DdManager *mgr = p->manager;
DdNode **V = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
V[i] = vars[i].node;
}
DdNode *result = Cudd_bddPickOneMinterm(mgr, node, V, (int) n);
delete [] V;
checkReturnValue(result);
return BDD(p, result);
} // BDD::PickOneMinterm
BDD
Cudd::bddComputeCube(
BDD * vars,
int * phase,
int n) const
{
DdManager *mgr = p->manager;
DdNode **V = new DdNode *[n];
for (int i = 0; i < n; i++) {
V[i] = vars[i].getNode();
}
DdNode *result = Cudd_bddComputeCube(mgr, V, phase, n);
delete [] V;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::bddComputeCube
BDD
Cudd::computeCube(
std::vector<BDD> const & vars) const
{
DdManager *mgr = p->manager;
size_t n = vars.size();
DdNode **V = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
V[i] = vars[i].getNode();
}
DdNode *result = Cudd_bddComputeCube(mgr, V, 0, n);
delete [] V;
checkReturnValue(result);
return BDD(p, result);
} // Cudd::computeCube
ADD
Cudd::addComputeCube(
ADD * vars,
int * phase,
int n) const
{
DdManager *mgr = p->manager;
DdNode **V = new DdNode *[n];
for (int i = 0; i < n; i++) {
V[i] = vars[i].getNode();
}
DdNode *result = Cudd_addComputeCube(mgr, V, phase, n);
delete [] V;
checkReturnValue(result);
return ADD(p, result);
} // Cudd::addComputeCube
ADD
Cudd::computeCube(
std::vector<ADD> const & vars) const
{
DdManager *mgr = p->manager;
size_t n = vars.size();
DdNode **V = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
V[i] = vars[i].getNode();
}
DdNode *result = Cudd_addComputeCube(mgr, V, 0, n);
delete [] V;
checkReturnValue(result);
return ADD(p, result);
} // Cudd::computeCube
BDD
Cudd::IndicesToCube(
int * array,
int n) const
{
DdNode *result = Cudd_IndicesToCube(p->manager, array, n);
checkReturnValue(result);
return BDD(p, result);
} // Cudd::IndicesToCube
void
Cudd::PrintVersion(
FILE * fp) const
{
cout.flush();
Cudd_PrintVersion(fp);
} // Cudd::PrintVersion
double
Cudd::AverageDistance() const
{
return Cudd_AverageDistance(p->manager);
} // Cudd::AverageDistance
int32_t
Cudd::Random() const
{
return Cudd_Random(p->manager);
} // Cudd::Random
void
Cudd::Srandom(
int32_t seed) const
{
Cudd_Srandom(p->manager,seed);
} // Cudd::Srandom
double
ABDD::Density(
int nvars) const
{
DdManager *mgr = p->manager;
double result = Cudd_Density(mgr, node, nvars);
checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
return result;
} // ABDD::Density
int
ZDD::Count() const
{
DdManager *mgr = p->manager;
int result = Cudd_zddCount(mgr, node);
checkReturnValue(result != CUDD_OUT_OF_MEM);
return result;
} // ZDD::Count
double
ZDD::CountDouble() const
{
DdManager *mgr = p->manager;
double result = Cudd_zddCountDouble(mgr, node);
checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
return result;
} // ZDD::CountDouble
ZDD
ZDD::Product(
const ZDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_zddProduct(mgr, node, g.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Product
ZDD
ZDD::UnateProduct(
const ZDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_zddUnateProduct(mgr, node, g.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::UnateProduct
ZDD
ZDD::WeakDiv(
const ZDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_zddWeakDiv(mgr, node, g.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::WeakDiv
ZDD
ZDD::Divide(
const ZDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_zddDivide(mgr, node, g.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Divide
ZDD
ZDD::WeakDivF(
const ZDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_zddWeakDivF(mgr, node, g.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::WeakDivF
ZDD
ZDD::DivideF(
const ZDD& g) const
{
DdManager *mgr = checkSameManager(g);
DdNode *result = Cudd_zddDivideF(mgr, node, g.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::DivideF
MtrNode *
Cudd::MakeZddTreeNode(
unsigned int low,
unsigned int size,
unsigned int type) const
{
return Cudd_MakeZddTreeNode(p->manager, low, size, type);
} // Cudd::MakeZddTreeNode
BDD
BDD::zddIsop(
const BDD& U,
ZDD* zdd_I) const
{
DdManager *mgr = checkSameManager(U);
DdNode *Z;
DdNode *result = Cudd_zddIsop(mgr, node, U.node, &Z);
checkReturnValue(result);
*zdd_I = ZDD(p, Z);
return BDD(p, result);
} // BDD::Isop
BDD
BDD::Isop(
const BDD& U) const
{
DdManager *mgr = checkSameManager(U);
DdNode *result = Cudd_bddIsop(mgr, node, U.node);
checkReturnValue(result);
return BDD(p, result);
} // BDD::Isop
double
ZDD::CountMinterm(
int path) const
{
DdManager *mgr = p->manager;
double result = Cudd_zddCountMinterm(mgr, node, path);
checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
return result;
} // ZDD::CountMinterm
void
Cudd::zddPrintSubtable() const
{
cout.flush();
Cudd_zddPrintSubtable(p->manager);
} // Cudd::zddPrintSubtable
ZDD
BDD::PortToZdd() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_zddPortFromBdd(mgr, node);
checkReturnValue(result);
return ZDD(p, result);
} // BDD::PortToZdd
BDD
ZDD::PortToBdd() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_zddPortToBdd(mgr, node);
checkReturnValue(result);
return BDD(p, result);
} // ZDD::PortToBdd
void
Cudd::zddReduceHeap(
Cudd_ReorderingType heuristic,
int minsize) const
{
int result = Cudd_zddReduceHeap(p->manager, heuristic, minsize);
checkReturnValue(result);
} // Cudd::zddReduceHeap
void
Cudd::zddShuffleHeap(
int * permutation) const
{
int result = Cudd_zddShuffleHeap(p->manager, permutation);
checkReturnValue(result);
} // Cudd::zddShuffleHeap
ZDD
ZDD::Ite(
const ZDD& g,
const ZDD& h) const
{
DdManager *mgr = checkSameManager(g);
checkSameManager(h);
DdNode *result = Cudd_zddIte(mgr, node, g.node, h.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Ite
ZDD
ZDD::Union(
const ZDD& Q) const
{
DdManager *mgr = checkSameManager(Q);
DdNode *result = Cudd_zddUnion(mgr, node, Q.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Union
ZDD
ZDD::Intersect(
const ZDD& Q) const
{
DdManager *mgr = checkSameManager(Q);
DdNode *result = Cudd_zddIntersect(mgr, node, Q.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Intersect
ZDD
ZDD::Diff(
const ZDD& Q) const
{
DdManager *mgr = checkSameManager(Q);
DdNode *result = Cudd_zddDiff(mgr, node, Q.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Diff
ZDD
ZDD::DiffConst(
const ZDD& Q) const
{
DdManager *mgr = checkSameManager(Q);
DdNode *result = Cudd_zddDiffConst(mgr, node, Q.node);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::DiffConst
ZDD
ZDD::Subset1(
int var) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_zddSubset1(mgr, node, var);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Subset1
ZDD
ZDD::Subset0(
int var) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_zddSubset0(mgr, node, var);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Subset0
ZDD
ZDD::Change(
int var) const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_zddChange(mgr, node, var);
checkReturnValue(result);
return ZDD(p, result);
} // ZDD::Change
void
Cudd::zddSymmProfile(
int lower,
int upper) const
{
Cudd_zddSymmProfile(p->manager, lower, upper);
} // Cudd::zddSymmProfile
void
ZDD::PrintMinterm() const
{
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_zddPrintMinterm(mgr, node);
checkReturnValue(result);
} // ZDD::PrintMinterm
void
ZDD::PrintCover() const
{
cout.flush();
DdManager *mgr = p->manager;
int result = Cudd_zddPrintCover(mgr, node);
checkReturnValue(result);
} // ZDD::PrintCover
BDD
ZDD::Support() const
{
DdManager *mgr = p->manager;
DdNode *result = Cudd_zddSupport(mgr, node);
checkReturnValue(result);
return BDD(p, result);
} // ZDD::Support
void
Cudd::DumpDot(
const std::vector<ZDD>& nodes,
char const * const * inames,
char const * const * onames,
FILE * fp) const
{
DdManager *mgr = p->manager;
size_t n = nodes.size();
DdNode **F = new DdNode *[n];
for (size_t i = 0; i < n; i++) {
F[i] = nodes[i].getNode();
}
int result = Cudd_zddDumpDot(mgr, (int) n, F, inames, onames, fp);
delete [] F;
checkReturnValue(result);
} // vector<ZDD>::DumpDot
std::string
Cudd::OrderString(void) const
{
DdManager * mgr = p->manager;
int nvars = Cudd_ReadSize(mgr);
bool hasNames = p->varnames.size() == (size_t) nvars;
std::ostringstream oss;
std::string separ = "";
for (int level = 0; level != nvars; ++level) {
oss << separ;
separ = " ";
int index = Cudd_ReadInvPerm(mgr, level);
if (hasNames) {
oss << p->varnames.at(index);
} else {
oss << "x" << index;
}
}
return oss.str();
} // Cudd::OrderString
} // end namespace storm