[Javabdd-checkins] SF.net SVN: javabdd: [470] trunk/JavaBDD/net/sf/javabdd
Brought to you by:
joewhaley
From: <joe...@us...> - 2006-11-30 09:22:44
|
Revision: 470 http://svn.sourceforge.net/javabdd/?rev=470&view=rev Author: joewhaley Date: 2006-11-30 01:22:42 -0800 (Thu, 30 Nov 2006) Log Message: ----------- Implement ZDD iterators. Modified Paths: -------------- trunk/JavaBDD/net/sf/javabdd/BDD.java trunk/JavaBDD/net/sf/javabdd/JFactory.java Modified: trunk/JavaBDD/net/sf/javabdd/BDD.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BDD.java 2006-11-29 08:07:31 UTC (rev 469) +++ trunk/JavaBDD/net/sf/javabdd/BDD.java 2006-11-30 09:22:42 UTC (rev 470) @@ -598,10 +598,25 @@ BDD rn = lo_empty ? r.high() : r.low(); int v = rn.isOne()||rn.isZero() ? f.varNum() - 1 : rn.level() - 1; for ( ; v > LEVEL_r; --v) { - allsatProfile[useLevel?v:f.level2Var(v)] = -1; + allsatProfile[useLevel?v:f.level2Var(v)] = f.isZDD()?(byte)0:(byte)-1; } if (!lo_empty) { - hiStack.addLast(r); + if (f.isZDD()) { + // Check for dont-care bits in ZDD. + BDD rh = r.high(); + boolean isDontCare = rn.equals(rh); + rh.free(); + if (isDontCare) { + // low child == high child, this is a dont-care bit. + allsatProfile[useLevel?v:f.level2Var(v)] = -1; + r.free(); + } else { + hiStack.addLast(r); + } + } else { + // BDD. + hiStack.addLast(r); + } } else { r.free(); } @@ -965,7 +980,7 @@ throw new NoSuchElementException(); } //if (lastReturned != null) lastReturned.free(); - lastReturned = f.one(); + lastReturned = f.universe(); //for (int i = 0; i < v.length; ++i) { for (int i = v.length-1; i >= 0; --i) { int li = v[i]; Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-11-29 08:07:31 UTC (rev 469) +++ trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-11-30 09:22:42 UTC (rev 470) @@ -2978,37 +2978,42 @@ return r; if (LEVEL(r) < LEVEL(var)) { + // r is not in the set if (ISZERO(LOW(r))) { int res = satoneset_rec(HIGH(r), var); - int m = bdd_makenode(LEVEL(r), BDDZERO, res); + int m = makenode_impl(LEVEL(r), BDDZERO, res); PUSHREF(m); return m; } else { int res = satoneset_rec(LOW(r), var); - int m = bdd_makenode(LEVEL(r), res, BDDZERO); + int m = makenode_impl(LEVEL(r), res, (ZDD && LOW(r) == HIGH(r))?res:BDDZERO); PUSHREF(m); return m; } } else if (LEVEL(var) < LEVEL(r)) { int res = satoneset_rec(r, HIGH(var)); - if (satPolarity) { - int m = bdd_makenode(LEVEL(var), BDDZERO, res); + if (!ZDD && satPolarity) { + int m = makenode_impl(LEVEL(var), BDDZERO, res); PUSHREF(m); return m; } else { - int m = bdd_makenode(LEVEL(var), res, BDDZERO); + int m = makenode_impl(LEVEL(var), res, BDDZERO); PUSHREF(m); return m; } } else /* LEVEL(r) == LEVEL(var) */ { if (ISZERO(LOW(r))) { int res = satoneset_rec(HIGH(r), HIGH(var)); - int m = bdd_makenode(LEVEL(r), BDDZERO, res); + int m = makenode_impl(LEVEL(r), BDDZERO, res); PUSHREF(m); return m; } else { int res = satoneset_rec(LOW(r), HIGH(var)); - int m = bdd_makenode(LEVEL(r), res, BDDZERO); + int m; + if (ZDD && satPolarity && LOW(r) == HIGH(r)) + m = zdd_makenode(LEVEL(r), BDDZERO, res); + else + m = makenode_impl(LEVEL(r), res, BDDZERO); PUSHREF(m); return m; } @@ -3030,7 +3035,7 @@ res = fullsatone_rec(r); for (v = LEVEL(r) - 1; v >= 0; v--) { - res = PUSHREF(ZDD?zdd_makenode(v, res, 0):bdd_makenode(v, res, 0)); + res = PUSHREF(makenode_impl(v, res, 0)); } bdd_enable_reorder(); @@ -3048,19 +3053,19 @@ int v; for (v = LEVEL(LOW(r)) - 1; v > LEVEL(r); v--) { - res = PUSHREF(ZDD?zdd_makenode(v, res, 0):bdd_makenode(v, res, 0)); + res = PUSHREF(makenode_impl(v, res, 0)); } - return PUSHREF(ZDD?zdd_makenode(LEVEL(r), res, 0):bdd_makenode(LEVEL(r), res, 0)); + return PUSHREF(makenode_impl(LEVEL(r), res, 0)); } else { int res = fullsatone_rec(HIGH(r)); int v; for (v = LEVEL(HIGH(r)) - 1; v > LEVEL(r); v--) { - res = PUSHREF(ZDD?zdd_makenode(v, res, 0):bdd_makenode(v, res, 0)); + res = PUSHREF(makenode_impl(v, res, 0)); } - return PUSHREF(ZDD?zdd_makenode(LEVEL(r), 0, res):bdd_makenode(LEVEL(r), 0, res)); + return PUSHREF(makenode_impl(LEVEL(r), 0, res)); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |