javabdd-checkins Mailing List for JavaBDD
                
                Brought to you by:
                
                    joewhaley
                    
                
            
            
        
        
        
    You can subscribe to this list here.
| 2003 | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec (4) | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2004 | Jan | Feb | Mar (6) | Apr (6) | May (4) | Jun (31) | Jul (64) | Aug (19) | Sep (28) | Oct (50) | Nov (25) | Dec | 
| 2005 | Jan (44) | Feb (8) | Mar (2) | Apr (15) | May (48) | Jun (8) | Jul (7) | Aug | Sep (1) | Oct (3) | Nov | Dec | 
| 2006 | Jan | Feb | Mar | Apr | May (1) | Jun (2) | Jul (14) | Aug | Sep | Oct | Nov (6) | Dec (4) | 
| 2007 | Jan | Feb | Mar (2) | Apr | May | Jun (1) | Jul | Aug | Sep | Oct | Nov | Dec | 
| 2010 | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct (1) | Nov (1) | Dec | 
| 2011 | Jan | Feb (2) | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov (1) | Dec | 
| 2019 | Jan | Feb | Mar | Apr (1) | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | 
| 
      
      
      From: Sarn U. <pol...@ya...> - 2019-04-18 15:20:59
      
     | 
| My name is Mr. Sarn Richard Ursell. I am currently a student at Victoria University, a famous University here in Wellington, (I currently study mathematics, first year, level-100), -and I wish to learn programming in, as I have some WONDERFUL ideas for manipulating sound and picture information using Java. I am told that this is a beautiful language, and, I can truly believe this. Is it alright with you if I collaborate with you about these projects, and can you please help me with some algorithms, that I need-and-wish to use to apply to sound and picture information? I can explain in more depth if you so desire, Many thanks, Sincerely, Mr. Sarn Richard Ursell. | 
| 
      
      
      From: <rob...@us...> - 2011-11-24 20:02:21
      
     | 
| Revision: 483
          http://javabdd.svn.sourceforge.net/javabdd/?rev=483&view=rev
Author:   robimalik
Date:     2011-11-24 20:02:15 +0000 (Thu, 24 Nov 2011)
Log Message:
-----------
MODIFY
  No longer try to implement setCacheRatio() for CUDD.
Modified Paths:
--------------
    trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
Modified: trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2011-02-18 14:54:24 UTC (rev 482)
+++ trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2011-11-24 20:02:15 UTC (rev 483)
@@ -174,9 +174,9 @@
      * @see net.sf.javabdd.BDDFactory#setCacheRatio(double)
      */
     public double setCacheRatio(double x) {
-        // TODO Implement this.
-        System.err.println("Warning: setCacheRatio() not yet implemented");
-        return 0;
+        // Cache size is determined automatically by CUDD.
+        // System.err.println("Warning: setCacheRatio() not yet implemented");
+        return 1.0;
     }
 
     /* (non-Javadoc)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gi...@us...> - 2011-02-18 14:54:32
      
     | 
| Revision: 482
          http://javabdd.svn.sourceforge.net/javabdd/?rev=482&view=rev
Author:   gismo
Date:     2011-02-18 14:54:24 +0000 (Fri, 18 Feb 2011)
Log Message:
-----------
added CUDDBDD.restrict again - if the parameter is a cube, Coudert and Madre's restrict actually does exactly what we expect from the function
Modified Paths:
--------------
    trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
Modified: trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2011-02-18 14:37:09 UTC (rev 481)
+++ trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2011-02-18 14:54:24 UTC (rev 482)
@@ -617,29 +617,25 @@
          * @see net.sf.javabdd.BDD#restrict(net.sf.javabdd.BDD)
          */
         public BDD restrict(BDD var) {
-//            CUDDBDD c = (CUDDBDD) var;
-//            long b = cofactor0(_ddnode_ptr, c._ddnode_ptr);
-//            return new CUDDBDD(b);
-            // TODO Implement this.
-            throw new UnsupportedOperationException();
+            CUDDBDD c = (CUDDBDD) var;
+            long b = restrict0(_ddnode_ptr, c._ddnode_ptr);
+            return new CUDDBDD(b);
         }
         
         /* (non-Javadoc)
          * @see net.sf.javabdd.BDD#restrictWith(net.sf.javabdd.BDD)
          */
         public BDD restrictWith(BDD var) {
-//            CUDDBDD c = (CUDDBDD) var;
-//            long b = cofactor0(_ddnode_ptr, c._ddnode_ptr);
-//            addRef(b);
-//            delRef(_ddnode_ptr);
-//            if (this != c) {
-//                delRef(c._ddnode_ptr);
-//                c._ddnode_ptr = INVALID_BDD;
-//            }
-//            _ddnode_ptr = b;
-//            return this;
-            // TODO Implement this.
-            throw new UnsupportedOperationException();
+            CUDDBDD c = (CUDDBDD) var;
+            long b = restrict0(_ddnode_ptr, c._ddnode_ptr);
+            addRef(b);
+            delRef(_ddnode_ptr);
+            if (this != c) {
+                delRef(c._ddnode_ptr);
+                c._ddnode_ptr = INVALID_BDD;
+            }
+            _ddnode_ptr = b;
+            return this;
         }
 //        private static native long cofactor0(long b, long var);
         
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gi...@us...> - 2011-02-18 14:37:16
      
     | 
| Revision: 481
          http://javabdd.svn.sourceforge.net/javabdd/?rev=481&view=rev
Author:   gismo
Date:     2011-02-18 14:37:09 +0000 (Fri, 18 Feb 2011)
Log Message:
-----------
fixed BDD.simplify:  It takes now a BDD instead of a BDDVarSet
fix in CUDDFactory:  simplify is implemented in CUDD by the method "restrict".  The JavaBDD restrict method is called cofactor in CUDD.  I fixed simplify and set restrict to unimplemented.  I will add the required method in cudd_jni.c shortly. 
Modified Paths:
--------------
    trunk/JavaBDD/net/sf/javabdd/BDD.java
    trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
    trunk/JavaBDD/net/sf/javabdd/CALFactory.java
    trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
    trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java
    trunk/JavaBDD/net/sf/javabdd/TypedBDDFactory.java
Modified: trunk/JavaBDD/net/sf/javabdd/BDD.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDD.java	2010-11-16 01:29:49 UTC (rev 480)
+++ trunk/JavaBDD/net/sf/javabdd/BDD.java	2011-02-18 14:37:09 UTC (rev 481)
@@ -404,7 +404,7 @@
      * @param d BDDVarSet containing the variables in the domain
      * @return the result of the simplify operation
      */
-    public abstract BDD simplify(BDDVarSet d);
+    public abstract BDD simplify(BDD d);
 
     /**
      * <p>Returns the variable support of this BDD.  The support is all the
Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java	2010-11-16 01:29:49 UTC (rev 480)
+++ trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java	2011-02-18 14:37:09 UTC (rev 481)
@@ -179,7 +179,7 @@
         public BDD satOne(BDDVarSet var, boolean pol) {
             return makeBDD(satOne_impl2(v, unwrap(var), pol));
         }
-        public BDD simplify(BDDVarSet d) {
+        public BDD simplify(BDD d) {
             return makeBDD(simplify_impl(v, unwrap(d)));
         }
         public BDDVarSet support() {
Modified: trunk/JavaBDD/net/sf/javabdd/CALFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/CALFactory.java	2010-11-16 01:29:49 UTC (rev 480)
+++ trunk/JavaBDD/net/sf/javabdd/CALFactory.java	2011-02-18 14:37:09 UTC (rev 481)
@@ -586,7 +586,7 @@
         /* (non-Javadoc)
          * @see net.sf.javabdd.BDD#simplify(net.sf.javabdd.BDDVarSet)
          */
-        public BDD simplify(BDDVarSet d) {
+        public BDD simplify(BDD d) {
             // TODO Implement this.
             throw new UnsupportedOperationException();
         }
Modified: trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2010-11-16 01:29:49 UTC (rev 480)
+++ trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2011-02-18 14:37:09 UTC (rev 481)
@@ -617,35 +617,43 @@
          * @see net.sf.javabdd.BDD#restrict(net.sf.javabdd.BDD)
          */
         public BDD restrict(BDD var) {
-            CUDDBDD c = (CUDDBDD) var;
-            long b = restrict0(_ddnode_ptr, c._ddnode_ptr);
-            return new CUDDBDD(b);
+//            CUDDBDD c = (CUDDBDD) var;
+//            long b = cofactor0(_ddnode_ptr, c._ddnode_ptr);
+//            return new CUDDBDD(b);
+            // TODO Implement this.
+            throw new UnsupportedOperationException();
         }
-        private static native long restrict0(long b, long var);
         
         /* (non-Javadoc)
          * @see net.sf.javabdd.BDD#restrictWith(net.sf.javabdd.BDD)
          */
         public BDD restrictWith(BDD var) {
-            CUDDBDD c = (CUDDBDD) var;
-            long b = restrict0(_ddnode_ptr, c._ddnode_ptr);
-            addRef(b);
-            delRef(_ddnode_ptr);
-            if (this != c) {
-                delRef(c._ddnode_ptr);
-                c._ddnode_ptr = INVALID_BDD;
-            }
-            _ddnode_ptr = b;
-            return this;
+//            CUDDBDD c = (CUDDBDD) var;
+//            long b = cofactor0(_ddnode_ptr, c._ddnode_ptr);
+//            addRef(b);
+//            delRef(_ddnode_ptr);
+//            if (this != c) {
+//                delRef(c._ddnode_ptr);
+//                c._ddnode_ptr = INVALID_BDD;
+//            }
+//            _ddnode_ptr = b;
+//            return this;
+            // TODO Implement this.
+            throw new UnsupportedOperationException();
         }
+//        private static native long cofactor0(long b, long var);
         
-        /* (non-Javadoc)
+        /** Coudert and Mardre's restrict function.  Note that this function
+         * is called restrict in CUDD, While the JavaBDD's restrict function is
+         * called cofactor in CUDD. (the generalized cofactor is constrain)
          * @see net.sf.javabdd.BDD#simplify(net.sf.javabdd.BDDVarSet)
          */
-        public BDD simplify(BDDVarSet d) {
-            // TODO Implement this.
-            throw new UnsupportedOperationException();
+        public BDD simplify(BDD d) {
+            CUDDBDD c = (CUDDBDD) d;
+            long b = restrict0(_ddnode_ptr, c._ddnode_ptr);
+            return new CUDDBDD(b);
         }
+        private static native long restrict0(long b, long var);
 
         /* (non-Javadoc)
          * @see net.sf.javabdd.BDD#support()
Modified: trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java	2010-11-16 01:29:49 UTC (rev 480)
+++ trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java	2011-02-18 14:37:09 UTC (rev 481)
@@ -326,9 +326,9 @@
          * 
          * @see net.sf.javabdd.BDD#simplify(net.sf.javabdd.BDDVarSet)
          */
-        public BDD simplify(BDDVarSet d) {
-            BDDVarSet c1 = ((TestBDDVarSet) d).b1;
-            BDDVarSet c2 = ((TestBDDVarSet) d).b2;
+        public BDD simplify(BDD d) {
+            BDD c1 = ((TestBDD) d).b1;
+            BDD c2 = ((TestBDD) d).b2;
             BDD r1 = b1.simplify(c1);
             BDD r2 = b2.simplify(c2);
             return new TestBDD(r1, r2);
Modified: trunk/JavaBDD/net/sf/javabdd/TypedBDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/TypedBDDFactory.java	2010-11-16 01:29:49 UTC (rev 480)
+++ trunk/JavaBDD/net/sf/javabdd/TypedBDDFactory.java	2011-02-18 14:37:09 UTC (rev 481)
@@ -755,8 +755,8 @@
         /* (non-Javadoc)
          * @see net.sf.javabdd.BDD#simplify(net.sf.javabdd.BDDVarSet)
          */
-        public BDD simplify(BDDVarSet d) {
-            TypedBDDVarSet bdd1 = (TypedBDDVarSet) d;
+        public BDD simplify(BDD d) {
+            TypedBDD bdd1 = (TypedBDD) d;
             // TODO How does this change the domains?
             Set newDom = makeSet();
             newDom.addAll(dom);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <rob...@us...> - 2010-11-16 01:29:55
      
     | 
| Revision: 480
          http://javabdd.svn.sourceforge.net/javabdd/?rev=480&view=rev
Author:   robimalik
Date:     2010-11-16 01:29:49 +0000 (Tue, 16 Nov 2010)
Log Message:
-----------
Fix reordering bugs.
Modified Paths:
--------------
    trunk/JavaBDD/cudd_jni.c
    trunk/JavaBDD/net/sf/javabdd/BDDFactory.java
    trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java
    trunk/JavaBDD/net/sf/javabdd/JFactory.java
Modified: trunk/JavaBDD/cudd_jni.c
===================================================================
--- trunk/JavaBDD/cudd_jni.c	2010-10-14 01:42:49 UTC (rev 479)
+++ trunk/JavaBDD/cudd_jni.c	2010-11-16 01:29:49 UTC (rev 480)
@@ -1,5 +1,6 @@
 #include <jni.h>
 #include <stdlib.h>
+
 #include "util.h"
 #include "cudd.h"
 #include "cuddInt.h"
@@ -369,7 +370,11 @@
 {
   Cudd_ReorderingType cuddmethod = getCUDDReorderMethod(env, javamethod);
   if (!(*env)->ExceptionOccurred(env)) {
-    Cudd_AutodynEnable(manager, cuddmethod);
+    if (cuddmethod == CUDD_REORDER_NONE) {
+      Cudd_AutodynDisable(manager);
+    } else {
+      Cudd_AutodynEnable(manager, cuddmethod);
+    }
   }
 }
 
Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDFactory.java	2010-10-14 01:42:49 UTC (rev 479)
+++ trunk/JavaBDD/net/sf/javabdd/BDDFactory.java	2010-11-16 01:29:49 UTC (rev 480)
@@ -66,46 +66,51 @@
      * @param cachesize operation cache size
      * @return BDD factory object
      */
-    public static BDDFactory init(String bddpackage, int nodenum, int cachesize) {
-        try {
-            if (bddpackage.equals("buddy"))
-                return BuDDyFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("cudd"))
-                return CUDDFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("cal"))
-                return CALFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("j") || bddpackage.equals("java"))
-                return JFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("u"))
-                return UberMicroFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("micro"))
-                return MicroFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("jdd"))
-                return JDDFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("test"))
-                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());
-        }
-        try {
-            Class c = Class.forName(bddpackage);
-            Method m = c.getMethod("init", new Class[] { int.class, int.class });
-            return (BDDFactory) m.invoke(null, new Object[] { new Integer(nodenum), new Integer(cachesize) });
-        }
-        catch (ClassNotFoundException _) {}
-        catch (NoSuchMethodException _) {}
-        catch (IllegalAccessException _) {}
-        catch (InvocationTargetException _) {}
-        // falling back to default java implementation.
-        return JFactory.init(nodenum, cachesize);
+  public static BDDFactory init(String bddpackage, int nodenum, int cachesize)
+  {
+    try {
+      if (bddpackage.equals("buddy")) {
+	return BuDDyFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("cudd")) {
+	return CUDDFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("cal")) {
+	return CALFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("j") || bddpackage.equals("java")) {
+	return JFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("u")) {
+	return UberMicroFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("micro")) {
+	return MicroFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("jdd")) {
+	return JDDFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("test")) {
+	return TestBDDFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("typed")) {
+	return TypedBDDFactory.init(nodenum, cachesize);
+      } else if (bddpackage.equals("zdd")) {
+	BDDFactory bdd = JFactory.init(nodenum, cachesize);
+	((JFactory)bdd).ZDD = true;
+	return bdd;
+      } else {
+	System.err.println("Unknown BDD package: " + bddpackage);
+      }
+    } catch (LinkageError e) {
+      System.err.println("Could not load BDD package "+ bddpackage +
+			 ": " + e.getLocalizedMessage());
     }
+    try {
+      Class c = Class.forName(bddpackage);
+      Method m = c.getMethod("init", new Class[] { int.class, int.class });
+      return (BDDFactory) m.invoke(null, new Object[]
+	{ new Integer(nodenum), new Integer(cachesize) });
+    }
+    catch (ClassNotFoundException _) {}
+    catch (NoSuchMethodException _) {}
+    catch (IllegalAccessException _) {}
+    catch (InvocationTargetException _) {}
+    // falling back to default java implementation.
+    return JFactory.init(nodenum, cachesize);
+  }
 
     /**
      * Logical 'and'.
Modified: trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java	2010-10-14 01:42:49 UTC (rev 479)
+++ trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java	2010-11-16 01:29:49 UTC (rev 480)
@@ -205,7 +205,7 @@
     private static native void enableReorder0();
     public int reorderVerbose(int v) { return reorderVerbose0(v); }
     private static native int reorderVerbose0(int v);
-    public void reorder(ReorderMethod m) { reorder0(m.id); }
+    public void reorder(ReorderMethod m) { if (varNum() > 1) reorder0(m.id); }
     private static native void reorder0(int method);
     public void autoReorder(ReorderMethod method) { autoReorder0(method.id); }
     private static native void autoReorder0(int method);
Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/JFactory.java	2010-10-14 01:42:49 UTC (rev 479)
+++ trunk/JavaBDD/net/sf/javabdd/JFactory.java	2010-11-16 01:29:49 UTC (rev 480)
@@ -227,7 +227,7 @@
     public void disableReorder() { bdd_disable_reorder(); }
     public void enableReorder() { bdd_enable_reorder(); }
     public int reorderVerbose(int v) { return bdd_reorder_verbose(v); }
-    public void reorder(ReorderMethod m) { bdd_reorder(m.id); }
+    public void reorder(ReorderMethod m) { if (varNum() > 1) bdd_reorder(m.id); }
     public void autoReorder(ReorderMethod method) { bdd_autoreorder(method.id); }
     public void autoReorder(ReorderMethod method, int max) { bdd_autoreorder_times(method.id, max); }
     public void swapVar(int v1, int v2) { bdd_swapvar(v1, v2); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <rob...@us...> - 2010-10-14 01:42:55
      
     | 
| Revision: 479
          http://javabdd.svn.sourceforge.net/javabdd/?rev=479&view=rev
Author:   robimalik
Date:     2010-10-14 01:42:49 +0000 (Thu, 14 Oct 2010)
Log Message:
-----------
Enable variable reordering and variable groups for CUDD.
Modified Paths:
--------------
    trunk/JavaBDD/cudd_jni.c
    trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
Modified: trunk/JavaBDD/cudd_jni.c
===================================================================
--- trunk/JavaBDD/cudd_jni.c	2007-06-15 22:22:53 UTC (rev 478)
+++ trunk/JavaBDD/cudd_jni.c	2010-10-14 01:42:49 UTC (rev 479)
@@ -46,6 +46,84 @@
     (*env)->DeleteLocalRef(env, cls);
 }
 
+
+/***************************************************************************
+ * Auxiliary Methods
+ */
+
+const char* BDDFACTORY_CLASS_NAME = "net/sf/javabdd/BDDFactory";
+
+jfieldID JAVA_REORDER_NONE;
+jfieldID JAVA_REORDER_RANDOM;
+jfieldID JAVA_REORDER_SIFT;
+jfieldID JAVA_REORDER_SIFTITE;
+jfieldID JAVA_REORDER_WIN2;
+jfieldID JAVA_REORDER_WIN2ITE;
+jfieldID JAVA_REORDER_WIN3;
+jfieldID JAVA_REORDER_WIN3ITE;
+
+
+static jboolean isJavaReorderMethod(JNIEnv *env, jclass cls,
+				    jfieldID id, jobject method)
+{
+  jobject field = (*env)->GetStaticObjectField(env, cls, id);
+  return (*env)->IsSameObject(env, field, method);
+}
+
+
+static Cudd_ReorderingType getCUDDReorderMethod(JNIEnv *env,
+						jobject javamethod)
+{
+  jclass cls = (*env)->FindClass(env, BDDFACTORY_CLASS_NAME); 
+  if (isJavaReorderMethod(env, cls, JAVA_REORDER_NONE, javamethod)) {
+    return CUDD_REORDER_NONE;
+  } else if (isJavaReorderMethod(env, cls, JAVA_REORDER_RANDOM, javamethod)) {
+    return CUDD_REORDER_RANDOM;
+  } else if (isJavaReorderMethod(env, cls, JAVA_REORDER_SIFT, javamethod)) {
+    return CUDD_REORDER_SIFT;
+  } else if (isJavaReorderMethod(env, cls, JAVA_REORDER_SIFTITE, javamethod)) {
+    return CUDD_REORDER_SIFT_CONVERGE;
+  } else if (isJavaReorderMethod(env, cls, JAVA_REORDER_WIN2, javamethod)) {
+    return CUDD_REORDER_WINDOW2;
+  } else if (isJavaReorderMethod(env, cls, JAVA_REORDER_WIN2ITE, javamethod)) {
+    return CUDD_REORDER_WINDOW2_CONV;
+  } else if (isJavaReorderMethod(env, cls, JAVA_REORDER_WIN3, javamethod)) {
+    return CUDD_REORDER_WINDOW3;
+  } else if (isJavaReorderMethod(env, cls, JAVA_REORDER_WIN3ITE, javamethod)) {
+    return CUDD_REORDER_WINDOW3_CONV;
+  } else {
+    die(env, "Unknown Java reorder method!");
+    return 0;
+  }
+}
+
+static jfieldID getJavaReorderMethodId(JNIEnv *env,
+				       Cudd_ReorderingType cuddmethod)
+{
+  switch (cuddmethod) {
+  case CUDD_REORDER_NONE:
+    return JAVA_REORDER_NONE;
+  case CUDD_REORDER_RANDOM:
+    return JAVA_REORDER_RANDOM;
+  case CUDD_REORDER_SIFT:
+    return JAVA_REORDER_SIFT;
+  case CUDD_REORDER_SIFT_CONVERGE:
+    return JAVA_REORDER_SIFTITE;
+  case CUDD_REORDER_WINDOW2:
+    return JAVA_REORDER_WIN2;
+  case CUDD_REORDER_WINDOW2_CONV:
+    return JAVA_REORDER_WIN2ITE;
+  case CUDD_REORDER_WINDOW3:
+    return JAVA_REORDER_WIN3;
+  case CUDD_REORDER_WINDOW3_CONV:
+    return JAVA_REORDER_WIN3ITE;
+  default:
+    die(env, "Unknown reorder method in CUDD!");
+    return 0;
+  }
+}
+
+
 /**** START OF NATIVE METHOD IMPLEMENTATIONS ****/
 
 /*
@@ -56,6 +134,24 @@
 JNIEXPORT void JNICALL Java_net_sf_javabdd_CUDDFactory_registerNatives
   (JNIEnv *env, jclass cl)
 {
+  jclass cls = (*env)->FindClass(env, BDDFACTORY_CLASS_NAME); 
+  const char* type = "Lnet/sf/javabdd/BDDFactory$ReorderMethod;";
+  JAVA_REORDER_NONE =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_NONE", type);
+  JAVA_REORDER_RANDOM =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_RANDOM", type);;
+  JAVA_REORDER_SIFT =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_SIFT", type);
+  JAVA_REORDER_SIFTITE =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_SIFTITE", type);
+  JAVA_REORDER_WIN2 =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_WIN2", type);
+  JAVA_REORDER_WIN2ITE =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_WIN2ITE", type);
+  JAVA_REORDER_WIN3 =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_WIN3", type);
+  JAVA_REORDER_WIN3ITE =
+    (*env)->GetStaticFieldID(env, cls, "REORDER_WIN3ITE", type);
 }
 
 typedef struct CuddPairing {
@@ -146,12 +242,15 @@
 
     Cudd_Deref((DdNode *)(intptr_cast_type) bdd_one);
     Cudd_Deref((DdNode *)(intptr_cast_type) bdd_zero);
-    
+    /*
     fprintf(stderr, "Garbage collections: %d  Time spent: %ldms\n",
-    Cudd_ReadGarbageCollections(manager), Cudd_ReadGarbageCollectionTime(manager));
-    
+            Cudd_ReadGarbageCollections(manager),
+	    Cudd_ReadGarbageCollectionTime(manager));
     bdds = Cudd_CheckZeroRef(manager);
-    if (bdds > 0) fprintf(stderr, "Note: %d BDDs still in memory when terminating\n", bdds);
+    if (bdds > 0)
+      fprintf(stderr, "Note: %d BDDs still in memory when terminating\n",
+                      bdds);
+    */
     m = manager;
     manager = NULL; // race condition with delRef
     Cudd_Quit(m);
@@ -248,6 +347,34 @@
 
 /*
  * Class:     net_sf_javabdd_CUDDFactory
+ * Method:    reorder0
+ * Signature: (Lnet/sf/javabdd/BDDFactory/ReorderMethod;)V
+ */
+JNIEXPORT void JNICALL Java_net_sf_javabdd_CUDDFactory_reorder0
+  (JNIEnv *env, jclass cl, jobject javamethod)
+{
+  Cudd_ReorderingType cuddmethod = getCUDDReorderMethod(env, javamethod);
+  if (!(*env)->ExceptionOccurred(env)) {
+    Cudd_ReduceHeap(manager, cuddmethod, INT_MAX);
+  }
+}
+
+/*
+ * Class:     net_sf_javabdd_CUDDFactory
+ * Method:    autoreorder0
+ * Signature: (Lnet/sf/javabdd/BDDFactory/ReorderMethod;)V
+ */
+JNIEXPORT void JNICALL Java_net_sf_javabdd_CUDDFactory_autoreorder0
+  (JNIEnv *env, jclass cl, jobject javamethod)
+{
+  Cudd_ReorderingType cuddmethod = getCUDDReorderMethod(env, javamethod);
+  if (!(*env)->ExceptionOccurred(env)) {
+    Cudd_AutodynEnable(manager, cuddmethod);
+  }
+}
+
+/*
+ * Class:     net_sf_javabdd_CUDDFactory
  * Method:    setVarOrder0
  * Signature: ([I)V
  */
@@ -271,6 +398,35 @@
 
 /*
  * Class:     net_sf_javabdd_CUDDFactory
+ * Method:    addVarBlock0
+ * Signature: (IIZ)V
+ */
+JNIEXPORT void JNICALL Java_net_sf_javabdd_CUDDFactory_addVarBlock0
+  (JNIEnv *env, jclass cl, jint first, jint last, jboolean fixed)
+{
+  int firstp = Cudd_ReadPerm(manager, first);
+  int lastp = Cudd_ReadPerm(manager, last);
+  if (firstp <= lastp) {
+    int len = lastp - firstp + 1;
+    Cudd_MakeTreeNode(manager, first, len, fixed ? MTR_FIXED : MTR_DEFAULT);
+  } else {
+    die(env, "Bad indexes in variable block!");
+  }
+}
+
+/*
+ * Class:     net_sf_javabdd_CUDDFactory
+ * Method:    clearVarBlocks0
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_net_sf_javabdd_CUDDFactory_clearVarBlocks0
+  (JNIEnv *env, jclass cl)
+{
+  Cudd_FreeTree(manager);
+}
+
+/*
+ * Class:     net_sf_javabdd_CUDDFactory
  * Method:    getAllocNum0
  * Signature: ()I
  */
Modified: trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2007-06-15 22:22:53 UTC (rev 478)
+++ trunk/JavaBDD/net/sf/javabdd/CUDDFactory.java	2010-10-14 01:42:49 UTC (rev 479)
@@ -1,6 +1,9 @@
+//# -*- tab-width: 4  indent-tabs-mode: nil  c-basic-offset: 4 -*-
+
 // CUDDFactory.java, created Jan 29, 2003 9:50:57 PM by jwhaley
 // Copyright (C) 2003 John Whaley
 // Licensed under the terms of the GNU LGPL; see COPYING for details.
+
 package net.sf.javabdd;
 
 import java.util.Collection;
@@ -277,57 +280,55 @@
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#reorder(net.sf.javabdd.BDDFactory.ReorderMethod)
      */
-    public void reorder(ReorderMethod m) {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+    public void reorder(final ReorderMethod method)
+    {
+        reorder0(method);
     }
+    private static native void reorder0(ReorderMethod method);
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod)
      */
-    public void autoReorder(ReorderMethod method) {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+    public void autoReorder(final ReorderMethod method)
+    {
+        mAutoReorderMethod = method;
+        autoreorder0(method);
     }
+    private static native void autoreorder0(ReorderMethod method);
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod, int)
      */
     public void autoReorder(ReorderMethod method, int max) {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+        autoReorder(method);
     }
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#getReorderMethod()
      */
     public ReorderMethod getReorderMethod() {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+        return mAutoReorderMethod;
     }
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#getReorderTimes()
      */
     public int getReorderTimes() {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+        return Integer.MAX_VALUE;
     }
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#disableReorder()
      */
     public void disableReorder() {
-        // TODO Implement this.
-        System.err.println("Warning: disableReorder() not yet implemented");
+        autoReorder(BDDFactory.REORDER_NONE);
     }
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#enableReorder()
      */
     public void enableReorder() {
-        // TODO Implement this.
-        System.err.println("Warning: enableReorder() not yet implemented");
+        autoReorder(mAutoReorderMethod);
     }
 
     /* (non-Javadoc)
@@ -349,34 +350,56 @@
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#addVarBlock(net.sf.javabdd.BDD, boolean)
      */
-    public void addVarBlock(BDD var, boolean fixed) {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+    public void addVarBlock(BDD vars, final boolean fixed)
+    {
+        if (vars.isZero()) {
+            return;
+        } else if (vars.isOne()) {
+            throw new IllegalArgumentException
+                ("Bad cube in CUDDFactory.addVarBlock()!");
+        } else {
+            final int first = vars.var();
+            int last;
+            do {
+                last = vars.var();
+                vars = vars.high();
+                if (vars.isZero()) {
+                    throw new IllegalArgumentException
+                        ("Bad cube in CUDDFactory.addVarBlock()!");
+                }
+            } while (!vars.isOne());
+            addVarBlock(first, last, fixed);
+        }
     }
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#addVarBlock(int, int, boolean)
      */
-    public void addVarBlock(int first, int last, boolean fixed) {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+    public void addVarBlock
+        (final int first, final int last, final boolean fixed)
+    {
+        addVarBlock0(first, last, fixed);
     }
+    private static native void addVarBlock0
+        (int first, int last, boolean fixed);
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#varBlockAll()
      */
     public void varBlockAll() {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+        final int varnum = varNum();
+        for (int i = 0; i < varnum; i++) {
+            addVarBlock(i, i, false);
+        }
     }
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#clearVarBlocks()
      */
     public void clearVarBlocks() {
-        // TODO Implement this.
-        throw new UnsupportedOperationException();
+        clearVarBlocks0();
     }
+    private static native void clearVarBlocks0();
 
     /* (non-Javadoc)
      * @see net.sf.javabdd.BDDFactory#printOrder()
@@ -954,5 +977,9 @@
     public String getVersion() {
         return "CUDD "+REVISION.substring(11, REVISION.length()-2);
     }
-    
+
+
+    private static BDDFactory.ReorderMethod mAutoReorderMethod =
+        BDDFactory.REORDER_NONE;
+
 }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <joe...@us...> - 2007-06-15 22:22:54
      
     | 
| Revision: 478
          http://svn.sourceforge.net/javabdd/?rev=478&view=rev
Author:   joewhaley
Date:     2007-06-15 15:22:53 -0700 (Fri, 15 Jun 2007)
Log Message:
-----------
Added Google Analytics.
Modified Paths:
--------------
    trunk/JavaBDD/project.properties
    trunk/JavaBDD/xdocs/navigation.xml
Modified: trunk/JavaBDD/project.properties
===================================================================
--- trunk/JavaBDD/project.properties	2007-03-06 07:31:44 UTC (rev 477)
+++ trunk/JavaBDD/project.properties	2007-06-15 22:22:53 UTC (rev 478)
@@ -2,8 +2,10 @@
 # Where to find source code, used by tasklist plugin.
 #maven.src.dir = .
 
-maven.compile.source = 1.3
-maven.compile.target = 1.3
+#maven.compile.source = 1.3
+#maven.compile.target = 1.3
+maven.compile.source = 1.5
+maven.compile.target = 1.5
 
 # The string to look for in TODO tags, used by tasklist plugin.
 #maven.tasklist.taskTag = TODO
Modified: trunk/JavaBDD/xdocs/navigation.xml
===================================================================
--- trunk/JavaBDD/xdocs/navigation.xml	2007-03-06 07:31:44 UTC (rev 477)
+++ trunk/JavaBDD/xdocs/navigation.xml	2007-06-15 22:22:53 UTC (rev 478)
@@ -35,5 +35,13 @@
       <item name="JavaBDD Source code"
             href="http://prdownloads.sourceforge.net/javabdd/javabdd_src_1.0b2.tar.gz"/>
     </menu>
+    <footer>
+<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+_uacct = "UA-72567-3";
+urchinTracker();
+</script>
+    </footer>
   </body>
 </project>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <joe...@us...> - 2007-03-06 07:31:45
      
     | 
| Revision: 477
          http://svn.sourceforge.net/javabdd/?rev=477&view=rev
Author:   joewhaley
Date:     2007-03-05 23:31:44 -0800 (Mon, 05 Mar 2007)
Log Message:
-----------
Turn off some debugging junk.
Modified Paths:
--------------
    trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java
Modified: trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java	2007-03-06 06:08:40 UTC (rev 476)
+++ trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java	2007-03-06 07:31:44 UTC (rev 477)
@@ -34,10 +34,11 @@
 
     public static boolean FLUSH_CACHE_ON_GC = true;
     
-    static final boolean VERIFY_ASSERTIONS = true;
+    static final boolean VERIFY_ASSERTIONS = false;
     static final boolean ORDER_CACHE = false;
     static final int CACHESTATS = 0;
     static final boolean SWAPCOUNT = false;
+    static final boolean TRACE_REORDER = false;
     
     public static final String REVISION = "$Revision: 465 $";
     
@@ -506,7 +507,7 @@
     float HASHFACTOR = 1.5f;
     
     void HASH_RESET() {
-        System.out.println("Resetting hash table");
+        if (false) System.out.println("Resetting hash table");
         if (bddhash == null || bddhash.length < bddnodesize * HASHFACTOR) {
             int newSize = (int)(bddnodesize * HASHFACTOR);
             if (POWEROF2)
@@ -533,7 +534,7 @@
     }
     
     final void HASH_RESET(int h) {
-        System.out.println("Resetting hash entry "+h);
+        if (false) System.out.println("Resetting hash entry "+h);
         bddhash[h] = HASH_EMPTY;
     }
     
@@ -667,7 +668,7 @@
             newBegin = 2;
         }
         
-        System.out.println("Moving level "+var0+" from ("+oldBegin+".."+oldEnd+") to ("+newBegin+".."+newEnd+")");
+        if (TRACE_REORDER) System.out.println("Moving level "+var0+" from ("+oldBegin+".."+oldEnd+") to ("+newBegin+".."+newEnd+")");
         
         if (newEnd > bddhash.length) {
             // grow the table!
@@ -748,7 +749,7 @@
                     //System.out.println("Rehashing "+r+" from hashloc "+k);
                     bddhash[k] = HASH_EMPTY;
                     int h = rehash_helper(var0, r);
-                    if (true)
+                    if (TRACE_REORDER)
                         System.out.println("Rehashed "+r+" from hashloc "+k+" to hashloc "+h);
                 }
             }
@@ -791,7 +792,7 @@
                 return h;
             }
             if (x < 0 || x == HASH_EMPTY) {
-                System.out.println("Rehashing node "+v+"("+VARr(v)+","+LOW(v)+","+HIGH(v)+") rc="+refcounts.get(v)+" into hash slot "+h);
+                if (TRACE_REORDER) System.out.println("Rehashing node "+v+"("+VARr(v)+","+LOW(v)+","+HIGH(v)+") rc="+refcounts.get(v)+" into hash slot "+h);
                 if (VERIFY_ASSERTIONS) _assert(x != HASH_SENTINEL);
                 bddhash[h] = v;
                 if (x != HASH_EMPTY && -x != v) {
@@ -826,7 +827,7 @@
             if (VERIFY_ASSERTIONS) _assert(HASH_GETVAL(h) != v);
             int x = bddhash[h];
             if (x == HASH_EMPTY || x == HASH_SENTINEL) {
-                System.out.println("Inserting node "+v+"("+VARr(v)+","+LOW(v)+","+HIGH(v)+") rc="+refcounts.get(v)+" into hash slot "+h);
+                if (TRACE_REORDER) System.out.println("Inserting node "+v+"("+VARr(v)+","+LOW(v)+","+HIGH(v)+") rc="+refcounts.get(v)+" into hash slot "+h);
                 bddhash[h] = v;
                 return h;
             } else {
@@ -843,7 +844,7 @@
                 h -= l.size;
         }
         
-        System.out.println("Inserting node "+v+"("+VARr(v)+","+LOW(v)+","+HIGH(v)+") rc="+refcounts.get(v)+" failed, resizing hash and trying again");
+        if (TRACE_REORDER) System.out.println("Inserting node "+v+"("+VARr(v)+","+LOW(v)+","+HIGH(v)+") rc="+refcounts.get(v)+" failed, resizing hash and trying again");
         
         HASHr_RESIZE(var);
         
@@ -5609,10 +5610,10 @@
             k += levels[n].size;
             if (levels[n].size >= 4)
                 levels[n].size = bdd_prime_lte(levels[n].size);
-            System.out.println("Var "+n+": "+levels[n].nodenum+" nodes, hash="+levels[n].start+"..."+(levels[n].start+levels[n].size));
+            if (TRACE_REORDER) System.out.println("Var "+n+": "+levels[n].nodenum+" nodes, hash="+levels[n].start+"..."+(levels[n].start+levels[n].size));
             total += levels[n].nodenum;
         }
-        System.out.println("total nodes="+total);
+        if (TRACE_REORDER) System.out.println("total nodes="+total);
     }
 
     // Reference counts.
@@ -5704,7 +5705,7 @@
         int size1 = levels[var1].size;
         int n;
 
-        System.out.println("Doing local GC for var "+var1+" ("+vl1+"..."+(vl1+size1)+")");
+        if (TRACE_REORDER) System.out.println("Doing local GC for var "+var1+" ("+vl1+"..."+(vl1+size1)+")");
 
         for (n = 0; n < size1; ++n) {
             int hash = n + vl1;
@@ -5712,7 +5713,7 @@
             int r = HASH_GETVAL(hash);
 
             if (!refcounts.hasref(r)) {
-                System.out.println("No longer referenced, freeing: "+r+"("+VARr(r)+","+LOW(r)+","+HIGH(r)+") rc="+refcounts.get(r)+" hash="+hash);
+                if (TRACE_REORDER) System.out.println("No longer referenced, freeing: "+r+"("+VARr(r)+","+LOW(r)+","+HIGH(r)+") rc="+refcounts.get(r)+" hash="+hash);
                 HASHr_SETSENTINEL(hash);
                 if (VERIFY_ASSERTIONS) _assert(VARr(r) == var1);
                 refcounts.dec(LOW(r));
@@ -5760,7 +5761,7 @@
         int size0 = levels[var0].size;
         int n;
 
-        System.out.println("Exchanging v"+var0+" and v"+var1+" ("+levels[var0].nodenum+" nodes) hashloc "+vl0+"..."+(vl0+size0));
+        if (TRACE_REORDER) System.out.println("Exchanging v"+var0+" and v"+var1+" ("+levels[var0].nodenum+" nodes) hashloc "+vl0+"..."+(vl0+size0));
         
         toBeProcessed.init(levels[var0].nodenum);
         
@@ -5768,11 +5769,11 @@
 
         for (n = 0; n < size0; ++n) {
             int hash = n + vl0;
-            System.out.println(" hashloc "+hash+" = "+bddhash[hash]);
+            if (TRACE_REORDER) System.out.println(" hashloc "+hash+" = "+bddhash[hash]);
             if (!HASHr_HASVAL(hash)) continue;
             int r = HASHr_GETVAL(hash);
 
-            System.out.println("Inspecting node "+r+"("+VARr(r)+","+LOW(r)+","+HIGH(r)+") rc="+refcounts.get(r));
+            if (TRACE_REORDER) System.out.println("Inspecting node "+r+"("+VARr(r)+","+LOW(r)+","+HIGH(r)+") rc="+refcounts.get(r));
             if (VERIFY_ASSERTIONS) _assert(VARr(r) == var0);
             
             if (VARr(LOW(r)) != var1 && VARr(HIGH(r)) != var1) {
@@ -5787,7 +5788,7 @@
             }
         }
 
-        System.out.println("Exchanging v"+var0+": "+toBeProcessed.numtoprocess+" nodes have v"+var1+
+        if (TRACE_REORDER) System.out.println("Exchanging v"+var0+": "+toBeProcessed.numtoprocess+" nodes have v"+var1+
                            " as a successor, "+levels[var0].nodenum+" do not");
         
         return toBeProcessed;
@@ -5817,7 +5818,7 @@
             } else
                 f10 = f11 = f1;
 
-            System.out.println("Pushing down node "+t+"("+var0+","+f0+","+f1+") rc="+refcounts.get(t));
+            if (TRACE_REORDER) System.out.println("Pushing down node "+t+"("+var0+","+f0+","+f1+") rc="+refcounts.get(t));
             
             // Note: makenode does refcou.
             f0 = reorder_makenode(var0, f00, f10);
@@ -5833,8 +5834,8 @@
             refcounts.dec(LOW(t));
             refcounts.dec(HIGH(t));
 
-            System.out.println("Old low child node: "+LOW(t)+"("+VARr(LOW(t))+","+LOW(LOW(t))+","+HIGH(LOW(t))+") rc="+refcounts.get(LOW(t)));
-            System.out.println("Old high child node: "+HIGH(t)+"("+VARr(HIGH(t))+","+LOW(HIGH(t))+","+HIGH(HIGH(t))+") rc="+refcounts.get(HIGH(t)));
+            if (TRACE_REORDER) System.out.println("Old low child node: "+LOW(t)+"("+VARr(LOW(t))+","+LOW(LOW(t))+","+HIGH(LOW(t))+") rc="+refcounts.get(LOW(t)));
+            if (TRACE_REORDER) System.out.println("Old high child node: "+HIGH(t)+"("+VARr(HIGH(t))+","+LOW(HIGH(t))+","+HIGH(HIGH(t))+") rc="+refcounts.get(HIGH(t)));
             
             // Update in-place
             SETVARr(t, var1);
@@ -5843,8 +5844,8 @@
 
             levels[var1].nodenum++;
 
-            System.out.println("New low child node: "+LOW(t)+"("+VARr(LOW(t))+","+LOW(LOW(t))+","+HIGH(LOW(t))+") rc="+refcounts.get(LOW(t)));
-            System.out.println("New high child node: "+HIGH(t)+"("+VARr(HIGH(t))+","+LOW(HIGH(t))+","+HIGH(HIGH(t))+") rc="+refcounts.get(HIGH(t)));
+            if (TRACE_REORDER) System.out.println("New low child node: "+LOW(t)+"("+VARr(LOW(t))+","+LOW(LOW(t))+","+HIGH(LOW(t))+") rc="+refcounts.get(LOW(t)));
+            if (TRACE_REORDER) System.out.println("New high child node: "+HIGH(t)+"("+VARr(HIGH(t))+","+LOW(HIGH(t))+","+HIGH(HIGH(t))+") rc="+refcounts.get(HIGH(t)));
             
             // Rehash the node since it has new children
             hash = NODEHASHr(var1, f0, f1);
@@ -5919,13 +5920,10 @@
         return res;
     }
 
-    double[] reordercheck;
-    
     int reorder_init() {
         int n;
 
         reorder_handler(true, reorderstats);
-        reordercheck = allSatCounts();        
         
         levels = new levelData[bddvarnum];
 
@@ -6073,9 +6071,6 @@
         // Garbage collect to rehash blocks.
         bdd_gbc();
         
-        compare(reordercheck, allSatCounts());
-        reordercheck = null;
-        
         reorder_handler(false, reorderstats);
     }
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <joe...@us...> - 2007-03-06 06:08:41
      
     | 
| Revision: 476
          http://svn.sourceforge.net/javabdd/?rev=476&view=rev
Author:   joewhaley
Date:     2007-03-05 22:08:40 -0800 (Mon, 05 Mar 2007)
Log Message:
-----------
Added new UberMicroFactory.
Fixed setCacheRatio().
Added Intel compiler flag to optimize for Core 2 Duo processors.
Other small cleanups.
Modified Paths:
--------------
    trunk/JavaBDD/Makefile
    trunk/JavaBDD/net/sf/javabdd/BDDFactory.java
    trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
    trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java
    trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java
    trunk/JavaBDD/net/sf/javabdd/JFactory.java
Added Paths:
-----------
    trunk/JavaBDD/net/sf/javabdd/BitString.java
    trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java
Modified: trunk/JavaBDD/Makefile
===================================================================
--- trunk/JavaBDD/Makefile	2006-12-05 10:59:01 UTC (rev 475)
+++ trunk/JavaBDD/Makefile	2007-03-06 06:08:40 UTC (rev 476)
@@ -35,7 +35,7 @@
   CUDD_DLL_NAME = cudd.dll
   CAL_DLL_NAME = cal.dll
   ifeq (${CC},icl)    # Intel Windows compiler
-    CFLAGS = -DSPECIALIZE_RELPROD -DSPECIALIZE_OR -DSPECIALIZE_AND -DSMALL_NODES /O2 /Ob2 $(EXTRA_CFLAGS)
+    CFLAGS = -DSPECIALIZE_RELPROD -DSPECIALIZE_OR -DSPECIALIZE_AND -DSMALL_NODES /O2 /Ob2 /QxT $(EXTRA_CFLAGS)
     CUDD_CFLAGS = $(CFLAGS) -DHAVE_SYS_RESOURCE_H=0
     CAL_CFLAGS = $(CFLAGS) -DCLOCK_RESOLUTION=60 -DRLIMIT_DATA_DEFAULT=16777216 -DNDEBUG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_SYS_FILE_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_UNISTD_H=0 -DHAVE_ERRNO_H=1 -DHAVE_ASSERT_H=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_PWD_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_TIMES_H=1 -DHAVE_SYS_TIME_H=0 -DHAVE_SYS_RESOURCE_H=0 -DHAVE_STDARG_H=1 -DSIZEOF_VOID_P=4 -DSIZEOF_INT=4 -DHAVE_IEEE_754=1 -DPAGE_SIZE=4096 -DLG_PAGE_SIZE=12 -DRETSIGTYPE=void -DHAVE_STRCOLL=1 -DHAVE_SYSCONF=1 -DHAVE_GETHOSTNAME=1 -DHAVE_STRCSPN=1 -DHAVE_STRERROR=1 -DHAVE_STRSPN=1 -DHAVE_STRSTR=1 -DHAVE_GETENV=1 -DHAVE_STRCHR=1 -DHAVE_GETRLIMIT=1 -DHAVE_GETRUSAGE=1 -DHAVE_VALLOC=0
     OBJECT_OUTPUT_OPTION = -Fo
Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDFactory.java	2006-12-05 10:59:01 UTC (rev 475)
+++ trunk/JavaBDD/net/sf/javabdd/BDDFactory.java	2007-03-06 06:08:40 UTC (rev 476)
@@ -76,7 +76,9 @@
                 return CALFactory.init(nodenum, cachesize);
             if (bddpackage.equals("j") || bddpackage.equals("java"))
                 return JFactory.init(nodenum, cachesize);
-            if (bddpackage.equals("u") || bddpackage.equals("micro"))
+            if (bddpackage.equals("u"))
+                return UberMicroFactory.init(nodenum, cachesize);
+            if (bddpackage.equals("micro"))
                 return MicroFactory.init(nodenum, cachesize);
             if (bddpackage.equals("jdd"))
                 return JDDFactory.init(nodenum, cachesize);
@@ -1278,6 +1280,12 @@
             sb.append("Unique Chain:   ");
             sb.append(uniqueChain);
             sb.append(newLine);
+            sb.append("=> Ave. chain = ");
+            if (uniqueAccess > 0)
+                sb.append(((float) uniqueChain) / ((float) uniqueAccess));
+            else
+                sb.append((float)0);
+            sb.append(newLine);
             sb.append("Unique Hit:     ");
             sb.append(uniqueHit);
             sb.append(newLine);
@@ -1830,7 +1838,11 @@
     }
     
     protected static void bdd_default_gbchandler(boolean pre, GCStats s) {
-        if (!pre) {
+        if (pre) {
+            if (s.freenodes != 0)
+                System.err.println("Starting GC cycle  #"+(s.num+1)+
+                                   ": "+s.nodes+" nodes / "+s.freenodes+" free");
+        } else {
             System.err.println(s.toString());
         }
     }
Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java	2006-12-05 10:59:01 UTC (rev 475)
+++ trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java	2007-03-06 06:08:40 UTC (rev 476)
@@ -209,12 +209,10 @@
         
         protected void finalize() throws Throwable {
             super.finalize();
-            if (USE_FINALIZER) {
-                if (false && v != invalid_bdd_impl()) {
-                    System.out.println("BDD not freed! "+System.identityHashCode(this));
-                }
-                deferredFree(v);
+            if (false && v != invalid_bdd_impl()) {
+                System.out.println("BDD not freed! "+System.identityHashCode(this));
             }
+            deferredFree(v);
         }
         
     }
@@ -347,12 +345,10 @@
         
         protected void finalize() throws Throwable {
             super.finalize();
-            if (USE_FINALIZER) {
-                if (false && v != invalid_bdd_impl()) {
-                    System.out.println("BDD not freed! "+System.identityHashCode(this));
-                }
-                deferredFree(v);
+            if (false && v != invalid_bdd_impl()) {
+                System.out.println("BDD not freed! "+System.identityHashCode(this));
             }
+            deferredFree(v);
         }
         
     }
@@ -524,6 +520,8 @@
     protected /*bdd*/int[] to_free = new /*bdd*/int[8];
     protected /*bdd*/int to_free_length = 0;
     public void deferredFree(int v) {
+        if (v == invalid_bdd_impl())
+            return;
         synchronized(to_free) {
             if (to_free_length == to_free.length) {
                 /*bdd*/int[] t = new /*bdd*/int[to_free.length * 2];
Modified: trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java	2006-12-05 10:59:01 UTC (rev 475)
+++ trunk/JavaBDD/net/sf/javabdd/BDDVarSet.java	2007-03-06 06:08:40 UTC (rev 476)
@@ -34,7 +34,16 @@
     public abstract int[] toLevelArray();
     
     public String toString() {
-        return Arrays.toString(toArray());
+        //return Arrays.toString(toArray());
+	int[] a = toArray();
+	StringBuffer sb = new StringBuffer(a.length * 4 + 2);
+	sb.append('[');
+	for (int i = 0; i < a.length; ++i) {
+	    if (i != 0) sb.append(',');
+	    sb.append(a[i]);
+	}
+	sb.append(']');
+	return sb.toString();
     }
     
     /**
Added: trunk/JavaBDD/net/sf/javabdd/BitString.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BitString.java	                        (rev 0)
+++ trunk/JavaBDD/net/sf/javabdd/BitString.java	2007-03-06 06:08:40 UTC (rev 476)
@@ -0,0 +1,805 @@
+// BitString.java, created Wed May 16 17:26:33 2001 by joewhaley
+// Copyright (C) 2001-3 John Whaley <jw...@al...>
+// Licensed under the terms of the GNU LGPL; see COPYING for details.
+package net.sf.javabdd;
+
+import java.util.Iterator;
+
+/**
+ * <code>BitString</code> implements a vector of bits much like <code>java.util.BitSet</code>,
+ * except that this implementation actually works.  Also, <code>BitString</code>
+ * has some groovy features which <code>BitSet</code> doesn't; mostly related to
+ * efficient iteration over <code>true</code> and <code>false</code> components.
+ * <p>
+ * Each component of the <code>BitString</code> has a boolean value.
+ * The bits of a <code>BitString</code> are indexed by non-negative
+ * integers (that means they are zero-based, of course).  Individual
+ * indexed bits can be examined, set, or cleared.  One
+ * <code>BitString</code> may be used to modify the contents of another
+ * <code>BitString</code> through logical AND, logical inclusive OR,
+ * and logical exclusive OR operations.
+ * <p>
+ * By default, all bits in the set initially have the value 
+ * <code>false</code>.
+ * <p>
+ * Every bit set has a current size, which is the number of bits of
+ * space currently in use by the bit set.  Note that the size is related
+ * to the implementation of a bit set, so it may change with implementation.
+ * The length of a bit set related to the logical length of a bit set
+ * and is defined independently of implementation.
+ * 
+ * @author  John Whaley <jw...@al...>
+ * @version $Id: BitString.java 2279 2005-05-28 10:24:54Z joewhaley $
+ */
+public final class BitString implements Cloneable, java.io.Serializable {
+    
+    /**
+     * Version ID for serialization.
+     */
+    private static final long serialVersionUID = 3257570590025265971L;
+    
+    /* There are 2^BITS_PER_UNIT bits in each unit (int) */
+    private static final int BITS_PER_UNIT = 5;
+    private static final int MASK = (1 << BITS_PER_UNIT) - 1;
+    private int[] bits;
+
+    /**
+     * Convert bitIndex to a subscript into the bits[] array.
+     */
+    private static int subscript(int bitIndex) {
+        return bitIndex >> BITS_PER_UNIT;
+    }
+
+    /**
+     * Creates an empty string with the specified size.
+     * @param nbits the size of the string
+     */
+    public BitString(int nbits) {
+        /* subscript(nbits + MASK) is the length of the array needed to hold
+         * nbits.  Can also be written 1+subscript(nbits-1). */
+        bits = new int[subscript(nbits + MASK)];
+    }
+
+    /**
+     * Returns the first index in the bit string which is set, or
+     * -1 if there is no such index.
+     */
+    public int firstSet() {
+        return firstSet(-1);
+    }
+
+    /**
+     * Returns the first index greater than <code>where</code> in the
+     * bit string which is set, or -1 if there is no such index.
+     * @param where the starting point for the search.  May be negative.
+     */
+    public int firstSet(int where) {
+        // convert exclusive starting point to inclusive starting point
+        where = (where < -1) ? 0 : (where + 1);
+        // search in first unit is masked.
+        int mask = (~0) << (where & MASK);
+        // search through units
+        for (int i = subscript(where); i < bits.length; i++, mask = ~0) {
+            int unit = bits[i] & mask;
+            if (unit != 0) return (i << BITS_PER_UNIT) + (bsf(unit) - 1);
+        }
+        return -1;
+    }
+
+    /**
+     * Utility function to return the number of 1 bits in the given integer
+     * value.
+     * 
+     * @param b value to check
+     * @return byte number of one bits
+     */
+    public static final byte popcount(int b) {
+        int t, x;
+        x = b;
+        x = x - ((x >> 1) & 0x55555555);
+        t = ((x >> 2) & 0x33333333);
+        x = (x & 0x33333333) + t;
+        x = (x + (x >> 4)) & 0x0F0F0F0F;
+        x = x + (x >> 8);
+        x = x + (x >> 16);
+        return (byte) x;
+    }
+
+    /**
+     * Utility function to return the number of 1 bits in the given long value.
+     * 
+     * @param b value to check
+     * @return byte number of one bits
+     */
+    public static final byte popcount(long b) {
+        long t, x;
+        x = b;
+        x = x - ((x >> 1) & 0x5555555555555555L);
+        t = ((x >> 2) & 0x3333333333333333L);
+        x = (x & 0x3333333333333333L) + t;
+        x = (x + (x >> 4)) & 0x0F0F0F0F0F0F0F0FL;
+        x = x + (x >> 8);
+        x = x + (x >> 16);
+        x = x + (x >> 32);
+        return (byte) x;
+    }
+
+    /**
+     * Utility function to return the index of the first (lowest-order) one bit
+     * in the given integer.  Returns zero if the given number is zero.
+     * 
+     * @param b value to check
+     * @return byte index of first one bit, or zero if the number is zero
+     */
+    public static final int bsf(int b) {
+        int t = ~(b | -b);
+        return popcount(t);
+    }
+
+    /**
+     * Utility function to return the index of the last one bit in the given
+     * integer.  Returns zero if the given number is zero.
+     * 
+     * @param v value to check
+     * @return byte index of first one bit, or zero if the number is zero
+     */
+    public static final int bsr(int v) {
+        if ((v & 0xFFFF0000) != 0) {
+            if ((v & 0xFF000000) != 0)
+                return 24 + bytemsb[(v >> 24) & 0xFF];
+            else
+                return 16 + bytemsb[v >> 16];
+        }
+        if ((v & 0x0000FF00) != 0)
+            return 8 + bytemsb[v >> 8];
+        else
+            return bytemsb[v];
+    }
+
+    /** Highest bit set in a byte. */
+    private static final byte bytemsb[] = {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 /* 256 */};
+
+    /**
+     * Returns the last index less than <code>where</code> in the
+     *  bit string which is set, or -1 if there is no such index.
+     * @param where the starting point for the search.
+     */
+    public int lastSet(int where) {
+        // convert exclusive starting point to inclusive starting point
+        if (--where < 0) return -1;
+        int start = (bits.length - 1), mask = ~0;
+        if (subscript(where) < bits.length) {
+            // search in first unit is masked.
+            start = subscript(where);
+            mask = (~0) >>> (MASK - (where & mask));
+        }
+        // search through units
+        for (int i = start; i >= 0; i--, mask = ~0) {
+            int unit = bits[i] & mask;
+            if (unit != 0) return (i << BITS_PER_UNIT) + (bsr(unit) - 1);
+        }
+        return -1;
+    }
+
+    /**
+     * Returns the last index in the bit string which is set, or
+     * -1 if there is no such index.
+     */
+    public int lastSet() {
+        return lastSet(size());
+    }
+
+    /**
+     * Sets all bits.
+     */
+    public void setAll() {
+        int i = bits.length;
+        while (i-- > 0) {
+            bits[i] = ~0;
+        }
+    }
+
+    /**
+     * Sets all bits up to and including the given bit.
+     * @param bit the bit to be set up to (zero-based)
+     */
+    public void setUpTo(int bit) {
+        int where = subscript(bit);
+        /* preaddition of 1 to bit is a clever hack to avoid long arithmetic */
+        bits[where] |= ((1 << ((bit + 1) & MASK)) - 1);
+        while (where-- > 0) {
+            bits[where] = ~0;
+        }
+    }
+
+    public void setRange(int lo, int hi) {
+        int where1 = subscript(lo);
+        int where2 = subscript(hi);
+        if (where1 == where2) {
+            for ( ; lo <= hi; ++lo)
+                bits[where1] |= (1 << (lo & MASK));
+        } else {
+            /* preaddition of 1 to bit is a clever hack to avoid long arithmetic */
+            bits[where2] |= ((1 << ((hi + 1) & MASK)) - 1);
+            while (--where2 > where1) {
+                bits[where2] = ~0;
+            }
+            bits[where1] |= -(1 << (lo & MASK));
+        }
+    }
+    
+    /**
+     * Sets a bit.
+     * @param bit the bit to be set (zero-based)
+     */
+    public void set(int bit) {
+        bits[subscript(bit)] |= (1 << (bit & MASK));
+    }
+
+    /**
+     * Clears all bits.
+     */
+    public void clearAll() {
+        int i = bits.length;
+        while (i-- > 0) {
+            bits[i] = 0;
+        }
+    }
+
+    /**
+     * Clears all bits up to and including the given bit.
+     * @param bit the bit to be set up to (zero-based)
+     */
+    public void clearUpTo(int bit) {
+        int where = subscript(bit);
+        /* preaddition of 1 to bit is a clever hack to avoid long arithmetic */
+        bits[where] &= ~((1 << ((bit + 1) & MASK)) - 1);
+        while (where-- > 0) {
+            bits[where] = 0;
+        }
+    }
+
+    /**
+     * Clears a bit.
+     * @param bit the bit to be cleared (zero-based)
+     */
+    public void clear(int bit) {
+        bits[subscript(bit)] &= ~(1 << (bit & MASK));
+    }
+
+    /**
+     * Gets a bit.
+     * @param bit the bit to be gotten (zero-based)
+     */
+    public boolean get(int bit) {
+        int n = subscript(bit);
+        return ((bits[n] & (1 << (bit & MASK))) != 0);
+    }
+
+    /**
+     * Logically ANDs this bit set with the specified set of bits.
+     * Returns <code>true</code> if <code>this</code> was modified in
+     * response to the operation.
+     * @param set the bit set to be ANDed with
+     */
+    public boolean and(BitString set) {
+        if (this == set) { // should help alias analysis
+            return false;
+        }
+        int n = bits.length;
+        boolean changed = false;
+        for (int i = n; i-- > 0;) {
+            int old = bits[i];
+            bits[i] &= set.bits[i];
+            changed |= (old != bits[i]);
+        }
+        return changed;
+    }
+
+    /**
+     * Logically ORs this bit set with the specified set of bits.
+     * Returns <code>true</code> if <code>this</code> was modified in
+     * response to the operation.
+     * @param set the bit set to be ORed with
+     */
+    public boolean or(BitString set) {
+        if (this == set) { // should help alias analysis
+            return false;
+        }
+        int setLength = set.bits.length;
+        boolean changed = false;
+        for (int i = setLength; i-- > 0;) {
+            int old = bits[i];
+            bits[i] |= set.bits[i];
+            changed |= (old != bits[i]);
+        }
+        return changed;
+    }
+
+    /**
+     * Logically ORs this bit set with the specified set of bits.
+     * Returns <code>true</code> if <code>this</code> was modified in
+     * response to the operation.
+     * @param set the bit set to be ORed with
+     */
+    public boolean or_upTo(BitString set, int bit) {
+        if (this == set) { // should help alias analysis
+            return false;
+        }
+        boolean result;
+        int where = subscript(bit);
+        int old = bits[where];
+        bits[where] |= (set.bits[where] & ((1 << ((bit + 1) & MASK)) - 1));
+        result = (bits[where] != old);
+        while (where-- > 0) {
+            old = bits[where];
+            bits[where] |= set.bits[where];
+            result |= (bits[where] != old);
+        }
+        return result;
+    }
+
+    /**
+     * Logically XORs this bit set with the specified set of bits.
+     * Returns <code>true</code> if <code>this</code> was modified in
+     * response to the operation.
+     * @param set the bit set to be XORed with
+     */
+    public boolean xor(BitString set) {
+        int setLength = set.bits.length;
+        boolean changed = false;
+        for (int i = setLength; i-- > 0;) {
+            int old = bits[i];
+            bits[i] ^= set.bits[i];
+            changed |= (old != bits[i]);
+        }
+        return changed;
+    }
+
+    /**
+     * Logically subtracts this bit set with the specified set of bits.
+     * Returns <code>true</code> if <code>this</code> was modified in
+     * response to the operation.
+     * @param set the bit set to subtract
+     */
+    public boolean minus(BitString set) {
+        int n = bits.length;
+        boolean changed = false;
+        for (int i = n; i-- > 0;) {
+            int old = bits[i];
+            bits[i] &= ~set.bits[i];
+            changed |= (old != bits[i]);
+        }
+        return changed;
+    }
+    
+    /**
+     * Check if the intersection of the two sets is empty
+     * @param other the set to check intersection with
+     */
+    public boolean intersectionEmpty(BitString other) {
+        int n = bits.length;
+        for (int i = n; i-- > 0;) {
+            if ((bits[i] & other.bits[i]) != 0) return false;
+        }
+        return true;
+    }
+
+    /**
+     * Check if this set contains all bits of the given set.
+     * @param other the set to check containment with
+     */
+    public boolean contains(BitString other) {
+        int n = bits.length;
+        for (int i = n; i-- > 0;) {
+            if ((bits[i] & other.bits[i]) != other.bits[i]) return false;
+        }
+        return true;
+    }
+
+    private static void shld(int[] bits, int i1, int i2, int amt) {
+        //Assert._assert(amt >= 0 && amt < BITS_PER_UNIT);
+        bits[i1] = (bits[i1] << amt) | ((bits[i2] << (BITS_PER_UNIT - amt)) >> (BITS_PER_UNIT - amt));
+    }
+
+    /**
+     * Performs a left-shift operation.
+     * @param amt number of bits to shift, can be negative
+     */
+    public void shl(int amt) {
+        final int div = amt >> BITS_PER_UNIT;
+        final int mod = amt & MASK;
+        final int size = bits.length;
+        if (amt < 0) {
+            shr(-amt); return;
+        }
+        // big moves
+        if (div > 0) {
+            System.arraycopy(bits, 0, bits, div, size - div);
+            for (int i = 0; i < div; ++i)
+                bits[i] = 0;
+            /*
+            int i;
+            for (i = size - 1; i >= div; --i) {
+                bits[i] = bits[i - div];
+            }
+            for (; i >= 0; --i) {
+                bits[i] = 0;
+            }
+            */
+        }
+        // small moves
+        if (mod > 0) {
+            int i;
+            for (i = size - 1; i > div; --i) {
+                shld(bits, i, i - 1, mod);
+            }
+            bits[i] <<= mod;
+        }
+    }
+
+    private static void shrd(int[] bits, int i1, int i2, int amt) {
+        //Assert._assert(amt >= 0 && amt < BITS_PER_UNIT);
+        bits[i1] = (bits[i1] >>> amt) | ((bits[i2] >>> (BITS_PER_UNIT - amt)) << (BITS_PER_UNIT - amt));
+    }
+
+    /**
+     * Performs a right-shift operation.
+     * @param amt number of bits to shift
+     */
+    public void shr(int amt) {
+        final int div = amt >> BITS_PER_UNIT;
+        final int mod = amt & MASK;
+        final int size = bits.length;
+        // big moves
+        if (div > 0) {
+            System.arraycopy(bits, div, bits, 0, size - div);
+            for (int i = size-div; i < size; ++i)
+                bits[i] = 0;
+            /*
+            int i;
+            for (i = 0; i < size - div; ++i) {
+                bits[i] = bits[i + div];
+            }
+            for (; i < size; ++i) {
+                bits[i] = 0;
+            }
+            */
+        }
+        // small moves
+        if (mod > 0) {
+            int i;
+            for (i = 0; i < size - div - 1; ++i) {
+                shrd(bits, i, i + 1, mod);
+            }
+            bits[i] >>>= mod;
+        }
+    }
+
+    /**
+     * Copies the values of the bits in the specified set into this set.
+     * @param set the bit set to copy the bits from
+     */
+    public void copyBits(BitString set) {
+        System.arraycopy(set.bits, 0, bits, 0, Math.min(bits.length, set.bits.length));
+    }
+
+    /**
+     * Returns a hash code value for this bit string whose value depends
+     * only on which bits have been set within this <code>BitString</code>.
+     */
+    public int hashCode() {
+        int h = 1234;
+        for (int i = bits.length; --i >= 0;) {
+            h ^= bits[i] * (i + 1);
+        }
+        return h;
+    }
+
+    /**
+     * Returns the "logical size" of this <code>BitString</code>: the
+     * index of the highest set bit in the <code>BitString</code> plus
+     * one.  Returns zero if the <code>BitString</code> contains no
+     * set bits.
+     */
+    public int length() {
+        return lastSet() + 1;
+    }
+
+    /**
+     * Returns the number of bits of space actually in use by this
+     * <code>BitString</code> to represent bit values.
+     * The maximum element in the set is the size - 1st element.
+     * The minimum element in the set is the zero'th element.
+     */
+    public int size() {
+        return bits.length << BITS_PER_UNIT;
+    }
+
+    /**
+     * Compares this object against the specified object.
+     * @param obj the object to compare with
+     * @return true if the contents of the bitsets are the same; false otherwise.
+     */
+    public boolean equals(Object obj) {
+        BitString set;
+        if (obj == null) return false;
+        if (this == obj) return true; //should help alias analysis
+        try {
+            set = (BitString) obj;
+        } catch (ClassCastException e) {
+            return false;
+        }
+        if (length() != set.length()) return false;
+        int n = bits.length - 1;
+        while (n >= 0 && bits[n] == 0) n--;
+        // now n has the first non-zero entry
+        for (int i = n; i >= 0; i--) {
+            if (bits[i] != set.bits[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Returns whether this <code>BitString</code> is all zeroes.
+     * @return true if it is all zeroes.
+     */
+    public boolean isZero() {
+        int setLength = bits.length;
+        for (int i = setLength; i-- > 0;) {
+            if (bits[i] != 0) return false;
+        }
+        return true;
+    }
+
+    /**
+     * Returns the number of ones in this <code>BitString</code>.
+     * @return number of bits set.
+     */
+    public int numberOfOnes() {
+        int setLength = bits.length;
+        int number = 0;
+        for (int i = setLength; i-- > 0;) {
+            number += popcount(bits[i]);
+        }
+        return number;
+    }
+
+    /**
+     * Returns the number of ones in this <code>BitString</code> up to a given index.
+     * @return number of bits set.
+     */
+    public int numberOfOnes(int where) {
+        int setLength = subscript(where);
+        int number = 0;
+        for (int i = setLength; i-- > 0;) {
+            number += popcount(bits[i]);
+        }
+        number += popcount(bits[setLength] & ((1 << ((where + 1) & MASK)) - 1));
+        return number;
+    }
+
+    /**
+     * Clones the BitString.
+     */
+    public Object clone() {
+        BitString result = null;
+        try {
+            result = (BitString) super.clone();
+        } catch (CloneNotSupportedException e) {
+            // this shouldn't happen, since we are Cloneable
+            throw new InternalError();
+        }
+        result.bits = new int[bits.length];
+        System.arraycopy(bits, 0, result.bits, 0, result.bits.length);
+        return result;
+    }
+
+    /**
+     * Converts the BitString to a String.
+     */
+    public String toString() {
+        StringBuffer buffer = new StringBuffer();
+        boolean needSeparator = false;
+        buffer.append('{');
+        for (ForwardBitStringIterator i=iterator(); i.hasNext(); ) {
+            int x = i.nextIndex();
+            if (needSeparator) {
+                buffer.append(", ");
+            } else {
+                needSeparator = true;
+            }
+            buffer.append(x);
+        }
+        buffer.append('}');
+        return buffer.toString();
+    }
+
+    /**
+     * Returns an iterator that iterates through the bits in forward order.
+     */
+    public ForwardBitStringIterator iterator() {
+        return new ForwardBitStringIterator();
+    }
+
+    public ForwardBitStringZeroIterator zeroIterator() {
+        return new ForwardBitStringZeroIterator();
+    }
+    
+    /**
+     * Returns an iterator that iterates through the bits in backward order.
+     */
+    public BackwardBitStringIterator backwardsIterator() {
+        return new BackwardBitStringIterator();
+    }
+
+    /**
+     * Returns an iterator that iterates through the bits in backward order,
+     * starting at the given index.
+     */
+    public BackwardBitStringIterator backwardsIterator(int i) {
+        return new BackwardBitStringIterator(i);
+    }
+
+    /**
+     * Abstract bit string iterator class.
+     */
+    public abstract static class BitStringIterator implements Iterator {
+
+        /**
+         * Returns the index of the next bit set.
+         */
+        public abstract int nextIndex();
+
+        /**
+         * @see java.util.Iterator#next()
+         */
+        public final Object next() {
+            return new Integer(nextIndex());
+        }
+        
+        public void remove() {
+            throw new UnsupportedOperationException("Unmodifiable Iterator");
+        }
+
+    }
+
+    /**
+     * Iterator for iterating through a bit string in forward order.
+     */
+     public class ForwardBitStringIterator extends BitStringIterator {
+         private int j, k, t;
+
+         ForwardBitStringIterator() {
+             j = 0;
+             k = 0;
+             t = bits[0];
+         }
+
+         /**
+          * @see java.util.Iterator#hasNext()
+          */
+         public boolean hasNext() {
+             while (t == 0) {
+                 if (j == bits.length - 1) return false;
+                 t = bits[++j];
+                 k += 1 << BITS_PER_UNIT;
+             }
+             return true;
+         }
+
+         /**
+          * @see jwutil.math.BitString.BitStringIterator#nextIndex()
+          */
+         public int nextIndex() {
+             while (t == 0) {
+                 if (j == bits.length - 1) throw new java.util.NoSuchElementException();
+                 t = bits[++j];
+                 k += 1 << BITS_PER_UNIT;
+             }
+             int t2 = (t ^ (-t));
+             int index = 31 - popcount(t2);
+             t &= t2;
+             return k + index;
+             /*
+             int t2 = ~(t | (-t));
+             int index = popcount(t2);
+             t &= ~(t2 + 1);
+             return k + index;
+              */
+         }
+
+     }
+    
+     /**
+      * Iterator for iterating through a bit string in forward order.
+      */
+      public class ForwardBitStringZeroIterator extends BitStringIterator {
+          private int j, k, t;
+
+          ForwardBitStringZeroIterator() {
+              j = 0;
+              k = 0;
+              t = ~bits[0];
+          }
+
+          /**
+           * @see java.util.Iterator#hasNext()
+           */
+          public boolean hasNext() {
+              while (t == 0) {
+                  if (j == bits.length - 1) return false;
+                  t = ~bits[++j];
+                  k += 1 << BITS_PER_UNIT;
+              }
+              return true;
+          }
+
+          /**
+           * @see jwutil.math.BitString.BitStringIterator#nextIndex()
+           */
+          public int nextIndex() {
+              while (t == 0) {
+                  if (j == bits.length - 1) throw new java.util.NoSuchElementException();
+                  t = ~bits[++j];
+                  k += 1 << BITS_PER_UNIT;
+              }
+              int t2 = (t ^ (-t));
+              int index = 31 - popcount(t2);
+              t &= t2;
+              return k + index;
+          }
+
+      }
+      
+    /**
+     * Iterator for iterating through a bit string in backward order.
+     */
+    public class BackwardBitStringIterator extends BitStringIterator {
+        private int j, k, t;
+
+        BackwardBitStringIterator(int i) {
+            j = subscript(i);
+            t = bits[j];
+            t &= (1 << ((i + 1) & MASK)) - 1;
+            k = j << BITS_PER_UNIT;
+        }
+
+        BackwardBitStringIterator() {
+            j = bits.length - 1;
+            t = bits[j];
+            k = j << BITS_PER_UNIT;
+        }
+
+        /**
+         * @see java.util.Iterator#hasNext()
+         */
+        public boolean hasNext() {
+            while (t == 0) {
+                if (j == 0) {
+                    return false;
+                }
+                t = bits[--j];
+                k -= 1 << BITS_PER_UNIT;
+            }
+            return true;
+        }
+
+        /**
+         * @see jwutil.math.BitString.BitStringIterator#nextIndex()
+         */
+        public int nextIndex() {
+            while (t == 0) {
+                if (j == 0) throw new java.util.NoSuchElementException();
+                t = bits[--j];
+                k -= 1 << BITS_PER_UNIT;
+            }
+            int index = bsr(t) - 1;
+            t &= ~(1 << index);
+            return k + index;
+        }
+        
+    }
+}
Modified: trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java	2006-12-05 10:59:01 UTC (rev 475)
+++ trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java	2007-03-06 06:08:40 UTC (rev 476)
@@ -295,7 +295,7 @@
      * @see net.sf.javabdd.BDDFactory#setCacheRatio(int)
      */
     public double setCacheRatio(double x) {
-        return setCacheRatio0((int)(x * 100.)) / 100.;
+        return setCacheRatio0((int)x);
     }
     private static native int setCacheRatio0(int x);
     
Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/JFactory.java	2006-12-05 10:59:01 UTC (rev 475)
+++ trunk/JavaBDD/net/sf/javabdd/JFactory.java	2007-03-06 06:08:40 UTC (rev 476)
@@ -214,7 +214,7 @@
     public int getCacheSize() { return cachesize; }
     public int reorderGain() { return bdd_reorder_gain(); }
     public void printStat() { bdd_fprintstat(System.out); }
-    public double setCacheRatio(double x) { return bdd_setcacheratio((int)(x * 100)) / 100.; }
+    public double setCacheRatio(double x) { return bdd_setcacheratio((int)x); }
     public int varNum() { return bdd_varnum(); }
     public int setVarNum(int num) { return bdd_setvarnum(num); }
     public void printAll() { bdd_fprintall(System.out); }
@@ -1431,7 +1431,7 @@
         }
 
         checkresize();
-        if (true) bdd_validate(res);
+        if (false) bdd_validate(res);
         return res;
     }
 
@@ -2574,7 +2574,7 @@
         }
 
         checkresize();
-        if (true) bdd_validate(res);
+        if (false) bdd_validate(res);
         return res;
     }
 
@@ -5331,21 +5331,28 @@
         resizedInMakenode = false;
 
         if (imatrixDepends(iactmtx, var, bddlevel2var[level + 1])) {
+            // This var depends on the next one.
+            // (ie there is some BDD with both this var and the next one)
+            
+            // Rehash this level and return a list of nodes that depend on the
+            // next level.
             int toBeProcessed = reorder_downSimple(var);
             levelData l = levels[var];
 
             if (l.nodenum < (l.size) / 3
                 || l.nodenum >= (l.size * 3) / 2
                 && l.size < l.maxsize) {
+                // Hash table for this level is too big or too small, resize it.
                 reorder_swapResize(toBeProcessed, var);
                 reorder_localGbcResize(toBeProcessed, var);
             } else {
+                // Swap the variable and do a GC pass on this level.
                 reorder_swap(toBeProcessed, var);
                 reorder_localGbc(var);
             }
         }
 
-        /* Swap the var<->level tables */
+        // Swap the var<->level tables
         n = bddlevel2var[level];
         bddlevel2var[level] = bddlevel2var[level + 1];
         bddlevel2var[level + 1] = n;
@@ -5439,13 +5446,17 @@
 
     int reorder_downSimple(int var0) {
         int toBeProcessed = 0;
+        
+        // Next variable to swap with.
         int var1 = bddlevel2var[bddvar2level[var0] + 1];
+        
+        // Hash table range for source variable.
         int vl0 = levels[var0].start;
         int size0 = levels[var0].size;
         int n;
 
+        // Rehash this level and recalculate the number of nodes.
         levels[var0].nodenum = 0;
-
         for (n = 0; n < size0; n++) {
             int r;
 
@@ -5455,26 +5466,17 @@
             while (r != 0) {
                 int next = NEXT(r);
 
-/***
-                if (LOW(r) == -1) {
-                    System.out.println(r+": LOW="+LOW(r));
-                }
-                if (HIGH(r) == -1) {
-                    System.out.println(r+": HIGH="+HIGH(r));
-                }
-***/
                 if (VARr(LOW(r)) != var1 && VARr(HIGH(r)) != var1) {
-                    /* Node does not depend on next var, let it stay in the chain */
+                    // Node does not depend on next var, put it in the chain
                     SETNEXT(r, HASH(n + vl0));
                     SETHASH(n + vl0, r);
                     levels[var0].nodenum++;
                 } else {
-                    /* Node depends on next var - save it for later procesing */
+                    // Node depends on next var - save it for later processing
                     SETNEXT(r, toBeProcessed);
                     toBeProcessed = r;
                     if (SWAPCOUNT)
                         cachestats.swapCount++;
-
                 }
 
                 r = next;
@@ -5493,7 +5495,7 @@
             int f1 = HIGH(toBeProcessed);
             int f00, f01, f10, f11;
 
-            /* Find the cofactors for the new nodes */
+            // Find the cofactors for the new nodes
             if (VARr(f0) == var1) {
                 f00 = LOW(f0);
                 f01 = HIGH(f0);
@@ -5520,14 +5522,14 @@
             DECREF(LOW(toBeProcessed));
             DECREF(HIGH(toBeProcessed));
 
-            /* Update in-place */
+            // Update in-place
             SETVARr(toBeProcessed, var1);
             SETLOW(toBeProcessed, f0);
             SETHIGH(toBeProcessed, f1);
 
             levels[var1].nodenum++;
 
-            /* Do not rehash yet since we are going to resize the hash table */
+            // Do not rehash yet since we are going to resize the hash table
 
             toBeProcessed = next;
         }
@@ -5595,13 +5597,15 @@
     void reorder_swap(int toBeProcessed, int var0) {
         int var1 = bddlevel2var[bddvar2level[var0] + 1];
 
+        // toBeProcessed is a linked list of nodes that depend on the next level.
+        
         while (toBeProcessed != 0) {
             int next = NEXT(toBeProcessed);
             int f0 = LOW(toBeProcessed);
             int f1 = HIGH(toBeProcessed);
             int f00, f01, f10, f11, hash;
 
-            /* Find the cofactors for the new nodes */
+            // Find the cofactors for the new nodes
             if (VARr(f0) == var1) {
                 f00 = LOW(f0);
                 f01 = HIGH(f0);
@@ -5620,22 +5624,25 @@
             //node = bddnodes[toBeProcessed]; /* Might change in makenode */
 
             /* We know that the refcou of the grandchilds of this node
-            * is greater than one (these are f00...f11), so there is
-            * no need to do a recursive refcou decrease. It is also
-            * possible for the node.low/high nodes to come alive again,
-            * so deref. of the childs is delayed until the local GBC. */
+             * is greater than one (these are f00...f11), so there is
+             * no need to do a recursive refcou decrease. It is also
+             * possible for the node.low/high nodes to come alive again,
+             * so deref. of the childs is delayed until the local GBC. */
 
             DECREF(LOW(toBeProcessed));
             DECREF(HIGH(toBeProcessed));
 
-            /* Update in-place */
+            // Update in-place
+            // NOTE: This node may be a duplicate.  However, we add this to the start
+            // of the list so we will always encounter this one first.  The refcount
+            // of the node we duplicated will go to zero.
             SETVARr(toBeProcessed, var1);
             SETLOW(toBeProcessed, f0);
             SETHIGH(toBeProcessed, f1);
 
             levels[var1].nodenum++;
 
-            /* Rehash the node since it got new childs */
+            // Rehash the node since it has new children
             hash = NODEHASH2(VARr(toBeProcessed), LOW(toBeProcessed), HIGH(toBeProcessed));
             SETNEXT(toBeProcessed, HASH(hash));
             SETHASH(hash, toBeProcessed);
@@ -5658,7 +5665,7 @@
             cachestats.uniqueAccess++;
 
         /* Note: We know that low,high has a refcou greater than zero, so
-        there is no need to add reference *recursively* */
+           there is no need to add reference *recursively* */
 
         if (ZDD) {
             /* check whether high child is zero */
@@ -5701,9 +5708,9 @@
                 return 0;
 
             /* Try to allocate more nodes - call noderesize without
-            * enabling rehashing.
+             * enabling rehashing.
              * Note: if ever rehashing is allowed here, then remember to
-            * update local variable "hash" */
+             * update local variable "hash" */
             bdd_noderesize(false);
             resizedInMakenode = true;
 
@@ -5740,12 +5747,18 @@
     }
 
     int reorder_init() {
+        // This method does the following:
+        //  - Calculate interaction matrix "iactmtx"
+        //  - Calculates the number of nodes with each variable.
+        //  - Mutates each node to store the var instead of the level.
+        //  - Sets refcounts for all links, including internal ones.
+        
         int n;
 
         reorder_handler(true, reorderstats);
         
+        // Split the hash table into a separate region for each variable.
         levels = new levelData[bddvarnum];
-
         for (n = 0; n < bddvarnum; n++) {
             levels[n] = new levelData();
             levels[n].start = -1;
@@ -5753,15 +5766,15 @@
             levels[n].nodenum = 0;
         }
 
-        /* First mark and recursive refcou. all roots and childs. Also do some
-         * setup here for both setLevellookup and reorder_gbc */
+        // First mark and recursive refcou. all roots and childs. Also do some
+        // setup here for both setLevellookup and reorder_gbc
         if (mark_roots() < 0)
             return -1;
 
-        /* Initialize the hash tables */
+        // Initialize the hash tables
         reorder_setLevellookup();
 
-        /* Garbage collect and rehash to new scheme */
+        // Garbage collect and rehash to new scheme
         reorder_gbc();
 
         return 0;
@@ -5786,14 +5799,19 @@
 
         iactmtx = imatrixNew(bddvarnum);
 
+        // Loop to compute dependences and node refcounts.
         for (n = 2, extrootsize = 0; n < bddnodesize; n++) {
 
             if (MARKED(n)) {
+                // Node has an external reference.
                 UNMARK(n);
                 extroots[extrootsize++] = n;
 
+                // Calculate the set of variables in this BDD.
+                // Also sets refcounts on internal nodes.
                 for (int i = 0; i < bddvarnum; ++i)
                     dep[i] = false;
+                
                 dep[VARr(n)] = true;
                 levels[VARr(n)].nodenum++;
 
@@ -5835,12 +5853,15 @@
             return;
 
         if (!HASREF(r) || MARKED(r)) {
+            // We haven't processed the node yet.
+            // Processed nodes have a refcount and are unmarked.
+            
             bddfreenum--;
 
-            /* Detect variable dependencies for the interaction matrix */
+            // Detect variable dependencies for the interaction matrix
             dep[VARr(r) & ~MARK_MASK] = true;
 
-            /* Make sure the nodenum field is updated. Used in the initial GBC */
+            // Make sure the nodenum field is updated. Used in the initial GBC
             levels[VARr(r) & ~MARK_MASK].nodenum++;
 
             addref_rec(LOW(r), dep);
@@ -5848,8 +5869,8 @@
         } else {
             int n;
 
-            /* Update (from previously found) variable dependencies
-            * for the interaction matrix */
+            // Update (from previously found) variable dependencies
+            // for the interaction matrix
             for (n = 0; n < bddvarnum; n++)
                 dep[n]
                     |= imatrixDepends(iactmtx, VARr(r) & ~MARK_MASK, n);
@@ -5913,7 +5934,7 @@
                 CLEARREF(n);
 
             /* This is where we go from .var to .level again!
-            * - Do NOT use the LEVEL macro here. */
+             * - Do NOT use the LEVEL macro here. */
             SETLEVELANDMARK(n, bddvar2level[LEVELANDMARK(n)]);
         }
 
Added: trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java	                        (rev 0)
+++ trunk/JavaBDD/net/sf/javabdd/UberMicroFactory.java	2007-03-06 06:08:40 UTC (rev 476)
@@ -0,0 +1,6763 @@
+// UberMicroFactory.java, created Jan 29, 2005 8:24:17 PM by joewhaley
+// Copyright (C) 2005 John Whaley <jw...@al...>
+// Licensed under the terms of the GNU LGPL; see COPYING for details.
+package net.sf.javabdd;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Random;
+import java.util.Set;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.PrintStream;
+
+/**
+ * <p>BDD factory where each node only takes 16 bytes.
+ * This is accomplished by tightly packing the bits, eliminating
+ * the refcount, splitting out the unique table and limiting the
+ * maximum number of BDD variables to 2^11 = 2048.</p>
+ * 
+ * <p>This BDD factory is not only more memory efficient than 
+ * JFactory, it also seems to perform better, probably due to
+ * better memory locality.  It performs cache-aware BDD node
+ * placement.</p>
+ * 
+ * @author jwhaley
+ * @version $Id: UberMicroFactory.java 465 2006-07-26 16:42:44Z joewhaley $
+ */
+public class UberMicroFactory extends BDDFactoryIntImpl {
+
+    public static boolean FLUSH_CACHE_ON_GC = true;
+    
+    static final boolean VERIFY_ASSERTIONS = true;
+    static final boolean ORDER_CACHE = false;
+    static final int CACHESTATS = 0;
+    static final boolean SWAPCOUNT = false;
+    
+    public static final String REVISION = "$Revision: 465 $";
+    
+    public String getVersion() {
+        return "UberMicroFactory "+REVISION.substring(11, REVISION.length()-2);
+    }
+    
+    private UberMicroFactory() { }
+    
+    /* (non-Javadoc)
+     * @see net.sf.javabdd.BDDFactory#init(int, int)
+     */
+    public static BDDFactory init(int nodenum, int cachesize) {
+        BDDFactory f = new UberMicroFactory();
+        f.initialize(nodenum, cachesize);
+        if (CACHESTATS > 0) addShutdownHook(f);
+        return f;
+    }
+
+    static void addShutdownHook(final BDDFactory f) {
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            public void run() {
+                System.out.println(f.getCacheStats().toString());
+            }
+        });
+    }
+    
+    protected IntBDD makeBDD(/*bdd*/int v) {
+        return new Micro5BDD(v);
+    }
+    
+    static final boolean USE_WEAK_REFS = false;
+    
+    Collection externalRefBDDs, externalRefVarSets;
+    
+    class Micro5BDD extends BDDFactoryIntImpl.IntBDD {
+        Micro5BDD(int v) {
+            super(v);
+            if (VERIFY_ASSERTIONS) {
+                if (v == INVALID_BDD)
+                    bdd_error(BDD_BREAK); /* distinctive */
+                if (v >= bddnodesize)
+                    bdd_error(BDD_ILLBDD);
+                if (bddnodes[v] == 0)
+                    bdd_error(BDD_ILLBDD);
+            }
+            if (USE_WEAK_REFS)
+                externalRefBDDs.add(new java.lang.ref.WeakReference(this));
+            else
+                externalRefBDDs.add(this);
+        }
+    }
+    
+    protected IntBDDVarSet makeBDDVarSet(/*bdd*/int v) {
+        return new Micro5VarSet(v);
+    }
+    
+    public class Micro5VarSet extends IntBDDVarSet {
+        Micro5VarSet(int v) {
+            super(v);
+            if (VERIFY_ASSERTIONS) {
+                if (v == INVALID_BDD)
+                    bdd_error(BDD_BREAK); /* distinctive */
+                if (v >= bddnodesize)
+                    bdd_error(BDD_ILLBDD);
+                if (bddnodes[v] == 0)
+                    bdd_error(BDD_ILLBDD);
+            }
+            if (USE_WEAK_REFS)
+                externalRefVarSets.add(new java.lang.ref.WeakReference(this));
+            else
+                externalRefVarSets.add(this);
+        }
+    }
+    
+    public void handleDeferredFree() {
+        to_free_length = 0;
+    }
+    
+    /**
+     * Implementation of BDDPairing used by JFactory.
+     */
+    class bddPair extends BDDPairing {
+        int[] result;
+        int last;
+        int id;
+        bddPair next;
+
+        /* (non-Javadoc)
+         * @see net.sf.javabdd.BDDPairing#set(int, int)
+         */
+        public void set(int oldvar, int newvar) {
+            bdd_setpair(this, oldvar, newvar);
+        }
+        /* (non-Javadoc)
+         * @see net.sf.javabdd.BDDPairing#set(int, net.sf.javabdd.BDD)
+         */
+        public void set(int oldvar, BDD newvar) {
+            bdd_setbddpair(this, oldvar, unwrap(newvar));
+        }
+        /* (non-Javadoc)
+         * @see net.sf.javabdd.BDDPairing#reset()
+         */
+        public void reset() {
+            bdd_resetpair(this);
+        }
+        
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            sb.append('{');
+            boolean any = false;
+            for (int i = 0; i < result.length; ++i) {
+                if (result[i] != bdd_ithvar(bddlevel2var[i])) {
+                    if (any) sb.append(", ");
+                    any = true;
+                    sb.append(bddlevel2var[i]);
+                    sb.append('=');
+                    BDD b = makeBDD(result[i]);
+                    sb.append(b);
+                    b.free();
+                }
+            }
+            sb.append('}');
+            return sb.toString();
+        }
+    }
+    
+    /* (non-Javadoc)
+     * @see net.sf.javabdd.BDDFactory#makePair()
+     */
+    public BDDPairing makePair() {
+        bddPair p = new bddPair();
+        p.result = new int[bddvarnum];
+        int n;
+        for (n = 0; n < bddvarnum; n++)
+            p.result[n] = bdd_ithvar(bddlevel2var[n]);
+
+        p.id = update_pairsid();
+        p.last = -1;
+
+        bdd_register_pair(p);
+        return p;
+    }
+
+    // Redirection functions.
+    
+    protected void addref_impl(int v) { }
+    protected void delref_impl(int v) { }
+    protected int zero_impl() { return BDDZERO; }
+    protected int one_impl() { return BDDONE; }
+    protected int invalid_bdd_impl() { return INVALID_BDD; }
+    protected int var_impl(int v) { return bdd_var(v); }
+    protected int level_impl(int v) { return LEVEL(v); }
+    protected int low_impl(int v) { return bdd_low(v); }
+    protected int high_impl(int v) { return bdd_high(v); }
+    protected int ithVar_impl(int var) { return bdd_ithvar(var); }
+    protected int nithVar_impl(int var) { return bdd_nithvar(var); }
+    
+    protected int makenode_impl(int lev, int lo, int hi) { return bdd_makenode(lev, lo, hi); }
+    protected int ite_impl(int v1, int v2, int v3) { return bdd_ite(v1, v2, v3); }
+    protected int apply_impl(int v1, int v2, BDDOp opr) { return bdd_apply(v1, v2, opr.id); }
+    protected int not_impl(int v1) { return bdd_not(v1); }
+    protected int applyAll_impl(int v1, int v2, BDDOp opr, int v3) { return bdd_appall(v1, v2, opr.id, v3); }
+    protected int applyEx_impl(int v1, int v2, BDDOp opr, int v3) { return bdd_appex(v1, v2, opr.id, v3); }
+    protected int applyUni_impl(int v1, int v2, BDDOp opr, int v3) { return bdd_appuni(v1, v2, opr.id, v3); }
+    protected int compose_impl(int v1, int v2, int var) { return bdd_compose(v1, v2, var); }
+    protected int constrain_impl(int v1, int v2) { return bdd_constrain(v1, v2); }
+    protected int restrict_impl(int v1, int v2) { return bdd_restrict(v1, v2); }
+    protected int simplify_impl(int v1, int v2) { return bdd_simplify(v1, v2); }
+    protected int support_impl(int v) { return bdd_support(v); }
+    protected int exist_impl(int v1, int v2) { return bdd_exist(v1, v2); }
+    protected int forAll_impl(int v1, int v2) { return bdd_forall(v1, v2); }
+    protected int unique_impl(int v1, int v2) { return bdd_unique(v1, v2); }
+    protected int fullSatOne_impl(int v) { return bdd_fullsatone(v); }
+    
+    protected int replace_impl(int v, BDDPairing p) { return bdd_replace(v, (bddPair)p); }
+    protected int veccompose_impl(int v, BDDPairing p) { return bdd_veccompose(v, (bddPair)p); }
+    
+    protected int nodeCount_impl(int v) { return bdd_nodecount(v); }
+    protected double pathCount_impl(int v) { return bdd_pathcount(v); }
+    protected double satCount_impl(int v) { return bdd_satcount(v); }
+    protected int satOne_impl(int v) { return bdd_satone(v); }
+    protected int satOne_impl2(int v1, int v2, boolean pol) { return bdd_satoneset(v1, v2, pol); }
+    protected int nodeCount_impl2(int[] v) { return bdd_anodecount(v); }
+    protected int[] varProfile_impl(int v) { return bdd_varprofile(v); }
+    protected void printTable_impl(int v) { bdd_fprinttable(System.out, v); }
+    
+    // More redirection functions.
+    
+    protected void initialize(int initnodesize, int cs) { bdd_init(initnodesize, cs); }
+    public void addVarBlock(int first, int last, boolean fixed) { bdd_intaddvarblock(first, last, fixed); }
+    public void varBlockAll() { bdd_varblockall(); }
+    public void clearVarBlocks() { bdd_clrvarblocks(); }
+    public void printOrder() { bdd_fprintorder(System.out); }
+    public int getNodeTableSize() { return bdd_getallocnum(); }
+    public int setNodeTableSize(int size) { return bdd_setallocnum(size); }
+    public int setCacheSize(int v) { return bdd_setcachesize(v); }
+    public boolean isInitialized() { return bddrunning; }
+    public void done() { super.done(); bdd_done(); }
+    public void setError(int code) { bdderrorcond = code; }
+    public void clearError() { bdderrorcond = 0; }
+    public int setMaxNodeNum(int size) { return bdd_setmaxnodenum(size); }
+    public double setMinFreeNodes(double x) { return bdd_setminfreenodes((int)(x * 100.)) / 100.; }
+    public int setMaxIncrease(int x) { return bdd_setmaxincrease(x); }
+    public double setIncreaseFactor(double x) { return bdd_setincreasefactor(x); }
+    public int getNodeNum() { return bdd_getnodenum(); }
+    public int getCacheSize() { return cachesize; }
+    public int reorderGain() { return bdd_reorder_gain(); }
+    public void printStat() { bdd_fprintstat(System.out); }
+    public double setCacheRatio(double x) { return bdd_setcacheratio((int)x); }
+    public int varNum() { return bdd_varnum(); }
+    public int setVarNum(int num) { return bdd_setvarnum(num); }
+    public void printAll() { bdd_fprintall(System.out); }
+    public BDD load(BufferedReader in, int[] translate) throws IOException { return makeBDD(bdd_load(in, translate)); }
+    public void save(BufferedWriter out, BDD b) throws IOException { bdd_save(out, unwrap(b)); }
+    public void setVarOrder(int[] neworder) { bdd_setvarorder(neworder); }
+    public int level2Var(int level) { return bddlevel2var[level]; }
+    public int var2Level(int var) { return bddvar2level[var]; }
+    public int getReorderTimes() { return bddreordertimes; }
+    public void disableReorder() { bdd_disable_reorder(); }
+    public void enableReorder() { bdd_enable_reorder(); }
+    public int reorderVerbose(int v) { return bdd_reorder_verbose(v); }
+    public void reorder(ReorderMethod m) { bdd_reorder(m.id); }
+    public void autoReorder(ReorderMethod method) { bdd_autoreorder(method.id); }
+    public void autoReorder(ReorderMethod method, int max) { bdd_autoreorder_times(method.id, max); }
+    public void swapVar(int v1, int v2) { bdd_swapvar(v1, v2); }
+    
+    public ReorderMethod getReorderMethod() {
+        switch (bddreordermethod) {
+            case BDD_REORDER_NONE :
+                return REORDER_NONE;
+            case BDD_REORDER_WIN2 :
+                return REORDER_WIN2;
+            case BDD_REORDER_WIN2ITE :
+                return REORDER_WIN2ITE;
+            case BDD_REORDER_WIN3 :
+                return REORDER_WIN3;
+            case BDD_REORDER_WIN3ITE :
+                return REORDER_WIN3ITE;
+            case BDD_REORDER_SIFT :
+                return REORDER_SIFT;
+            case BDD_REORDER_SIFTITE :
+                return REORDER_SIFTITE;
+            case BDD_REORDER_RANDOM :
+                return REORDER_RANDOM;
+            default :
+                throw new BDDException();
+        }
+    }
+
+    // Experimental functions.
+    
+    public void validateAll() { bdd_validate_all(); }
+    public void validateLive() { bdd_validate_live(); }
+    public void validateBDD(BDD b) { bdd_validate(unwrap(b)); }
+    
+    
+    /***** IMPLEMENTATION BELOW *****/
+    
+    long[] bddnodes;
+    
+    static final int LEV_BITS  = 11;
+    static final int NODE_BITS = 26;
+    static final int LOW_SHIFT = 12;
+    static final int HIGH_SHIFT = 38;
+    static final int LEV_SHIFT = 1;
+    static final int MARK_MASK = 0x001;
+    static final int LEV_MASK =  0xffe;
+    static final long LO_MASK =  0x0000003ffffff000L;
+    static final long HI_MASK =  0xffffffc000000000L;
+    static final long LOHILEV_MASK = LO_MASK | HI_MASK | LEV_MASK;
+    
+    static final int INVALID_BDD = -1;
+    static final int MAXVAR = (1 << LEV_BITS) - 1;
+    static final int MAX_PAIRSID = MAXVAR;
+    static final int NODE_MASK = (1 << NODE_BITS) - 1;
+    
+    private final int LEVEL(int node) {
+        return ((int)bddnodes[node] & LEV_MASK) >> LEV_SHIFT;
+    }
+
+    private final void SETLEVEL(int node, int val) {
+        if (VERIFY_ASSERTIONS)
+            _assert(val >= 0 && val <= MAXVAR);
+        long a = bddnodes[node] & ~LEV_MASK;
+        a |= val << LEV_SHIFT;
+        bddnodes[node] = a;
+    }
+
+    private final void SETMARK(int n) {
+        bddnodes[n] |= MARK_MASK;
+    }
+    
+    private final void UNMARK(int n) {
+        if (VERIFY_ASSERTIONS) _assert(n > 1);
+        bddnodes[n] &= ~MARK_MASK;
+    }
+    
+    private final boolean MARKED(int n) {
+        return ((int)bddnodes[n] & MARK_MASK) != 0;
+    }
+
+    private final int LOW(int r) {
+        return (int)(bddnodes[r] >> LOW_SHIFT) & NODE_MASK;
+    }
+
+    private final void SETLOW(int r, int v) {
+        if (VERIFY_ASSERTIONS) _assert(v >= 0 && v <= NODE_MASK);
+        long a = bddnodes[r] & ~LO_MASK;
+        a |= (long)v << LOW_SHIFT;
+        bddnodes[r] = a;
+    }
+    
+    private final int HIGH(int r) {
+        return (int)(bddnodes[r] >> HIGH_SHIFT) & NODE_MASK;
+    }
+
+    private final void SETHIGH(int r, int v) {
+        if (VERIFY_ASSERTIONS) _assert(v >= 0 && v <= NODE_MASK);
+        long a = bddnodes[r] & ~HI_MASK;
+        a |= (long)v << HIGH_SHIFT;
+        bddnodes[r] = a;
+    }
+    
+    private static final long MAKE_NODE(int lev, int lo, int hi) {
+        long a = lev << LEV_SHIFT;
+        a |= (long)lo << LOW_SHIFT;
+        a |= (long)hi << HIGH_SHIFT;
+        return a;
+    }
+    
+    private final int VARr(int node) {
+        return ((int)bddnodes[node] & LEV_MASK) >> LEV_SHIFT;
+    }
+    
+    private final void SETVARr(int node, int val) {
+        if (VERIFY_ASSERTIONS)
+            _assert(val >= 0 && val <= MAXVAR);
+        long a = bddnodes[node] & ~LEV_MASK;
+        a |= val << LEV_SHIFT;
+        bddnodes[node] = a;
+    }
+    
+    static final int BUCKET_SIZE = 8;
+    
+    class freelist {
+        BitString fullbuckets;
+        
+        void reset() {
+            if (VERIFY_ASSERTIONS) _assert((bddnodesize & -BUCKET_SIZE) == bddnodesize);
+            int b = bddnodesize / BUCKET_SIZE;
+            if (fullbuckets == null || b != fullbuckets.size())
+                fullbuckets = new BitString(b);
+            last_bucket = 0;
+        }
+        
+        void resize() {
+            if (fullbuckets == null) {
+                reset();
+            } else {
+                if (VERIFY_ASSERTIONS) _assert((bddnodesize & -BUCKET_SIZE) == bddnodesize);
+                int b = bddnodesize / BUCKET_SIZE;
+                if (b !...
 
[truncated message content] | 
| 
      
      
      From: <joe...@us...> - 2006-12-05 10:59:03
      
     | 
| Revision: 475
          http://svn.sourceforge.net/javabdd/?rev=475&view=rev
Author:   joewhaley
Date:     2006-12-05 02:59:01 -0800 (Tue, 05 Dec 2006)
Log Message:
-----------
Added random relprod test.
Modified Paths:
--------------
    trunk/JavaBDD_tests/bdd/IteratorTests.java
Modified: trunk/JavaBDD_tests/bdd/IteratorTests.java
===================================================================
--- trunk/JavaBDD_tests/bdd/IteratorTests.java	2006-12-05 10:58:16 UTC (rev 474)
+++ trunk/JavaBDD_tests/bdd/IteratorTests.java	2006-12-05 10:59:01 UTC (rev 475)
@@ -13,6 +13,7 @@
 import net.sf.javabdd.BDDDomain;
 import net.sf.javabdd.BDDFactory;
 import net.sf.javabdd.BDDVarSet;
+import net.sf.javabdd.TestBDDFactory;
 
 /**
  * IteratorTests
@@ -21,6 +22,8 @@
  * @version $Id$
  */
 public class IteratorTests extends BDDTestCase {
+    static Random random = new Random(1238);
+    
     public static void main(String[] args) {
         junit.textui.TestRunner.run(IteratorTests.class);
     }
@@ -84,8 +87,6 @@
         }
     }
     
-    static Random random = new Random(1234);
-    
     static BDD randomBDD(BDDFactory f) {
         BDD result = f.zero();
         for (int i = 0; i < f.varNum(); ++i) {
@@ -100,6 +101,15 @@
         return result;
     }
 
+    static BDDVarSet randomBDDVarSet(BDDFactory f) {
+        BDDVarSet s = f.emptySet();
+        for (int i = 0; i < f.varNum(); ++i) {
+            if (random.nextBoolean())
+                s.unionWith(i);
+        }
+        return s;
+    }
+    
     static BDD betterRandomBDD(BDDFactory f) {
         // Use a random truth table.
         byte[] bytes = new byte[(1 << f.varNum()) / 8 + 1];
@@ -153,6 +163,25 @@
         }
     }
     
+    public void testRandomRelprod() {
+        System.setProperty("bdd1", "zdd");
+        System.setProperty("bdd2", "j");
+        BDDFactory bdd = TestBDDFactory.init(10000, 1000);
+        bdd.setVarNum(5);
+        for (int i = 0; i < 1000; ++i) {
+            BDD b = betterRandomBDD(bdd);
+            BDD c = betterRandomBDD(bdd);
+            BDDVarSet d = randomBDDVarSet(bdd);
+            BDD e = b.relprod(c, d);
+            
+            BDD f = b.and(c);
+            BDD g = f.exist(d);
+            Assert.assertEquals(g, e);
+            
+            b.free(); c.free(); d.free(); e.free(); f.free(); g.free();
+        }
+    }
+    
     public void testRandomIterator() {
         reset();
         Assert.assertTrue(hasNext());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      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.
 | 
| 
      
      
      From: <joe...@us...> - 2006-12-03 10:34:05
      
     | 
| Revision: 473
          http://svn.sourceforge.net/javabdd/?rev=473&view=rev
Author:   joewhaley
Date:     2006-12-03 02:34:02 -0800 (Sun, 03 Dec 2006)
Log Message:
-----------
Clean up code.
Modified Paths:
--------------
    trunk/JavaBDD_tests/bdd/BasicTests.java
Modified: trunk/JavaBDD_tests/bdd/BasicTests.java
===================================================================
--- trunk/JavaBDD_tests/bdd/BasicTests.java	2006-12-03 10:32:26 UTC (rev 472)
+++ trunk/JavaBDD_tests/bdd/BasicTests.java	2006-12-03 10:34:02 UTC (rev 473)
@@ -202,12 +202,6 @@
             a = bdd.ithVar(0);
             b = a.not();
             c = bdd.nithVar(0);
-            //System.out.println("First graph:");
-            //a.printDot();
-            //System.out.println("Second graph:");
-            //b.printDot();
-            //System.out.println("Third graph:");
-            //c.printDot();
             Assert.assertEquals(b, c);
             if (!bdd.isZDD()) {
                 c.free();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <joe...@us...> - 2006-12-03 10:32:29
      
     | 
| Revision: 472
          http://svn.sourceforge.net/javabdd/?rev=472&view=rev
Author:   joewhaley
Date:     2006-12-03 02:32:26 -0800 (Sun, 03 Dec 2006)
Log Message:
-----------
For ZDD: Fixed toString() and an embarrassing bug in ithVar/setvarnum.
Updated TestBDDFactory to work with ZDDs and newer APIs.
Modified Paths:
--------------
    trunk/JavaBDD/net/sf/javabdd/BDD.java
    trunk/JavaBDD/net/sf/javabdd/JFactory.java
    trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java
Modified: trunk/JavaBDD/net/sf/javabdd/BDD.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/BDD.java	2006-11-30 09:23:43 UTC (rev 471)
+++ trunk/JavaBDD/net/sf/javabdd/BDD.java	2006-12-03 10:32:26 UTC (rev 472)
@@ -546,6 +546,11 @@
         protected byte[] allsatProfile;
         protected final boolean useLevel;
 
+        protected AllSatIterator(BDDFactory factory, boolean level) {
+            f = factory;
+            useLevel = level;
+        }
+        
         /**
          * Constructs a satisfying-assignment iterator on the given BDD.
          * next() returns a byte array indexed by BDD variable number.
@@ -1289,6 +1294,8 @@
     public String toString() {
         BDDFactory f = this.getFactory();
         int[] set = new int[f.varNum()];
+        if (f.isZDD())
+            Arrays.fill(set, 1);
         StringBuffer sb = new StringBuffer();
         bdd_printset_rec(f, sb, this, set);
         return sb.toString();
@@ -1316,17 +1323,34 @@
             }
             sb.append('>');
         } else {
-            set[f.var2Level(r.var())] = 1;
-            BDD rl = r.low();
-            bdd_printset_rec(f, sb, rl, set);
-            rl.free();
-
-            set[f.var2Level(r.var())] = 2;
-            BDD rh = r.high();
-            bdd_printset_rec(f, sb, rh, set);
-            rh.free();
-
-            set[f.var2Level(r.var())] = 0;
+            if (f.isZDD()) {
+                if (r.low().equals(r.high())) {
+                    set[f.var2Level(r.var())] = 0;
+                } else {
+                    BDD rl = r.low();
+                    bdd_printset_rec(f, sb, rl, set);
+                    rl.free();
+                    
+                    set[f.var2Level(r.var())] = 2;
+                }
+                BDD rl = r.high();
+                bdd_printset_rec(f, sb, rl, set);
+                rl.free();
+                
+                set[f.var2Level(r.var())] = 1;
+            } else {
+                set[f.var2Level(r.var())] = 1;
+                BDD rl = r.low();
+                bdd_printset_rec(f, sb, rl, set);
+                rl.free();
+    
+                set[f.var2Level(r.var())] = 2;
+                BDD rh = r.high();
+                bdd_printset_rec(f, sb, rh, set);
+                rh.free();
+    
+                set[f.var2Level(r.var())] = 0;
+            }
         }
     }
     
Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/JFactory.java	2006-11-30 09:23:43 UTC (rev 471)
+++ trunk/JavaBDD/net/sf/javabdd/JFactory.java	2006-12-03 10:32:26 UTC (rev 472)
@@ -2943,12 +2943,12 @@
 
         if (ISZERO(LOW(r))) {
             int res = satone_rec(HIGH(r));
-            int m = bdd_makenode(LEVEL(r), BDDZERO, res);
+            int m = makenode_impl(LEVEL(r), BDDZERO, res);
             PUSHREF(m);
             return m;
         } else {
             int res = satone_rec(LOW(r));
-            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;
         }
@@ -5003,13 +5003,22 @@
             if (ZDD) {
                 int res = 1, res_not = 1;
                 for (int k = num-1; k >= 0; --k) {
-                    PUSHREF(res);
-                    PUSHREF(res_not);
-                    PUSHREF(univ);
-                    res = zdd_makenode(k, (k == bddvarnum)?0:res, res);
-                    res_not = (k == bddvarnum) ? res_not : zdd_makenode(k, res_not, res_not);
-                    if (bdv == bddvarnum) univ = zdd_makenode(k, univ, univ);
-                    POPREF(3);
+                    int res2 = zdd_makenode(k, (k == bddvarnum)?0:res, res);
+                    INCREF(res2);
+                    DECREF(res);
+                    res = res2;
+                    
+                    int res_not2 = (k == bddvarnum) ? res_not : zdd_makenode(k, res_not, res_not);
+                    INCREF(res_not2);
+                    DECREF(res_not);
+                    res_not = res_not2;
+                    
+                    if (bdv == bddvarnum) {
+                        int univ2 = zdd_makenode(k, univ, univ);
+                        INCREF(univ2);
+                        DECREF(univ);
+                        univ = univ2;
+                    }
                 }
                 bddvarset[bddvarnum * 2] = res;
                 bddvarset[bddvarnum * 2 + 1] = res_not;
@@ -5040,7 +5049,7 @@
         bdd_operator_varresize();
 
         if (ZDD) {
-            System.out.println("Changed number of ZDD variables, all existing ZDDs are now invalid.");
+            System.out.println("Changed number of ZDD variables to "+num+", all existing ZDDs are now invalid.");
             // Need to rebuild varsets for existing domains.
             for (int n = 0; n < fdvarnum; n++) {
                 domain[n].var.free();
Modified: trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java	2006-11-30 09:23:43 UTC (rev 471)
+++ trunk/JavaBDD/net/sf/javabdd/TestBDDFactory.java	2006-12-03 10:32:26 UTC (rev 472)
@@ -11,9 +11,11 @@
 import java.math.BigInteger;
 
 /**
- * <p>This BDD factory is used to test other BDD factories.  It is a wrapper around
- * two BDD factories, and all operations are performed on both factories.  It
- * throws an exception if the results from the two implementations do not match.</p>
+ * <p>
+ * This BDD factory is used to test other BDD factories. It is a wrapper around
+ * two BDD factories, and all operations are performed on both factories. It
+ * throws an exception if the results from the two implementations do not match.
+ * </p>
  * 
  * @see net.sf.javabdd.BDDFactory
  * 
@@ -21,11 +23,11 @@
  * @version $Id$
  */
 public class TestBDDFactory extends BDDFactory {
-
     BDDFactory f1, f2;
 
     public TestBDDFactory(BDDFactory a, BDDFactory b) {
-        f1 = a; f2 = b;
+        f1 = a;
+        f2 = b;
     }
 
     public static BDDFactory init(int nodenum, int cachesize) {
@@ -41,36 +43,34 @@
             throw new InternalError(s);
         }
     }
-    
+
     public static final void assertSame(BDD b1, BDD b2, String s) {
         if (!b1.toString().equals(b2.toString())) {
         //if (b1.nodeCount() != b2.nodeCount()) {
-            System.out.println("b1 = "+b1.nodeCount());
-            System.out.println("b2 = "+b2.nodeCount());
-            System.out.println("b1 = "+b1.toString());
-            System.out.println("b2 = "+b2.toString());
+            System.out.println("b1 = " + b1.nodeCount());
+            System.out.println("b2 = " + b2.nodeCount());
+            System.out.println("b1 = " + b1.toString());
+            System.out.println("b2 = " + b2.toString());
             throw new InternalError(s);
         }
     }
 
     public static final void assertSame(boolean b, BDD b1, BDD b2, String s) {
         if (!b) {
-            System.err.println("b1 = "+b1);
-            System.err.println("b2 = "+b2);
+            System.err.println("b1 = " + b1);
+            System.err.println("b2 = " + b2);
             throw new InternalError(s);
         }
     }
-    
+
     public static final void assertSame(BDDVarSet b1, BDDVarSet b2, String s) {
         assertSame(b1.toBDD(), b2.toBDD(), s);
     }
-    
+
     public static final void assertSame(boolean b, BDDVarSet b1, BDDVarSet b2, String s) {
         assertSame(b, b1.toBDD(), b2.toBDD(), s);
     }
-    
     private class TestBDD extends BDD {
-
         BDD b1, b2;
 
         TestBDD(BDD a, BDD b) {
@@ -79,21 +79,27 @@
             assertSame(a, b, "constructor");
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#getFactory()
          */
         public BDDFactory getFactory() {
             return TestBDDFactory.this;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#toVarSet()
          */
         public BDDVarSet toVarSet() {
             return new TestBDDVarSet(b1.toVarSet(), b2.toVarSet());
         }
-        
-        /* (non-Javadoc)
+
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#isZero()
          */
         public boolean isZero() {
@@ -103,7 +109,9 @@
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#isOne()
          */
         public boolean isOne() {
@@ -113,7 +121,9 @@
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#var()
          */
         public int var() {
@@ -123,7 +133,9 @@
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#high()
          */
         public BDD high() {
@@ -132,7 +144,9 @@
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#low()
          */
         public BDD low() {
@@ -141,7 +155,9 @@
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#id()
          */
         public BDD id() {
@@ -150,7 +166,9 @@
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#not()
          */
         public BDD not() {
@@ -159,133 +177,158 @@
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#ite(net.sf.javabdd.BDD, net.sf.javabdd.BDD)
          */
         public BDD ite(BDD thenBDD, BDD elseBDD) {
-            BDD c1 = ((TestBDD)thenBDD).b1;
-            BDD c2 = ((TestBDD)thenBDD).b2;
-            BDD d1 = ((TestBDD)elseBDD).b1;
-            BDD d2 = ((TestBDD)elseBDD).b2;
+            BDD c1 = ((TestBDD) thenBDD).b1;
+            BDD c2 = ((TestBDD) thenBDD).b2;
+            BDD d1 = ((TestBDD) elseBDD).b1;
+            BDD d2 = ((TestBDD) elseBDD).b2;
             BDD r1 = b1.ite(c1, d1);
             BDD r2 = b2.ite(c2, d2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
-         * @see net.sf.javabdd.BDD#relprod(net.sf.javabdd.BDD, net.sf.javabdd.BDDVarSet)
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#relprod(net.sf.javabdd.BDD,
+         *      net.sf.javabdd.BDDVarSet)
          */
         public BDD relprod(BDD that, BDDVarSet var) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
-            BDDVarSet d1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet d2 = ((TestBDDVarSet)var).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
+            BDDVarSet d1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet d2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.relprod(c1, d1);
             BDD r2 = b2.relprod(c2, d2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#compose(net.sf.javabdd.BDD, int)
          */
         public BDD compose(BDD g, int var) {
-            BDD c1 = ((TestBDD)g).b1;
-            BDD c2 = ((TestBDD)g).b2;
+            BDD c1 = ((TestBDD) g).b1;
+            BDD c2 = ((TestBDD) g).b2;
             BDD r1 = b1.compose(c1, var);
             BDD r2 = b2.compose(c2, var);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#veccompose(net.sf.javabdd.BDDPairing)
          */
         public BDD veccompose(BDDPairing pair) {
-            BDDPairing c1 = ((TestBDDPairing)pair).b1;
-            BDDPairing c2 = ((TestBDDPairing)pair).b2;
+            BDDPairing c1 = ((TestBDDPairing) pair).b1;
+            BDDPairing c2 = ((TestBDDPairing) pair).b2;
             BDD r1 = b1.veccompose(c1);
             BDD r2 = b2.veccompose(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#constrain(net.sf.javabdd.BDD)
          */
         public BDD constrain(BDD that) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
             BDD r1 = b1.constrain(c1);
             BDD r2 = b2.constrain(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#exist(net.sf.javabdd.BDDVarSet)
          */
         public BDD exist(BDDVarSet var) {
-            BDDVarSet c1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)var).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.exist(c1);
             BDD r2 = b2.exist(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#forAll(net.sf.javabdd.BDD)
          */
         public BDD forAll(BDDVarSet var) {
-            BDDVarSet c1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)var).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.forAll(c1);
             BDD r2 = b2.forAll(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#unique(net.sf.javabdd.BDD)
          */
         public BDD unique(BDDVarSet var) {
-            BDDVarSet c1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)var).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.unique(c1);
             BDD r2 = b2.unique(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#restrict(net.sf.javabdd.BDD)
          */
         public BDD restrict(BDD var) {
-            BDD c1 = ((TestBDD)var).b1;
-            BDD c2 = ((TestBDD)var).b2;
+            BDD c1 = ((TestBDD) var).b1;
+            BDD c2 = ((TestBDD) var).b2;
             BDD r1 = b1.restrict(c1);
             BDD r2 = b2.restrict(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#restrictWith(net.sf.javabdd.BDD)
          */
         public BDD restrictWith(BDD var) {
-            BDD c1 = ((TestBDD)var).b1;
-            BDD c2 = ((TestBDD)var).b2;
+            BDD c1 = ((TestBDD) var).b1;
+            BDD c2 = ((TestBDD) var).b2;
             b1.restrictWith(c1);
             b2.restrictWith(c2);
             assertSame(b1, b2, "restrict");
             return this;
         }
-        
-        /* (non-Javadoc)
+
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#simplify(net.sf.javabdd.BDDVarSet)
          */
         public BDD simplify(BDDVarSet d) {
-            BDDVarSet c1 = ((TestBDDVarSet)d).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)d).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) d).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) d).b2;
             BDD r1 = b1.simplify(c1);
             BDD r2 = b2.simplify(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#support()
          */
         public BDDVarSet support() {
@@ -294,69 +337,86 @@
             return new TestBDDVarSet(r1, r2);
         }
 
-        /* (non-Javadoc)
-         * @see net.sf.javabdd.BDD#apply(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp)
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#apply(net.sf.javabdd.BDD,
+         *      net.sf.javabdd.BDDFactory.BDDOp)
          */
         public BDD apply(BDD that, BDDOp opr) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
             BDD r1 = b1.apply(c1, opr);
             BDD r2 = b2.apply(c2, opr);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
-         * @see net.sf.javabdd.BDD#applyWith(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp)
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#applyWith(net.sf.javabdd.BDD,
+         *      net.sf.javabdd.BDDFactory.BDDOp)
          */
         public BDD applyWith(BDD that, BDDOp opr) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
             b1.applyWith(c1, opr);
             b2.applyWith(c2, opr);
-            assertSame(b1, b2, "applyWith "+opr);
+            assertSame(b1, b2, "applyWith " + opr);
             return this;
         }
 
-        /* (non-Javadoc)
-         * @see net.sf.javabdd.BDD#applyAll(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet)
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#applyAll(net.sf.javabdd.BDD,
+         *      net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet)
          */
         public BDD applyAll(BDD that, BDDOp opr, BDDVarSet var) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
-            BDDVarSet e1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet e2 = ((TestBDDVarSet)var).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
+            BDDVarSet e1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet e2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.applyAll(c1, opr, e1);
             BDD r2 = b2.applyAll(c2, opr, e2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
-         * @see net.sf.javabdd.BDD#applyEx(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet)
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#applyEx(net.sf.javabdd.BDD,
+         *      net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet)
          */
         public BDD applyEx(BDD that, BDDOp opr, BDDVarSet var) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
-            BDDVarSet e1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet e2 = ((TestBDDVarSet)var).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
+            BDDVarSet e1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet e2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.applyEx(c1, opr, e1);
             BDD r2 = b2.applyEx(c2, opr, e2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
-         * @see net.sf.javabdd.BDD#applyUni(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet)
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#applyUni(net.sf.javabdd.BDD,
+         *      net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet)
          */
         public BDD applyUni(BDD that, BDDOp opr, BDDVarSet var) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
-            BDDVarSet e1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet e2 = ((TestBDDVarSet)var).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
+            BDDVarSet e1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet e2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.applyUni(c1, opr, e1);
             BDD r2 = b2.applyUni(c2, opr, e2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#satOne()
          */
         public BDD satOne() {
@@ -365,7 +425,9 @@
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#fullSatOne()
          */
         public BDD fullSatOne() {
@@ -374,41 +436,49 @@
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#satOne(net.sf.javabdd.BDDVarSet, boolean)
          */
         public BDD satOne(BDDVarSet var, boolean pol) {
-            BDDVarSet c1 = ((TestBDDVarSet)var).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)var).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) var).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) var).b2;
             BDD r1 = b1.satOne(c1, pol);
             BDD r2 = b2.satOne(c2, pol);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#replace(net.sf.javabdd.BDDPairing)
          */
         public BDD replace(BDDPairing pair) {
-            BDDPairing c1 = ((TestBDDPairing)pair).b1;
-            BDDPairing c2 = ((TestBDDPairing)pair).b2;
+            BDDPairing c1 = ((TestBDDPairing) pair).b1;
+            BDDPairing c2 = ((TestBDDPairing) pair).b2;
             BDD r1 = b1.replace(c1);
             BDD r2 = b2.replace(c2);
             return new TestBDD(r1, r2);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#replaceWith(net.sf.javabdd.BDDPairing)
          */
         public BDD replaceWith(BDDPairing pair) {
-            BDDPairing c1 = ((TestBDDPairing)pair).b1;
-            BDDPairing c2 = ((TestBDDPairing)pair).b2;
+            BDDPairing c1 = ((TestBDDPairing) pair).b1;
+            BDDPairing c2 = ((TestBDDPairing) pair).b2;
             b1.replaceWith(c1);
             b2.replaceWith(c2);
             assertSame(b1, b2, "replaceWith");
             return this;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#printDot()
          */
         public void printDot() {
@@ -416,17 +486,81 @@
             b1.printDot();
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#toString()
+         */
+        public String toString() {
+            // String already checked.
+            return b1.toString();
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#toStringWithDomains(net.sf.javabdd.BDD.BDDToString)
+         */
+        public String toStringWithDomains(BDDToString ts) {
+            String s1 = b1.toStringWithDomains(ts);
+            String s2 = b2.toStringWithDomains(ts);
+            assertSame(s1.equals(s2), "toStringWithDomains");
+            return s1;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#allsat()
+         */
+        public AllSatIterator allsat() {
+            return new AllSatIterator(TestBDDFactory.this, false) {
+                AllSatIterator i1 = b1.allsat();
+                AllSatIterator i2 = b2.allsat();
+
+                public boolean hasNext() {
+                    boolean r1 = i1.hasNext();
+                    boolean r2 = i2.hasNext();
+                    assertSame(r1 == r2, b1, b2, "allsat.hasNext");
+                    return r1;
+                }
+
+                public byte[] nextSat() {
+                    byte[] r1 = i1.nextSat();
+                    byte[] r2 = i2.nextSat();
+                    assertSame(Arrays.equals(r1, r2), b1, b2, "allsat.nextSat");
+                    return r1;
+                }
+            };
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see net.sf.javabdd.BDD#scanAllVar()
+         */
+        public BigInteger[] scanAllVar() {
+            BigInteger[] r1 = b1.scanAllVar();
+            BigInteger[] r2 = b2.scanAllVar();
+            assertSame(Arrays.equals(r1, r2), b1, b2, "scanAllVar");
+            return r1;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#nodeCount()
          */
         public int nodeCount() {
             int r1 = b1.nodeCount();
             int r2 = b2.nodeCount();
-            assertSame(r1 == r2, b1, b2, "nodeCount");
+            if (false) assertSame(r1 == r2, b1, b2, "nodeCount");
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#pathCount()
          */
         public double pathCount() {
@@ -436,7 +570,9 @@
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#satCount()
          */
         public double satCount() {
@@ -446,32 +582,35 @@
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#varProfile()
          */
         public int[] varProfile() {
             int[] r1 = b1.varProfile();
             int[] r2 = b2.varProfile();
-            assertSame(r1.length == r2.length, "varProfile");
-            for (int i=0; i<r1.length; ++i) {
-                assertSame(r1[i] == r2[i], "varProfile");
-            }
+            assertSame(Arrays.equals(r1, r2), "varProfile");
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#equals(net.sf.javabdd.BDD)
          */
         public boolean equals(BDD that) {
-            BDD c1 = ((TestBDD)that).b1;
-            BDD c2 = ((TestBDD)that).b2;
+            BDD c1 = ((TestBDD) that).b1;
+            BDD c2 = ((TestBDD) that).b2;
             boolean r1 = b1.equals(c1);
             boolean r2 = b2.equals(c2);
             assertSame(r1 == r2, b1, b2, "equals");
             return r1;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#hashCode()
          */
         public int hashCode() {
@@ -480,7 +619,9 @@
             return b2.hashCode();
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDD#free()
          */
         public void free() {
@@ -488,9 +629,7 @@
             b2.free();
         }
     }
-
     private class TestBDDVarSet extends BDDVarSet {
-        
         BDDVarSet b1, b2;
 
         TestBDDVarSet(BDDVarSet a, BDDVarSet b) {
@@ -513,7 +652,7 @@
             BDD r2 = b2.toBDD();
             return new TestBDD(r1, r2);
         }
-        
+
         public BDDVarSet id() {
             BDDVarSet r1 = b1.id();
             BDDVarSet r2 = b2.id();
@@ -521,16 +660,16 @@
         }
 
         public BDDVarSet intersect(BDDVarSet that) {
-            BDDVarSet c1 = ((TestBDDVarSet)that).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)that).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) that).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) that).b2;
             BDDVarSet r1 = b1.intersect(c1);
             BDDVarSet r2 = b2.intersect(c2);
             return new TestBDDVarSet(r1, r2);
         }
 
         public BDDVarSet intersectWith(BDDVarSet that) {
-            BDDVarSet c1 = ((TestBDDVarSet)that).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)that).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) that).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) that).b2;
             b1.intersectWith(c1);
             b2.intersectWith(c2);
             assertSame(b1, b2, "intersectWith");
@@ -566,8 +705,8 @@
         }
 
         public BDDVarSet union(BDDVarSet that) {
-            BDDVarSet c1 = ((TestBDDVarSet)that).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)that).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) that).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) that).b2;
             BDDVarSet r1 = b1.union(c1);
             BDDVarSet r2 = b2.union(c2);
             return new TestBDDVarSet(r1, r2);
@@ -580,8 +719,8 @@
         }
 
         public BDDVarSet unionWith(BDDVarSet that) {
-            BDDVarSet c1 = ((TestBDDVarSet)that).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)that).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) that).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) that).b2;
             b1.unionWith(c1);
             b2.unionWith(c2);
             assertSame(b1, b2, "unionWith");
@@ -594,45 +733,62 @@
             assertSame(b1, b2, "unionWith");
             return this;
         }
-        
+
         public int hashCode() {
             // TODO Compare!
             b1.hashCode();
             return b2.hashCode();
         }
-        
+
         public boolean equals(BDDVarSet that) {
-            BDDVarSet c1 = ((TestBDDVarSet)that).b1;
-            BDDVarSet c2 = ((TestBDDVarSet)that).b2;
+            BDDVarSet c1 = ((TestBDDVarSet) that).b1;
+            BDDVarSet c2 = ((TestBDDVarSet) that).b2;
             boolean r1 = b1.equals(c1);
             boolean r2 = b2.equals(c2);
             assertSame(r1 == r2, b1, b2, "equals");
             return r1;
         }
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#zero()
      */
     public BDD zero() {
         return new TestBDD(f1.zero(), f2.zero());
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#one()
      */
     public BDD one() {
         return new TestBDD(f1.one(), f2.one());
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
+     * @see net.sf.javabdd.BDDFactory#universe()
+     */
+    public BDD universe() {
+        return new TestBDD(f1.universe(), f2.universe());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#emptySet()
      */
     public BDDVarSet emptySet() {
         return new TestBDDVarSet(f1.emptySet(), f2.emptySet());
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#initialize(int, int)
      */
     protected void initialize(int nodenum, int cachesize) {
@@ -640,7 +796,9 @@
         f2.initialize(nodenum, cachesize);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#isInitialized()
      */
     public boolean isInitialized() {
@@ -650,7 +808,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#done()
      */
     public void done() {
@@ -658,23 +818,29 @@
         f2.done();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setError(int)
      */
     public void setError(int code) {
         f1.setError(code);
         f2.setError(code);
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#clearError()
      */
     public void clearError() {
         f1.clearError();
         f2.clearError();
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setMaxNodeNum(int)
      */
     public int setMaxNodeNum(int size) {
@@ -684,7 +850,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setMinFreeNodes(double)
      */
     public double setMinFreeNodes(double x) {
@@ -694,17 +862,21 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setIncreaseFactor(double)
      */
     public double setIncreaseFactor(double x) {
         double r1 = f1.setIncreaseFactor(x);
         double r2 = f2.setIncreaseFactor(x);
-        assertSame(r1 == r2, "setIncreaseFactor");
+        if (false) assertSame(r1 == r2, "setIncreaseFactor");
         return r1;
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setMaxIncrease(int)
      */
     public int setMaxIncrease(int x) {
@@ -714,7 +886,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setCacheRatio(double)
      */
     public double setCacheRatio(double x) {
@@ -724,17 +898,21 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setNodeTableSize(int)
      */
     public int setNodeTableSize(int size) {
         int r1 = f1.setNodeTableSize(size);
         int r2 = f2.setNodeTableSize(size);
-        assertSame(r1 == r2, "setNodeTableSize");
+        if (false) assertSame(r1 == r2, "setNodeTableSize");
         return r1;
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setCacheSize(int)
      */
     public int setCacheSize(int size) {
@@ -743,8 +921,10 @@
         assertSame(r1 == r2, "setCacheSize");
         return r1;
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#varNum()
      */
     public int varNum() {
@@ -754,31 +934,39 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setVarNum(int)
      */
     public int setVarNum(int num) {
         int r1 = f1.setVarNum(num);
         int r2 = f2.setVarNum(num);
-        //assertSame(r1 == r2, "setVarNum");
+        // assertSame(r1 == r2, "setVarNum");
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#ithVar(int)
      */
     public BDD ithVar(int var) {
         return new TestBDD(f1.ithVar(var), f2.ithVar(var));
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#nithVar(int)
      */
     public BDD nithVar(int var) {
         return new TestBDD(f1.nithVar(var), f2.nithVar(var));
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#printAll()
      */
     public void printAll() {
@@ -786,32 +974,40 @@
         f1.printAll();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#printTable(net.sf.javabdd.BDD)
      */
     public void printTable(BDD b) {
         // TODO Compare!
-        BDD b1 = ((TestBDD)b).b1;
+        BDD b1 = ((TestBDD) b).b1;
         f1.printTable(b1);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#load(java.lang.String)
      */
     public BDD load(String filename) throws IOException {
         return new TestBDD(f1.load(filename), f2.load(filename));
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#save(java.lang.String, net.sf.javabdd.BDD)
      */
     public void save(String filename, BDD var) throws IOException {
         // TODO Compare!
-        BDD b1 = ((TestBDD)var).b1;
+        BDD b1 = ((TestBDD) var).b1;
         f1.save(filename, b1);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#level2Var(int)
      */
     public int level2Var(int level) {
@@ -821,7 +1017,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#var2Level(int)
      */
     public int var2Level(int var) {
@@ -831,7 +1029,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#reorder(net.sf.javabdd.BDDFactory.ReorderMethod)
      */
     public void reorder(ReorderMethod m) {
@@ -839,7 +1039,9 @@
         f2.reorder(m);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod)
      */
     public void autoReorder(ReorderMethod method) {
@@ -847,15 +1049,20 @@
         f2.autoReorder(method);
     }
 
-    /* (non-Javadoc)
-     * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod, int)
+    /*
+     * (non-Javadoc)
+     * 
+     * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod,
+     *      int)
      */
     public void autoReorder(ReorderMethod method, int max) {
         f1.autoReorder(method, max);
         f2.autoReorder(method, max);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#getReorderMethod()
      */
     public ReorderMethod getReorderMethod() {
@@ -865,7 +1072,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#getReorderTimes()
      */
     public int getReorderTimes() {
@@ -875,7 +1084,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#disableReorder()
      */
     public void disableReorder() {
@@ -883,7 +1094,9 @@
         f2.disableReorder();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#enableReorder()
      */
     public void enableReorder() {
@@ -891,7 +1104,9 @@
         f2.enableReorder();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#reorderVerbose(int)
      */
     public int reorderVerbose(int v) {
@@ -901,7 +1116,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#setVarOrder(int[])
      */
     public void setVarOrder(int[] neworder) {
@@ -909,7 +1126,9 @@
         f2.setVarOrder(neworder);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#addVarBlock(int, int, boolean)
      */
     public void addVarBlock(int first, int last, boolean fixed) {
@@ -917,7 +1136,9 @@
         f2.addVarBlock(first, last, fixed);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#varBlockAll()
      */
     public void varBlockAll() {
@@ -925,7 +1146,9 @@
         f2.varBlockAll();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#clearVarBlocks()
      */
     public void clearVarBlocks() {
@@ -933,7 +1156,9 @@
         f2.clearVarBlocks();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#printOrder()
      */
     public void printOrder() {
@@ -941,14 +1166,16 @@
         f1.printOrder();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#nodeCount(java.util.Collection)
      */
     public int nodeCount(Collection r) {
         LinkedList a1 = new LinkedList();
         LinkedList a2 = new LinkedList();
-        for (Iterator i=r.iterator(); i.hasNext();) {
-            TestBDD b = (TestBDD)i.next();
+        for (Iterator i = r.iterator(); i.hasNext();) {
+            TestBDD b = (TestBDD) i.next();
             a1.add(b.b1);
             a2.add(b.b2);
         }
@@ -958,7 +1185,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#getNodeTableSize()
      */
     public int getNodeTableSize() {
@@ -968,7 +1197,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#getNodeNum()
      */
     public int getNodeNum() {
@@ -978,7 +1209,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#getCacheSize()
      */
     public int getCacheSize() {
@@ -987,8 +1220,10 @@
         assertSame(r1 == r2, "getCacheSize");
         return r1;
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#reorderGain()
      */
     public int reorderGain() {
@@ -998,7 +1233,9 @@
         return r1;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#printStat()
      */
     public void printStat() {
@@ -1006,7 +1243,9 @@
         f1.printStat();
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#makePair()
      */
     public BDDPairing makePair() {
@@ -1015,7 +1254,9 @@
         return new TestBDDPairing(p1, p2);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#swapVar(int, int)
      */
     public void swapVar(int v1, int v2) {
@@ -1023,30 +1264,34 @@
         f2.swapVar(v1, v2);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#createDomain(int, BigInteger)
      */
     protected BDDDomain createDomain(int a, BigInteger b) {
         return new TestBDDDomain(a, b);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#createBitVector(int)
      */
     protected BDDBitVector createBitVector(int a) {
         return new TestBDDBitVector(a);
     }
-
     private static class TestBDDPairing extends BDDPairing {
-        
         BDDPairing b1, b2;
-        
+
         TestBDDPairing(BDDPairing p1, BDDPairing p2) {
             this.b1 = p1;
             this.b2 = p2;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDDPairing#set(int, int)
          */
         public void set(int oldvar, int newvar) {
@@ -1054,7 +1299,9 @@
             b2.set(oldvar, newvar);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDDPairing#set(int, net.sf.javabdd.BDD)
          */
         public void set(int oldvar, BDD newvar) {
@@ -1062,53 +1309,53 @@
             b2.set(oldvar, newvar);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDDPairing#reset()
          */
         public void reset() {
             b1.reset();
             b2.reset();
         }
-        
     }
-        
     private class TestBDDDomain extends BDDDomain {
-
         private TestBDDDomain(int a, BigInteger b) {
             super(a, b);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDDDomain#getFactory()
          */
         public BDDFactory getFactory() {
             return TestBDDFactory.this;
         }
-        
     }
-
     private class TestBDDBitVector extends BDDBitVector {
-
         TestBDDBitVector(int a) {
             super(a);
         }
-        
-        /* (non-Javadoc)
+
+        /*
+         * (non-Javadoc)
+         * 
          * @see net.sf.javabdd.BDDBitVector#getFactory()
          */
         public BDDFactory getFactory() {
             return TestBDDFactory.this;
         }
-        
     }
-    
     public static final String REVISION = "$Revision$";
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
+     * 
      * @see net.sf.javabdd.BDDFactory#getVersion()
      */
     public String getVersion() {
-        return "TestBDD "+REVISION.substring(11, REVISION.length()-2)+
-               " of ("+f1.getVersion()+","+f2.getVersion()+")";
+        return "TestBDD " + REVISION.substring(11, REVISION.length() - 2)
+            + " of (" + f1.getVersion() + "," + f2.getVersion() + ")";
     }
 }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <joe...@us...> - 2006-11-30 09:23:44
      
     | 
| Revision: 471
          http://svn.sourceforge.net/javabdd/?rev=471&view=rev
Author:   joewhaley
Date:     2006-11-30 01:23:43 -0800 (Thu, 30 Nov 2006)
Log Message:
-----------
Added allsat() iterator test.
Modified Paths:
--------------
    trunk/JavaBDD_tests/bdd/IteratorTests.java
Added Paths:
-----------
    trunk/JavaBDD_tests/bdd/IOTests.java
Added: trunk/JavaBDD_tests/bdd/IOTests.java
===================================================================
--- trunk/JavaBDD_tests/bdd/IOTests.java	                        (rev 0)
+++ trunk/JavaBDD_tests/bdd/IOTests.java	2006-11-30 09:23:43 UTC (rev 471)
@@ -0,0 +1,55 @@
+// IOTests.java, created Nov 20, 2006 4:55:28 PM by jwhaley
+// Copyright (C) 2006 jwhaley
+// Licensed under the terms of the GNU LGPL; see COPYING for details.
+package bdd;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import junit.framework.Assert;
+import net.sf.javabdd.BDD;
+import net.sf.javabdd.BDDFactory;
+
+/**
+ * IOTests
+ * 
+ * @author jwhaley
+ * @version $Id$
+ */
+public class IOTests extends BDDTestCase {
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(IOTests.class);
+    }
+
+    public void testLoad() {
+        reset();
+        Assert.assertTrue(hasNext());
+        while (hasNext()) {
+            BDDFactory bdd = nextFactory();
+            File tmp = null;
+            Exception error = null;
+            try {
+                tmp = File.createTempFile("loadtest", "bdd");
+                tmp.deleteOnExit();
+                PrintWriter out = new PrintWriter(tmp);
+                out.println("2 3");
+                out.println("0 1 2");
+                out.println("222 1 1 0");
+                out.println("333 2 1 222");
+                out.close();
+                BDD x = bdd.load(tmp.getAbsolutePath());
+                tmp.delete();
+                //x.printDot();
+                Assert.assertEquals(6.0, x.satCount(), 0.001);
+                x.free();
+            } catch (IOException x) {
+                error = x;
+            } finally {
+                if (tmp != null) tmp.delete();
+            }
+            if (error != null)
+                Assert.fail(error.toString());
+        }
+    }
+
+}
Modified: trunk/JavaBDD_tests/bdd/IteratorTests.java
===================================================================
--- trunk/JavaBDD_tests/bdd/IteratorTests.java	2006-11-30 09:22:42 UTC (rev 470)
+++ trunk/JavaBDD_tests/bdd/IteratorTests.java	2006-11-30 09:23:43 UTC (rev 471)
@@ -84,6 +84,75 @@
         }
     }
     
+    static Random random = new Random(1234);
+    
+    static BDD randomBDD(BDDFactory f) {
+        BDD result = f.zero();
+        for (int i = 0; i < f.varNum(); ++i) {
+            BDD b = f.universe();
+            for (int j = 0; j < f.varNum(); ++j) {
+                int k = random.nextInt(3);
+                if (k == 0) b.andWith(f.nithVar(j));
+                else if (k == 1) b.andWith(f.ithVar(j));
+            }
+            result.orWith(b);
+        }
+        return result;
+    }
+
+    static BDD betterRandomBDD(BDDFactory f) {
+        // Use a random truth table.
+        byte[] bytes = new byte[(1 << f.varNum()) / 8 + 1];
+        random.nextBytes(bytes);
+        BDD result = f.zero();
+        for (int i = 0; i < (1 << f.varNum()); ++i) {
+            if ((bytes[i / 8] & (1<<(i%8))) != 0) {
+                BDD b = f.universe();
+                for (int j = 0; j < f.varNum(); ++j) {
+                    if ((i & (1<<j)) != 0)
+                        b.andWith(f.ithVar(j));
+                    else
+                        b.andWith(f.nithVar(j));
+                }
+                result.orWith(b);
+            }
+        }
+        return result;
+    }
+
+    public void testAllsatIterator() {
+        reset();
+        Assert.assertTrue(hasNext());
+        while (hasNext()) {
+            BDDFactory f = nextFactory();
+            f.setVarNum(5);
+            for (int kk = 0; kk < 10; ++kk) {
+                BDD bdd1 = ((kk&1)==0)?randomBDD(f):betterRandomBDD(f);
+                BDD bdd2 = f.zero();
+                BDD.AllSatIterator i = bdd1.allsat();
+                while (i.hasNext()) {
+                    byte[] b = i.nextSat();
+                    BDD t = f.universe();
+                    for (int k = 0; k < b.length; ++k) {
+                        if (b[k] == 0)
+                            t.andWith(f.nithVar(k));
+                        else if (b[k] == 1)
+                            t.andWith(f.ithVar(k));
+                    }
+                    
+                    BDD overlap = bdd2.and(t);
+                    Assert.assertTrue(overlap.isZero());
+                    overlap.free();
+                    
+                    bdd2.orWith(t);
+                }
+                Assert.assertEquals(bdd1, bdd2);
+                bdd2.free();
+                bdd1.free();
+            }
+        }
+    }
+    
     public void testRandomIterator() {
         reset();
         Assert.assertTrue(hasNext());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      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.
 | 
| 
      
      
      From: <joe...@us...> - 2006-11-29 08:07:33
      
     | 
| Revision: 469
          http://svn.sourceforge.net/javabdd/?rev=469&view=rev
Author:   joewhaley
Date:     2006-11-29 00:07:31 -0800 (Wed, 29 Nov 2006)
Log Message:
-----------
Improved ZDD support.  load(), support(), quant methods now work.
Modified Paths:
--------------
    trunk/JavaBDD_tests/bdd/BDDTestCase.java
    trunk/JavaBDD_tests/bdd/BasicTests.java
    trunk/JavaBDD_tests/bdd/IteratorTests.java
    trunk/JavaBDD_tests/highlevel/NQueensTest.java
    trunk/JavaBDD_tests/regression/R2.java
    trunk/JavaBDD_tests/trace/TraceDriver.java
Modified: trunk/JavaBDD_tests/bdd/BDDTestCase.java
===================================================================
--- trunk/JavaBDD_tests/bdd/BDDTestCase.java	2006-11-29 08:07:13 UTC (rev 468)
+++ trunk/JavaBDD_tests/bdd/BDDTestCase.java	2006-11-29 08:07:31 UTC (rev 469)
@@ -21,6 +21,7 @@
     
     public static final String[] factoryNames = {
         "net.sf.javabdd.JFactory",
+        "zdd",
         "net.sf.javabdd.BuDDyFactory",
         "net.sf.javabdd.MicroFactory",
         //"net.sf.javabdd.CUDDFactory",
@@ -38,10 +39,15 @@
         for (int k = 0; k < factoryNames.length; ++k) {
             String bddpackage = factoryNames[k];
             try {
-                Class c = Class.forName(bddpackage);
-                Method m = c.getMethod("init", new Class[] { int.class, int.class });
-                BDDFactory b = (BDDFactory) m.invoke(null, new Object[] { new Integer(nodenum), new Integer(cachesize) });
-                f.add(b);
+                if (bddpackage.indexOf('.') == -1) {
+                    BDDFactory b = BDDFactory.init(bddpackage, nodenum, cachesize);
+                    f.add(b);
+                } else {
+                    Class c = Class.forName(bddpackage);
+                    Method m = c.getMethod("init", new Class[] { int.class, int.class });
+                    BDDFactory b = (BDDFactory) m.invoke(null, new Object[] { new Integer(nodenum), new Integer(cachesize) });
+                    f.add(b);
+                }
             }
             catch (Throwable _) {
                 if (_ instanceof InvocationTargetException)
Modified: trunk/JavaBDD_tests/bdd/BasicTests.java
===================================================================
--- trunk/JavaBDD_tests/bdd/BasicTests.java	2006-11-29 08:07:13 UTC (rev 468)
+++ trunk/JavaBDD_tests/bdd/BasicTests.java	2006-11-29 08:07:31 UTC (rev 469)
@@ -473,7 +473,7 @@
             if (bdd.varNum() < 5) bdd.setVarNum(5);
             BDD a, b, c, d, e;
             a = bdd.ithVar(1);
-            b = bdd.one();
+            b = bdd.universe();
             c = bdd.zero();
             d = a.ite(b, c);
             Assert.assertEquals(a, d);
@@ -648,7 +648,7 @@
         for (int i = 0; i < f.numberOfDomains(); ++i) {
             list.add(f.getDomain(i));
         }
-        BDD result = f.one();
+        BDD result = f.universe();
         for (int i = 0; i < k; ++i) {
             int x = random.nextInt(f.numberOfDomains() - i);
             BDDDomain d = (BDDDomain) list.remove(x);
Modified: trunk/JavaBDD_tests/bdd/IteratorTests.java
===================================================================
--- trunk/JavaBDD_tests/bdd/IteratorTests.java	2006-11-29 08:07:13 UTC (rev 468)
+++ trunk/JavaBDD_tests/bdd/IteratorTests.java	2006-11-29 08:07:31 UTC (rev 469)
@@ -44,7 +44,7 @@
             } catch (NoSuchElementException x) {
             }
             
-            b = bdd.one();
+            b = bdd.universe();
             Iterator i1 = b.iterator(var);
             Iterator i2 = new MyBDDIterator(b, var);
             b.free();
Modified: trunk/JavaBDD_tests/highlevel/NQueensTest.java
===================================================================
--- trunk/JavaBDD_tests/highlevel/NQueensTest.java	2006-11-29 08:07:13 UTC (rev 468)
+++ trunk/JavaBDD_tests/highlevel/NQueensTest.java	2006-11-29 08:07:31 UTC (rev 469)
@@ -52,7 +52,7 @@
 
             if (B.varNum() < N * N) B.setVarNum(N * N);
 
-            queen = B.one();
+            queen = B.universe();
 
             int i, j;
 
@@ -92,7 +92,7 @@
         }
         
         private 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_tests/regression/R2.java
===================================================================
--- trunk/JavaBDD_tests/regression/R2.java	2006-11-29 08:07:13 UTC (rev 468)
+++ trunk/JavaBDD_tests/regression/R2.java	2006-11-29 08:07:31 UTC (rev 469)
@@ -25,9 +25,9 @@
         while (hasNext()) {
             BDDFactory bdd = nextFactory();
             BDD zero = bdd.zero();
-            BDD one = bdd.one();
+            BDD one = bdd.universe();
             Assert.assertTrue(bdd.getVersion(), zero.isZero());
-            Assert.assertTrue(bdd.getVersion(), one.isOne());
+            Assert.assertTrue(bdd.getVersion(), one.isUniverse());
             BDDVarSet s0 = zero.support();
             BDDVarSet s1 = one.support();
             Assert.assertTrue(bdd.getVersion(), s0.isEmpty());
Modified: trunk/JavaBDD_tests/trace/TraceDriver.java
===================================================================
--- trunk/JavaBDD_tests/trace/TraceDriver.java	2006-11-29 08:07:13 UTC (rev 468)
+++ trunk/JavaBDD_tests/trace/TraceDriver.java	2006-11-29 08:07:31 UTC (rev 469)
@@ -211,7 +211,7 @@
             if(ops == 2) ret.bdd = op1.bdd.or(op2.bdd);
             else {
                 for (Enumeration e = operands.elements() ; e.hasMoreElements() ;)
-                    if(((TracedVariable)e.nextElement()).bdd.isOne()) { ret.bdd = bdd.one(); return; }
+                    if(((TracedVariable)e.nextElement()).bdd.isUniverse()) { ret.bdd = bdd.universe(); return; }
 
                 BDD tmp = bdd.zero();
                 for (Enumeration e = operands.elements() ; e.hasMoreElements() ;) {
@@ -230,7 +230,7 @@
                 for (Enumeration e = operands.elements() ; e.hasMoreElements() ;)
                     if(((TracedVariable)e.nextElement()).bdd.isZero()) { ret.bdd = bdd.zero(); return; }
 
-                BDD tmp = bdd.one();
+                BDD tmp = bdd.universe();
                 for (Enumeration e = operands.elements() ; e.hasMoreElements() ;) {
                     TracedVariable v = (TracedVariable)e.nextElement();
                     BDD tmp2 = tmp.and(v.bdd);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      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.
 | 
| 
      
      
      From: <joe...@us...> - 2006-11-13 16:58:32
      
     | 
| Revision: 467
          http://svn.sourceforge.net/javabdd/?rev=467&view=rev
Author:   joewhaley
Date:     2006-11-12 23:25:37 -0800 (Sun, 12 Nov 2006)
Log Message:
-----------
More support for ZDDs.
Modified Paths:
--------------
    trunk/JavaBDD_tests/bdd/BasicTests.java
    trunk/JavaBDD_tests/highlevel/NQueensTest.java
    trunk/JavaBDD_tests/regression/R3.java
Modified: trunk/JavaBDD_tests/bdd/BasicTests.java
===================================================================
--- trunk/JavaBDD_tests/bdd/BasicTests.java	2006-11-13 07:25:31 UTC (rev 466)
+++ trunk/JavaBDD_tests/bdd/BasicTests.java	2006-11-13 07:25:37 UTC (rev 467)
@@ -25,7 +25,6 @@
  * @version $Id$
  */
 public class BasicTests extends BDDTestCase {
-
     public static void main(String[] args) {
         junit.textui.TestRunner.run(BasicTests.class);
     }
@@ -45,10 +44,12 @@
             Assert.assertEquals(true, y.isOne());
             Assert.assertEquals(false, z.isZero());
             Assert.assertEquals(false, z.isOne());
-            x.free(); y.free(); z.free();
+            x.free();
+            y.free();
+            z.free();
         }
     }
-    
+
     public void testVar() {
         reset();
         Assert.assertTrue(hasNext());
@@ -56,8 +57,9 @@
             BDDFactory bdd = nextFactory();
             if (bdd.varNum() < 5) bdd.setVarNum(5);
             try {
-                bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 });
-            } catch (UnsupportedOperationException _) { }
+                bdd.setVarOrder(new int[]{0, 1, 2, 3, 4});
+            } catch (UnsupportedOperationException _) {
+            }
             BDD a = bdd.ithVar(1);
             BDD b = bdd.ithVar(2);
             BDD c = bdd.ithVar(3);
@@ -71,18 +73,24 @@
             try {
                 d.var();
                 Assert.fail(bdd.getVersion());
-            } catch (BDDException x) { }
+            } catch (BDDException x) {
+            }
             try {
                 e.var();
                 Assert.fail(bdd.getVersion());
-            } catch (BDDException x) { }
+            } catch (BDDException x) {
+            }
             BDD f = a.and(b);
-            if (!bdd.isZDD())
-                Assert.assertEquals(1, f.var());
-            a.free(); b.free(); c.free(); d.free(); e.free(); f.free();
+            if (!bdd.isZDD()) Assert.assertEquals(1, f.var());
+            a.free();
+            b.free();
+            c.free();
+            d.free();
+            e.free();
+            f.free();
         }
     }
-    
+
     public void testVarOrder() {
         reset();
         Assert.assertTrue(hasNext());
@@ -90,9 +98,10 @@
             BDDFactory bdd = nextFactory();
             if (bdd.varNum() < 5) bdd.setVarNum(5);
             try {
-                bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 });
+                bdd.setVarOrder(new int[]{0, 1, 2, 3, 4});
             } catch (UnsupportedOperationException _) {
-                System.err.println("Warning: "+bdd.getVersion()+" does not support setVarOrder()");
+                System.err.println("Warning: " + bdd.getVersion()
+                    + " does not support setVarOrder()");
                 continue;
             }
             BDD a = bdd.ithVar(0);
@@ -107,7 +116,7 @@
                 Assert.assertEquals(3, d.var());
                 Assert.assertEquals(4, e.var());
             }
-            bdd.setVarOrder(new int[] { 2, 3, 4, 0, 1 });
+            bdd.setVarOrder(new int[]{2, 3, 4, 0, 1});
             if (!bdd.isZDD()) {
                 Assert.assertEquals(0, a.var());
                 Assert.assertEquals(1, b.var());
@@ -120,10 +129,14 @@
                 Assert.assertEquals(1, d.level());
                 Assert.assertEquals(2, e.level());
             }
-            a.free(); b.free(); c.free(); d.free(); e.free();
+            a.free();
+            b.free();
+            c.free();
+            d.free();
+            e.free();
         }
     }
-    
+
     public void testLowHigh() {
         reset();
         Assert.assertTrue(hasNext());
@@ -131,8 +144,9 @@
             BDDFactory bdd = nextFactory();
             if (bdd.varNum() < 5) bdd.setVarNum(5);
             try {
-                bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 });
-            } catch (UnsupportedOperationException _) { }
+                bdd.setVarOrder(new int[]{0, 1, 2, 3, 4});
+            } catch (UnsupportedOperationException _) {
+            }
             BDD a, b, c;
             a = bdd.ithVar(0);
             a.andWith(bdd.ithVar(1));
@@ -157,8 +171,7 @@
             Assert.assertEquals(1, b.var());
             c = b.high();
             b.free();
-            if (!bdd.isZDD())
-                Assert.assertEquals(2, c.var());
+            if (!bdd.isZDD()) Assert.assertEquals(2, c.var());
             b = c.low();
             if (!bdd.isZDD()) {
                 Assert.assertEquals(true, b.isOne());
@@ -173,10 +186,12 @@
                 } catch (BDDException _) {
                 }
             }
-            a.free(); b.free(); c.free();
+            a.free();
+            b.free();
+            c.free();
         }
     }
-    
+
     public void testNot() {
         reset();
         Assert.assertTrue(hasNext());
@@ -187,12 +202,12 @@
             a = bdd.ithVar(0);
             b = a.not();
             c = bdd.nithVar(0);
-            System.out.println("First graph:");
-            a.printDot();
-            System.out.println("Second graph:");
-            b.printDot();
-            System.out.println("Third graph:");
-            c.printDot();
+            //System.out.println("First graph:");
+            //a.printDot();
+            //System.out.println("Second graph:");
+            //b.printDot();
+            //System.out.println("Third graph:");
+            //c.printDot();
             Assert.assertEquals(b, c);
             if (!bdd.isZDD()) {
                 c.free();
@@ -202,10 +217,12 @@
                 c = b.low();
                 Assert.assertEquals(true, c.isOne());
             }
-            a.free(); b.free(); c.free();
+            a.free();
+            b.free();
+            c.free();
         }
     }
-    
+
     public void testId() {
         reset();
         Assert.assertTrue(hasNext());
@@ -218,37 +235,39 @@
             a.andWith(bdd.ithVar(0));
             Assert.assertTrue(!a.equals(b));
             Assert.assertTrue(a.var() == 0);
-            if (!bdd.isZDD())
-                Assert.assertTrue(b.var() == 1);
+            if (!bdd.isZDD()) Assert.assertTrue(b.var() == 1);
             b.andWith(bdd.zero());
             Assert.assertTrue(b.isZero());
             Assert.assertTrue(!a.isZero());
-            a.free(); b.free();
+            a.free();
+            b.free();
         }
     }
-    
-    void testApply(BDDFactory bdd, BDDFactory.BDDOp op,
-            boolean b1, boolean b2, boolean b3, boolean b4) {
+
+    void testApply(BDDFactory bdd, BDDFactory.BDDOp op, boolean b1, boolean b2, boolean b3,
+        boolean b4) {
         BDD a;
-        Assert.assertEquals(b1, (a = bdd.zero().applyWith(bdd.zero(), op)).isOne());
+        Assert.assertEquals(b1, (a = bdd.zero().applyWith(bdd.zero(), op)).isUniverse());
         a.free();
-        Assert.assertEquals(b2, (a = bdd.zero().applyWith(bdd.one(), op)).isOne());
+        Assert.assertEquals(b2, (a = bdd.zero().applyWith(bdd.universe(), op)).isUniverse());
         a.free();
-        Assert.assertEquals(b3, (a = bdd.one().applyWith(bdd.zero(), op)).isOne());
+        Assert.assertEquals(b3, (a = bdd.universe().applyWith(bdd.zero(), op)).isUniverse());
         a.free();
-        Assert.assertEquals(b4, (a = bdd.one().applyWith(bdd.one(), op)).isOne());
+        Assert.assertEquals(b4, (a = bdd.universe().applyWith(bdd.universe(), op)).isUniverse());
         a.free();
     }
-    
+
     static boolean isFreed(BDD b) {
         return b.hashCode() == -1 || b.hashCode() == 0x07ffffff;
     }
-    
-    void testApplyWith(BDDFactory bdd, BDDFactory.BDDOp op,
-        boolean b1, boolean b2, boolean b3, boolean b4) {
+
+    void testApplyWith(BDDFactory bdd, BDDFactory.BDDOp op, boolean b1, boolean b2, boolean b3,
+        boolean b4) {
         BDD a, b, c, d;
-        a = bdd.zero(); b = bdd.zero();
-        c = a; d = b;
+        a = bdd.zero();
+        b = bdd.zero();
+        c = a;
+        d = b;
         Assert.assertTrue(!isFreed(d));
         a.applyWith(b, op);
         Assert.assertEquals(b1, a.isOne());
@@ -256,9 +275,10 @@
         Assert.assertTrue(isFreed(b));
         Assert.assertTrue(isFreed(d));
         a.free();
-
-        a = bdd.zero(); b = bdd.one();
-        c = a; d = b;
+        a = bdd.zero();
+        b = bdd.one();
+        c = a;
+        d = b;
         Assert.assertTrue(!isFreed(d));
         a.applyWith(b, op);
         Assert.assertEquals(b2, a.isOne());
@@ -266,9 +286,10 @@
         Assert.assertTrue(isFreed(b));
         Assert.assertTrue(isFreed(d));
         a.free();
-
-        a = bdd.one(); b = bdd.zero();
-        c = a; d = b;
+        a = bdd.one();
+        b = bdd.zero();
+        c = a;
+        d = b;
         Assert.assertTrue(!isFreed(d));
         a.applyWith(b, op);
         Assert.assertEquals(b3, a.isOne());
@@ -276,9 +297,10 @@
         Assert.assertTrue(isFreed(b));
         Assert.assertTrue(isFreed(d));
         a.free();
-        
-        a = bdd.one(); b = bdd.one();
-        c = a; d = b;
+        a = bdd.one();
+        b = bdd.one();
+        c = a;
+        d = b;
         Assert.assertTrue(!isFreed(d));
         a.applyWith(b, op);
         Assert.assertEquals(b4, a.isOne());
@@ -287,7 +309,7 @@
         Assert.assertTrue(isFreed(d));
         a.free();
     }
-    
+
     public void testOr() {
         reset();
         Assert.assertTrue(hasNext());
@@ -307,11 +329,13 @@
             c = b.id();
             b.orWith(b);
             Assert.assertEquals(b, c);
-            a.free(); b.free(); c.free();
+            a.free();
+            b.free();
+            c.free();
             testApply(bdd, BDDFactory.or, false, true, true, true);
         }
     }
-    
+
     public void testXor() {
         reset();
         Assert.assertTrue(hasNext());
@@ -323,17 +347,19 @@
             b = bdd.ithVar(2);
             c = bdd.nithVar(1);
             c.xorWith(a);
-            Assert.assertTrue(c.isOne());
+            Assert.assertTrue(c.isUniverse());
             a = bdd.zero();
             a.orWith(bdd.zero());
             Assert.assertTrue(a.isZero());
             b.xorWith(b);
             Assert.assertTrue(b.isZero());
-            a.free(); b.free(); c.free();
+            a.free();
+            b.free();
+            c.free();
             testApply(bdd, BDDFactory.xor, false, true, true, false);
         }
     }
-    
+
     public void testImp() {
         reset();
         Assert.assertTrue(hasNext());
@@ -343,7 +369,7 @@
             testApply(bdd, BDDFactory.imp, true, true, false, true);
         }
     }
-    
+
     public void testBiimp() {
         reset();
         Assert.assertTrue(hasNext());
@@ -353,7 +379,7 @@
             testApply(bdd, BDDFactory.biimp, true, false, false, true);
         }
     }
-    
+
     public void testDiff() {
         reset();
         Assert.assertTrue(hasNext());
@@ -363,7 +389,7 @@
             testApply(bdd, BDDFactory.diff, false, false, true, false);
         }
     }
-    
+
     public void testLess() {
         reset();
         Assert.assertTrue(hasNext());
@@ -373,10 +399,11 @@
             // TODO: more tests
             try {
                 testApply(bdd, BDDFactory.less, false, true, false, false);
-            } catch (UnsupportedOperationException _) { }
+            } catch (UnsupportedOperationException _) {
+            }
         }
     }
-    
+
     public void testInvImp() {
         reset();
         Assert.assertTrue(hasNext());
@@ -385,10 +412,11 @@
             // TODO: more tests
             try {
                 testApply(bdd, BDDFactory.invimp, true, false, true, true);
-            } catch (UnsupportedOperationException _) { }
+            } catch (UnsupportedOperationException _) {
+            }
         }
     }
-    
+
     public void testNand() {
         reset();
         Assert.assertTrue(hasNext());
@@ -398,7 +426,7 @@
             testApply(bdd, BDDFactory.nand, true, true, true, false);
         }
     }
-    
+
     public void testNor() {
         reset();
         Assert.assertTrue(hasNext());
@@ -408,7 +436,7 @@
             testApply(bdd, BDDFactory.nor, true, false, false, false);
         }
     }
-    
+
     public void testApplyWith() {
         reset();
         Assert.assertTrue(hasNext());
@@ -424,16 +452,19 @@
             testApplyWith(bdd, BDDFactory.nor, true, false, false, false);
             try {
                 testApplyWith(bdd, BDDFactory.biimp, true, false, false, true);
-            } catch (UnsupportedOperationException _) { }
+            } catch (UnsupportedOperationException _) {
+            }
             try {
                 testApplyWith(bdd, BDDFactory.less, false, true, false, false);
-            } catch (UnsupportedOperationException _) { }
+            } catch (UnsupportedOperationException _) {
+            }
             try {
                 testApplyWith(bdd, BDDFactory.invimp, true, false, true, true);
-            } catch (UnsupportedOperationException _) { }
+            } catch (UnsupportedOperationException _) {
+            }
         }
     }
-    
+
     public void testIte() {
         reset();
         Assert.assertTrue(hasNext());
@@ -450,15 +481,20 @@
             d = a.ite(c, b);
             e = d.not();
             Assert.assertEquals(a, e);
-            d.free(); e.free();
+            d.free();
+            e.free();
             e = bdd.ithVar(2);
             d = e.ite(a, a);
             Assert.assertEquals(a, d);
             // TODO: more tests.
-            a.free(); b.free(); c.free(); d.free(); e.free();
+            a.free();
+            b.free();
+            c.free();
+            d.free();
+            e.free();
         }
     }
-    
+
     public void testReplace() {
         reset();
         Assert.assertTrue(hasNext());
@@ -469,7 +505,7 @@
             BDDPairing p2 = bdd.makePair();
             p2.set(1, 2);
             BDDPairing p3 = bdd.makePair();
-            p3.set(new int[] { 0, 1 }, new int[] { 1, 0 });
+            p3.set(new int[]{0, 1}, new int[]{1, 0});
             BDD a, b, c, d, e, f;
             a = bdd.ithVar(0);
             b = bdd.ithVar(1);
@@ -491,19 +527,24 @@
             Assert.assertTrue(d.isZero());
             e.replaceWith(p3);
             Assert.assertTrue(e.isOne());
-            a.free(); b.free(); c.free(); d.free(); e.free(); f.free();
+            a.free();
+            b.free();
+            c.free();
+            d.free();
+            e.free();
+            f.free();
             p1.reset();
             p2.reset();
             p3.reset();
         }
     }
-    
+
     void tEnsureCapacity() {
         reset();
         Assert.assertTrue(hasNext());
         while (hasNext()) {
             BDDFactory bdd = nextFactory();
-            long[] domains = new long[] { 127, 17, 31, 4 };
+            long[] domains = new long[]{127, 17, 31, 4};
             BDDDomain[] d = bdd.extDomain(domains);
             BDD q = d[0].ithVar(7);
             BDD r = d[1].ithVar(9);
@@ -512,7 +553,7 @@
             BDD u = r.and(s);
             BDD v = q.and(t);
             BDD w = u.and(t);
-            //BDD x = d[1].set();
+            // BDD x = d[1].set();
             for (int i = 0; i < d.length; ++i) {
                 d[i].ensureCapacity(BigInteger.valueOf(150));
                 Assert.assertEquals(BigInteger.valueOf(7), q.scanVar(d[0]));
@@ -526,22 +567,28 @@
                 Assert.assertEquals(BigInteger.valueOf(9), w.scanVar(d[1]));
                 Assert.assertEquals(BigInteger.valueOf(4), w.scanVar(d[2]));
                 Assert.assertEquals(BigInteger.valueOf(2), w.scanVar(d[3]));
-                //BDD y = d[1].set();
-                //Assert.assertEquals(x, y);
-                //y.free();
+                // BDD y = d[1].set();
+                // Assert.assertEquals(x, y);
+                // y.free();
             }
-            //x.free();
-            w.free(); v.free(); u.free(); t.free(); s.free(); r.free(); q.free();
+            // x.free();
+            w.free();
+            v.free();
+            u.free();
+            t.free();
+            s.free();
+            r.free();
+            q.free();
         }
     }
-    
+
     void tEnsureCapacity2() throws IOException {
         reset();
         Assert.assertTrue(hasNext());
         while (hasNext()) {
             BDDFactory bdd = nextFactory();
-            System.out.println("Factory "+bdd);
-            long[] domainSizes = new long[] { 127, 17, 31, 4, 256, 87, 42, 666, 3405, 18 };
+            System.out.println("Factory " + bdd);
+            long[] domainSizes = new long[]{127, 17, 31, 4, 256, 87, 42, 666, 3405, 18};
             while (bdd.numberOfDomains() < domainSizes.length) {
                 bdd.extDomain(domainSizes[bdd.numberOfDomains()]);
             }
@@ -557,7 +604,7 @@
             final int num = 10;
             for (int i = 0; i < count; ++i) {
                 String order = randomOrder(d);
-                //System.out.println("Random order: "+order);
+                // System.out.println("Random order: "+order);
                 bdd.setVarOrder(bdd.makeVarOrdering(false, order));
                 List bdds = new LinkedList();
                 for (int j = 0; j < num; ++j) {
@@ -565,32 +612,35 @@
                     bdds.add(b);
                 }
                 StringBuffer sb = new StringBuffer();
-                for (Iterator j = bdds.iterator(); j.hasNext(); ) {
+                for (Iterator j = bdds.iterator(); j.hasNext();) {
                     BDD b = (BDD) j.next();
                     sb.append(b.toStringWithDomains());
-                    //bdd.save(new BufferedWriter(new PrintWriter(System.out)), b);
+                    // bdd.save(new BufferedWriter(new PrintWriter(System.out)),
+                    // b);
                 }
                 String before = sb.toString();
                 int which = random.nextInt(d.length);
                 int amount = random.nextInt(d[which].size().intValue() * 3);
-                //System.out.println(" Ensure capacity "+d[which]+" = "+amount);
+                // System.out.println(" Ensure capacity "+d[which]+" =
+                // "+amount);
                 d[which].ensureCapacity(amount);
                 sb = new StringBuffer();
-                for (Iterator j = bdds.iterator(); j.hasNext(); ) {
+                for (Iterator j = bdds.iterator(); j.hasNext();) {
                     BDD b = (BDD) j.next();
                     sb.append(b.toStringWithDomains());
-                    //bdd.save(new BufferedWriter(new PrintWriter(System.out)), b);
+                    // bdd.save(new BufferedWriter(new PrintWriter(System.out)),
+                    // b);
                 }
                 String after = sb.toString();
                 Assert.assertEquals(before, after);
-                for (Iterator j = bdds.iterator(); j.hasNext(); ) {
+                for (Iterator j = bdds.iterator(); j.hasNext();) {
                     BDD b = (BDD) j.next();
                     b.free();
                 }
             }
         }
     }
-    
+
     private static BDD randomBDD(BDDFactory f) {
         Assert.assertTrue(f.numberOfDomains() > 0);
         List list = new ArrayList(f.numberOfDomains());
@@ -600,16 +650,15 @@
         }
         BDD result = f.one();
         for (int i = 0; i < k; ++i) {
-            int x = random.nextInt(f.numberOfDomains()-i);
+            int x = random.nextInt(f.numberOfDomains() - i);
             BDDDomain d = (BDDDomain) list.remove(x);
             int y = random.nextInt(d.size().intValue());
             result.andWith(d.ithVar(y));
         }
-        if (k == 0 && random.nextBoolean())
-            result.andWith(f.zero());
+        if (k == 0 && random.nextBoolean()) result.andWith(f.zero());
         return result;
     }
-    
+
     private static String randomOrder(BDDDomain[] domains) {
         domains = (BDDDomain[]) randomShuffle(domains);
         StringBuffer sb = new StringBuffer();
@@ -623,14 +672,14 @@
         }
         return sb.toString();
     }
-    
     private static Random random = new Random(System.currentTimeMillis());
+
     private static Object[] randomShuffle(Object[] a) {
         int n = a.length;
         List list = new ArrayList(Arrays.asList(a));
         Object[] result = (Object[]) a.clone();
         for (int i = 0; i < n; ++i) {
-            int k = random.nextInt(n-i);
+            int k = random.nextInt(n - i);
             result[i] = list.remove(k);
         }
         Assert.assertTrue(list.isEmpty());
Modified: trunk/JavaBDD_tests/highlevel/NQueensTest.java
===================================================================
--- trunk/JavaBDD_tests/highlevel/NQueensTest.java	2006-11-13 07:25:31 UTC (rev 466)
+++ trunk/JavaBDD_tests/highlevel/NQueensTest.java	2006-11-13 07:25:37 UTC (rev 467)
@@ -77,7 +77,7 @@
                     build(i, j);
                 }
 
-            solution = queen.satOne();
+            solution = queen.fullSatOne();
             
             double result = queen.satCount();
             return result;
Modified: trunk/JavaBDD_tests/regression/R3.java
===================================================================
--- trunk/JavaBDD_tests/regression/R3.java	2006-11-13 07:25:31 UTC (rev 466)
+++ trunk/JavaBDD_tests/regression/R3.java	2006-11-13 07:25:37 UTC (rev 467)
@@ -25,6 +25,7 @@
         while (hasNext()) {
             
             BDDFactory bdd = nextFactory();
+            if (bdd.isZDD()) continue;
             BDD x0,x1,y0,y1,z0,z1,t,or,one;
             BDDVarSet xs0,xs1;
             bdd.setVarNum(5);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <joe...@us...> - 2006-11-13 16:58:17
      
     | 
| Revision: 466
          http://svn.sourceforge.net/javabdd/?rev=466&view=rev
Author:   joewhaley
Date:     2006-11-12 23:25:31 -0800 (Sun, 12 Nov 2006)
Log Message:
-----------
More support for ZDDs.
Modified Paths:
--------------
    trunk/JavaBDD/net/sf/javabdd/JFactory.java
Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java
===================================================================
--- trunk/JavaBDD/net/sf/javabdd/JFactory.java	2006-07-26 16:42:44 UTC (rev 465)
+++ trunk/JavaBDD/net/sf/javabdd/JFactory.java	2006-11-13 07:25:31 UTC (rev 466)
@@ -102,15 +102,19 @@
             sb.append('{');
             boolean any = false;
             for (int i = 0; i < result.length; ++i) {
-                // TODO: revisit for zdd
-                if (result[i] != bdd_ithvar(bddlevel2var[i])) {
+                if (result[i] != (ZDD ? zdd_makenode(i, 0, 1):bdd_ithvar(bddlevel2var[i]))) {
                     if (any) sb.append(", ");
                     any = true;
                     sb.append(bddlevel2var[i]);
                     sb.append('=');
-                    BDD b = makeBDD(result[i]);
-                    sb.append(b);
-                    b.free();
+                    //if (ZDD)
+                    //    sb.append(bddlevel2var[LEVEL(result[i])]);
+                    //else
+                    {
+                        BDD b = makeBDD(result[i]);
+                        sb.append(b);
+                        b.free();
+                    }
                 }
             }
             sb.append('}');
@@ -125,9 +129,11 @@
         bddPair p = new bddPair();
         p.result = new int[bddvarnum];
         int n;
-        // TODO: revisit for zdd
         for (n = 0; n < bddvarnum; n++)
-            p.result[n] = bdd_ithvar(bddlevel2var[n]);
+            if (ZDD)
+                p.result[n] = bdd_addref(zdd_makenode(n, 0, 1));
+            else
+                p.result[n] = bdd_ithvar(bddlevel2var[n]);
 
         p.id = update_pairsid();
         p.last = -1;
@@ -1191,6 +1197,7 @@
         CHECKa(r, bddfalse);
 
         if (replacecache == null) replacecache = BddCacheI_init(cachesize);
+        if (ZDD && applycache == null) applycache = BddCacheI_init(cachesize);
         
         again : for (;;) {
             try {
@@ -1198,6 +1205,7 @@
                 replacepair = pair.result;
                 replacelast = pair.last;
                 replaceid = (pair.id << 2) | CACHEID_REPLACE;
+                if (ZDD) applyop = bddop_or;
 
                 if (numReorder == 0) bdd_disable_reorder();
                 res = replace_rec(r);
@@ -1284,32 +1292,38 @@
     }
 
     int zdd_correctify(int level, int l, int r) {
-        // TODO: This function is wrong.  Need to figure out how to do replace in ZDD.
         int res;
-
-        if (level < LEVEL(l) && level < LEVEL(r))
-            return zdd_makenode(level, l, r);
-
-        if (level == LEVEL(l) || level == LEVEL(r)) {
-            bdd_error(BDD_REPLACE);
-            return 0;
-        }
-
-        if (LEVEL(l) == LEVEL(r)) {
-            PUSHREF(zdd_correctify(level, LOW(l), LOW(r)));
-            PUSHREF(zdd_correctify(level, HIGH(l), HIGH(r)));
-            res = zdd_makenode(LEVEL(l), READREF(2), READREF(1));
-        } else if (LEVEL(l) < LEVEL(r)) {
-            PUSHREF(zdd_correctify(level, LOW(l), r));
-            PUSHREF(zdd_correctify(level, HIGH(l), r));
-            res = zdd_makenode(LEVEL(l), READREF(2), READREF(1));
+        
+        // Here's the idea: Flip the "level" bit on the one branch,
+        // then "or" the result with the zero branch.
+        PUSHREF(zdd_makenode(level, 0, 1));
+        PUSHREF(zdd_change(r, READREF(1)));
+        res = zor_rec(READREF(1), l);
+        POPREF(2);
+        
+        return res;
+    }
+    
+    // Flip zvar in r.
+    int zdd_change(int r, int zvar) {
+        int res;
+        
+        if (ISZERO(r))
+            return r;
+        if (ISONE(r))
+            return zvar;
+        
+        if (LEVEL(r) > LEVEL(zvar)) {
+            res = zdd_makenode(LEVEL(zvar), BDDZERO, r);
+        } else if (LEVEL(r) == LEVEL(zvar)) {
+            res = zdd_makenode(LEVEL(zvar), HIGH(r), LOW(r));
         } else {
-            PUSHREF(zdd_correctify(level, l, LOW(r)));
-            PUSHREF(zdd_correctify(level, l, HIGH(r)));
+            PUSHREF(zdd_change(LOW(r), zvar));
+            PUSHREF(zdd_change(HIGH(r), zvar));
             res = zdd_makenode(LEVEL(r), READREF(2), READREF(1));
+            POPREF(2);
         }
-        POPREF(2);
-
+        
         return res; /* FIXME: cache ? */
     }
     
@@ -1333,11 +1347,79 @@
                 applyop = op;
 
                 if (numReorder == 0) bdd_disable_reorder();
-                switch (op) {
-                    case bddop_and: res = ZDD ? zand_rec(l, r) : and_rec(l, r); break;
-                    case bddop_or: res = ZDD ? zor_rec(l, r) : or_rec(l, r); break;
-                    case bddop_diff: res = ZDD ? zdiff_rec(l, r) : apply_rec(l, r); break;
-                    default: res = apply_rec(l, r); break;
+                if (ZDD) {
+                    switch (op) {
+                        case bddop_and: res = zand_rec(l, r); break;
+                        case bddop_or: res = zor_rec(l, r); break;
+                        case bddop_diff: res = zdiff_rec(l, r); break;
+                        case bddop_imp:
+                        {
+                            // TODO: A real ZDD implementation
+                            int a = bdd_addref(zdiff_rec(l, r));
+                            res = zdiff_rec(univ, a);
+                            bdd_delref(a);
+                            break;
+                        }
+                        case bddop_invimp:
+                        {
+                            // TODO: A real ZDD implementation
+                            int a = bdd_addref(zdiff_rec(r, l));
+                            res = zdiff_rec(univ, a);
+                            bdd_delref(a);
+                            break;
+                        }
+                        case bddop_less:
+                        {
+                            // TODO: A real ZDD implementation
+                            res = zdiff_rec(r, l);
+                            break;
+                        }
+                        case bddop_nand:
+                        {
+                            // TODO: A real ZDD implementation
+                            int k = bdd_addref(zand_rec(l, r));
+                            res = zdiff_rec(univ, k);
+                            bdd_delref(k);
+                            break;
+                        }
+                        case bddop_nor:
+                        {
+                            // TODO: A real ZDD implementation
+                            int k = bdd_addref(zor_rec(l, r));
+                            res = zdiff_rec(univ, k);
+                            bdd_delref(k);
+                            break;
+                        }
+                        case bddop_xor:
+                        {
+                            // TODO: A real ZDD implementation
+                            int a = bdd_addref(zand_rec(l, r));
+                            int b = bdd_addref(zor_rec(l, r));
+                            res = zdiff_rec(b, a);
+                            bdd_delref(a); bdd_delref(b);
+                            break;
+                        }
+                        case bddop_biimp:
+                        {
+                            // TODO: A real ZDD implementation
+                            int a = bdd_addref(zand_rec(l, r));
+                            int b = bdd_addref(zor_rec(l, r));
+                            int c = bdd_addref(zdiff_rec(b, a));
+                            bdd_delref(a); bdd_delref(b);
+                            res = zdiff_rec(univ, c);
+                            bdd_delref(c);
+                            break;
+                        }
+                        default:
+                            // TODO: other operators
+                            throw new BDDException();
+                    }
+                } else {
+                    switch (op) {
+                        case bddop_and: res = and_rec(l, r); break;
+                        case bddop_or: res = or_rec(l, r); break;
+                        default: res = apply_rec(l, r); break;
+                    }
                 }
                 if (numReorder == 0) bdd_enable_reorder();
             } catch (ReorderException x) {
@@ -2866,7 +2948,7 @@
         res = fullsatone_rec(r);
 
         for (v = LEVEL(r) - 1; v >= 0; v--) {
-            res = PUSHREF(bdd_makenode(v, res, 0));
+            res = PUSHREF(ZDD?zdd_makenode(v, res, 0):bdd_makenode(v, res, 0));
         }
 
         bdd_enable_reorder();
@@ -2884,19 +2966,19 @@
             int v;
 
             for (v = LEVEL(LOW(r)) - 1; v > LEVEL(r); v--) {
-                res = PUSHREF(bdd_makenode(v, res, 0));
+                res = PUSHREF(ZDD?zdd_makenode(v, res, 0):bdd_makenode(v, res, 0));
             }
 
-            return PUSHREF(bdd_makenode(LEVEL(r), res, 0));
+            return PUSHREF(ZDD?zdd_makenode(LEVEL(r), res, 0):bdd_makenode(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(bdd_makenode(v, res, 0));
+                res = PUSHREF(ZDD?zdd_makenode(v, res, 0):bdd_makenode(v, res, 0));
             }
 
-            return PUSHREF(bdd_makenode(LEVEL(r), 0, res));
+            return PUSHREF(ZDD?zdd_makenode(LEVEL(r), 0, res):bdd_makenode(LEVEL(r), 0, res));
         }
     }
 
@@ -3031,7 +3113,8 @@
         if (countcache == null) countcache = BddCacheD_init(cachesize);
         
         miscid = CACHEID_SATCOU;
-        size = Math.pow(2.0, (double) LEVEL(r));
+        if (!ZDD)
+            size = Math.pow(2.0, (double) LEVEL(r));
 
         return size * satcount_rec(r);
     }
@@ -3064,12 +3147,13 @@
 
         size = 0;
         s = 1;
-
-        s *= Math.pow(2.0, (float) (LEVEL(LOW(root)) - LEVEL(root) - 1));
+        if (!ZDD)
+            s *= Math.pow(2.0, (float) (LEVEL(LOW(root)) - LEVEL(root) - 1));
         size += s * satcount_rec(LOW(root));
 
         s = 1;
-        s *= Math.pow(2.0, (float) (LEVEL(HIGH(root)) - LEVEL(root) - 1));
+        if (!ZDD)
+            s *= Math.pow(2.0, (float) (LEVEL(HIGH(root)) - LEVEL(root) - 1));
         size += s * satcount_rec(HIGH(root));
 
         entry.a = root;
@@ -3747,9 +3831,29 @@
         if (newvar < 0 || newvar > bddvarnum - 1)
             bdd_error(BDD_VAR);
 
-        bdd_delref(pair.result[bddvar2level[oldvar]]);
-        // TODO: revisit for zdd
-        pair.result[bddvar2level[oldvar]] = bdd_ithvar(newvar);
+        if (ZDD) {
+            // ZDD requires a permutation, not just a pairing.
+            int oldlev = bddvar2level[oldvar], newlev = bddvar2level[newvar];
+            int newIndex = newlev;
+            if (LEVEL(pair.result[newIndex]) != newlev) {
+                // Find who points to newlev.
+                for (newIndex = 0; newIndex < bddvarnum; ++newIndex) {
+                    if (LEVEL(pair.result[newIndex]) == newlev) {
+                        break;
+                    }
+                }
+                _assert(newIndex != bddvarnum);
+            }
+            int tmp = pair.result[oldlev];
+            pair.result[oldlev] = pair.result[newIndex];
+            pair.result[newIndex] = tmp;
+            
+            if (newlev > pair.last)
+                pair.last = newlev;
+        } else {
+            bdd_delref(pair.result[bddvar2level[oldvar]]);
+            pair.result[bddvar2level[oldvar]] = bdd_ithvar(newvar);
+        }
         pair.id = update_pairsid();
 
         if (bddvar2level[oldvar] > pair.last)
@@ -3764,6 +3868,9 @@
         if (pair == null)
             return;
 
+        if (ZDD)
+            throw new BDDException("setbddpair not supported with ZDDs");
+        
         CHECK(newvar);
         if (oldvar < 0 || oldvar >= bddvarnum)
             bdd_error(BDD_VAR);
@@ -3782,9 +3889,13 @@
     void bdd_resetpair(bddPair p) {
         int n;
 
-        // TODO: revisit for zdd
-        for (n = 0; n < bddvarnum; n++)
-            p.result[n] = bdd_ithvar(bddlevel2var[n]);
+        for (n = 0; n < bddvarnum; n++) {
+            if (ZDD) {
+                bdd_delref(p.result[n]);
+                p.result[n] = bdd_addref(zdd_makenode(n, 0, 1));
+            } else
+                p.result[n] = bdd_ithvar(bddlevel2var[n]);
+        }
         p.last = 0;
     }
 
@@ -3861,9 +3972,11 @@
             System.arraycopy(p.result, 0, new_result, 0, oldsize);
             p.result = new_result;
 
-            // TODO: revisit for zdd
             for (n = oldsize; n < newsize; n++)
-                p.result[n] = bdd_ithvar(bddlevel2var[n]);
+                if (ZDD)
+                    p.result[n] = bdd_addref(zdd_makenode(n, 0, 1));
+                else
+                    p.result[n] = bdd_ithvar(bddlevel2var[n]);
         }
 
         return 0;
@@ -4688,6 +4801,8 @@
         bddvarnum = 0;
         bddproduced = 0;
 
+        univ = 1;
+        
         //err_handler = null;
         //gbc_handler = null;
         //resize_handler = null;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <joe...@us...> - 2006-07-26 19:49:45
      
     | 
| Revision: 464 Author: joewhaley Date: 2006-07-26 09:42:39 -0700 (Wed, 26 Jul 2006) ViewCVS: http://svn.sourceforge.net/javabdd/?rev=464&view=rev Log Message: ----------- Improved ZDD support. Modified Paths: -------------- trunk/JavaBDD_tests/bdd/BasicTests.java Modified: trunk/JavaBDD_tests/bdd/BasicTests.java =================================================================== --- trunk/JavaBDD_tests/bdd/BasicTests.java 2006-07-21 16:55:23 UTC (rev 463) +++ trunk/JavaBDD_tests/bdd/BasicTests.java 2006-07-26 16:42:39 UTC (rev 464) @@ -63,9 +63,11 @@ BDD c = bdd.ithVar(3); BDD d = bdd.one(); BDD e = bdd.zero(); - Assert.assertEquals(1, a.var()); - Assert.assertEquals(2, b.var()); - Assert.assertEquals(3, c.var()); + if (!bdd.isZDD()) { + Assert.assertEquals(1, a.var()); + Assert.assertEquals(2, b.var()); + Assert.assertEquals(3, c.var()); + } try { d.var(); Assert.fail(bdd.getVersion()); @@ -75,7 +77,8 @@ Assert.fail(bdd.getVersion()); } catch (BDDException x) { } BDD f = a.and(b); - Assert.assertEquals(1, f.var()); + if (!bdd.isZDD()) + Assert.assertEquals(1, f.var()); a.free(); b.free(); c.free(); d.free(); e.free(); f.free(); } } @@ -97,22 +100,26 @@ BDD c = bdd.ithVar(2); BDD d = bdd.ithVar(3); BDD e = bdd.ithVar(4); - Assert.assertEquals(0, a.var()); - Assert.assertEquals(1, b.var()); - Assert.assertEquals(2, c.var()); - Assert.assertEquals(3, d.var()); - Assert.assertEquals(4, e.var()); + if (!bdd.isZDD()) { + Assert.assertEquals(0, a.var()); + Assert.assertEquals(1, b.var()); + Assert.assertEquals(2, c.var()); + Assert.assertEquals(3, d.var()); + Assert.assertEquals(4, e.var()); + } bdd.setVarOrder(new int[] { 2, 3, 4, 0, 1 }); - Assert.assertEquals(0, a.var()); - Assert.assertEquals(1, b.var()); - Assert.assertEquals(2, c.var()); - Assert.assertEquals(3, d.var()); - Assert.assertEquals(4, e.var()); - Assert.assertEquals(3, a.level()); - Assert.assertEquals(4, b.level()); - Assert.assertEquals(0, c.level()); - Assert.assertEquals(1, d.level()); - Assert.assertEquals(2, e.level()); + if (!bdd.isZDD()) { + Assert.assertEquals(0, a.var()); + Assert.assertEquals(1, b.var()); + Assert.assertEquals(2, c.var()); + Assert.assertEquals(3, d.var()); + Assert.assertEquals(4, e.var()); + Assert.assertEquals(3, a.level()); + Assert.assertEquals(4, b.level()); + Assert.assertEquals(0, c.level()); + Assert.assertEquals(1, d.level()); + Assert.assertEquals(2, e.level()); + } a.free(); b.free(); c.free(); d.free(); e.free(); } } @@ -132,35 +139,40 @@ a.andWith(bdd.nithVar(2)); Assert.assertEquals(0, a.var()); b = a.low(); - Assert.assertEquals(true, b.isZero()); - try { - b.low(); - Assert.fail(); - } catch (BDDException _) { + if (!bdd.isZDD()) { + Assert.assertEquals(true, b.isZero()); + try { + b.low(); + Assert.fail(); + } catch (BDDException _) { + } + try { + b.high(); + Assert.fail(); + } catch (BDDException _) { + } } - try { - b.high(); - Assert.fail(); - } catch (BDDException _) { - } b.free(); b = a.high(); Assert.assertEquals(1, b.var()); c = b.high(); b.free(); - Assert.assertEquals(2, c.var()); + if (!bdd.isZDD()) + Assert.assertEquals(2, c.var()); b = c.low(); - Assert.assertEquals(true, b.isOne()); - try { - b.low(); - Assert.fail(); - } catch (BDDException _) { + if (!bdd.isZDD()) { + Assert.assertEquals(true, b.isOne()); + try { + b.low(); + Assert.fail(); + } catch (BDDException _) { + } + try { + b.high(); + Assert.fail(); + } catch (BDDException _) { + } } - try { - b.high(); - Assert.fail(); - } catch (BDDException _) { - } a.free(); b.free(); c.free(); } } @@ -175,13 +187,21 @@ a = bdd.ithVar(0); b = a.not(); c = bdd.nithVar(0); + System.out.println("First graph:"); + a.printDot(); + System.out.println("Second graph:"); + b.printDot(); + System.out.println("Third graph:"); + c.printDot(); Assert.assertEquals(b, c); - c.free(); - c = b.high(); - Assert.assertEquals(true, c.isZero()); - c.free(); - c = b.low(); - Assert.assertEquals(true, c.isOne()); + if (!bdd.isZDD()) { + c.free(); + c = b.high(); + Assert.assertEquals(true, c.isZero()); + c.free(); + c = b.low(); + Assert.assertEquals(true, c.isOne()); + } a.free(); b.free(); c.free(); } } @@ -198,7 +218,8 @@ a.andWith(bdd.ithVar(0)); Assert.assertTrue(!a.equals(b)); Assert.assertTrue(a.var() == 0); - Assert.assertTrue(b.var() == 1); + if (!bdd.isZDD()) + Assert.assertTrue(b.var() == 1); b.andWith(bdd.zero()); Assert.assertTrue(b.isZero()); Assert.assertTrue(!a.isZero()); @@ -278,12 +299,14 @@ b = bdd.ithVar(2); c = bdd.nithVar(1); c.orWith(a); - Assert.assertTrue(c.isOne()); + Assert.assertTrue(c.isUniverse()); a = bdd.zero(); a.orWith(bdd.zero()); Assert.assertTrue(a.isZero()); + c.free(); + c = b.id(); b.orWith(b); - Assert.assertEquals(2, b.var()); + Assert.assertEquals(b, c); a.free(); b.free(); c.free(); testApply(bdd, BDDFactory.or, false, true, true, true); } @@ -346,6 +369,7 @@ Assert.assertTrue(hasNext()); while (hasNext()) { BDDFactory bdd = nextFactory(); + if (bdd.isZDD()) continue; // TODO: more tests try { testApply(bdd, BDDFactory.less, false, true, false, false); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. | 
| 
      
      
      From: <joe...@us...> - 2006-07-26 17:46:44
      
     | 
| Revision: 465 Author: joewhaley Date: 2006-07-26 09:42:44 -0700 (Wed, 26 Jul 2006) ViewCVS: http://svn.sourceforge.net/javabdd/?rev=465&view=rev Log Message: ----------- Improved ZDD support. Modified Paths: -------------- trunk/JavaBDD/net/sf/javabdd/BDD.java trunk/JavaBDD/net/sf/javabdd/BDDFactory.java trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java trunk/JavaBDD/net/sf/javabdd/JDDFactory.java trunk/JavaBDD/net/sf/javabdd/JFactory.java trunk/JavaBDD/net/sf/javabdd/MicroFactory.java Modified: trunk/JavaBDD/net/sf/javabdd/BDD.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BDD.java 2006-07-26 16:42:39 UTC (rev 464) +++ trunk/JavaBDD/net/sf/javabdd/BDD.java 2006-07-26 16:42:44 UTC (rev 465) @@ -48,6 +48,14 @@ public abstract boolean isOne(); /** + * <p>Returns true if this BDD is the universe BDD. + * The universal BDD differs from the one BDD in ZDD mode.</p> + * + * @return true if this BDD is the universe BDD + */ + public boolean isUniverse() { return isOne(); } + + /** * <p>Converts this BDD to a new BDDVarSet.</p> * * <p>This BDD must be a boolean function that represents the all-true minterm Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BDDFactory.java 2006-07-26 16:42:39 UTC (rev 464) +++ trunk/JavaBDD/net/sf/javabdd/BDDFactory.java 2006-07-26 16:42:44 UTC (rev 465) @@ -196,6 +196,14 @@ public abstract BDD one(); /** + * <p>Get the constant universe BDD. + * (The universe BDD differs from the one BDD in ZDD mode.)</p> + * + * <p>Compare to bdd_true.</p> + */ + public BDD universe() { return one(); } + + /** * <p>Get an empty BDDVarSet.</p> * * <p>Compare to bdd_true.</p> Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-07-26 16:42:39 UTC (rev 464) +++ trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-07-26 16:42:44 UTC (rev 465) @@ -20,6 +20,7 @@ protected abstract void delref_impl(/*bdd*/int v); protected abstract /*bdd*/int zero_impl(); protected abstract /*bdd*/int one_impl(); + protected /*bdd*/int universe_impl() { return one_impl(); } protected abstract /*bdd*/int invalid_bdd_impl(); protected abstract int var_impl(/*bdd*/int v); protected abstract int level_impl(/*bdd*/int v); @@ -28,6 +29,7 @@ protected abstract /*bdd*/int ithVar_impl(int var); protected abstract /*bdd*/int nithVar_impl(int var); + protected abstract /*bdd*/int makenode_impl(int lev, /*bdd*/int lo, /*bdd*/int hi); protected abstract /*bdd*/int ite_impl(/*bdd*/int v1, /*bdd*/int v2, /*bdd*/int v3); protected abstract /*bdd*/int apply_impl(/*bdd*/int v1, /*bdd*/int v2, BDDOp opr); protected abstract /*bdd*/int not_impl(/*bdd*/int v1); @@ -121,6 +123,9 @@ public boolean isOne() { return v == one_impl(); } + public boolean isUniverse() { + return v == universe_impl(); + } public boolean isZero() { return v == zero_impl(); } @@ -236,7 +241,7 @@ public class IntBDDVarSet extends BDDVarSet { /*bdd*/int v; - private IntBDDVarSet(/*bdd*/int v) { + protected IntBDDVarSet(/*bdd*/int v) { this.v = v; addref_impl(v); } @@ -256,12 +261,15 @@ public BDDVarSet id() { return makeBDDVarSet(v); } + protected int do_intersect(int v1, int v2) { + return apply_impl(v1, v2, or); + } public BDDVarSet intersect(BDDVarSet b) { - return makeBDDVarSet(apply_impl(v, unwrap(b), or)); + return makeBDDVarSet(do_intersect(v, unwrap(b))); } public BDDVarSet intersectWith(BDDVarSet b) { /*bdd*/int v2 = unwrap(b); - /*bdd*/int v3 = apply_impl(v, v2, or); + /*bdd*/int v3 = do_intersect(v, v2); addref_impl(v3); delref_impl(v); if (this != b) @@ -300,18 +308,21 @@ } return result; } + protected int do_unionvar(int v, int var) { + return apply_impl(v, ithVar_impl(var), and); + } + protected int do_union(int v1, int v2) { + return apply_impl(v1, v2, and); + } public BDDVarSet union(BDDVarSet b) { - return makeBDDVarSet(apply_impl(v, unwrap(b), and)); + return makeBDDVarSet(do_union(v, unwrap(b))); } public BDDVarSet union(int var) { - /*bdd*/int v2 = ithVar_impl(var); - /*bdd*/int v3 = apply_impl(v, v2, and); - delref_impl(v2); - return makeBDDVarSet(v3); + return makeBDDVarSet(do_unionvar(v, var)); } public BDDVarSet unionWith(BDDVarSet b) { /*bdd*/int v2 = unwrap(b); - /*bdd*/int v3 = apply_impl(v, v2, and); + /*bdd*/int v3 = do_union(v, v2); addref_impl(v3); delref_impl(v); if (this != b) @@ -320,11 +331,9 @@ return this; } public BDDVarSet unionWith(int var) { - /*bdd*/int v2 = ithVar_impl(var); - /*bdd*/int v3 = apply_impl(v, v2, and); + /*bdd*/int v3 = do_unionvar(v, var); addref_impl(v3); delref_impl(v); - delref_impl(v2); v = v3; return this; } @@ -348,11 +357,106 @@ } + public class IntZDDVarSet extends IntBDDVarSet { + protected IntZDDVarSet(/*bdd*/int v) { + super(v); + } + protected int do_intersect(int v1, int v2) { + if (v1 == one_impl()) return v2; + if (v2 == one_impl()) return v1; + int l1, l2; + l1 = level_impl(v1); + l2 = level_impl(v2); + for (;;) { + if (v1 == v2) + return v1; + if (l1 < l2) { + v1 = high_impl(v1); + if (v1 == one_impl()) return v2; + l1 = level_impl(v1); + } else if (l1 > l2) { + v2 = high_impl(v2); + if (v2 == one_impl()) return v1; + l2 = level_impl(v2); + } else { + int k = do_intersect(high_impl(v1), high_impl(v2)); + addref_impl(k); + int result = makenode_impl(l1, zero_impl(), k); + delref_impl(k); + return result; + } + } + } + protected int do_union(int v1, int v2) { + if (v1 == v2) return v1; + if (v1 == one_impl()) return v2; + if (v2 == one_impl()) return v1; + int l1, l2; + l1 = level_impl(v1); + l2 = level_impl(v2); + int vv1 = v1, vv2 = v2, lev = l1; + if (l1 <= l2) + vv1 = high_impl(v1); + if (l1 >= l2) { + vv2 = high_impl(v2); + lev = l2; + } + int k = do_union(vv1, vv2); + addref_impl(k); + int result = makenode_impl(lev, zero_impl(), k); + delref_impl(k); + return result; + } + protected int do_unionvar(int v, int var) { + return do_unionlevel(v, var2Level(var)); + } + private int do_unionlevel(int v, int lev) { + if (v == one_impl()) + return makenode_impl(lev, zero_impl(), one_impl()); + int l = level_impl(v); + if (l == lev) { + return v; + } else if (l > lev) { + return makenode_impl(lev, zero_impl(), v); + } else { + int k = do_unionlevel(high_impl(v), lev); + addref_impl(k); + int result = makenode_impl(lev, zero_impl(), k); + return result; + } + } + } + + public class IntZDDVarSetWithFinalizer extends IntZDDVarSet { + + protected IntZDDVarSetWithFinalizer(int v) { + super(v); + } + + protected void finalize() throws Throwable { + super.finalize(); + if (USE_FINALIZER) { + if (false && v != invalid_bdd_impl()) { + System.out.println("BDD not freed! "+System.identityHashCode(this)); + } + deferredFree(v); + } + } + + } + protected IntBDDVarSet makeBDDVarSet(/*bdd*/int v) { - if (USE_FINALIZER) - return new IntBDDVarSetWithFinalizer(v); - else - return new IntBDDVarSet(v); + if (true || isZDD()) { + if (USE_FINALIZER) + return new IntZDDVarSetWithFinalizer(v); + else + return new IntZDDVarSet(v); + } else { + if (USE_FINALIZER) + return new IntBDDVarSetWithFinalizer(v); + else + return new IntBDDVarSet(v); + } } protected static final /*bdd*/int unwrap(BDDVarSet b) { @@ -387,6 +491,10 @@ return makeBDD(one_impl()); } + public BDD universe() { + return makeBDD(universe_impl()); + } + public BDDVarSet emptySet() { return makeBDDVarSet(one_impl()); } Modified: trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java 2006-07-26 16:42:39 UTC (rev 464) +++ trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java 2006-07-26 16:42:44 UTC (rev 465) @@ -115,6 +115,7 @@ protected int nithVar_impl(int var) { return nithVar0(var); } private static native int nithVar0(int var); + protected int makenode_impl(int lev, int lo, int hi) { return ite0(ithVar_impl(level2Var0(lev)), hi, lo); } protected int ite_impl(int v1, int v2, int v3) { return ite0(v1, v2, v3); } private static native int ite0(int b, int c, int d); protected int apply_impl(int v1, int v2, BDDOp opr) { return apply0(v1, v2, opr.id); } Modified: trunk/JavaBDD/net/sf/javabdd/JDDFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/JDDFactory.java 2006-07-26 16:42:39 UTC (rev 464) +++ trunk/JavaBDD/net/sf/javabdd/JDDFactory.java 2006-07-26 16:42:44 UTC (rev 465) @@ -62,6 +62,7 @@ throw new BDDException(); return bdd.not(vars[var]); } + protected int makenode_impl(int lev, int lo, int hi) { return bdd.mk(lev, lo, hi); } protected int ite_impl(int v1, int v2, int v3) { return bdd.ite(v1, v2, v3); } protected int apply_impl(int x, int y, BDDOp opr) { int r; Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-07-26 16:42:39 UTC (rev 464) +++ trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-07-26 16:42:44 UTC (rev 465) @@ -37,7 +37,7 @@ */ public static boolean FLUSH_CACHE_ON_GC = true; - static final boolean VERIFY_ASSERTIONS = false; + static final boolean VERIFY_ASSERTIONS = true; static final boolean CACHESTATS = false; static final boolean SWAPCOUNT = false; @@ -67,7 +67,7 @@ }); } - boolean ZDD = false; + boolean ZDD = true; /** * Implementation of BDDPairing used by JFactory. @@ -102,6 +102,7 @@ sb.append('{'); boolean any = false; for (int i = 0; i < result.length; ++i) { + // TODO: revisit for zdd if (result[i] != bdd_ithvar(bddlevel2var[i])) { if (any) sb.append(", "); any = true; @@ -124,6 +125,7 @@ bddPair p = new bddPair(); p.result = new int[bddvarnum]; int n; + // TODO: revisit for zdd for (n = 0; n < bddvarnum; n++) p.result[n] = bdd_ithvar(bddlevel2var[n]); @@ -140,6 +142,7 @@ protected void delref_impl(int v) { bdd_delref(v); } protected int zero_impl() { return BDDZERO; } protected int one_impl() { return BDDONE; } + protected int universe_impl() { return univ; } protected int invalid_bdd_impl() { return INVALID_BDD; } protected int var_impl(int v) { return bdd_var(v); } protected int level_impl(int v) { return LEVEL(v); } @@ -148,6 +151,12 @@ protected int ithVar_impl(int var) { return bdd_ithvar(var); } protected int nithVar_impl(int var) { return bdd_nithvar(var); } + protected int makenode_impl(int lev, int lo, int hi) { + if (ZDD) + return zdd_makenode(lev, lo, hi); + else + return bdd_makenode(lev, lo, hi); + } protected int ite_impl(int v1, int v2, int v3) { return bdd_ite(v1, v2, v3); } protected int apply_impl(int v1, int v2, BDDOp opr) { return bdd_apply(v1, v2, opr.id); } protected int not_impl(int v1) { return bdd_not(v1); } @@ -456,7 +465,7 @@ prev_interleaved = inter; } BddTree newchild = my_vartree[0]; - _assert(newchild.prev == null); + if (VERIFY_ASSERTIONS) _assert(newchild.prev == null); //while (newchild.prev != null) newchild = newchild.prev; if (parent == null) vartree = newchild; else parent.nextlevel = newchild; @@ -492,8 +501,6 @@ return null; } - - /***** IMPLEMENTATION BELOW *****/ static final int REF_MASK = 0xFFC00000; @@ -710,6 +717,7 @@ /*=== PRIVATE KERNEL VARIABLES =========================================*/ int[] bddvarset; /* Set of defined BDD variables */ + int univ = 1; /* Universal set (used for ZDD) */ int gbcollectnum; /* Number of garbage collections */ int cachesize; /* Size of the operator caches */ long gbcclock; /* Clock ticks used in GBC */ @@ -941,8 +949,10 @@ again : for (;;) { try { INITREF(); + if (numReorder == 0) bdd_disable_reorder(); - res = ZDD ? znot_rec(r) : not_rec(r); + if (ZDD) res = zdiff_rec(univ, r); + else res = not_rec(r); if (numReorder == 0) bdd_enable_reorder(); } catch (ReorderException x) { bdd_checkreorder(); @@ -985,36 +995,6 @@ return res; } - int znot_rec(int r) { - BddCacheDataI entry; - int res; - - if (ISZERO(r)) - return bddtrue; - if (ISONE(r)) - return bddfalse; - - entry = BddCache_lookupI(applycache, NOTHASH(r)); - - if (entry.a == r && entry.c == bddop_not) { - if (CACHESTATS) - cachestats.opHit++; - return entry.res; - } - if (CACHESTATS) - cachestats.opMiss++; - - PUSHREF(znot_rec(LOW(r))); - res = bdd_makenode(LEVEL(r), READREF(1), HIGH(r)); - POPREF(1); - - entry.a = r; - entry.c = bddop_not; - entry.res = res; - - return res; - } - int bdd_ite(int f, int g, int h) { int res; int numReorder = 1; @@ -1136,7 +1116,7 @@ if (ISONE(g) && ISZERO(h)) return f; if (ISZERO(g) && ISONE(h)) - return znot_rec(f); + return zdiff_rec(univ, f); int v = Math.min(LEVEL(g), LEVEL(h)); if (LEVEL(f) < v) @@ -1155,43 +1135,43 @@ if (LEVEL(f) == LEVEL(h)) { PUSHREF(zite_rec(LOW(f), LOW(g), LOW(h))); PUSHREF(zite_rec(HIGH(f), HIGH(g), HIGH(h))); - res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + res = zdd_makenode(LEVEL(f), READREF(2), READREF(1)); POPREF(2); } else if (LEVEL(f) < LEVEL(h)) { PUSHREF(zite_rec(LOW(f), LOW(g), h)); PUSHREF(zite_rec(HIGH(f), HIGH(g), 0)); - res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + res = zdd_makenode(LEVEL(f), READREF(2), READREF(1)); POPREF(2); } else /* f > h */ { PUSHREF(zite_rec(f, g, LOW(h))); - res = bdd_makenode(LEVEL(h), HIGH(h), READREF(1)); + res = zdd_makenode(LEVEL(h), HIGH(h), READREF(1)); POPREF(1); } } else if (LEVEL(f) < LEVEL(g)) { if (LEVEL(f) == LEVEL(h)) { PUSHREF(zite_rec(LOW(f), g, LOW(h))); PUSHREF(zite_rec(HIGH(f), 0, HIGH(h))); - res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + res = zdd_makenode(LEVEL(f), READREF(2), READREF(1)); POPREF(2); } else if (LEVEL(f) < LEVEL(h)) { res = zite_rec(LOW(f), g, h); } else /* f > h */ { PUSHREF(zite_rec(f, g, LOW(h))); - res = bdd_makenode(LEVEL(h), HIGH(h), READREF(1)); + res = zdd_makenode(LEVEL(h), HIGH(h), READREF(1)); POPREF(1); } } else /* f > g */ { if (LEVEL(g) == LEVEL(h)) { PUSHREF(zite_rec(f, LOW(g), LOW(h))); - res = bdd_makenode(LEVEL(g), HIGH(h), READREF(1)); + res = zdd_makenode(LEVEL(g), HIGH(h), READREF(1)); POPREF(1); } else if (LEVEL(g) < LEVEL(h)) { PUSHREF(zite_rec(f, LOW(g), h)); - res = bdd_makenode(LEVEL(g), 0, READREF(1)); + res = zdd_makenode(LEVEL(g), 0, READREF(1)); POPREF(1); } else /* g > h */ { PUSHREF(zite_rec(f, g, LOW(h))); - res = bdd_makenode(LEVEL(h), HIGH(h), READREF(1)); + res = zdd_makenode(LEVEL(h), HIGH(h), READREF(1)); POPREF(1); } } @@ -1253,11 +1233,18 @@ PUSHREF(replace_rec(LOW(r))); PUSHREF(replace_rec(HIGH(r))); - res = - bdd_correctify( - LEVEL(replacepair[LEVEL(r)]), - READREF(2), - READREF(1)); + if (ZDD) + res = + zdd_correctify( + LEVEL(replacepair[LEVEL(r)]), + READREF(2), + READREF(1)); + else + res = + bdd_correctify( + LEVEL(replacepair[LEVEL(r)]), + READREF(2), + READREF(1)); POPREF(2); entry.a = r; @@ -1296,6 +1283,36 @@ return res; /* FIXME: cache ? */ } + int zdd_correctify(int level, int l, int r) { + // TODO: This function is wrong. Need to figure out how to do replace in ZDD. + int res; + + if (level < LEVEL(l) && level < LEVEL(r)) + return zdd_makenode(level, l, r); + + if (level == LEVEL(l) || level == LEVEL(r)) { + bdd_error(BDD_REPLACE); + return 0; + } + + if (LEVEL(l) == LEVEL(r)) { + PUSHREF(zdd_correctify(level, LOW(l), LOW(r))); + PUSHREF(zdd_correctify(level, HIGH(l), HIGH(r))); + res = zdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } else if (LEVEL(l) < LEVEL(r)) { + PUSHREF(zdd_correctify(level, LOW(l), r)); + PUSHREF(zdd_correctify(level, HIGH(l), r)); + res = zdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } else { + PUSHREF(zdd_correctify(level, l, LOW(r))); + PUSHREF(zdd_correctify(level, l, HIGH(r))); + res = zdd_makenode(LEVEL(r), READREF(2), READREF(1)); + } + POPREF(2); + + return res; /* FIXME: cache ? */ + } + int bdd_apply(int l, int r, int op) { int res; int numReorder = 1; @@ -1483,7 +1500,7 @@ PUSHREF(zand_rec(LOW(l), LOW(r))); PUSHREF(zand_rec(HIGH(l), HIGH(r))); - res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + res = zdd_makenode(LEVEL(l), READREF(2), READREF(1)); POPREF(2); @@ -1547,8 +1564,8 @@ if (l == r) return l; - if (ISONE(l) || ISONE(r)) - return 1; + //if (ISONE(l) || ISONE(r)) + // return 1; if (ISZERO(l)) return r; if (ISZERO(r)) @@ -1566,15 +1583,15 @@ if (LEVEL(l) == LEVEL(r)) { PUSHREF(zor_rec(LOW(l), LOW(r))); PUSHREF(zor_rec(HIGH(l), HIGH(r))); - res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + res = zdd_makenode(LEVEL(l), READREF(2), READREF(1)); POPREF(2); } else { if (LEVEL(l) < LEVEL(r)) { PUSHREF(zor_rec(LOW(l), r)); - res = bdd_makenode(LEVEL(l), READREF(1), HIGH(l)); + res = zdd_makenode(LEVEL(l), READREF(1), HIGH(l)); } else { PUSHREF(zor_rec(l, LOW(r))); - res = bdd_makenode(LEVEL(r), READREF(1), HIGH(r)); + res = zdd_makenode(LEVEL(r), READREF(1), HIGH(r)); } POPREF(1); } @@ -1591,16 +1608,16 @@ BddCacheDataI entry; int res; - if (ISZERO(l) || ISONE(r) || l == r) + if (ISZERO(l) /*|| ISONE(r)*/ || l == r) return 0; if (ISZERO(r)) return l; if (LEVEL(l) > LEVEL(r)) return zdiff_rec(l, LOW(r)); - entry = BddCache_lookupI(applycache, APPLYHASH(l, r, bddop_and)); + entry = BddCache_lookupI(applycache, APPLYHASH(l, r, bddop_diff)); - if (entry.a == l && entry.b == r && entry.c == bddop_and) { + if (entry.a == l && entry.b == r && entry.c == bddop_diff) { if (CACHESTATS) cachestats.opHit++; return entry.res; @@ -1611,11 +1628,11 @@ if (LEVEL(l) == LEVEL(r)) { PUSHREF(zdiff_rec(LOW(l), LOW(r))); PUSHREF(zdiff_rec(HIGH(l), HIGH(r))); - res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + res = zdd_makenode(LEVEL(l), READREF(2), READREF(1)); POPREF(2); } else { PUSHREF(zdiff_rec(LOW(l), r)); - res = bdd_makenode(LEVEL(l), READREF(1), HIGH(l)); + res = zdd_makenode(LEVEL(l), READREF(1), HIGH(l)); POPREF(1); } @@ -2050,7 +2067,9 @@ default: res = apply_rec(r2, r1); break; } } else { - res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + res = ZDD + ? zdd_makenode(LEVEL(r), READREF(2), READREF(1)) + : bdd_makenode(LEVEL(r), READREF(2), READREF(1)); } POPREF(2); @@ -3207,22 +3226,36 @@ } int bdd_makenode(int level, int low, int high) { - int hash2; - int res; + if (VERIFY_ASSERTIONS) _assert(!ZDD); + + if (CACHESTATS) + cachestats.uniqueAccess++; + // check whether children are equal + if (low == high) + return low; + + return makenode(level, low, high); + } + + int zdd_makenode(int level, int low, int high) { + if (VERIFY_ASSERTIONS) _assert(ZDD); + if (CACHESTATS) cachestats.uniqueAccess++; + + // check whether high child is zero + if (high == 0) + return low; + + return makenode(level, low, high); + } + + // Don't call directly - call bdd_makenode or zdd_makenode instead. + private int makenode(int level, int low, int high) { + int hash2; + int res; - if (ZDD) { - /* check whether high child is zero */ - if (high == 0) - return low; - } else { - /* check whether childs are equal */ - if (low == high) - return low; - } - /* Try to find an existing node of this kind */ hash2 = NODEHASH(level, low, high); res = HASH(hash2); @@ -3715,6 +3748,7 @@ bdd_error(BDD_VAR); bdd_delref(pair.result[bddvar2level[oldvar]]); + // TODO: revisit for zdd pair.result[bddvar2level[oldvar]] = bdd_ithvar(newvar); pair.id = update_pairsid(); @@ -3748,6 +3782,7 @@ void bdd_resetpair(bddPair p) { int n; + // TODO: revisit for zdd for (n = 0; n < bddvarnum; n++) p.result[n] = bdd_ithvar(bddlevel2var[n]); p.last = 0; @@ -3826,6 +3861,7 @@ System.arraycopy(p.result, 0, new_result, 0, oldsize); p.result = new_result; + // TODO: revisit for zdd for (n = oldsize; n < newsize; n++) p.result[n] = bdd_ithvar(bddlevel2var[n]); } @@ -4757,16 +4793,36 @@ bddrefstack = new int[num * 2 + 1]; bddrefstacktop = 0; + if (ZDD) + bddvarnum = 0; // need to recreate all of them for ZDD + + univ = 1; for (bdv = bddvarnum; bddvarnum < num; bddvarnum++) { - bddvarset[bddvarnum * 2] = PUSHREF(bdd_makenode(bddvarnum, 0, 1)); - bddvarset[bddvarnum * 2 + 1] = bdd_makenode(bddvarnum, 1, 0); - POPREF(1); + if (ZDD) { + int res = 1, res_not = 1; + for (int k = num-1; k >= 0; --k) { + PUSHREF(res); + PUSHREF(res_not); + PUSHREF(univ); + res = zdd_makenode(k, (k == bddvarnum)?0:res, res); + res_not = (k == bddvarnum) ? res_not : zdd_makenode(k, res_not, res_not); + if (bdv == bddvarnum) univ = zdd_makenode(k, univ, univ); + POPREF(3); + } + bddvarset[bddvarnum * 2] = res; + bddvarset[bddvarnum * 2 + 1] = res_not; + SETMAXREF(univ); + } else { + bddvarset[bddvarnum * 2] = PUSHREF(bdd_makenode(bddvarnum, 0, 1)); + bddvarset[bddvarnum * 2 + 1] = bdd_makenode(bddvarnum, 1, 0); + POPREF(1); + } if (bdderrorcond != 0) { bddvarnum = bdv; return -bdderrorcond; } - + SETMAXREF(bddvarset[bddvarnum * 2]); SETMAXREF(bddvarset[bddvarnum * 2 + 1]); bddlevel2var[bddvarnum] = bddvarnum; @@ -5717,6 +5773,7 @@ int next; } + // TODO: revisit for zdd int bdd_loaddata(BufferedReader ifile, int[] translate) throws IOException { int key, var, low, high, root = 0, n; Modified: trunk/JavaBDD/net/sf/javabdd/MicroFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/MicroFactory.java 2006-07-26 16:42:39 UTC (rev 464) +++ trunk/JavaBDD/net/sf/javabdd/MicroFactory.java 2006-07-26 16:42:44 UTC (rev 465) @@ -149,6 +149,7 @@ protected int ithVar_impl(int var) { return bdd_ithvar(var); } protected int nithVar_impl(int var) { return bdd_nithvar(var); } + protected int makenode_impl(int lev, int lo, int hi) { return bdd_makenode(lev, lo, hi); } protected int ite_impl(int v1, int v2, int v3) { return bdd_ite(v1, v2, v3); } protected int apply_impl(int v1, int v2, BDDOp opr) { return bdd_apply(v1, v2, opr.id); } protected int not_impl(int v1) { return bdd_not(v1); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. | 
| 
      
      
      From: <joe...@us...> - 2006-07-21 16:55:31
      
     | 
| Revision: 463 Author: joewhaley Date: 2006-07-21 09:55:23 -0700 (Fri, 21 Jul 2006) ViewCVS: http://svn.sourceforge.net/javabdd/?rev=463&view=rev Log Message: ----------- Update BuDDyFactory to also use common superclass BDDFactoryIntImpl. Modified Paths: -------------- trunk/JavaBDD/Makefile trunk/JavaBDD/buddy_jni.c trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java trunk/JavaBDD/net/sf/javabdd/JDDFactory.java trunk/JavaBDD/net/sf/javabdd/JFactory.java trunk/JavaBDD/net/sf/javabdd/MicroFactory.java Modified: trunk/JavaBDD/Makefile =================================================================== --- trunk/JavaBDD/Makefile 2006-07-21 14:32:13 UTC (rev 462) +++ trunk/JavaBDD/Makefile 2006-07-21 16:55:23 UTC (rev 463) @@ -141,8 +141,7 @@ CUDD_CLASSFILE = net/sf/javabdd/CUDDFactory.class CAL_CLASSFILE = net/sf/javabdd/CALFactory.class BUDDY_CLASSNAMES = net.sf.javabdd.BuDDyFactory \ - net.sf.javabdd.BuDDyFactory\$$BuDDyBDD \ - net.sf.javabdd.BuDDyFactory\$$BuDDyBDDPairing + net.sf.javabdd.BuDDyFactory\$$BuDDyPairing CUDD_CLASSNAMES = net.sf.javabdd.CUDDFactory \ net.sf.javabdd.CUDDFactory\$$CUDDBDD \ net.sf.javabdd.CUDDFactory\$$CUDDBDDPairing Modified: trunk/JavaBDD/buddy_jni.c =================================================================== --- trunk/JavaBDD/buddy_jni.c 2006-07-21 14:32:13 UTC (rev 462) +++ trunk/JavaBDD/buddy_jni.c 2006-07-21 16:55:23 UTC (rev 463) @@ -984,10 +984,10 @@ /* * Class: net_sf_javabdd_BuDDyFactory - * Method: nodeCount0 + * Method: nodeCount1 * Signature: ([I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_nodeCount0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_nodeCount1 (JNIEnv *env, jclass cl, jintArray arr) { jint *a; @@ -1116,11 +1116,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: var0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_var0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_var0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1134,11 +1134,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: high0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_high0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_high0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1152,11 +1152,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: low0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_low0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_low0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1169,11 +1169,11 @@ return result;} /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: not0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_not0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_not0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1187,11 +1187,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: ite0 * Signature: (III)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_ite0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_ite0 (JNIEnv *env, jclass cl, jint b, jint c, jint d) { int result; @@ -1205,11 +1205,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: relprod0 * Signature: (III)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_relprod0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_relprod0 (JNIEnv *env, jclass cl, jint b, jint c, jint d) { int result; @@ -1223,11 +1223,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: compose0 * Signature: (III)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_compose0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_compose0 (JNIEnv *env, jclass cl, jint b, jint c, jint v) { int result; @@ -1241,11 +1241,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: constrain0 * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_constrain0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_constrain0 (JNIEnv *env, jclass cl, jint b, jint c) { int result; @@ -1259,11 +1259,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: exist0 * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_exist0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_exist0 (JNIEnv *env, jclass cl, jint b, jint c) { int result; @@ -1277,11 +1277,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: forAll0 * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_forAll0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_forAll0 (JNIEnv *env, jclass cl, jint b, jint c) { int result; @@ -1295,11 +1295,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: unique0 * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_unique0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_unique0 (JNIEnv *env, jclass cl, jint b, jint c) { int result; @@ -1313,11 +1313,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: restrict0 * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_restrict0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_restrict0 (JNIEnv *env, jclass cl, jint b, jint c) { int result; @@ -1331,11 +1331,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: simplify0 * Signature: (II)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_simplify0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_simplify0 (JNIEnv *env, jclass cl, jint b, jint c) { int result; @@ -1349,11 +1349,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: support0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_support0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_support0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1367,11 +1367,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: apply0 * Signature: (III)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_apply0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_apply0 (JNIEnv *env, jclass cl, jint b, jint c, jint operation) { int result; @@ -1385,11 +1385,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: applyAll0 * Signature: (IIII)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_applyAll0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_applyAll0 (JNIEnv *env, jclass cl, jint b, jint c, jint operation, jint d) { int result; @@ -1403,11 +1403,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: applyEx0 * Signature: (IIII)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_applyEx0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_applyEx0 (JNIEnv *env, jclass cl, jint b, jint c, jint operation, jint d) { int result; @@ -1421,11 +1421,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: applyUni0 * Signature: (IIII)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_applyUni0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_applyUni0 (JNIEnv *env, jclass cl, jint b, jint c, jint operation, jint d) { int result; @@ -1439,11 +1439,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: satOne0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_satOne0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_satOne0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1457,11 +1457,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: fullSatOne0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_fullSatOne0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_fullSatOne0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1475,11 +1475,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: satOne1 * Signature: (III)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_satOne1 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_satOne1 (JNIEnv *env, jclass cl, jint b, jint c, jint d) { int result; @@ -1493,11 +1493,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: printSet0 * Signature: (I)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_printSet0 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_printSet0 (JNIEnv *env, jclass cl, jint b) { jnienv = env; @@ -1510,11 +1510,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: printDot0 * Signature: (I)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_printDot0 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_printDot0 (JNIEnv *env, jclass cl, jint b) { jnienv = env; @@ -1527,11 +1527,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: nodeCount0 * Signature: (I)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_nodeCount0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_nodeCount0 (JNIEnv *env, jclass cl, jint b) { int result; @@ -1545,11 +1545,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: pathCount0 * Signature: (I)D */ -JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_pathCount0 +JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_pathCount0 (JNIEnv *env, jclass cl, jint b) { double result; @@ -1563,11 +1563,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: satCount0 * Signature: (I)D */ -JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_satCount0 +JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_satCount0 (JNIEnv *env, jclass cl, jint b) { double result; @@ -1581,11 +1581,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: satCount1 * Signature: (II)D */ -JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_satCount1 +JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_satCount1 (JNIEnv *env, jclass cl, jint b, jint c) { double result; @@ -1599,11 +1599,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: logSatCount0 * Signature: (I)D */ -JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_logSatCount0 +JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_logSatCount0 (JNIEnv *env, jclass cl, jint b) { double result; @@ -1617,11 +1617,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: logSatCount1 * Signature: (II)D */ -JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_logSatCount1 +JNIEXPORT jdouble JNICALL Java_net_sf_javabdd_BuDDyFactory_logSatCount1 (JNIEnv *env, jclass cl, jint b, jint c) { double result; @@ -1635,11 +1635,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: varProfile0 * Signature: (I)[I */ -JNIEXPORT jintArray JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_varProfile0 +JNIEXPORT jintArray JNICALL Java_net_sf_javabdd_BuDDyFactory_varProfile0 (JNIEnv *env, jclass cl, jint b) { jintArray result; @@ -1664,11 +1664,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: addRef * Signature: (I)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_addRef +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_addRef (JNIEnv *env, jclass cl, jint b) { jnienv = env; @@ -1680,11 +1680,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDD + * Class: net_sf_javabdd_BuDDyFactory * Method: delRef * Signature: (I)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_delRef +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_delRef (JNIEnv *env, jclass cl, jint b) { jnienv = env; @@ -1702,7 +1702,7 @@ * Method: veccompose0 * Signature: (IJ)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_veccompose0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_veccompose0 (JNIEnv *env, jclass cl, jint b, jlong pair) { int result; @@ -1722,7 +1722,7 @@ * Method: replace0 * Signature: (IJ)I */ -JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDD_replace0 +JNIEXPORT jint JNICALL Java_net_sf_javabdd_BuDDyFactory_replace0 (JNIEnv *env, jclass cl, jint b, jlong pair) { int result; @@ -1737,14 +1737,14 @@ return result; } -/* class net_sf_javabdd_BuDDyFactory_BuDDyBDDPairing */ +/* class net_sf_javabdd_BuDDyFactory_BuDDyPairing */ /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDDPairing + * Class: net_sf_javabdd_BuDDyFactory_BuDDyPairing * Method: set0 * Signature: (JII)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDDPairing_set0 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyPairing_set0 (JNIEnv *env, jclass cl, jlong pair, jint i, jint j) { bddPair* p; @@ -1758,11 +1758,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDDPairing + * Class: net_sf_javabdd_BuDDyFactory_BuDDyPairing * Method: set1 * Signature: (J[I[I)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDDPairing_set1 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyPairing_set1 (JNIEnv *env, jclass cl, jlong pair, jintArray arr1, jintArray arr2) { jint size1, size2; @@ -1795,11 +1795,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDDPairing + * Class: net_sf_javabdd_BuDDyFactory_BuDDyPairing * Method: set2 * Signature: (JII)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDDPairing_set2 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyPairing_set2 (JNIEnv *env, jclass cl, jlong pair, jint b, jint c) { bddPair* p; @@ -1813,11 +1813,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDDPairing + * Class: net_sf_javabdd_BuDDyFactory_BuDDyPairing * Method: set3 * Signature: (J[I[I)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDDPairing_set3 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyPairing_set3 (JNIEnv *env, jclass cl, jlong pair, jintArray arr1, jintArray arr2) { jint size1, size2; @@ -1850,11 +1850,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDDPairing + * Class: net_sf_javabdd_BuDDyFactory_BuDDyPairing * Method: reset0 * Signature: (J)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDDPairing_reset0 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyPairing_reset0 (JNIEnv *env, jclass cl, jlong pair) { bddPair* p; @@ -1868,11 +1868,11 @@ } /* - * Class: net_sf_javabdd_BuDDyFactory_BuDDyBDDPairing + * Class: net_sf_javabdd_BuDDyFactory_BuDDyPairing * Method: free0 * Signature: (J)V */ -JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyBDDPairing_free0 +JNIEXPORT void JNICALL Java_net_sf_javabdd_BuDDyFactory_00024BuDDyPairing_free0 (JNIEnv *env, jclass cl, jlong pair) { bddPair* p; Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-07-21 14:32:13 UTC (rev 462) +++ trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-07-21 16:55:23 UTC (rev 463) @@ -399,6 +399,19 @@ return makeBDD(zero_impl()); } + public void done() { + if (USE_FINALIZER) { + System.gc(); + System.runFinalization(); + handleDeferredFree(); + } + } + + protected void finalize() throws Throwable { + super.finalize(); + this.done(); + } + protected /*bdd*/int[] to_free = new /*bdd*/int[8]; protected /*bdd*/int to_free_length = 0; public void deferredFree(int v) { Modified: trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java 2006-07-21 14:32:13 UTC (rev 462) +++ trunk/JavaBDD/net/sf/javabdd/BuDDyFactory.java 2006-07-21 16:55:23 UTC (rev 463) @@ -4,9 +4,6 @@ package net.sf.javabdd; import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -26,8 +23,8 @@ * you are _completely_ sure that all BDD objects that reference the old * factory have been freed.</p> * - * <p>If you really need multiple BDD factories, consider using the JavaFactory - * class for the additional BDD factories --- JavaFactory can have multiple + * <p>If you really need multiple BDD factories, consider using the JFactory + * class for the additional BDD factories --- JFactory can have multiple * factory instances active at a time.</p> * * @see net.sf.javabdd.BDDFactory @@ -35,14 +32,10 @@ * @author John Whaley * @version $Id$ */ -public class BuDDyFactory extends BDDFactory { +public class BuDDyFactory extends BDDFactoryIntImpl { public static BDDFactory init(int nodenum, int cachesize) { - BuDDyFactory f; - if (USE_FINALIZER) - f = new BuDDyFactoryWithFinalizer(); - else - f = new BuDDyFactory(); + BuDDyFactory f = new BuDDyFactory(); f.initialize(nodenum, cachesize); return f; } @@ -98,93 +91,128 @@ private BuDDyFactory() {} - private static final boolean USE_FINALIZER = false; + /** An invalid id, for use in invalidating BDDs. */ + static final int INVALID_BDD = -1; - private static class BuDDyFactoryWithFinalizer extends BuDDyFactory { - - /** - * @see java.lang.Object#finalize() - */ - protected void finalize() throws Throwable { - super.finalize(); - this.done(); - } - - } + // Redirection functions. - private static BuDDyBDD makeBDD(int id) { - BuDDyBDD b; - if (USE_FINALIZER) { - b = new BuDDyBDDWithFinalizer(id); - if (false) { // can check for specific id's here. - System.out.println("Created "+System.identityHashCode(b)+" id "+id); - new Exception().printStackTrace(System.out); - } - } else { - b = new BuDDyBDD(id); - } - return b; - } + protected void addref_impl(int v) { addRef(v); } + private static native void addRef(int b); + protected void delref_impl(int v) { delRef(v); } + private static native void delRef(int b); + protected int zero_impl() { return 0; } + protected int one_impl() { return 1; } + protected int invalid_bdd_impl() { return INVALID_BDD; } + protected int var_impl(int v) { return var0(v); } + private static native int var0(int b); + protected int level_impl(int v) { return var2Level0(var0(v)); } + protected int low_impl(int v) { return low0(v); } + private static native int low0(int b); + protected int high_impl(int v) { return high0(v); } + private static native int high0(int b); + protected int ithVar_impl(int var) { return ithVar0(var); } + private static native int ithVar0(int var); + protected int nithVar_impl(int var) { return nithVar0(var); } + private static native int nithVar0(int var); - private static BDDVarSet.DefaultImpl makeBDDVarSet(int id) { - return new BDDVarSet.DefaultImpl(makeBDD(id)); - } + protected int ite_impl(int v1, int v2, int v3) { return ite0(v1, v2, v3); } + private static native int ite0(int b, int c, int d); + protected int apply_impl(int v1, int v2, BDDOp opr) { return apply0(v1, v2, opr.id); } + private static native int apply0(int b, int c, int opr); + protected int not_impl(int v1) { return not0(v1); } + private static native int not0(int b); + protected int applyAll_impl(int v1, int v2, BDDOp opr, int v3) { return applyAll0(v1, v2, opr.id, v3); } + private static native int applyAll0(int b, int c, int opr, int d); + protected int applyEx_impl(int v1, int v2, BDDOp opr, int v3) { return applyEx0(v1, v2, opr.id, v3); } + private static native int applyEx0(int b, int c, int opr, int d); + protected int applyUni_impl(int v1, int v2, BDDOp opr, int v3) { return applyUni0(v1, v2, opr.id, v3); } + private static native int applyUni0(int b, int c, int opr, int d); + protected int compose_impl(int v1, int v2, int var) { return compose0(v1, v2, var); } + private static native int compose0(int b, int c, int var); + protected int constrain_impl(int v1, int v2) { return constrain0(v1, v2); } + private static native int constrain0(int b, int c); + protected int restrict_impl(int v1, int v2) { return restrict0(v1, v2); } + private static native int restrict0(int b, int var); + protected int simplify_impl(int v1, int v2) { return simplify0(v1, v2); } + private static native int simplify0(int b, int d); + protected int support_impl(int v) { return support0(v); } + private static native int support0(int b); + protected int exist_impl(int v1, int v2) { return exist0(v1, v2); } + private static native int exist0(int b, int var); + protected int forAll_impl(int v1, int v2) { return forAll0(v1, v2); } + private static native int forAll0(int b, int var); + protected int unique_impl(int v1, int v2) { return unique0(v1, v2); } + private static native int unique0(int b, int var); + protected int fullSatOne_impl(int v) { return fullSatOne0(v); } + private static native int fullSatOne0(int b); - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#zero() - */ - public BDD zero() { return makeBDD(0); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#one() - */ - public BDD one() { return makeBDD(1); } + protected int replace_impl(int v, BDDPairing p) { return replace0(v, unwrap(p)); } + private static native int replace0(int b, long p); + protected int veccompose_impl(int v, BDDPairing p) { return veccompose0(v, unwrap(p)); } + private static native int veccompose0(int b, long p); - /** - * Converts collection of BuDDyBDD's into an int array, for passing to - * native code. - * - * @param c collection of BuDDyBDD's - * @return int array of indices - */ - private static int[] toBuDDyArray(Collection c) { - int[] a = new int[c.size()]; - int k = 0; - for (Iterator i = c.iterator(); k < a.length; ++k) { - BuDDyBDD b = (BuDDyBDD) i.next(); - a[k] = b._id; - } - return a; - } + protected int nodeCount_impl(int v) { return nodeCount0(v); } + private static native int nodeCount0(int b); + protected double pathCount_impl(int v) { return pathCount0(v); } + private static native double pathCount0(int b); + protected double satCount_impl(int v) { return satCount0(v); } + private static native double satCount0(int b); + protected int satOne_impl(int v) { return satOne0(v); } + private static native int satOne0(int b); + protected int satOne_impl2(int v1, int v2, boolean pol) { return satOne1(v1, v2, pol?1:0); } + private static native int satOne1(int b, int c, int d); + protected int nodeCount_impl2(int[] v) { return nodeCount1(v); } + private static native int nodeCount1(int[] a); + protected int[] varProfile_impl(int v) { return varProfile0(v); } + private static native int[] varProfile0(int b); + protected void printTable_impl(int v) { printTable0(v); } + private static native void printTable0(int b); - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#buildCube(int, java.util.List) - */ - public BDD buildCube(int value, List var) { - int[] a = toBuDDyArray(var); - int id = buildCube0(value, a); - return makeBDD(id); - } - private static native int buildCube0(int value, int[] var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#buildCube(int, int[]) - */ - public BDD buildCube(int value, int[] var) { - int id = buildCube1(value, var); - return makeBDD(id); - } - private static native int buildCube1(int value, int[] var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#makeSet(int[]) - */ - public BDDVarSet makeSet(int[] v) { - int id = makeSet0(v); - return makeBDDVarSet(id); - } - private static native int makeSet0(int[] var); + // More redirection functions. + public void addVarBlock(int first, int last, boolean fixed) { addVarBlock1(first, last, fixed); } + private static native void addVarBlock1(int first, int last, boolean fixed); + public void varBlockAll() { varBlockAll0(); } + private static native void varBlockAll0(); + public void clearVarBlocks() { clearVarBlocks0(); } + private static native void clearVarBlocks0(); + public void printOrder() { printOrder0(); } + private static native void printOrder0(); + public int getNodeTableSize() { return getAllocNum0(); } + private static native int getAllocNum0(); + public int getNodeNum() { return getNodeNum0(); } + private static native int getNodeNum0(); + public int getCacheSize() { return getCacheSize0(); } + private static native int getCacheSize0(); + public int reorderGain() { return reorderGain0(); } + private static native int reorderGain0(); + public void printStat() { printStat0(); } + private static native void printStat0(); + public void printAll() { printAll0(); } + private static native void printAll0(); + public void setVarOrder(int[] neworder) { setVarOrder0(neworder); } + private static native void setVarOrder0(int[] neworder); + public int level2Var(int level) { return level2Var0(level); } + private static native int level2Var0(int level); + public int var2Level(int var) { return var2Level0(var); } + private static native int var2Level0(int var); + public int getReorderTimes() { return getReorderTimes0(); } + private static native int getReorderTimes0(); + public void disableReorder() { disableReorder0(); } + private static native void disableReorder0(); + public void enableReorder() { enableReorder0(); } + private static native void enableReorder0(); + public int reorderVerbose(int v) { return reorderVerbose0(v); } + private static native int reorderVerbose0(int v); + public void reorder(ReorderMethod m) { reorder0(m.id); } + private static native void reorder0(int method); + public void autoReorder(ReorderMethod method) { autoReorder0(method.id); } + private static native void autoReorder0(int method); + public void autoReorder(ReorderMethod method, int max) { autoReorder1(method.id, max); } + private static native void autoReorder1(int method, int max); + public void swapVar(int v1, int v2) { swapVar0(v1, v2); } + private static native void swapVar0(int v1, int v2); + /* (non-Javadoc) * @see net.sf.javabdd.BDDFactory#initialize(int, int) */ @@ -208,27 +236,13 @@ * @see net.sf.javabdd.BDDFactory#done() */ public void done() { - if (USE_FINALIZER) { - System.gc(); - System.runFinalization(); - } + super.done(); INSTANCE = null; done0(); } private static native void done0(); /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#reset() - */ - public void reset() { - if (USE_FINALIZER) { - System.gc(); - System.runFinalization(); - } - super.reset(); - } - - /* (non-Javadoc) * @see net.sf.javabdd.BDDFactory#setError(int) */ public void setError(int code) { @@ -317,78 +331,19 @@ private static native int setVarNum0(int num); /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#duplicateVar(int) - */ - public int duplicateVar(int var) { - return duplicateVar0(var); - } - private static native int duplicateVar0(int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#extVarNum(int) - */ - public int extVarNum(int num) { - return extVarNum0(num); - } - private static native int extVarNum0(int num); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#ithVar(int) - */ - public BDD ithVar(int var) { - int id = ithVar0(var); - return makeBDD(id); - } - private static native int ithVar0(int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#nithVar(int) - */ - public BDD nithVar(int var) { - int id = nithVar0(var); - return makeBDD(id); - } - private static native int nithVar0(int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#swapVar(int, int) - */ - public void swapVar(int v1, int v2) { - swapVar0(v1, v2); - } - private static native void swapVar0(int v1, int v2); - - /* (non-Javadoc) * @see net.sf.javabdd.BDDFactory#makePair() */ public BDDPairing makePair() { long ptr = makePair0(); if (USE_FINALIZER) { - return new BuDDyBDDPairingWithFinalizer(ptr); + return new BuDDyPairingWithFinalizer(ptr); } else { - return new BuDDyBDDPairing(ptr); + return new BuDDyPairing(ptr); } } private static native long makePair0(); /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printAll() - */ - public void printAll() { - printAll0(); - } - private static native void printAll0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printTable(net.sf.javabdd.BDD) - */ - public void printTable(BDD b) { - BuDDyBDD bb = (BuDDyBDD) b; - printTable0(bb._id); - } - private static native void printTable0(int b); - - /* (non-Javadoc) * @see net.sf.javabdd.BDDFactory#load(java.lang.String) */ public BDD load(String filename) { @@ -401,52 +356,11 @@ * @see net.sf.javabdd.BDDFactory#save(java.lang.String, net.sf.javabdd.BDD) */ public void save(String filename, BDD b) { - BuDDyBDD bb = (BuDDyBDD) b; - save0(filename, bb._id); + save0(filename, unwrap(b)); } private static native void save0(String filename, int b); /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#level2Var(int) - */ - public int level2Var(int level) { - return level2Var0(level); - } - private static native int level2Var0(int level); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#var2Level(int) - */ - public int var2Level(int var) { - return var2Level0(var); - } - private static native int var2Level0(int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#reorder(net.sf.javabdd.BDDFactory.ReorderMethod) - */ - public void reorder(BDDFactory.ReorderMethod method) { - reorder0(method.id); - } - private static native void reorder0(int method); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod) - */ - public void autoReorder(BDDFactory.ReorderMethod method) { - autoReorder0(method.id); - } - private static native void autoReorder0(int method); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod, int) - */ - public void autoReorder(BDDFactory.ReorderMethod method, int max) { - autoReorder1(method.id, max); - } - private static native void autoReorder1(int method, int max); - - /* (non-Javadoc) * @see net.sf.javabdd.BDDFactory#getReorderMethod() */ public BDDFactory.ReorderMethod getReorderMethod() { @@ -465,595 +379,18 @@ } private static native int getReorderMethod0(); - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getReorderTimes() - */ - public int getReorderTimes() { - return getReorderTimes0(); + static long unwrap(BDDPairing p) { + return ((BuDDyPairing)p)._ptr; } - private static native int getReorderTimes0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#disableReorder() - */ - public void disableReorder() { - disableReorder0(); - } - private static native void disableReorder0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#enableReorder() - */ - public void enableReorder() { - enableReorder0(); - } - private static native void enableReorder0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#reorderVerbose(int) - */ - public int reorderVerbose(int v) { - return reorderVerbose0(v); - } - private static native int reorderVerbose0(int v); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setVarOrder(int[]) - */ - public void setVarOrder(int[] neworder) { - setVarOrder0(neworder); - } - private static native void setVarOrder0(int[] neworder); /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#addVarBlock(net.sf.javabdd.BDD, boolean) - */ - public void addVarBlock(BDD var, boolean fixed) { - BuDDyBDD bb = (BuDDyBDD) var; - addVarBlock0(bb._id, fixed); - } - private static native void addVarBlock0(int var, boolean fixed); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#addVarBlock(int, int, boolean) - */ - public void addVarBlock(int first, int last, boolean fixed) { - addVarBlock1(first, last, fixed); - } - private static native void addVarBlock1(int first, int last, boolean fixed); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#varBlockAll() - */ - public void varBlockAll() { - varBlockAll0(); - } - private static native void varBlockAll0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#clearVarBlocks() - */ - public void clearVarBlocks() { - clearVarBlocks0(); - } - private static native void clearVarBlocks0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printOrder() - */ - public void printOrder() { - printOrder0(); - } - private static native void printOrder0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#nodeCount(java.util.Collection) - */ - public int nodeCount(Collection r) { - int[] a = toBuDDyArray(r); - return nodeCount0(a); - } - private static native int nodeCount0(int[] a); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getNodeTableSize() - */ - public int getNodeTableSize() { - return getAllocNum0(); - } - private static native int getAllocNum0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getCacheSize() - */ - public int getCacheSize() { - return getCacheSize0(); - } - private static native int getCacheSize0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getNodeNum() - */ - public int getNodeNum() { - return getNodeNum0(); - } - private static native int getNodeNum0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#reorderGain() - */ - public int reorderGain() { - return reorderGain0(); - } - private static native int reorderGain0(); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printStat() - */ - public void printStat() { - printStat0(); - } - private static native void printStat0(); - - /* (non-Javadoc) - * An implementation of a BDD class, used by the BuDDy interface. - */ - private static class BuDDyBDD extends BDD { - - /** The value used by the BDD library. */ - protected int _id; - - /** An invalid id, for use in invalidating BDDs. */ - static final int INVALID_BDD = -1; - - protected BuDDyBDD(int id) { - _id = id; - addRef(_id); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#getFactory() - */ - public BDDFactory getFactory() { - return INSTANCE; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#isZero() - */ - public boolean isZero() { - return _id == 0; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#isOne() - */ - public boolean isOne() { - return _id == 1; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#var() - */ - public int var() { - return var0(_id); - } - private static native int var0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#high() - */ - public BDD high() { - int b = high0(_id); - return makeBDD(b); - } - private static native int high0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#low() - */ - public BDD low() { - int b = low0(_id); - return makeBDD(b); - } - private static native int low0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#id() - */ - public BDD id() { - return makeBDD(_id); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#not() - */ - public BDD not() { - int b = not0(_id); - return makeBDD(b); - } - private static native int not0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#ite(net.sf.javabdd.BDD, net.sf.javabdd.BDD) - */ - public BDD ite(BDD thenBDD, BDD elseBDD) { - BuDDyBDD c = (BuDDyBDD) thenBDD; - BuDDyBDD d = (BuDDyBDD) elseBDD; - int b = ite0(_id, c._id, d._id); - return makeBDD(b); - } - private static native int ite0(int b, int c, int d); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#relprod(net.sf.javabdd.BDD, net.sf.javabdd.BDDVarSet) - */ - public BDD relprod(BDD that, BDDVarSet var) { - BuDDyBDD c = (BuDDyBDD) that; - BuDDyBDD d = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = relprod0(_id, c._id, d._id); - return makeBDD(b); - } - private static native int relprod0(int b, int c, int d); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#compose(net.sf.javabdd.BDD, int) - */ - public BDD compose(BDD that, int var) { - BuDDyBDD c = (BuDDyBDD) that; - int b = compose0(_id, c._id, var); - return makeBDD(b); - } - private static native int compose0(int b, int c, int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#constrain(net.sf.javabdd.BDD) - */ - public BDD constrain(BDD that) { - BuDDyBDD c = (BuDDyBDD) that; - int b = constrain0(_id, c._id); - return makeBDD(b); - } - private static native int constrain0(int b, int c); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#exist(net.sf.javabdd.BDDVarSet) - */ - public BDD exist(BDDVarSet var) { - BuDDyBDD c = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = exist0(_id, c._id); - return makeBDD(b); - } - private static native int exist0(int b, int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#forAll(net.sf.javabdd.BDDVarSet) - */ - public BDD forAll(BDDVarSet var) { - BuDDyBDD c = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = forAll0(_id, c._id); - return makeBDD(b); - } - private static native int forAll0(int b, int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#unique(net.sf.javabdd.BDDVarSet) - */ - public BDD unique(BDDVarSet var) { - BuDDyBDD c = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = unique0(_id, c._id); - return makeBDD(b); - } - private static native int unique0(int b, int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#restrict(net.sf.javabdd.BDD) - */ - public BDD restrict(BDD var) { - BuDDyBDD c = (BuDDyBDD) var; - int b = restrict0(_id, c._id); - return makeBDD(b); - } - private static native int restrict0(int b, int var); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#restrictWith(net.sf.javabdd.BDD) - */ - public BDD restrictWith(BDD var) { - BuDDyBDD c = (BuDDyBDD) var; - int b = restrict0(_id, c._id); - addRef(b); - delRef(_id); - if (this != c) { - delRef(c._id); - c._id = INVALID_BDD; - } - _id = b; - return this; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#simplify(net.sf.javabdd.BDDVarSet) - */ - public BDD simplify(BDDVarSet d) { - BuDDyBDD c = (BuDDyBDD) ((BDDVarSet.DefaultImpl) d).b; - int b = simplify0(_id, c._id); - return makeBDD(b); - } - private static native int simplify0(int b, int d); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#support() - */ - public BDDVarSet support() { - int b = support0(_id); - return makeBDDVarSet(b); - } - private static native int support0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#apply(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp) - */ - public BDD apply(BDD that, BDDFactory.BDDOp opr) { - BuDDyBDD c = (BuDDyBDD) that; - int b = apply0(_id, c._id, opr.id); - return makeBDD(b); - } - private static native int apply0(int b, int c, int opr); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyWith(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp) - */ - public BDD applyWith(BDD that, BDDFactory.BDDOp opr) { - BuDDyBDD c = (BuDDyBDD) that; - int b = apply0(_id, c._id, opr.id); - addRef(b); - delRef(_id); - if (this != c) { - delRef(c._id); - c._id = INVALID_BDD; - } - _id = b; - return this; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyAll(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet) - */ - public BDD applyAll(BDD that, BDDFactory.BDDOp opr, BDDVarSet var) { - BuDDyBDD c = (BuDDyBDD) that; - BuDDyBDD d = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = applyAll0(_id, c._id, opr.id, d._id); - return makeBDD(b); - } - private static native int applyAll0(int b, int c, int opr, int d); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyEx(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet) - */ - public BDD applyEx(BDD that, BDDFactory.BDDOp opr, BDDVarSet var) { - BuDDyBDD c = (BuDDyBDD) that; - BuDDyBDD d = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = applyEx0(_id, c._id, opr.id, d._id); - return makeBDD(b); - } - private static native int applyEx0(int b, int c, int opr, int d); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyUni(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet) - */ - public BDD applyUni(BDD that, BDDFactory.BDDOp opr, BDDVarSet var) { - BuDDyBDD c = (BuDDyBDD) that; - BuDDyBDD d = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = applyUni0(_id, c._id, opr.id, d._id); - return makeBDD(b); - } - private static native int applyUni0(int b, int c, int opr, int d); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#satOne() - */ - public BDD satOne() { - int b = satOne0(_id); - return makeBDD(b); - } - private static native int satOne0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#fullSatOne() - */ - public BDD fullSatOne() { - int b = fullSatOne0(_id); - return makeBDD(b); - } - private static native int fullSatOne0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#satOne(net.sf.javabdd.BDDVarSet, boolean) - */ - public BDD satOne(BDDVarSet var, boolean pol) { - BuDDyBDD c = (BuDDyBDD) ((BDDVarSet.DefaultImpl) var).b; - int b = satOne1(_id, c._id, pol?1:0); - return makeBDD(b); - } - private static native int satOne1(int b, int c, int d); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#printSet() - */ - public void printSet() { - printSet0(_id); - } - private static native void printSet0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#printDot() - */ - public void printDot() { - printDot0(_id); - } - private static native void printDot0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#nodeCount() - */ - public int nodeCount() { - return nodeCount0(_id); - } - private static native int nodeCount0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#pathCount() - */ - public double pathCount() { - return pathCount0(_id); - } - private static native double pathCount0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#satCount() - */ - public double satCount() { - return satCount0(_id); - } - private static native double satCount0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#satCount(net.sf.javabdd.BDDVarSet) - */ - public double satCount(BDDVarSet varset) { - BuDDyBDD c = (BuDDyBDD) ((BDDVarSet.DefaultImpl) varset).b; - return satCount1(_id, c._id); - } - private static native double satCount1(int b, int c); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#logSatCount() - */ - public double logSatCount() { - return logSatCount0(_id); - } - private static native double logSatCount0(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#logSatCount(net.sf.javabdd.BDDVarSet) - */ - public double logSatCount(BDDVarSet varset) { - BuDDyBDD c = (BuDDyBDD) ((BDDVarSet.DefaultImpl) varset).b; - return logSatCount1(_id, c._id); - } - private static native double logSatCount1(int b, int c); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#varProfile() - */ - public int[] varProfile() { - return varProfile0(_id); - } - private static native int[] varProfile0(int b); - - private static native void addRef(int b); - - private static native void delRef(int b); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#free() - */ - public void free() { - if (INSTANCE != null) { - delRef(_id); - } - _id = INVALID_BDD; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#veccompose(net.sf.javabdd.BDDPairing) - */ - public BDD veccompose(BDDPairing pair) { - BuDDyBDDPairing p = (BuDDyBDDPairing) pair; - int b = veccompose0(_id, p._ptr); - return makeBDD(b); - } - private static native int veccompose0(int b, long p); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#replace(net.sf.javabdd.BDDPairing) - */ - public BDD replace(BDDPairing pair) { - BuDDyBDDPairing p = (BuDDyBDDPairing) pair; - int b = replace0(_id, p._ptr); - return makeBDD(b); - } - private static native int replace0(int b, long p); - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#replaceWith(net.sf.javabdd.BDDPairing) - */ - public BDD replaceWith(BDDPairing pair) { - BuDDyBDDPairing p = (BuDDyBDDPairing) pair; - int b = replace0(_id, p._ptr); - addRef(b); - delRef(_id); - _id = b; - return this; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#equals(net.sf.javabdd.BDD) - */ - public boolean equals(BDD that) { - return this._id == ((BuDDyBDD) that)._id; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#hashCode() - */ - public int hashCode() { - return this._id; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#toVarSet() - */ - public BDDVarSet toVarSet() { - return makeBDDVarSet(this._id); - } - - } - - private static class BuDDyBDDWithFinalizer extends BuDDyBDD { - - protected BuDDyBDDWithFinalizer(int id) { - super(id); - } - - /* Finalizer runs in different thread, and BuDDy is not thread-safe. - * Also, the existence of any finalize() method hurts performance - * considerably. - */ - /* (non-Javadoc) - * @see java.lang.Object#finalize() - */ - protected void finalize() throws Throwable { - super.finalize(); - if (_id >= 0) { - System.out.println("BDD not freed! "+System.identityHashCode(this)+" _id "+_id+" nodes: "+nodeCount()); - } - //this.free(); - } - static { - //System.runFinalizersOnExit(true); - } - } - - /* (non-Javadoc) * An implementation of a BDDPairing, used by the BuDDy interface. */ - private static class BuDDyBDDPairing extends BDDPairing { + private static class BuDDyPairing extends BDDPairing { private long _ptr; - private BuDDyBDDPairing(long ptr) { + private BuDDyPairing(long ptr) { this._ptr = ptr; } @@ -1077,8 +414,7 @@ * @see net.sf.javabdd.BDDPairing#set(int, net.sf.javabdd.BDD) */ public void set(int oldvar, BDD newvar) { - BuDDyBDD c = (BuDDyBDD) newvar; - set2(_ptr, oldvar, c._id); + set2(_ptr, oldvar, unwrap(newvar)); } private static native void set2(long p, int oldvar, int newbdd); @@ -1086,8 +422,7 @@ * @see net.sf.javabdd.BDDPairing#set(int[], net.sf.javabdd.BDD[]) */ public void set(int[] oldvar, BDD[] newvar) { - int[] a = toBuDDyArray(Arrays.asList(newvar)); - set3(_ptr, oldvar, a); + set3(_ptr, oldvar, unwrap(Arrays.asList(newvar))); } private static native void set3(long p, int[] oldvar, int[] newbdds); @@ -1110,9 +445,9 @@ } - private static class BuDDyBDDPairingWithFinalizer extends BuDDyBDDPairing { + private static class BuDDyPairingWithFinalizer extends BuDDyPairing { - private BuDDyBDDPairingWithFinalizer(long ptr) { + private BuDDyPairingWithFinalizer(long ptr) { super(ptr); } Modified: trunk/JavaBDD/net/sf/javabdd/JDDFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/JDDFactory.java 2006-07-21 14:32:13 UTC (rev 462) +++ trunk/JavaBDD/net/sf/javabdd/JDDFactory.java 2006-07-21 16:55:23 UTC (rev 463) @@ -208,7 +208,7 @@ return 0; } public boolean isInitialized() { return true; } - public void done() { bdd.cleanup(); bdd = null; } + public void done() { super.done(); bdd.cleanup(); bdd = null; } public void setError(int code) { // todo: implement this } Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-07-21 14:32:13 UTC (rev 462) +++ trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-07-21 16:55:23 UTC (rev 463) @@ -188,7 +188,7 @@ public int setCacheSize(int v) { return bdd_setcachesize(v); } public boolean isZDD() { return ZDD; } public boolean isInitialized() { return bddrunning; } - public void done() { bdd_done(); } + public void done() { super.done(); bdd_done(); } public void setError(int code) { bdderrorcond = code; } public void clearError() { bdderrorcond = 0; } public int setMaxNodeNum(int size) { return bdd_setmaxnodenum(size); } @@ -3075,6 +3075,9 @@ gbc_handler(true, gcstats); } + // Handle nodes that were marked as free by finalizer. + handleDeferredFree(); + for (r = 0; r < bddrefstacktop; r++) bdd_mark(bddrefstack[r]); Modified: trunk/JavaBDD/net/sf/javabdd/MicroFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/MicroFactory.java 2006-07-21 14:32:13 UTC (rev 462) +++ trunk/JavaBDD/net/sf/javabdd/MicroFactory.java 2006-07-21 16:55:23 UTC (rev 463) @@ -188,7 +188,7 @@ public int setNodeTableSize(int size) { return bdd_setallocnum(size); } public int setCacheSize(int v) { return bdd_setcachesize(v); } public boolean isInitialized() { return bddrunning; } - public void done() { bdd_done(); } + public void done() { super.done(); bdd_done(); } public void setError(int code) { bdderrorcond = code; } public void clearError() { bdderrorcond = 0; } public int setMaxNodeNum(int size) { return bdd_setmaxnodenum(size); } @@ -3217,6 +3217,9 @@ gcstats.num = gbcollectnum; gbc_handler(true, gcstats); + // Handle nodes that were marked as free by finalizer. + handleDeferredFree(); + for (r = 0; r < bddrefstacktop; r++) bdd_mark(bddrefstack[r]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. | 
| 
      
      
      From: <joe...@us...> - 2006-07-21 14:32:20
      
     | 
| Revision: 462 Author: joewhaley Date: 2006-07-21 07:32:13 -0700 (Fri, 21 Jul 2006) ViewCVS: http://svn.sourceforge.net/javabdd/?rev=462&view=rev Log Message: ----------- Changed MicroFactory, JDDFactory to use new BDDFactoryIntImpl shared superclass. More bug fixes in the test cases. Now the test cases won't fail if a BDD library doesn't support a (nonessential) operation and throws UnsupportedOperationException. Modified Paths: -------------- trunk/JavaBDD_tests/bdd/BDDTestCase.java trunk/JavaBDD_tests/bdd/BasicTests.java trunk/JavaBDD_tests/bdd/CallbackTests.java trunk/JavaBDD_tests/bdd/IteratorTests.java trunk/JavaBDD_tests/highlevel/NQueensTest.java trunk/JavaBDD_tests/regression/R1.java trunk/JavaBDD_tests/regression/R2.java trunk/JavaBDD_tests/regression/R3.java Modified: trunk/JavaBDD_tests/bdd/BDDTestCase.java =================================================================== --- trunk/JavaBDD_tests/bdd/BDDTestCase.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/bdd/BDDTestCase.java 2006-07-21 14:32:13 UTC (rev 462) @@ -23,9 +23,9 @@ "net.sf.javabdd.JFactory", "net.sf.javabdd.BuDDyFactory", "net.sf.javabdd.MicroFactory", - "net.sf.javabdd.CUDDFactory", + //"net.sf.javabdd.CUDDFactory", //"net.sf.javabdd.CALFactory", - //"net.sf.javabdd.JDDFactory", + "net.sf.javabdd.JDDFactory", }; protected static Collection factories; Modified: trunk/JavaBDD_tests/bdd/BasicTests.java =================================================================== --- trunk/JavaBDD_tests/bdd/BasicTests.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/bdd/BasicTests.java 2006-07-21 14:32:13 UTC (rev 462) @@ -55,7 +55,9 @@ while (hasNext()) { BDDFactory bdd = nextFactory(); if (bdd.varNum() < 5) bdd.setVarNum(5); - bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 }); + try { + bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 }); + } catch (UnsupportedOperationException _) { } BDD a = bdd.ithVar(1); BDD b = bdd.ithVar(2); BDD c = bdd.ithVar(3); @@ -66,11 +68,11 @@ Assert.assertEquals(3, c.var()); try { d.var(); - Assert.fail(); + Assert.fail(bdd.getVersion()); } catch (BDDException x) { } try { e.var(); - Assert.fail(); + Assert.fail(bdd.getVersion()); } catch (BDDException x) { } BDD f = a.and(b); Assert.assertEquals(1, f.var()); @@ -84,7 +86,12 @@ while (hasNext()) { BDDFactory bdd = nextFactory(); if (bdd.varNum() < 5) bdd.setVarNum(5); - bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 }); + try { + bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 }); + } catch (UnsupportedOperationException _) { + System.err.println("Warning: "+bdd.getVersion()+" does not support setVarOrder()"); + continue; + } BDD a = bdd.ithVar(0); BDD b = bdd.ithVar(1); BDD c = bdd.ithVar(2); @@ -116,7 +123,9 @@ while (hasNext()) { BDDFactory bdd = nextFactory(); if (bdd.varNum() < 5) bdd.setVarNum(5); - bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 }); + try { + bdd.setVarOrder(new int[] { 0, 1, 2, 3, 4 }); + } catch (UnsupportedOperationException _) { } BDD a, b, c; a = bdd.ithVar(0); a.andWith(bdd.ithVar(1)); @@ -124,6 +133,16 @@ Assert.assertEquals(0, a.var()); b = a.low(); Assert.assertEquals(true, b.isZero()); + try { + b.low(); + Assert.fail(); + } catch (BDDException _) { + } + try { + b.high(); + Assert.fail(); + } catch (BDDException _) { + } b.free(); b = a.high(); Assert.assertEquals(1, b.var()); @@ -132,6 +151,16 @@ Assert.assertEquals(2, c.var()); b = c.low(); Assert.assertEquals(true, b.isOne()); + try { + b.low(); + Assert.fail(); + } catch (BDDException _) { + } + try { + b.high(); + Assert.fail(); + } catch (BDDException _) { + } a.free(); b.free(); c.free(); } } @@ -318,7 +347,9 @@ while (hasNext()) { BDDFactory bdd = nextFactory(); // TODO: more tests - testApply(bdd, BDDFactory.less, false, true, false, false); + try { + testApply(bdd, BDDFactory.less, false, true, false, false); + } catch (UnsupportedOperationException _) { } } } @@ -328,7 +359,9 @@ while (hasNext()) { BDDFactory bdd = nextFactory(); // TODO: more tests - testApply(bdd, BDDFactory.invimp, true, false, true, true); + try { + testApply(bdd, BDDFactory.invimp, true, false, true, true); + } catch (UnsupportedOperationException _) { } } } @@ -362,12 +395,18 @@ testApplyWith(bdd, BDDFactory.or, false, true, true, true); testApplyWith(bdd, BDDFactory.xor, false, true, true, false); testApplyWith(bdd, BDDFactory.imp, true, true, false, true); - testApplyWith(bdd, BDDFactory.biimp, true, false, false, true); testApplyWith(bdd, BDDFactory.diff, false, false, true, false); - testApplyWith(bdd, BDDFactory.less, false, true, false, false); - testApplyWith(bdd, BDDFactory.invimp, true, false, true, true); testApplyWith(bdd, BDDFactory.nand, true, true, true, false); testApplyWith(bdd, BDDFactory.nor, true, false, false, false); + try { + testApplyWith(bdd, BDDFactory.biimp, true, false, false, true); + } catch (UnsupportedOperationException _) { } + try { + testApplyWith(bdd, BDDFactory.less, false, true, false, false); + } catch (UnsupportedOperationException _) { } + try { + testApplyWith(bdd, BDDFactory.invimp, true, false, true, true); + } catch (UnsupportedOperationException _) { } } } Modified: trunk/JavaBDD_tests/bdd/CallbackTests.java =================================================================== --- trunk/JavaBDD_tests/bdd/CallbackTests.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/bdd/CallbackTests.java 2006-07-21 14:32:13 UTC (rev 462) @@ -45,7 +45,12 @@ Assert.assertTrue(hasNext()); while (hasNext()) { BDDFactory bdd = nextFactory(); - bdd.registerGCCallback(this, m); + try { + bdd.registerGCCallback(this, m); + } catch (UnsupportedOperationException _) { + System.err.println("Warning: "+bdd.getVersion()+" does not support callbacks"); + continue; + } gc_called = 0; final int numBits = 20; final int max = (1 << numBits) - 1; @@ -89,7 +94,12 @@ Assert.assertTrue(hasNext()); while (hasNext()) { BDDFactory bdd = nextFactory(); - bdd.registerReorderCallback(this, m); + try { + bdd.registerReorderCallback(this, m); + } catch (UnsupportedOperationException _) { + System.err.println("Warning: "+bdd.getVersion()+" does not support callbacks"); + continue; + } reorder_called = false; if (bdd.varNum() < 5) bdd.setVarNum(5); //bdd.varBlockAll(); @@ -127,7 +137,12 @@ Assert.assertTrue(hasNext()); while (hasNext()) { BDDFactory bdd = nextFactory(); - bdd.registerResizeCallback(this, m); + try { + bdd.registerResizeCallback(this, m); + } catch (UnsupportedOperationException _) { + System.err.println("Warning: "+bdd.getVersion()+" does not support callbacks"); + continue; + } resize_called = false; int newSize = bdd.getNodeTableSize() * 2; bdd.setNodeTableSize(newSize); Modified: trunk/JavaBDD_tests/bdd/IteratorTests.java =================================================================== --- trunk/JavaBDD_tests/bdd/IteratorTests.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/bdd/IteratorTests.java 2006-07-21 14:32:13 UTC (rev 462) @@ -37,7 +37,7 @@ BDDVarSet var = d.set(); Iterator i = b.iterator(var); b.free(); - Assert.assertEquals(i.hasNext(), false); + Assert.assertEquals(bdd.getVersion(), i.hasNext(), false); try { i.next(); Assert.fail(); @@ -53,18 +53,18 @@ while (i1.hasNext()) { BDD b1 = (BDD) i1.next(); double sc = b1.satCount(var); - Assert.assertEquals(1., sc, 0.0000001); + Assert.assertEquals(bdd.getVersion(), 1., sc, 0.0000001); s1.add(b1); } while (i2.hasNext()) { BDD b2 = (BDD) i2.next(); double sc = b2.satCount(var); - Assert.assertEquals(1., sc, 0.0000001); + Assert.assertEquals(bdd.getVersion(), 1., sc, 0.0000001); s2.add(b2); } var.free(); - Assert.assertEquals(s1.size(), domainSize); - Assert.assertEquals(s2.size(), domainSize); + Assert.assertEquals(bdd.getVersion(), s1.size(), domainSize); + Assert.assertEquals(bdd.getVersion(), s2.size(), domainSize); if (!s1.equals(s2)) { Set s1_minus_s2 = new HashSet(s1); s1_minus_s2.removeAll(s2); @@ -118,13 +118,13 @@ while (i1.hasNext()) { BDD b1 = (BDD) i1.next(); double sc = b1.satCount(var); - Assert.assertEquals(1., sc, 0.0000001); + Assert.assertEquals(bdd.getVersion(), 1., sc, 0.0000001); s1.add(b1); } while (i2.hasNext()) { BDD b2 = (BDD) i2.next(); double sc = b2.satCount(var); - Assert.assertEquals(1., sc, 0.0000001); + Assert.assertEquals(bdd.getVersion(), 1., sc, 0.0000001); s2.add(b2); } var.free(); @@ -133,7 +133,7 @@ s1_minus_s2.removeAll(s2); Set s2_minus_s1 = new HashSet(s2); s2_minus_s1.removeAll(s1); - Assert.fail("iterator() contains these extras: "+s1_minus_s2+"\n"+ + Assert.fail(bdd.getVersion()+": iterator() contains these extras: "+s1_minus_s2+"\n"+ "iterator2() contains these extras: "+s2_minus_s1); } for (Iterator k = s1.iterator(); k.hasNext(); ) { Modified: trunk/JavaBDD_tests/highlevel/NQueensTest.java =================================================================== --- trunk/JavaBDD_tests/highlevel/NQueensTest.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/highlevel/NQueensTest.java 2006-07-21 14:32:13 UTC (rev 462) @@ -34,7 +34,7 @@ for (int i = 1; i <= CHECK; ++i) { NQueens.N = i; double n = NQueens.runTest(); - Assert.assertEquals(n, ANSWERS[i-1], 0.1); + Assert.assertEquals(NQueens.B.getVersion(), n, ANSWERS[i-1], 0.1); NQueens.freeAll(); } } Modified: trunk/JavaBDD_tests/regression/R1.java =================================================================== --- trunk/JavaBDD_tests/regression/R1.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/regression/R1.java 2006-07-21 14:32:13 UTC (rev 462) @@ -31,7 +31,7 @@ double s1 = x.satCount(set); if (bdd.varNum() < 20) bdd.setVarNum(20); double s2 = x.satCount(set); - Assert.assertEquals(bdd.toString(), s1, s2, 0.00001); + Assert.assertEquals(bdd.getVersion(), s1, s2, 0.00001); x.free(); set.free(); } } Modified: trunk/JavaBDD_tests/regression/R2.java =================================================================== --- trunk/JavaBDD_tests/regression/R2.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/regression/R2.java 2006-07-21 14:32:13 UTC (rev 462) @@ -26,12 +26,12 @@ BDDFactory bdd = nextFactory(); BDD zero = bdd.zero(); BDD one = bdd.one(); - Assert.assertTrue(bdd.toString(), zero.isZero()); - Assert.assertTrue(bdd.toString(), one.isOne()); + Assert.assertTrue(bdd.getVersion(), zero.isZero()); + Assert.assertTrue(bdd.getVersion(), one.isOne()); BDDVarSet s0 = zero.support(); BDDVarSet s1 = one.support(); - Assert.assertTrue(bdd.toString(), s0.isEmpty()); - Assert.assertTrue(bdd.toString(), s1.isEmpty()); + Assert.assertTrue(bdd.getVersion(), s0.isEmpty()); + Assert.assertTrue(bdd.getVersion(), s1.isEmpty()); zero.free(); one.free(); s0.free(); s1.free(); } Modified: trunk/JavaBDD_tests/regression/R3.java =================================================================== --- trunk/JavaBDD_tests/regression/R3.java 2006-07-21 14:32:02 UTC (rev 461) +++ trunk/JavaBDD_tests/regression/R3.java 2006-07-21 14:32:13 UTC (rev 462) @@ -35,28 +35,33 @@ one = bdd.one(); or = x0.or(x1); - z0 = or.unique(xs0); + try { + z0 = or.unique(xs0); + } catch (UnsupportedOperationException _) { + System.err.println("Warning: "+bdd.getVersion()+" does not support unique()"); + continue; + } t = x1.not(); - Assert.assertTrue(bdd.getVersion()+": "+z0.toString(), z0.equals(t)); + Assert.assertTrue(bdd.getVersion(), z0.equals(t)); t.free(); z1 = or.unique(xs1); t = x0.not(); - Assert.assertTrue(bdd.getVersion()+": "+z1.toString(), z1.equals(t)); + Assert.assertTrue(bdd.getVersion(), z1.equals(t)); t.free(); t = one.unique(xs0); - Assert.assertTrue(bdd.getVersion()+": "+t.toString(), t.isZero()); + Assert.assertTrue(bdd.getVersion(), t.isZero()); t.free(); y0 = x0.applyUni(x1, BDDFactory.or, xs0); t = x1.not(); - Assert.assertTrue(bdd.getVersion()+": "+y0.toString(), y0.equals(t)); + Assert.assertTrue(bdd.getVersion(), y0.equals(t)); t.free(); y1 = x0.applyUni(x1, BDDFactory.or, xs1); t = x0.not(); - //Assert.assertTrue(bdd.getVersion()+": "+y1.toString(), y1.equals(t)); + //Assert.assertTrue(bdd.getVersion(), y1.equals(t)); t.free(); x0.free(); x1.free(); y0.free(); y1.free(); z0.free(); z1.free(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. | 
| 
      
      
      From: <joe...@us...> - 2006-07-21 14:32:09
      
     | 
| Revision: 461 Author: joewhaley Date: 2006-07-21 07:32:02 -0700 (Fri, 21 Jul 2006) ViewCVS: http://svn.sourceforge.net/javabdd/?rev=461&view=rev Log Message: ----------- Changed MicroFactory, JDDFactory to use new BDDFactoryIntImpl shared superclass. More bug fixes in the test cases. Now the test cases won't fail if a BDD library doesn't support a (nonessential) operation and throws UnsupportedOperationException. Modified Paths: -------------- trunk/JavaBDD/net/sf/javabdd/BDD.java trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java trunk/JavaBDD/net/sf/javabdd/JDDFactory.java trunk/JavaBDD/net/sf/javabdd/JFactory.java trunk/JavaBDD/net/sf/javabdd/MicroFactory.java Modified: trunk/JavaBDD/net/sf/javabdd/BDD.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BDD.java 2006-07-17 16:03:04 UTC (rev 460) +++ trunk/JavaBDD/net/sf/javabdd/BDD.java 2006-07-21 14:32:02 UTC (rev 461) @@ -588,7 +588,8 @@ allsatProfile[useLevel?LEVEL_r:f.level2Var(LEVEL_r)] = lo_empty ? (byte)1 : (byte)0; BDD rn = lo_empty ? r.high() : r.low(); - for (int v = rn.level() - 1; v > LEVEL_r; --v) { + int v = rn.isOne()||rn.isZero() ? f.varNum() - 1 : rn.level() - 1; + for ( ; v > LEVEL_r; --v) { allsatProfile[useLevel?v:f.level2Var(v)] = -1; } if (!lo_empty) { Modified: trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-07-17 16:03:04 UTC (rev 460) +++ trunk/JavaBDD/net/sf/javabdd/BDDFactoryIntImpl.java 2006-07-21 14:32:02 UTC (rev 461) @@ -16,49 +16,49 @@ static final boolean USE_FINALIZER = false; - protected abstract void addref_impl(int v); - protected abstract void delref_impl(int v); - protected abstract int zero_impl(); - protected abstract int one_impl(); - protected abstract int invalid_bdd_impl(); - protected abstract int var_impl(int v); - protected abstract int level_impl(int v); - protected abstract int low_impl(int v); - protected abstract int high_impl(int v); - protected abstract int ithVar_impl(int var); - protected abstract int nithVar_impl(int var); + protected abstract void addref_impl(/*bdd*/int v); + protected abstract void delref_impl(/*bdd*/int v); + protected abstract /*bdd*/int zero_impl(); + protected abstract /*bdd*/int one_impl(); + protected abstract /*bdd*/int invalid_bdd_impl(); + protected abstract int var_impl(/*bdd*/int v); + protected abstract int level_impl(/*bdd*/int v); + protected abstract /*bdd*/int low_impl(/*bdd*/int v); + protected abstract /*bdd*/int high_impl(/*bdd*/int v); + protected abstract /*bdd*/int ithVar_impl(int var); + protected abstract /*bdd*/int nithVar_impl(int var); - protected abstract int ite_impl(int v1, int v2, int v3); - protected abstract int apply_impl(int v1, int v2, BDDOp opr); - protected abstract int not_impl(int v1); - protected abstract int applyAll_impl(int v1, int v2, BDDOp opr, int v3); - protected abstract int applyEx_impl(int v1, int v2, BDDOp opr, int v3); - protected abstract int applyUni_impl(int v1, int v2, BDDOp opr, int v3); - protected abstract int compose_impl(int v1, int v2, int var); - protected abstract int constrain_impl(int v1, int v2); - protected abstract int restrict_impl(int v1, int v2); - protected abstract int simplify_impl(int v1, int v2); - protected abstract int support_impl(int v); - protected abstract int exist_impl(int v1, int v2); - protected abstract int forAll_impl(int v1, int v2); - protected abstract int unique_impl(int v1, int v2); - protected abstract int fullSatOne_impl(int v); + protected abstract /*bdd*/int ite_impl(/*bdd*/int v1, /*bdd*/int v2, /*bdd*/int v3); + protected abstract /*bdd*/int apply_impl(/*bdd*/int v1, /*bdd*/int v2, BDDOp opr); + protected abstract /*bdd*/int not_impl(/*bdd*/int v1); + protected abstract /*bdd*/int applyAll_impl(/*bdd*/int v1, /*bdd*/int v2, BDDOp opr, /*bdd*/int v3); + protected abstract /*bdd*/int applyEx_impl(/*bdd*/int v1, /*bdd*/int v2, BDDOp opr, /*bdd*/int v3); + protected abstract /*bdd*/int applyUni_impl(/*bdd*/int v1, /*bdd*/int v2, BDDOp opr, /*bdd*/int v3); + protected abstract /*bdd*/int compose_impl(/*bdd*/int v1, /*bdd*/int v2, int var); + protected abstract /*bdd*/int constrain_impl(/*bdd*/int v1, /*bdd*/int v2); + protected abstract /*bdd*/int restrict_impl(/*bdd*/int v1, /*bdd*/int v2); + protected abstract /*bdd*/int simplify_impl(/*bdd*/int v1, /*bdd*/int v2); + protected abstract /*bdd*/int support_impl(/*bdd*/int v); + protected abstract /*bdd*/int exist_impl(/*bdd*/int v1, /*bdd*/int v2); + protected abstract /*bdd*/int forAll_impl(/*bdd*/int v1, /*bdd*/int v2); + protected abstract /*bdd*/int unique_impl(/*bdd*/int v1, /*bdd*/int v2); + protected abstract /*bdd*/int fullSatOne_impl(/*bdd*/int v); - protected abstract int replace_impl(int v, BDDPairing p); - protected abstract int veccompose_impl(int v, BDDPairing p); + protected abstract /*bdd*/int replace_impl(/*bdd*/int v, BDDPairing p); + protected abstract /*bdd*/int veccompose_impl(/*bdd*/int v, BDDPairing p); - protected abstract int nodeCount_impl(int v); - protected abstract double pathCount_impl(int v); - protected abstract double satCount_impl(int v); - protected abstract int satOne_impl(int v); - protected abstract int satOne_impl2(int v1, int v2, boolean pol); - protected abstract int nodeCount_impl2(int[] v); - protected abstract int[] varProfile_impl(int v); - protected abstract void printTable_impl(int v); + protected abstract int nodeCount_impl(/*bdd*/int v); + protected abstract double pathCount_impl(/*bdd*/int v); + protected abstract double satCount_impl(/*bdd*/int v); + protected abstract /*bdd*/int satOne_impl(/*bdd*/int v); + protected abstract /*bdd*/int satOne_impl2(/*bdd*/int v1, /*bdd*/int v2, boolean pol); + protected abstract int nodeCount_impl2(/*bdd*/int[] v); + protected abstract int[] varProfile_impl(/*bdd*/int v); + protected abstract void printTable_impl(/*bdd*/int v); public class IntBDD extends BDD { - protected int v; - protected IntBDD(int v) { + protected /*bdd*/int v; + protected IntBDD(/*bdd*/int v) { this.v = v; addref_impl(v); } @@ -75,8 +75,8 @@ return makeBDD(applyUni_impl(v, unwrap(that), opr, unwrap(var))); } public BDD applyWith(BDD that, BDDOp opr) { - int v2 = unwrap(that); - int v3 = apply_impl(v, v2, opr); + /*bdd*/int v2 = unwrap(that); + /*bdd*/int v3 = apply_impl(v, v2, opr); addref_impl(v3); delref_impl(v); if (this != that) @@ -146,7 +146,7 @@ return makeBDD(replace_impl(v, pair)); } public BDD replaceWith(BDDPairing pair) { - int v3 = replace_impl(v, pair); + /*bdd*/int v3 = replace_impl(v, pair); addref_impl(v3); delref_impl(v); v = v3; @@ -156,8 +156,8 @@ return makeBDD(restrict_impl(v, unwrap(var))); } public BDD restrictWith(BDD that) { - int v2 = unwrap(that); - int v3 = restrict_impl(v, v2); + /*bdd*/int v2 = unwrap(that); + /*bdd*/int v3 = restrict_impl(v, v2); addref_impl(v3); delref_impl(v); if (this != that) @@ -198,7 +198,7 @@ } public class IntBDDWithFinalizer extends IntBDD { - protected IntBDDWithFinalizer(int v) { + protected IntBDDWithFinalizer(/*bdd*/int v) { super(v); } @@ -214,19 +214,19 @@ } - protected IntBDD makeBDD(int v) { + protected IntBDD makeBDD(/*bdd*/int v) { if (USE_FINALIZER) return new IntBDDWithFinalizer(v); else return new IntBDD(v); } - protected static final int unwrap(BDD b) { + protected static final /*bdd*/int unwrap(BDD b) { return ((IntBDD) b).v; } - protected static final int[] unwrap(Collection/*<BDD>*/ c) { - int[] result = new int[c.size()]; + protected static final /*bdd*/int[] unwrap(Collection/*<BDD>*/ c) { + /*bdd*/int[] result = new /*bdd*/int[c.size()]; int k = -1; for (Iterator i = c.iterator(); i.hasNext(); ) { result[++k] = ((IntBDD) i.next()).v; @@ -235,8 +235,8 @@ } public class IntBDDVarSet extends BDDVarSet { - int v; - private IntBDDVarSet(int v) { + /*bdd*/int v; + private IntBDDVarSet(/*bdd*/int v) { this.v = v; addref_impl(v); } @@ -260,8 +260,8 @@ return makeBDDVarSet(apply_impl(v, unwrap(b), or)); } public BDDVarSet intersectWith(BDDVarSet b) { - int v2 = unwrap(b); - int v3 = apply_impl(v, v2, or); + /*bdd*/int v2 = unwrap(b); + /*bdd*/int v3 = apply_impl(v, v2, or); addref_impl(v3); delref_impl(v); if (this != b) @@ -274,7 +274,7 @@ } public int size() { int result = 0; - for (int p = v; p != one_impl(); p = high_impl(p)) { + for (/*bdd*/int p = v; p != one_impl(); p = high_impl(p)) { if (p == zero_impl()) throw new BDDException("varset contains zero"); ++result; @@ -284,7 +284,7 @@ public int[] toArray() { int[] result = new int[size()]; int k = -1; - for (int p = v; p != one_impl(); p = high_impl(p)) { + for (/*bdd*/int p = v; p != one_impl(); p = high_impl(p)) { result[++k] = var_impl(p); } return result; @@ -304,14 +304,14 @@ return makeBDDVarSet(apply_impl(v, unwrap(b), and)); } public BDDVarSet union(int var) { - int v2 = ithVar_impl(var); - int v3 = apply_impl(v, v2, and); + /*bdd*/int v2 = ithVar_impl(var); + /*bdd*/int v3 = apply_impl(v, v2, and); delref_impl(v2); return makeBDDVarSet(v3); } public BDDVarSet unionWith(BDDVarSet b) { - int v2 = unwrap(b); - int v3 = apply_impl(v, v2, and); + /*bdd*/int v2 = unwrap(b); + /*bdd*/int v3 = apply_impl(v, v2, and); addref_impl(v3); delref_impl(v); if (this != b) @@ -320,8 +320,8 @@ return this; } public BDDVarSet unionWith(int var) { - int v2 = ithVar_impl(var); - int v3 = apply_impl(v, v2, and); + /*bdd*/int v2 = ithVar_impl(var); + /*bdd*/int v3 = apply_impl(v, v2, and); addref_impl(v3); delref_impl(v); delref_impl(v2); @@ -348,14 +348,14 @@ } - protected IntBDDVarSet makeBDDVarSet(int v) { + protected IntBDDVarSet makeBDDVarSet(/*bdd*/int v) { if (USE_FINALIZER) return new IntBDDVarSetWithFinalizer(v); else return new IntBDDVarSet(v); } - protected static final int unwrap(BDDVarSet b) { + protected static final /*bdd*/int unwrap(BDDVarSet b) { return ((IntBDDVarSet) b).v; } @@ -371,11 +371,11 @@ } - public BDD ithVar(int var) { + public BDD ithVar(/*bdd*/int var) { return makeBDD(ithVar_impl(var)); } - public BDD nithVar(int var) { + public BDD nithVar(/*bdd*/int var) { return makeBDD(nithVar_impl(var)); } @@ -399,12 +399,12 @@ return makeBDD(zero_impl()); } - protected int[] to_free = new int[8]; - protected int to_free_length = 0; + protected /*bdd*/int[] to_free = new /*bdd*/int[8]; + protected /*bdd*/int to_free_length = 0; public void deferredFree(int v) { synchronized(to_free) { if (to_free_length == to_free.length) { - int[] t = new int[to_free.length * 2]; + /*bdd*/int[] t = new /*bdd*/int[to_free.length * 2]; System.arraycopy(to_free, 0, t, 0, to_free.length); to_free = t; } Modified: trunk/JavaBDD/net/sf/javabdd/JDDFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/JDDFactory.java 2006-07-17 16:03:04 UTC (rev 460) +++ trunk/JavaBDD/net/sf/javabdd/JDDFactory.java 2006-07-21 14:32:02 UTC (rev 461) @@ -3,632 +3,257 @@ // Licensed under the terms of the GNU LGPL; see COPYING for details. package net.sf.javabdd; -import java.util.Collection; -import java.math.BigInteger; +import java.lang.reflect.Method; - /** * JDDFactory * * @author John Whaley * @version $Id$ */ -public class JDDFactory extends BDDFactory { +public class JDDFactory extends BDDFactoryIntImpl { - private final jdd.bdd.BDD bdd; - private int[] vars; // indexed by EXTERNAL - private int[] level2var; // internal -> external - private int[] var2level; // external -> internal + public static final String REVISION = "$Revision$"; - private JDDFactory(int nodenum, int cachesize) { - bdd = new jdd.bdd.BDD(nodenum, cachesize); - vars = new int[256]; - jdd.util.Options.verbose = true; + public String getVersion() { + return "JDDFactory "+REVISION.substring(11, REVISION.length()-2); } - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#init(int, int) - */ - public static BDDFactory init(int nodenum, int cachesize) { - BDDFactory f = new JDDFactory(nodenum, cachesize); - return f; + static final int INVALID_BDD = -1; + + // Redirection functions. + + protected void addref_impl(int v) { bdd.ref(v); } + protected void delref_impl(int v) { bdd.deref(v); } + protected int zero_impl() { return bdd.getZero(); } + protected int one_impl() { return bdd.getOne(); } + protected int invalid_bdd_impl() { return INVALID_BDD; } + protected int var_impl(int index) { + int v = level_impl(index); + return level2var != null ? level2var[v] : v; } - - /** - * Wrapper for the BDD index number used internally in the representation. - */ - private class bdd extends BDD { - int _index; - - static final int INVALID_BDD = -1; - - bdd(int index) { - this._index = index; - bdd.ref(_index); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#getFactory() - */ - public BDDFactory getFactory() { - return JDDFactory.this; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#isZero() - */ - public boolean isZero() { - return _index == bdd.getZero(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#isOne() - */ - public boolean isOne() { - return _index == bdd.getOne(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#var() - */ - public int var() { - int v = bdd.getVar(_index); - return level2var != null ? level2var[v] : v; - } - - public int level() { - int v = bdd.getVar(_index); - return v; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#high() - */ - public BDD high() { - return new bdd(bdd.getHigh(_index)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#low() - */ - public BDD low() { - return new bdd(bdd.getLow(_index)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#id() - */ - public BDD id() { - return new bdd(_index); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#not() - */ - public BDD not() { - return new bdd(bdd.not(_index)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#ite(net.sf.javabdd.BDD, net.sf.javabdd.BDD) - */ - public BDD ite(BDD thenBDD, BDD elseBDD) { - int x = _index; - int y = ((bdd) thenBDD)._index; - int z = ((bdd) elseBDD)._index; - return new bdd(bdd.ite(x, y, z)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#relprod(net.sf.javabdd.BDD, net.sf.javabdd.BDDVarSet) - */ - public BDD relprod(BDD that, BDDVarSet var) { - int x = _index; - int y = ((bdd) that)._index; - int z = ((bdd) ((BDDVarSet.DefaultImpl) var).b)._index; - return new bdd(bdd.relProd(x, y, z)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#compose(net.sf.javabdd.BDD, int) - */ - public BDD compose(BDD g, int var) { - int x = _index; - int y = ((bdd) g)._index; - return null; // todo. - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#veccompose(net.sf.javabdd.BDDPairing) - */ - public BDD veccompose(BDDPairing pair) { - int x = _index; - return null; // todo. - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#constrain(net.sf.javabdd.BDD) - */ - public BDD constrain(BDD that) { - int x = _index; - int y = ((bdd) that)._index; - return null; // todo. - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#exist(net.sf.javabdd.BDDVarSet) - */ - public BDD exist(BDDVarSet var) { - int x = _index; - int y = ((bdd) ((BDDVarSet.DefaultImpl) var).b)._index; - return new bdd(bdd.exists(x, y)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#forAll(net.sf.javabdd.BDDVarSet) - */ - public BDD forAll(BDDVarSet var) { - int x = _index; - int y = ((bdd) ((BDDVarSet.DefaultImpl) var).b)._index; - return new bdd(bdd.forall(x, y)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#unique(net.sf.javabdd.BDDVarSet) - */ - public BDD unique(BDDVarSet var) { - int x = _index; - int y = ((bdd) ((BDDVarSet.DefaultImpl) var).b)._index; - return null; // todo. - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#restrict(net.sf.javabdd.BDD) - */ - public BDD restrict(BDD var) { - int x = _index; - int y = ((bdd) var)._index; - return new bdd(bdd.restrict(x, y)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#restrictWith(net.sf.javabdd.BDD) - */ - public BDD restrictWith(BDD that) { - int x = _index; - int y = ((bdd) that)._index; - int a = bdd.restrict(x, y); - //System.out.println("restrictWith("+System.identityHashCode(this)+") "+x+" -> "+a); - bdd.deref(x); - if (this != that) - that.free(); - bdd.deref(a); - this._index = a; - return this; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#simplify(net.sf.javabdd.BDDVarSet) - */ - public BDD simplify(BDDVarSet d) { - int x = _index; - int y = ((bdd) ((BDDVarSet.DefaultImpl) d).b)._index; - return new bdd(bdd.simplify(x, y)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#support() - */ - public BDDVarSet support() { - int x = _index; - return new BDDVarSet.DefaultImpl(new bdd(bdd.support(x))); - } - - private int apply0(int x, int y, int z) { - int r; - switch (z) { - case 0: r = bdd.and(x, y); break; - case 1: r = bdd.xor(x, y); break; - case 2: r = bdd.or(x, y); break; - case 3: r = bdd.nand(x, y); break; - case 4: r = bdd.nor(x, y); break; - case 5: r = bdd.imp(x, y); break; - case 6: r = bdd.biimp(x, y); break; - case 7: r = bdd.and(x, bdd.not(y)); break; // diff - default: - throw new BDDException(); // TODO. - } - return r; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#apply(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp) - */ - public BDD apply(BDD that, BDDOp opr) { - int x = _index; - int y = ((bdd) that)._index; - int z = opr.id; - return new bdd(apply0(x, y, z)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyWith(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp) - */ - public BDD applyWith(BDD that, BDDOp opr) { - int x = _index; - int y = ((bdd) that)._index; - int z = opr.id; - int a = apply0(x, y, z); - bdd.deref(x); - if (this != that) - that.free(); - bdd.ref(a); - this._index = a; - return this; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyAll(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet) - */ - public BDD applyAll(BDD that, BDDOp opr, BDDVarSet var) { - int x = _index; - int y = ((bdd) that)._index; - int z = opr.id; - int a = ((bdd) ((BDDVarSet.DefaultImpl) var).b)._index; - // todo: combine. - int r = apply0(x, y, z); - bdd.ref(r); - int r2 = bdd.forall(r, a); - bdd.deref(r); - return new bdd(r2); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyEx(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet) - */ - public BDD applyEx(BDD that, BDDOp opr, BDDVarSet var) { - int x = _index; - int y = ((bdd) that)._index; - int z = opr.id; - int a = ((bdd) ((BDDVarSet.DefaultImpl) var).b)._index; - // todo: combine. - int r = apply0(x, y, z); - bdd.ref(r); - int r2 = bdd.exists(r, a); - bdd.deref(r); - return new bdd(r2); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#applyUni(net.sf.javabdd.BDD, net.sf.javabdd.BDDFactory.BDDOp, net.sf.javabdd.BDDVarSet) - */ - public BDD applyUni(BDD that, BDDOp opr, BDDVarSet var) { - int x = _index; - int y = ((bdd) that)._index; - int z = opr.id; - int a = ((bdd) ((BDDVarSet.DefaultImpl) var).b)._index; - throw new BDDException(); // todo. - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#satOne() - */ - public BDD satOne() { - int x = _index; - return new bdd(bdd.oneSat(x)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#replace(net.sf.javabdd.BDDPairing) - */ - public BDD replace(BDDPairing pair) { - int x = _index; - return new bdd(bdd.replace(x, ((bddPairing) pair).pairing)); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#replaceWith(net.sf.javabdd.BDDPairing) - */ - public BDD replaceWith(BDDPairing pair) { - int x = _index; - int y = bdd.replace(x, ((bddPairing) pair).pairing); - //System.out.println("replaceWith("+System.identityHashCode(this)+") "+x+" -> "+y); - bdd.deref(x); - bdd.ref(y); - _index = y; - return this; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#nodeCount() - */ - public int nodeCount() { - return bdd.nodeCount(_index); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#satCount() - */ - public double satCount() { - return bdd.satCount(_index); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#equals(net.sf.javabdd.BDD) - */ - public boolean equals(BDD that) { - return this._index == ((bdd) that)._index; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#hashCode() - */ - public int hashCode() { - return _index; - } - - static final boolean USE_FINALIZER = false; - - /** - * @see java.lang.Object#finalize() - */ - /* - protected void finalize() throws Throwable { - super.finalize(); - if (USE_FINALIZER) { - if (false && _index >= 0) { - System.out.println("BDD not freed! "+System.identityHashCode(this)); - } - this.free(); - } - } - */ - - /** - * @see net.sf.javabdd.BDD#free() - */ - public void free() { - bdd.deref(_index); - _index = INVALID_BDD; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#fullSatOne() - */ - public BDD fullSatOne() { + protected int level_impl(int index) { + // NOTE: jdd seems to returns the total number of variables when + // calling getVar() on a terminal. + int v = bdd.getVar(index); + if (index == bdd.getOne() || index == bdd.getZero()) throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#satOne(net.sf.javabdd.BDDVarSet, boolean) - */ - public BDD satOne(BDDVarSet var, boolean pol) { - // TODO Implement this. - throw new UnsupportedOperationException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#pathCount() - */ - public double pathCount() { + if (v == -1) throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#varProfile() - */ - public int[] varProfile() { + return v; + } + protected int low_impl(int v) { + if (v == bdd.getOne() || v == bdd.getZero()) throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDD#toVarSet() - */ - public BDDVarSet toVarSet() { - return new BDDVarSet.DefaultImpl(new bdd(_index)); - } - + return bdd.getLow(v); } - - private class bddPairing extends BDDPairing { - - private int[] from; - private int[] to; - private jdd.bdd.Permutation pairing; - - private bddPairing() { - reset(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDPairing#set(int, int) - */ - public void set(int oldvar, int newvar) { - for (int i = 0; i < from.length; ++i) { - if (from[i] == vars[oldvar]) { - to[i] = vars[newvar]; - pairing = bdd.createPermutation(from, to); - return; - } - } - int[] oldfrom = from; - from = new int[from.length + 1]; - System.arraycopy(oldfrom, 0, from, 0, oldfrom.length); - from[oldfrom.length] = vars[oldvar]; - int[] oldto = to; - to = new int[to.length + 1]; - System.arraycopy(oldto, 0, to, 0, oldto.length); - to[oldto.length] = vars[newvar]; - pairing = bdd.createPermutation(from, to); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDPairing#set(int, net.sf.javabdd.BDD) - */ - public void set(int oldvar, BDD newvar) { + protected int high_impl(int v) { + if (v == bdd.getOne() || v == bdd.getZero()) throw new BDDException(); + return bdd.getHigh(v); + } + protected int ithVar_impl(int var) { + if (var >= bdd.numberOfVariables()) + throw new BDDException(); + return vars[var]; + } + protected int nithVar_impl(int var) { + if (var >= bdd.numberOfVariables()) + throw new BDDException(); + return bdd.not(vars[var]); + } + protected int ite_impl(int v1, int v2, int v3) { return bdd.ite(v1, v2, v3); } + protected int apply_impl(int x, int y, BDDOp opr) { + int r; + switch (opr.id) { + case 0: r = bdd.and(x, y); break; + case 1: r = bdd.xor(x, y); break; + case 2: r = bdd.or(x, y); break; + case 3: r = bdd.nand(x, y); break; + case 4: r = bdd.nor(x, y); break; + case 5: r = bdd.imp(x, y); break; + case 6: r = bdd.biimp(x, y); break; + case 7: r = bdd.and(x, bdd.not(y)); break; // diff + default: + throw new UnsupportedOperationException(); // TODO. } - - public void set(int[] oldvar, int[] newvar) { - int[] oldfrom = from; - from = new int[from.length + oldvar.length]; - System.arraycopy(oldfrom, 0, from, 0, oldfrom.length); - for (int i = 0; i < oldvar.length; ++i) { - from[i + oldfrom.length] = vars[oldvar[i]]; - } - int[] oldto = to; - to = new int[to.length + newvar.length]; - System.arraycopy(oldto, 0, to, 0, oldto.length); - for (int i = 0; i < newvar.length; ++i) { - to[i + oldto.length] = vars[newvar[i]]; - } - //debug(); - pairing = bdd.createPermutation(from, to); + return r; + } + protected int not_impl(int v1) { return bdd.not(v1); } + protected int applyAll_impl(int v1, int v2, BDDOp opr, int v3) { + // todo: combine. + int r = apply_impl(v1, v2, opr); + bdd.ref(r); + int r2 = bdd.forall(r, v3); + bdd.deref(r); + return r2; + } + protected int applyEx_impl(int v1, int v2, BDDOp opr, int v3) { + if (opr == and) + return bdd.relProd(v1, v2, v3); + // todo: combine. + int r = apply_impl(v1, v2, opr); + bdd.ref(r); + int r2 = bdd.exists(r, v3); + bdd.deref(r); + return r2; + } + protected int applyUni_impl(int v1, int v2, BDDOp opr, int v3) { + throw new UnsupportedOperationException(); // todo. + } + protected int compose_impl(int v1, int v2, int var) { + throw new UnsupportedOperationException(); // todo. + } + protected int constrain_impl(int v1, int v2) { + throw new UnsupportedOperationException(); // todo. + } + protected int restrict_impl(int v1, int v2) { return bdd.restrict(v1, v2); } + protected int simplify_impl(int v1, int v2) { return bdd.simplify(v1, v2); } + protected int support_impl(int v) { return bdd.support(v); } + protected int exist_impl(int v1, int v2) { return bdd.exists(v1, v2); } + protected int forAll_impl(int v1, int v2) { return bdd.forall(v1, v2); } + protected int unique_impl(int v1, int v2) { + throw new UnsupportedOperationException(); // todo. + } + protected int fullSatOne_impl(int v) { + if (v == bdd.getZero()) + return v; + int[] res = bdd.oneSat(v, null); + int result = bdd.getOne(); + for (int i = res.length - 1; i >= 0; --i) { + int u; + if (res[i] == 1) + u = bdd.mk(i, 0, result); + else + u = bdd.mk(i, result, 0); + bdd.ref(u); bdd.deref(result); + result = u; } - - void debug() { - for (int i = 0; i < from.length; ++i) { - System.out.println(bdd.getVar(from[i])+" -> "+bdd.getVar(to[i])); + bdd.deref(result); + return result; + } + + protected int replace_impl(int v, BDDPairing p) { return bdd.replace(v, ((bddPairing) p).pairing); } + protected int veccompose_impl(int v, BDDPairing p) { + throw new UnsupportedOperationException(); // todo. + } + + protected int nodeCount_impl(int v) { return bdd.nodeCount(v); } + protected double pathCount_impl(int v) { + throw new UnsupportedOperationException(); // todo. + } + protected double satCount_impl(int v) { return bdd.satCount(v); } + protected int satOne_impl(int v) { return bdd.oneSat(v); } + protected int satOne_impl2(int v1, int v2, boolean pol) { + if (v1 == bdd.getZero()) + return v1; + int[] res = bdd.oneSat(v1, null); + int result = bdd.getOne(); + for (int i = res.length - 1; i >= 0; --i) { + while (bdd.getVar(v2) < i) + v2 = bdd.getHigh(v2); + boolean p; + if (res[i] == 1) p = true; + else if (res[i] == 0) p = false; + else { + if (bdd.getVar(v2) != i) + continue; + p = pol; } + int u = bdd.mk(i, p?0:result, p?result:0); + bdd.ref(u); bdd.deref(result); + result = u; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDPairing#reset() - */ - public void reset() { - from = to = new int[] { }; - pairing = null; - } - + bdd.deref(result); + return result; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#zero() - */ - public BDD zero() { - return new bdd(bdd.getZero()); + protected int nodeCount_impl2(int[] v) { + throw new UnsupportedOperationException(); // todo. } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#one() - */ - public BDD one() { - return new bdd(bdd.getOne()); + protected int[] varProfile_impl(int v) { + throw new UnsupportedOperationException(); // todo. } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#initialize(int, int) - */ - protected void initialize(int nodenum, int cachesize) { - throw new BDDException(); + protected void printTable_impl(int v) { + throw new UnsupportedOperationException(); // todo. } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#isInitialized() - */ - public boolean isInitialized() { - // TODO Auto-generated method stub - return true; + + // More redirection functions. + + protected void initialize(int initnodesize, int cs) { + bdd = new jdd.bdd.BDD(initnodesize, cs); + vars = new int[256]; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#done() - */ - public void done() { - bdd.cleanup(); + public void addVarBlock(int first, int last, boolean fixed) { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setError(int) - */ + public void varBlockAll() { + throw new UnsupportedOperationException(); + } + public void clearVarBlocks() { + throw new UnsupportedOperationException(); + } + public void printOrder() { + throw new UnsupportedOperationException(); + } + public int getNodeTableSize() { + // todo. + return bdd.countRootNodes(); + } + public int setNodeTableSize(int x) { + // TODO. + return getNodeTableSize(); + } + public int setCacheSize(int x) { + // TODO. + return 0; + } + public boolean isInitialized() { return true; } + public void done() { bdd.cleanup(); bdd = null; } public void setError(int code) { - // TODO Implement this. + // todo: implement this } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#clearError() - */ public void clearError() { - // TODO Implement this. + // todo: implement this } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setMaxNodeNum(int) - */ public int setMaxNodeNum(int size) { - // TODO Auto-generated method stub - //throw new BDDException(); + // todo: implement this return 0; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setMinFreeNodes(double) - */ public double setMinFreeNodes(double x) { int old = jdd.util.Configuration.minFreeNodesProcent; jdd.util.Configuration.minFreeNodesProcent = (int)(x * 100); return (double) old / 100.; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setIncreaseFactor(double) - */ - public double setIncreaseFactor(double x) { - // TODO. - return 0.; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setMaxIncrease(int) - */ public int setMaxIncrease(int x) { int old = jdd.util.Configuration.maxNodeIncrease; jdd.util.Configuration.maxNodeIncrease = x; return old; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setNodeTableSize(int) - */ - public int setNodeTableSize(int x) { - // TODO. - return getNodeTableSize(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setCacheSize(int) - */ - public int setCacheSize(int x) { - // TODO. + public double setIncreaseFactor(double x) { + // todo: implement this return 0; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getCacheSize() - */ + public int getNodeNum() { + // todo. + return bdd.countRootNodes(); + } public int getCacheSize() { // TODO Implement this. + return 0; + } + public int reorderGain() { throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setCacheRatio(int) - */ + public void printStat() { + bdd.showStats(); + } public double setCacheRatio(double x) { - // TODO Auto-generated method stub + // TODO Implement this. return 0; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#varNum() - */ public int varNum() { return bdd.numberOfVariables(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setVarNum(int) - */ public int setVarNum(int num) { if (num > Integer.MAX_VALUE / 2) throw new BDDException(); @@ -664,128 +289,13 @@ } return old; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#duplicateVar(int) - */ - public int duplicateVar(int var) { - // TODO Implement this. + public void printAll() { throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#ithVar(int) - */ - public BDD ithVar(int var) { - if (var >= bdd.numberOfVariables()) - throw new BDDException(); - //int v = var2level != null ? var2level[var] : var; - int v = var; - return new bdd(vars[v]); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#nithVar(int) - */ - public BDD nithVar(int var) { - if (var >= bdd.numberOfVariables()) - throw new BDDException(); - //int v = var2level != null ? var2level[var] : var; - int v = var; - return new bdd(bdd.not(vars[v])); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printAll() - */ - public void printAll() { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printTable(net.sf.javabdd.BDD) - */ - public void printTable(BDD b) { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#level2Var(int) - */ - public int level2Var(int level) { - return level2var != null ? level2var[level] : level; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#var2Level(int) - */ - public int var2Level(int var) { - return var2level != null ? var2level[var] : var; - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#reorder(net.sf.javabdd.BDDFactory.ReorderMethod) - */ - public void reorder(ReorderMethod m) { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod) - */ - public void autoReorder(ReorderMethod method) { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#autoReorder(net.sf.javabdd.BDDFactory.ReorderMethod, int) - */ - public void autoReorder(ReorderMethod method, int max) { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getReorderMethod() - */ - public ReorderMethod getReorderMethod() { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getReorderTimes() - */ - public int getReorderTimes() { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#disableReorder() - */ - public void disableReorder() { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#enableReorder() - */ - public void enableReorder() { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#reorderVerbose(int) - */ - public int reorderVerbose(int v) { - throw new BDDException(); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#setVarOrder(int[]) - */ public void setVarOrder(int[] neworder) { - // todo: setting var order corrupts all existing BDD's! + // todo: setting var order corrupts all existing BDDs! if (var2level != null) - throw new BDDException(); + throw new UnsupportedOperationException(); if (bdd.numberOfVariables() != neworder.length) throw new BDDException(); @@ -809,139 +319,149 @@ //System.out.println("Set for domain "+d+": "+d.var.toStringWithDomains()); } } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#addVarBlock(net.sf.javabdd.BDD, boolean) - */ - public void addVarBlock(BDD var, boolean fixed) { - throw new BDDException(); + public int level2Var(int level) { return level2var != null ? level2var[level] : level; } + public int var2Level(int var) { return var2level != null ? var2level[var] : var; } + public ReorderMethod getReorderMethod() { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#addVarBlock(int, int, boolean) - */ - public void addVarBlock(int first, int last, boolean fixed) { - throw new BDDException(); + public int getReorderTimes() { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#varBlockAll() - */ - public void varBlockAll() { - throw new BDDException(); + public void disableReorder() { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#clearVarBlocks() - */ - public void clearVarBlocks() { - throw new BDDException(); + public void enableReorder() { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printOrder() - */ - public void printOrder() { - throw new BDDException(); + public int reorderVerbose(int v) { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#nodeCount(java.util.Collection) - */ - public int nodeCount(Collection r) { - throw new BDDException(); + public void reorder(ReorderMethod m) { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getNodeTableSize() - */ - public int getNodeTableSize() { - // todo. - return bdd.countRootNodes(); + public void autoReorder(ReorderMethod method) { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getNodeNum() - */ - public int getNodeNum() { - // todo. - return bdd.countRootNodes(); + public void autoReorder(ReorderMethod method, int max) { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#reorderGain() - */ - public int reorderGain() { - throw new BDDException(); + public void swapVar(int v1, int v2) { + throw new UnsupportedOperationException(); } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#printStat() - */ - public void printStat() { - bdd.showStats(); + + private jdd.bdd.BDD bdd; + private int[] vars; // indexed by EXTERNAL + private int[] level2var; // internal -> external + private int[] var2level; // external -> internal + + static { + jdd.util.Options.verbose = true; } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#makePair() - */ - public BDDPairing makePair() { - return new bddPairing(); + + private JDDFactory(int nodenum, int cachesize) { + initialize(nodenum, cachesize); } - + /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#swapVar(int, int) + * @see net.sf.javabdd.BDDFactory#init(int, int) */ - public void swapVar(int v1, int v2) { - throw new BDDException(); + public static BDDFactory init(int nodenum, int cachesize) { + BDDFactory f = new JDDFactory(nodenum, cachesize); + return f; } - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#createDomain(int, BigInteger) - */ - protected BDDDomain createDomain(int a, BigInteger b) { - return new bddDomain(a, b); - } - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#createBitVector(int) - */ - protected BDDBitVector createBitVector(int a) { - return new bddBitVector(a); - } - - private class bddDomain extends BDDDomain { - - private bddDomain(int a, BigInteger b) { - super(a, b); + private class bddPairing extends BDDPairing { + + private int[] from; + private int[] to; + private jdd.bdd.Permutation pairing; + + private bddPairing() { + reset(); } - + /* (non-Javadoc) - * @see net.sf.javabdd.BDDBitVector#getFactory() + * @see net.sf.javabdd.BDDPairing#set(int, int) */ - public BDDFactory getFactory() { return JDDFactory.this; } - - } - - private class bddBitVector extends BDDBitVector { - - private bddBitVector(int a) { - super(a); + public void set(int oldvar, int newvar) { + for (int i = 0; i < from.length; ++i) { + if (from[i] == vars[oldvar]) { + to[i] = vars[newvar]; + pairing = bdd.createPermutation(from, to); + return; + } + } + int[] oldfrom = from; + from = new int[from.length + 1]; + System.arraycopy(oldfrom, 0, from, 0, oldfrom.length); + from[oldfrom.length] = vars[oldvar]; + int[] oldto = to; + to = new int[to.length + 1]; + System.arraycopy(oldto, 0, to, 0, oldto.length); + to[oldto.length] = vars[newvar]; + pairing = bdd.createPermutation(from, to); } - + /* (non-Javadoc) - * @see net.sf.javabdd.BDDBitVector#getFactory() + * @see net.sf.javabdd.BDDPairing#set(int, net.sf.javabdd.BDD) */ - public BDDFactory getFactory() { return JDDFactory.this; } - + public void set(int oldvar, BDD newvar) { + throw new UnsupportedOperationException(); + } + + public void set(int[] oldvar, int[] newvar) { + int[] oldfrom = from; + from = new int[from.length + oldvar.length]; + System.arraycopy(oldfrom, 0, from, 0, oldfrom.length); + for (int i = 0; i < oldvar.length; ++i) { + from[i + oldfrom.length] = vars[oldvar[i]]; + } + int[] oldto = to; + to = new int[to.length + newvar.length]; + System.arraycopy(oldto, 0, to, 0, oldto.length); + for (int i = 0; i < newvar.length; ++i) { + to[i + oldto.length] = vars[newvar[i]]; + } + //debug(); + pairing = bdd.createPermutation(from, to); + } + + void debug() { + for (int i = 0; i < from.length; ++i) { + System.out.println(bdd.getVar(from[i])+" -> "+bdd.getVar(to[i])); + } + } + + /* (non-Javadoc) + * @see net.sf.javabdd.BDDPairing#reset() + */ + public void reset() { + from = to = new int[] { }; + pairing = null; + } + } - public static final String REVISION = "$Revision$"; - - /* (non-Javadoc) - * @see net.sf.javabdd.BDDFactory#getVersion() - */ - public String getVersion() { - return "JDD "+REVISION.substring(11, REVISION.length()-2); + public BDDPairing makePair() { + return new bddPairing(); } + + public void registerGCCallback(Object o, Method m) { + throw new UnsupportedOperationException(); + } + public void unregisterGCCallback(Object o, Method m) { + throw new UnsupportedOperationException(); + } + public void registerReorderCallback(Object o, Method m) { + throw new UnsupportedOperationException(); + } + public void unregisterReorderCallback(Object o, Method m) { + throw new UnsupportedOperationException(); + } + public void registerResizeCallback(Object o, Method m) { + throw new UnsupportedOperationException(); + } + public void unregisterResizeCallback(Object o, Method m) { + throw new UnsupportedOperationException(); + } } Modified: trunk/JavaBDD/net/sf/javabdd/JFactory.java =================================================================== --- trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-07-17 16:03:04 UTC (rev 460) +++ trunk/JavaBDD/net/sf/javabdd/JFactory.java 2006-07-21 14:32:02 UTC (rev 461) @@ -28,8 +28,16 @@ */ public class JFactory extends BDDFactoryIntImpl { - static final boolean VERIFY_ASSERTIONS = false; + /**** Options ****/ + + /** + * Flush the operation cache on every garbage collection. If this is false, + * we only clean the collected entries on every GC, rather than emptying the + * whole cache. For most problems, you should keep this set to true. + */ public static boolean FLUSH_CACHE_ON_GC = true; + + static final boolean VERIFY_ASSERTIONS = false; static final boolean CACHESTATS = false; static final boolean SWAPCOUNT = false; @@ -47,11 +55,20 @@ public static BDDFactory init(int nodenum, int cachesize) { BDDFactory f = new JFactory(); f.initialize(nodenum, cachesize); + if (CACHESTATS) addShutdownHook(f); return f; } - public boolean ZDD = false; + static void addShutdownHook(final BDDFactory f) { + Runtime.getRuntime().addShutdownHook(new Thread() { + public void run() { + System.out.println(f.getCacheStats().toString()); + } + }); + } + boolean ZDD = false; + /** * Implementation of BDDPairing used by JFactory. */ @@ -122,7 +139,7 @@ protected void addref_impl(int v) { bdd_addref(v); } protected void delref_impl(int v) { bdd_delref(v); } protected int zero_impl() { return BDDZERO; } - protected int one_impl() {return BDDONE; } + protected int one_impl() { return BDDONE; } protected int invalid_bdd_impl() { return INVALID_BDD; } protected int var_impl(int v) { return bdd_var(v); } protected int level_impl(int v) { return LEVEL(v); } @@ -917,25 +934,20 @@ int bdd_not(int r) { int res; - firstReorder = 1; + int numReorder = 1; CHECKa(r, bddfalse); if (applycache == null) applycache = BddCacheI_init(cachesize); again : for (;;) { try { INITREF(); - - if (firstReorder == 0) - bdd_disable_reorder(); + if (numReorder == 0) bdd_disable_reorder(); res = ZDD ? znot_rec(r) : not_rec(r); - if (firstReorder == 0) - bdd_enable_reorder(); + if (numReorder == 0) bdd_enable_reorder(); } catch (ReorderException x) { bdd_checkreorder(); - if (firstReorder-- == 1) - continue again; - res = bddfalse; - /* avoid warning about res being uninitialized */ + numReorder--; + continue again; } break; } @@ -948,10 +960,8 @@ BddCacheDataI entry; int res; - if (ISZERO(r)) - return bddtrue; - if (ISONE(r)) - return bddfalse; + if (ISCONST(r)) + return 1 - r; entry = BddCache_lookupI(applycache, NOTHASH(r)); @@ -1007,7 +1017,7 @@ int bdd_ite(int f, int g, int h) { int res; - firstReorder = 1; + int numReorder = 1; CHECKa(f, bddfalse); CHECKa(g, bddfalse); @@ -1020,18 +1030,13 @@ try { INITREF(); - if (firstReorder == 0) - bdd_disable_reorder(); + if (numReorder == 0) bdd_disable_reorder(); res = ZDD ? zite_rec(f, g, h) : ite_rec(f, g, h); - if (firstReorder == 0) - bdd_enable_reorder(); + if (numReorder == 0) bdd_enable_reorder(); } catch (ReorderException x) { bdd_checkreorder(); - - if (firstReorder-- == 1) - continue again; - res = BDDZERO; - /* avoid warning about res being uninitialized */ + numReorder--; + continue again; } break; } @@ -1201,7 +1206,7 @@ int bdd_replace(int r, bddPair pair) { int res; - firstReorder = 1; + int numReorder = 1; CHECKa(r, bddfalse); @@ -1214,18 +1219,13 @@ replacelast = pair.last; replaceid = (pair.id << 2) | CACHEID_REPLACE; - if (firstReorder == 0) - bdd_disable_reorder(); + if (numReorder == 0) bdd_disable_reorder(); res = replace_rec(r); - if (firstReorder == 0) - bdd_enable_reorder(); + if (numReorder == 0) bdd_enable_reorder(); } catch (ReorderException x) { bdd_checkreorder(); - - if (firstReorder-- == 1) - continue again; - res = BDDZERO; - /* avoid warning about res being uninitialized */ + numReorder--; + continue again; } break; } @@ -1298,7 +1298,7 @@ int bdd_apply(int l, int r, int op) { int res; - firstReorder = 1; + int numReorder = 1; CHECKa(l, bddfalse); CHECKa(r, bddfalse); @@ -1315,29 +1315,22 @@ INITREF(); applyop = op; - if (firstReorder == 0) - bdd_disable_reorder(); + if (numReorder == 0) bdd_disable_reorder(); switch (op) { case bddop_and: res = ZDD ? zand_rec(l, r) : and_rec(l, r); break; case bddop_or: res = ZDD ? zor_rec(l, r) : or_rec(l, r); break; case bddop_diff: res = ZDD ? zdiff_rec(l, r) : apply_rec(l, r); break; default: res = apply_rec(l, r); break; } - if (firstReorder == 0) - bdd_enable_reorder(); + if (numReorder == 0) bdd_enable_reorder(); } catch (ReorderException x) { bdd_checkreorder(); - - if (firstReorder-- == 1) - continue again; - res = BDDZERO; - /* avoid warning about res being uninitialized */ + numReorder--; + continue again; } break; } - //validate(res); - checkresize(); return res; } @@ -1705,7 +1698,7 @@ int bdd_appex(int l, int r, int opr, int var) { int res; - firstReorder = 1; + int numReorder = 1; CHECKa(l, bddfalse); CHECKa(r, bddfalse); @@ -1734,18 +1727,16 @@ appexid = (var << 5) | (appexop << 1); /* FIXME: range! */ quantid = (appexid << 3) | CACHEID_APPEX; - if (firstReorder == 0) + if (numReorder == 0) bdd_disable_reorder(); res = opr == bddop_and ? relprod_rec(l, r) : appquant_rec(l, r); - if (firstReorder == 0) + if (numReorder == 0) bdd_enable_reorder(); } catch (ReorderException x) { bdd_checkreorder(); - if (firstReorder-- == 1) - continue again; - res = BDDZERO; - /* avoid warning about res being uninitialized */ + numReorder--; + continue again; } break; } @@ -2073,7 +2064,7 @@ int bdd_constrain(int f, int c) { int res; - firstReorder = 1; + int numReorder = 1; CHECKa(f, bddfalse); CHECKa(c, bddfalse); @@ -2085,18 +2076,16 @@ INITREF(); miscid = CACHEID_CONSTRAIN; - if (firstReorder == 0) + if (numReorder == 0) bdd_disable_reorder(); res = constrain_rec(f, c); - if (firstReorder == 0) + if (numReorder == 0) bdd_enable_reorder(); } catch (ReorderException x) { bdd_checkreorder(); - if (firstReorder-- == 1) - continue again; - res = BDDZERO; - /* avoid warning about res being uninitialized */ + numReorder--; + continue again; } break; } @@ -2166,7 +2155,7 @@ int bdd_compose(int f, int g, int var) { int res; - firstReorder = 1; + int numReorder = 1; CHECKa(f, bddfalse); CHECKa(g, bddfalse); @@ -2184,18 +2173,16 @@ composelevel = bddvar2level[var]; replaceid = (composelevel << 2) | CACHEID_COMPOSE; - if (firstReorder == 0) + if (numReorder == 0) bdd_disable_reorder(); res = compose_rec(f, g); - if (fir... [truncated message content] | 
| 
      
      
      From: <joe...@us...> - 2006-07-17 16:03:09
      
     | 
| Revision: 460 Author: joewhaley Date: 2006-07-17 09:03:04 -0700 (Mon, 17 Jul 2006) ViewCVS: http://svn.sourceforge.net/javabdd/?rev=460&view=rev Log Message: ----------- Update maven project files to JavaBDD 2.0. Modified Paths: -------------- trunk/JavaBDD/project.xml Modified: trunk/JavaBDD/project.xml =================================================================== --- trunk/JavaBDD/project.xml 2006-07-17 15:54:24 UTC (rev 459) +++ trunk/JavaBDD/project.xml 2006-07-17 16:03:04 UTC (rev 460) @@ -5,7 +5,7 @@ <name>JavaBDD</name> <groupId>javabdd</groupId> <id>javabdd</id> - <currentVersion>1.0b2</currentVersion> + <currentVersion>2.0</currentVersion> <logo>/images/logo2_mid.jpg</logo> <organization> <name>John Whaley</name> @@ -80,6 +80,11 @@ <name>1.0b2</name> <tag>v1_0b2</tag> </version> + <version> + <id>2.0</id> + <name>2.0</name> + <tag>v2_0</tag> + </version> </versions> <mailingLists> <mailingList> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |