[Javabdd-checkins] SF.net SVN: javabdd: [468] trunk/JavaBDD
Brought to you by:
joewhaley
|
From: <joe...@us...> - 2006-11-29 08:07:15
|
Revision: 468
http://svn.sourceforge.net/javabdd/?rev=468&view=rev
Author: joewhaley
Date: 2006-11-29 00:07:13 -0800 (Wed, 29 Nov 2006)
Log Message:
-----------
Improved ZDD support. load(), support(), quant methods now work.
Modified Paths:
--------------
trunk/JavaBDD/NQueens.java
trunk/JavaBDD/RubiksCube.java
trunk/JavaBDD/net/sf/javabdd/BDDDomain.java
trunk/JavaBDD/net/sf/javabdd/BDDFactory.java
trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
trunk/JavaBDD/net/sf/javabdd/JFactory.java
Modified: trunk/JavaBDD/NQueens.java
===================================================================
--- trunk/JavaBDD/NQueens.java 2006-11-13 07:25:37 UTC (rev 467)
+++ trunk/JavaBDD/NQueens.java 2006-11-29 08:07:13 UTC (rev 468)
@@ -58,7 +58,7 @@
}
if (B.varNum() < N * N) B.setVarNum(N * N);
- queen = B.one();
+ queen = B.universe();
int i, j;
@@ -108,7 +108,7 @@
}
static void build(int i, int j) {
- BDD a = B.one(), b = B.one(), c = B.one(), d = B.one();
+ BDD a = B.universe(), b = B.universe(), c = B.universe(), d = B.universe();
int k, l;
/* No one in the same column */
Modified: trunk/JavaBDD/RubiksCube.java
===================================================================
--- trunk/JavaBDD/RubiksCube.java 2006-11-13 07:25:37 UTC (rev 467)
+++ trunk/JavaBDD/RubiksCube.java 2006-11-29 08:07:13 UTC (rev 468)
@@ -159,7 +159,7 @@
}
static BDD buildInitial() {
- BDD b = bdd.one();
+ BDD b = bdd.universe();
for (int k=0; k<4; ++k) {
for (int i=0; i<n; ++i) {
b.andWith(bdd.getDomain(k*n + i).ithVar(k));
Modified: trunk/JavaBDD/net/sf/javabdd/BDDDomain.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDDomain.java 2006-11-13 07:25:37 UTC (rev 467)
+++ trunk/JavaBDD/net/sf/javabdd/BDDDomain.java 2006-11-29 08:07:13 UTC (rev 468)
@@ -94,7 +94,7 @@
/* Encode V<=X-1. V is the variables in 'var' and X is the domain size */
BigInteger val = size().subtract(BigInteger.ONE);
- BDD d = factory.one();
+ BDD d = factory.universe();
int[] ivar = vars();
for (int n = 0; n < this.varNum(); n++) {
if (val.testBit(0))
@@ -128,7 +128,7 @@
BDDFactory bdd = getFactory();
if (value == 0L) {
- BDD result = bdd.one();
+ BDD result = bdd.universe();
int n;
for (n = 0; n < bits; n++) {
BDD b = bdd.ithVar(this.ivar[n]);
@@ -182,7 +182,7 @@
}
BDDFactory factory = getFactory();
- BDD e = factory.one();
+ BDD e = factory.universe();
int[] this_ivar = this.vars();
int[] that_ivar = that.vars();
@@ -226,7 +226,7 @@
}
BDDFactory factory = getFactory();
- BDD v = factory.one();
+ BDD v = factory.universe();
int[] ivar = this.vars();
for (int n = 0; n < ivar.length; n++) {
if (val.testBit(0))
@@ -257,7 +257,7 @@
BDD result = factory.zero();
int[] ivar = this.vars();
while (lo.compareTo(hi) <= 0) {
- BDD v = factory.one();
+ BDD v = factory.universe();
for (int n = ivar.length - 1; ; n--) {
if (lo.testBit(n)) {
v.andWith(factory.ithVar(ivar[n]));
Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDFactory.java 2006-11-13 07:25:37 UTC (rev 467)
+++ trunk/JavaBDD/net/sf/javabdd/BDDFactory.java 2006-11-29 08:07:13 UTC (rev 468)
@@ -84,6 +84,11 @@
return TestBDDFactory.init(nodenum, cachesize);
if (bddpackage.equals("typed"))
return TypedBDDFactory.init(nodenum, cachesize);
+ if (bddpackage.equals("zdd")) {
+ BDDFactory bdd = JFactory.init(nodenum, cachesize);
+ ((JFactory)bdd).ZDD = true;
+ return bdd;
+ }
} catch (LinkageError e) {
System.out.println("Could not load BDD package "+bddpackage+": "+e.getLocalizedMessage());
}
@@ -218,7 +223,7 @@
* <p>Compare to bdd_buildcube.</p>
*/
public BDD buildCube(int value, List/*<BDD>*/ variables) {
- BDD result = one();
+ BDD result = universe();
Iterator i = variables.iterator();
int z = 0;
while (i.hasNext()) {
@@ -240,7 +245,7 @@
* <p>Compare to bdd_ibuildcube./p>
*/
public BDD buildCube(int value, int[] variables) {
- BDD result = one();
+ BDD result = universe();
for (int z = 0; z < variables.length; z++, value >>= 1) {
BDD v;
if ((value & 0x1) != 0)
@@ -529,7 +534,7 @@
// Check for constant true / false
if (lh_nodenum == 0 && vnum == 0) {
int r = Integer.parseInt(readNext(ifile));
- return r == 0 ? zero() : one();
+ return r == 0 ? zero() : universe();
}
// Not actually used.
@@ -631,7 +636,7 @@
protected BDD loadhash_get(LoadHash[] lh_table, int lh_nodenum, int key) {
if (key < 0) return null;
if (key == 0) return zero();
- if (key == 1) return one();
+ if (key == 1) return universe();
int hash = lh_table[key % lh_nodenum].first;
@@ -1423,6 +1428,14 @@
}
}
+ if (isZDD()) {
+ // Need to rebuild varsets for existing domains.
+ for (n = 0; n < fdvarnum; n++) {
+ domain[n].var.free();
+ domain[n].var =
+ makeSet(domain[n].ivar);
+ }
+ }
for (n = 0; n < num; n++) {
domain[n + fdvarnum].var =
makeSet(domain[n + fdvarnum].ivar);
Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-11-13 07:25:37 UTC (rev 467)
+++ trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-11-29 08:07:13 UTC (rev 468)
@@ -446,7 +446,7 @@
}
protected IntBDDVarSet makeBDDVarSet(/*bdd*/int v) {
- if (true || isZDD()) {
+ if (isZDD()) {
if (USE_FINALIZER)
return new IntZDDVarSetWithFinalizer(v);
else
Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-11-13 07:25:37 UTC (rev 467)
+++ trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-11-29 08:07:13 UTC (rev 468)
@@ -67,7 +67,7 @@
});
}
- boolean ZDD = true;
+ boolean ZDD = false;
/**
* Implementation of BDDPairing used by JFactory.
@@ -1561,14 +1561,11 @@
return l;
if (ISZERO(l) || ISZERO(r))
return 0;
- if (ISONE(l))
- return r;
- if (ISONE(r))
- return l;
if (LEVEL(l) < LEVEL(r))
return zand_rec(LOW(l), r);
else if (LEVEL(l) > LEVEL(r))
return zand_rec(l, LOW(r));
+ _assert(!ISCONST(l) && !ISCONST(r));
entry = BddCache_lookupI(applycache, APPLYHASH(l, r, bddop_and));
@@ -1811,6 +1808,14 @@
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);
@@ -2144,14 +2149,12 @@
if (INVARSET(LEVEL(r))) {
int r2 = READREF(2), r1 = READREF(1);
switch (applyop) {
- case bddop_and: res = ZDD ? zand_rec(r2, r1) : and_rec(r2, r1); break;
- case bddop_or: res = ZDD ? zor_rec(r2, r1) : or_rec(r2, r1); break;
+ case bddop_and: res = and_rec(r2, r1); break;
+ case bddop_or: res = or_rec(r2, r1); break;
default: res = apply_rec(r2, r1); break;
}
} else {
- res = ZDD
- ? zdd_makenode(LEVEL(r), READREF(2), READREF(1))
- : bdd_makenode(LEVEL(r), READREF(2), READREF(1));
+ res = bdd_makenode(LEVEL(r), READREF(2), READREF(1));
}
POPREF(2);
@@ -2163,6 +2166,45 @@
return res;
}
+ int zquant_rec(int r) {
+ BddCacheDataI entry;
+ int res;
+
+ if (r < 2 || LEVEL(r) > quantlast)
+ return r;
+
+ entry = BddCache_lookupI(quantcache, QUANTHASH(r));
+ if (entry.a == r && entry.c == quantid) {
+ if (CACHESTATS)
+ cachestats.opHit++;
+ return entry.res;
+ }
+ if (CACHESTATS)
+ cachestats.opMiss++;
+
+ PUSHREF(zquant_rec(LOW(r)));
+ PUSHREF(zquant_rec(HIGH(r)));
+
+ if (INVARSET(LEVEL(r))) {
+ int r2 = READREF(2), r1 = READREF(1);
+ switch (applyop) {
+ case bddop_and: res = zand_rec(r2, r1); break;
+ case bddop_or: res = zor_rec(r2, r1); break;
+ default: throw new BDDException();
+ }
+ } else {
+ res = zdd_makenode(LEVEL(r), READREF(2), READREF(1));
+ }
+
+ POPREF(2);
+
+ entry.a = r;
+ entry.c = quantid;
+ entry.res = res;
+
+ return res;
+ }
+
int bdd_constrain(int f, int c) {
int res;
int numReorder = 1;
@@ -2706,7 +2748,10 @@
supportMin = LEVEL(r);
supportMax = supportMin;
- support_rec(r, supportSet);
+ if (ZDD)
+ zsupport_rec(r, 0, supportSet);
+ else
+ support_rec(r, supportSet);
bdd_unmark(r);
bdd_disable_reorder();
@@ -2715,7 +2760,7 @@
if (supportSet[n] == supportID) {
int tmp;
bdd_addref(res);
- tmp = bdd_makenode(n, 0, res);
+ tmp = makenode_impl(n, 0, res);
bdd_delref(res);
res = tmp;
}
@@ -2727,6 +2772,8 @@
void support_rec(int r, int[] support) {
+ _assert(!ZDD);
+
if (r < 2)
return;
@@ -2744,6 +2791,41 @@
support_rec(HIGH(r), support);
}
+ void zsupport_rec(int r, int lev, int[] support) {
+
+ _assert(ZDD);
+
+ if (!ISZERO(r)) {
+ while (lev != LEVEL(r)) {
+ if (lev > supportMax)
+ supportMax = lev;
+ support[lev++] = supportID;
+ }
+ }
+
+ if (r < 2)
+ return;
+
+ if (MARKED(r) || LOW(r) == INVALID_BDD)
+ return;
+
+ if (LOW(r) == HIGH(r)) {
+ SETMARK(r);
+ zsupport_rec(LOW(r), LEVEL(r)+1, support);
+ return;
+ }
+
+ support[LEVEL(r)] = supportID;
+
+ if (LEVEL(r) > supportMax)
+ supportMax = LEVEL(r);
+
+ SETMARK(r);
+
+ zsupport_rec(LOW(r), LEVEL(r)+1, support);
+ zsupport_rec(HIGH(r), LEVEL(r)+1, support);
+ }
+
int bdd_appall(int l, int r, int opr, int var) {
int res;
int numReorder = 1;
@@ -4952,6 +5034,15 @@
bdd_pairs_resize(oldbddvarnum, bddvarnum);
bdd_operator_varresize();
+ if (ZDD) {
+ System.out.println("Changed number of ZDD variables, all existing ZDDs are now invalid.");
+ // Need to rebuild varsets for existing domains.
+ for (int n = 0; n < fdvarnum; n++) {
+ domain[n].var.free();
+ domain[n].var = makeSet(domain[n].ivar);
+ }
+ }
+
bdd_enable_reorder();
return 0;
@@ -5888,7 +5979,6 @@
int next;
}
- // TODO: revisit for zdd
int bdd_loaddata(BufferedReader ifile, int[] translate) throws IOException {
int key, var, low, high, root = 0, n;
@@ -5908,6 +5998,12 @@
if (low < 0 || high < 0 || var < 0)
return bdd_error(BDD_FORMAT);
+ if (ZDD) {
+ // The terminal "1" in BDD means universal set.
+ if (low == 1) low = univ;
+ if (high == 1) high = univ;
+ }
+
root = bdd_addref(bdd_ite(bdd_ithvar(var), high, low));
loadhash_add(key, root);
@@ -5962,6 +6058,7 @@
return;
}
+ // TODO: revisit for ZDD
void bdd_save_rec(BufferedWriter out, int root) throws IOException {
if (root < 2)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|