[Javabdd-checkins] SF.net SVN: javabdd: [474] trunk/JavaBDD/net/sf/javabdd
Brought to you by:
joewhaley
|
From: <joe...@us...> - 2006-12-05 10:58:18
|
Revision: 474
http://svn.sourceforge.net/javabdd/?rev=474&view=rev
Author: joewhaley
Date: 2006-12-05 02:58:16 -0800 (Tue, 05 Dec 2006)
Log Message:
-----------
Working ZDD exists() and relprod().
Modified Paths:
--------------
trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java
trunk/JavaBDD/net/sf/javabdd/JFactory.java
trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java
Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-12-03 10:34:02 UTC (rev 473)
+++ trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-12-05 10:58:16 UTC (rev 474)
@@ -421,7 +421,8 @@
} else {
int k = do_unionlevel(high_impl(v), lev);
addref_impl(k);
- int result = makenode_impl(lev, zero_impl(), k);
+ int result = makenode_impl(l, zero_impl(), k);
+ delref_impl(k);
return result;
}
}
Modified: trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java 2006-12-03 10:34:02 UTC (rev 473)
+++ trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java 2006-12-05 10:58:16 UTC (rev 474)
@@ -3,6 +3,8 @@
// Licensed under the terms of the GNU LGPL; see COPYING for details.
package net.sf.javabdd;
+import java.util.Arrays;
+
/**
* <p>Some BDD methods, namely <tt>exist()</tt>, <tt>forall()</tt>, <tt>unique()</tt>,
* <tt>relprod()</tt>, <tt>applyAll()</tt>, <tt>applyEx()</tt>, <tt>applyUni()</tt>,
@@ -31,6 +33,10 @@
public abstract int[] toArray();
public abstract int[] toLevelArray();
+ public String toString() {
+ return Arrays.toString(toArray());
+ }
+
/**
* <p>Scans this BDD and copies the stored variables into an array of BDDDomains.
* The domains returned are guaranteed to be in ascending order.</p>
Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-12-03 10:34:02 UTC (rev 473)
+++ trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-12-05 10:58:16 UTC (rev 474)
@@ -37,7 +37,7 @@
*/
public static boolean FLUSH_CACHE_ON_GC = true;
- static final boolean VERIFY_ASSERTIONS = true;
+ static final boolean VERIFY_ASSERTIONS = false;
static final boolean CACHESTATS = false;
static final boolean SWAPCOUNT = false;
@@ -1431,6 +1431,7 @@
}
checkresize();
+ if (true) bdd_validate(res);
return res;
}
@@ -1565,7 +1566,7 @@
return zand_rec(LOW(l), r);
else if (LEVEL(l) > LEVEL(r))
return zand_rec(l, LOW(r));
- _assert(!ISCONST(l) && !ISCONST(r));
+ if (VERIFY_ASSERTIONS) _assert(!ISCONST(l) && !ISCONST(r));
entry = BddCache_lookupI(applycache, APPLYHASH(l, r, bddop_and));
@@ -1591,6 +1592,82 @@
return res;
}
+ int zrelprod_rec(int l, int r, int lev) {
+ BddCacheDataI entry;
+ int res;
+
+ if (l == r)
+ return zquant_rec(l, lev);
+ if (ISZERO(l) || ISZERO(r))
+ return 0;
+
+ int LEVEL_l = LEVEL(l);
+ int LEVEL_r = LEVEL(r);
+
+ for (;;) {
+ if (lev > quantlast) {
+ applyop = bddop_and;
+ res = zand_rec(l, r);
+ applyop = bddop_or;
+ return res;
+ }
+ if (lev >= LEVEL_l || lev >= LEVEL_r)
+ break;
+ if (INVARSET(lev)) {
+ res = zrelprod_rec(l, r, lev+1);
+ PUSHREF(res);
+ res = zdd_makenode(lev, res, res);
+ POPREF(1);
+ return res;
+ }
+ ++lev;
+ }
+
+ entry = BddCache_lookupI(appexcache, APPEXHASH(l, r, bddop_and));
+ if (entry.a == l && entry.b == r && entry.c == appexid) {
+ if (CACHESTATS)
+ cachestats.opHit++;
+ return entry.res;
+ }
+ if (CACHESTATS)
+ cachestats.opMiss++;
+
+ if (LEVEL_l == LEVEL_r) {
+ if (VERIFY_ASSERTIONS) _assert(LEVEL_l == lev);
+ PUSHREF(zrelprod_rec(LOW(l), LOW(r), lev+1));
+ PUSHREF(zrelprod_rec(HIGH(l), HIGH(r), lev+1));
+ if (INVARSET(lev)) {
+ res = zor_rec(READREF(2), READREF(1));
+ POPREF(2);
+ PUSHREF(res);
+ res = zdd_makenode(lev, res, res);
+ POPREF(1);
+ } else {
+ res = zdd_makenode(lev, READREF(2), READREF(1));
+ POPREF(2);
+ }
+ } else {
+ if (LEVEL_l < LEVEL_r) {
+ if (VERIFY_ASSERTIONS) _assert(LEVEL_l == lev);
+ res = zrelprod_rec(LOW(l), r, lev+1);
+ } else {
+ if (VERIFY_ASSERTIONS) _assert(LEVEL_r == lev);
+ res = zrelprod_rec(l, LOW(r), lev+1);
+ }
+ if (INVARSET(lev)) {
+ PUSHREF(res);
+ res = zdd_makenode(lev, res, res);
+ POPREF(1);
+ }
+ }
+ entry.a = l;
+ entry.b = r;
+ entry.c = appexid;
+ entry.res = res;
+
+ return res;
+ }
+
int or_rec(int l, int r) {
BddCacheDataI entry;
int res;
@@ -1808,14 +1885,6 @@
if (var < 2) /* Empty set */
return bdd_apply(l, r, opr);
- if (ZDD) {
- // TODO: A real ZDD implementation.
- int x = bdd_addref(bdd_apply(l, r, opr));
- int y = bdd_exist(x, var);
- bdd_delref(x);
- return y;
- }
-
if (applycache == null) applycache = BddCacheI_init(cachesize);
if (appexcache == null) appexcache = BddCacheI_init(cachesize);
if (quantcache == null) quantcache = BddCacheI_init(cachesize);
@@ -1833,7 +1902,11 @@
if (numReorder == 0)
bdd_disable_reorder();
- res = opr == bddop_and ? relprod_rec(l, r) : appquant_rec(l, r);
+ if (opr == bddop_and)
+ res = ZDD ? zrelprod_rec(l, r, 0) : relprod_rec(l, r);
+ else
+ res = appquant_rec(l, r);
+
if (numReorder == 0)
bdd_enable_reorder();
} catch (ReorderException x) {
@@ -2166,13 +2239,32 @@
return res;
}
- int zquant_rec(int r) {
+ int zquant_rec(int r, int lev) {
BddCacheDataI entry;
int res;
- if (r < 2 || LEVEL(r) > quantlast)
+ for (;;) {
+ if (lev > quantlast)
+ return r;
+ if (lev == LEVEL(r))
+ break;
+ if (INVARSET(lev)) {
+ switch (applyop) {
+ case bddop_and: return 0;
+ case bddop_or:
+ PUSHREF(zquant_rec(r, lev+1));
+ res = zdd_makenode(lev, READREF(1), READREF(1));
+ POPREF(1);
+ return res;
+ default: throw new BDDException();
+ }
+ }
+ lev++;
+ }
+
+ if (r < 2)
return r;
-
+
entry = BddCache_lookupI(quantcache, QUANTHASH(r));
if (entry.a == r && entry.c == quantid) {
if (CACHESTATS)
@@ -2182,8 +2274,9 @@
if (CACHESTATS)
cachestats.opMiss++;
- PUSHREF(zquant_rec(LOW(r)));
- PUSHREF(zquant_rec(HIGH(r)));
+ int nlev = LEVEL(r) + 1;
+ PUSHREF(zquant_rec(LOW(r), nlev));
+ PUSHREF(zquant_rec(HIGH(r), nlev));
if (INVARSET(LEVEL(r))) {
int r2 = READREF(2), r1 = READREF(1);
@@ -2192,12 +2285,15 @@
case bddop_or: res = zor_rec(r2, r1); break;
default: throw new BDDException();
}
+ POPREF(2);
+ PUSHREF(res);
+ res = zdd_makenode(LEVEL(r), READREF(1), READREF(1));
+ POPREF(1);
} else {
res = zdd_makenode(LEVEL(r), READREF(2), READREF(1));
+ POPREF(2);
}
- POPREF(2);
-
entry.a = r;
entry.c = quantid;
entry.res = res;
@@ -2465,7 +2561,7 @@
if (numReorder == 0)
bdd_disable_reorder();
- res = quant_rec(r);
+ res = ZDD?zquant_rec(r, 0):quant_rec(r);
if (numReorder == 0)
bdd_enable_reorder();
} catch (ReorderException x) {
@@ -2478,6 +2574,7 @@
}
checkresize();
+ if (true) bdd_validate(res);
return res;
}
@@ -2504,7 +2601,7 @@
if (numReorder == 0)
bdd_disable_reorder();
- res = quant_rec(r);
+ res = ZDD?zquant_rec(r, 0):quant_rec(r);
if (numReorder == 0)
bdd_enable_reorder();
} catch (ReorderException x) {
@@ -2772,7 +2869,7 @@
void support_rec(int r, int[] support) {
- _assert(!ZDD);
+ if (VERIFY_ASSERTIONS) _assert(!ZDD);
if (r < 2)
return;
@@ -2793,7 +2890,7 @@
void zsupport_rec(int r, int lev, int[] support) {
- _assert(ZDD);
+ if (VERIFY_ASSERTIONS) _assert(ZDD);
if (!ISZERO(r)) {
while (lev != LEVEL(r)) {
@@ -3929,7 +4026,7 @@
break;
}
}
- _assert(newIndex != bddvarnum);
+ if (VERIFY_ASSERTIONS) _assert(newIndex != bddvarnum);
}
int tmp = pair.result[oldlev];
pair.result[oldlev] = pair.result[newIndex];
@@ -6295,7 +6392,11 @@
}
}
void bdd_validate(int k) {
- validate(k, -1);
+ try {
+ validate(k, -1);
+ } finally {
+ bdd_unmark(k);
+ }
}
void validate(int k, int lastLevel) {
if (k < 2) return;
@@ -6303,6 +6404,15 @@
//System.out.println("Level("+k+") = "+lev);
if (lev <= lastLevel)
throw new BDDException(lev+" <= "+lastLevel);
+ if (ZDD) {
+ if (HIGH(k) == 0)
+ throw new BDDException("HIGH("+k+")==0");
+ } else {
+ if (LOW(k) == HIGH(k))
+ throw new BDDException("LOW("+k+") == HIGH("+k+")");
+ }
+ if (MARKED(k)) return;
+ SETMARK(k);
//System.out.println("Low:");
validate(LOW(k), lev);
//System.out.println("High:");
Modified: trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java 2006-12-03 10:34:02 UTC (rev 473)
+++ trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java 2006-12-05 10:58:16 UTC (rev 474)
@@ -64,11 +64,19 @@
}
public static final void assertSame(BDDVarSet b1, BDDVarSet b2, String s) {
- assertSame(b1.toBDD(), b2.toBDD(), s);
+ if (!b1.toString().equals(b2.toString())) {
+ System.out.println("b1 = " + b1.toString());
+ System.out.println("b2 = " + b2.toString());
+ throw new InternalError(s);
+ }
}
public static final void assertSame(boolean b, BDDVarSet b1, BDDVarSet b2, String s) {
- assertSame(b, b1.toBDD(), b2.toBDD(), s);
+ if (!b) {
+ System.err.println("b1 = " + b1);
+ System.err.println("b2 = " + b2);
+ throw new InternalError(s);
+ }
}
private class TestBDD extends BDD {
BDD b1, b2;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|