From: John W. <joe...@us...> - 2005-01-29 11:37:32
|
Update of /cvsroot/javabdd/JavaBDD/net/sf/javabdd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11927/net/sf/javabdd Modified Files: JFactory.java BuDDyFactory.java BDDFactory.java Log Message: Added complete support for callbacks, including passing stats objects, etc. Index: BuDDyFactory.java =================================================================== RCS file: /cvsroot/javabdd/JavaBDD/net/sf/javabdd/BuDDyFactory.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** BuDDyFactory.java 19 Oct 2004 21:45:19 -0000 1.6 --- BuDDyFactory.java 29 Jan 2005 11:37:20 -0000 1.7 *************** *** 1143,1155 **** private static void gc_callback(int i) { ! INSTANCE.doCallbacks(INSTANCE.gc_callbacks, i); } private static void reorder_callback(int i) { ! INSTANCE.doCallbacks(INSTANCE.reorder_callbacks, i); } private static void resize_callback(int i, int j) { ! INSTANCE.doCallbacks(INSTANCE.resize_callbacks, i); } } --- 1143,1155 ---- private static void gc_callback(int i) { ! INSTANCE.gbc_handler(i!=0, INSTANCE.gcstats); } private static void reorder_callback(int i) { ! INSTANCE.reorder_handler(i!=0, INSTANCE.reorderstats); } private static void resize_callback(int i, int j) { ! INSTANCE.resize_handler(i, j); } } Index: JFactory.java =================================================================== RCS file: /cvsroot/javabdd/JavaBDD/net/sf/javabdd/JFactory.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** JFactory.java 29 Jan 2005 01:10:33 -0000 1.10 --- JFactory.java 29 Jan 2005 11:37:20 -0000 1.11 *************** *** 2637,2654 **** } - void gbc_handler(boolean pre, GCStats s) { - if (gc_callbacks == null) { - bdd_default_gbchandler(pre, s); - } else { - doCallbacks(gc_callbacks, pre?1:0); - } - } - - void bdd_default_gbchandler(boolean pre, GCStats s) { - if (!pre) { - System.err.println(s.toString()); - } - } - void bdd_gbc_rehash() { int n; --- 2637,2640 ---- *************** *** 3133,3140 **** } - void resize_handler(int oldsize, int newsize) { - super.doCallbacks(resize_callbacks, oldsize); - } - int bdd_noderesize(boolean doRehash) { int oldsize = bddnodesize; --- 3119,3122 ---- *************** *** 3698,3723 **** bddreordertimes = 1; ! if ((top = bddtree_new(-1)) == null) ! return; ! if (reorder_init() < 0) ! return; ! ! usednum_before = bddnodesize - bddfreenum; ! ! top.first = 0; ! top.last = bdd_varnum() - 1; ! top.fixed = false; ! top.next = null; ! top.nextlevel = vartree; ! ! reorder_block(top, method); ! vartree = top.nextlevel; ! free(top); ! ! usednum_after = bddnodesize - bddfreenum; ! ! reorder_done(); ! bddreordermethod = savemethod; ! bddreordertimes = savetimes; } --- 3680,3705 ---- bddreordertimes = 1; ! if ((top = bddtree_new(-1)) != null) { ! if (reorder_init() >= 0) { ! ! usednum_before = bddnodesize - bddfreenum; ! ! top.first = 0; ! top.last = bdd_varnum() - 1; ! top.fixed = false; ! top.next = null; ! top.nextlevel = vartree; ! ! reorder_block(top, method); ! vartree = top.nextlevel; ! free(top); ! ! usednum_after = bddnodesize - bddfreenum; ! ! reorder_done(); ! bddreordermethod = savemethod; ! bddreordertimes = savetimes; ! } ! } } *************** *** 4391,4410 **** return; - //if (reorder_handler != null) - reorder_handler(true); - bdd_reorder(bddreordermethod); bddreordertimes--; - - //if (reorder_handler != null) - reorder_handler(false); - } - - void reorder_handler(boolean b) { - if (reorder_callbacks == null) { - bdd_default_reohandler(b?1:0); - } else { - doCallbacks(reorder_callbacks, b?1:0); - } } --- 4373,4378 ---- *************** *** 4892,4915 **** static long c1; - void bdd_default_reohandler(int prestate) { - - if (verbose > 0) { - if (prestate != 0) { - System.out.println("Start reordering"); - c1 = clock(); - } else { - long c2 = clock(); - System.out.println( - "End reordering. Went from " - + usednum_before - + " to " - + usednum_after - + " nodes (" - + (float) (c2 - c1) / (float) 1000 - + " sec)"); - } - } - } - void bdd_reorder_done() { bddtree_del(vartree); --- 4860,4863 ---- *************** *** 5379,5382 **** --- 5327,5332 ---- int n; + reorder_handler(true, reorderstats); + levels = new levelData[bddvarnum]; *************** *** 5556,5559 **** --- 5506,5511 ---- imatrixDelete(iactmtx); bdd_gbc(); + + reorder_handler(false, reorderstats); } Index: BDDFactory.java =================================================================== RCS file: /cvsroot/javabdd/JavaBDD/net/sf/javabdd/BDDFactory.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** BDDFactory.java 19 Oct 2004 11:11:35 -0000 1.4 --- BDDFactory.java 29 Jan 2005 11:37:20 -0000 1.5 *************** *** 1027,1032 **** public int num; ! private GCStats() { } public String toString() { StringBuffer sb = new StringBuffer(); --- 1027,1035 ---- public int num; ! protected GCStats() { } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ public String toString() { StringBuffer sb = new StringBuffer(); *************** *** 1051,1058 **** * Singleton object for GC statistics. */ ! protected final GCStats gcstats = new GCStats(); /** ! * <p>Return the current GC statistics.</p> * * @return GC statistics --- 1054,1061 ---- * Singleton object for GC statistics. */ ! protected GCStats gcstats = new GCStats(); /** ! * <p>Return the current GC statistics for this BDD factory.</p> * * @return GC statistics *************** *** 1063,1066 **** --- 1066,1118 ---- /** + * Stores statistics about reordering. + * + * @author jwhaley + * @version $Id$ + */ + public static class ReorderStats { + + public long time; + public int usednum_before, usednum_after; + + protected ReorderStats() { } + + public int gain() { + if (usednum_before == 0) + return 0; + + return (100 * (usednum_before - usednum_after)) / usednum_before; + } + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("Went from "); + sb.append(usednum_before); + sb.append(" to "); + sb.append(usednum_after); + sb.append(" nodes, gain = "); + sb.append(gain()); + sb.append("% ("); + sb.append((float) time / 1000f); + sb.append(" sec)"); + return sb.toString(); + } + } + + /** + * Singleton object for reorder statistics. + */ + protected ReorderStats reorderstats = new ReorderStats(); + + /** + * <p>Return the current reordering statistics for this BDD factory.</p> + * + * @return reorder statistics + */ + public ReorderStats getReorderStats() { + return reorderstats; + } + + /** * Stores statistics about the operator cache. * *************** *** 1077,1081 **** public int swapCount; ! private CacheStats() { } void copyFrom(CacheStats that) { --- 1129,1133 ---- public int swapCount; ! protected CacheStats() { } void copyFrom(CacheStats that) { *************** *** 1141,1145 **** * Singleton object for cache statistics. */ ! protected final CacheStats cachestats = new CacheStats(); // TODO: bdd_sizeprobe_hook --- 1193,1206 ---- * Singleton object for cache statistics. */ ! protected CacheStats cachestats = new CacheStats(); ! ! /** ! * <p>Return the current cache statistics for this BDD factory.</p> ! * ! * @return cache statistics ! */ ! public CacheStats getCacheStats() { ! return cachestats; ! } // TODO: bdd_sizeprobe_hook *************** *** 1553,1556 **** --- 1614,1630 ---- /** + * <p>Unregister a garbage collection callback that was previously + * registered.</p> + * + * @param o base object + * @param m method + */ + public void unregisterGCCallback(Object o, Method m) { + if (gc_callbacks == null) throw new BDDException(); + if (!unregisterCallback(gc_callbacks, o, m)) + throw new BDDException(); + } + + /** * <p>Register a callback that is called when reordering is about * to occur.</p> *************** *** 1565,1568 **** --- 1639,1655 ---- /** + * <p>Unregister a reorder callback that was previously + * registered.</p> + * + * @param o base object + * @param m method + */ + public void unregisterReorderCallback(Object o, Method m) { + if (reorder_callbacks == null) throw new BDDException(); + if (!unregisterCallback(reorder_callbacks, o, m)) + throw new BDDException(); + } + + /** * <p>Register a callback that is called when node table resizing is about * to occur.</p> *************** *** 1576,1581 **** } protected void registerCallback(List callbacks, Object o, Method m) { ! if (!m.isAccessible()) { throw new BDDException("Callback method not accessible"); } --- 1663,1740 ---- } + /** + * <p>Unregister a reorder callback that was previously + * registered.</p> + * + * @param o base object + * @param m method + */ + public void unregisterResizeCallback(Object o, Method m) { + if (resize_callbacks == null) throw new BDDException(); + if (!unregisterCallback(resize_callbacks, o, m)) + throw new BDDException(); + } + + protected void gbc_handler(boolean pre, GCStats s) { + if (gc_callbacks == null) { + bdd_default_gbchandler(pre, s); + } else { + doCallbacks(gc_callbacks, new Integer(pre?1:0), s); + } + } + + protected static void bdd_default_gbchandler(boolean pre, GCStats s) { + if (!pre) { + System.err.println(s.toString()); + } + } + + void reorder_handler(boolean b, ReorderStats s) { + if (b) { + s.usednum_before = getNodeNum(); + s.time = System.currentTimeMillis(); + } else { + s.time = System.currentTimeMillis() - s.time; + s.usednum_after = getNodeNum(); + } + if (reorder_callbacks == null) { + bdd_default_reohandler(b, s); + } else { + doCallbacks(reorder_callbacks, new Integer(b?1:0), s); + } + } + + protected void bdd_default_reohandler(boolean prestate, ReorderStats s) { + int verbose = 1; + if (verbose > 0) { + if (prestate) { + System.out.println("Start reordering"); + s.usednum_before = getNodeNum(); + s.time = System.currentTimeMillis(); + } else { + s.time = System.currentTimeMillis() - s.time; + s.usednum_after = getNodeNum(); + System.out.println("End reordering. "+s); + } + } + } + + protected void resize_handler(int oldsize, int newsize) { + if (resize_callbacks == null) { + bdd_default_reshandler(oldsize, newsize); + } else { + doCallbacks(resize_callbacks, new Integer(oldsize), new Integer(newsize)); + } + } + + protected static void bdd_default_reshandler(int oldsize, int newsize) { + int verbose = 1; + if (verbose > 0) { + System.out.println("Resizing node table from "+oldsize+" to "+newsize); + } + } + protected void registerCallback(List callbacks, Object o, Method m) { ! if (!Modifier.isPublic(m.getModifiers()) && !m.isAccessible()) { throw new BDDException("Callback method not accessible"); } *************** *** 1588,1594 **** } } ! Class[] params = m.getParameterTypes(); ! if (params.length != 1 || params[0] != int.class) { ! throw new BDDException("Wrong signature for callback"); } callbacks.add(new Object[] { o, m }); --- 1747,1755 ---- } } ! if (false) { ! Class[] params = m.getParameterTypes(); ! if (params.length != 1 || params[0] != int.class) { ! throw new BDDException("Wrong signature for callback"); ! } } callbacks.add(new Object[] { o, m }); *************** *** 1608,1612 **** } ! protected void doCallbacks(List callbacks, int val) { if (callbacks != null) { for (Iterator i = callbacks.iterator(); i.hasNext(); ) { --- 1769,1773 ---- } ! protected void doCallbacks(List callbacks, Object arg1, Object arg2) { if (callbacks != null) { for (Iterator i = callbacks.iterator(); i.hasNext(); ) { *************** *** 1615,1619 **** Method m = (Method) cb[1]; try { ! m.invoke(o, new Object[] { new Integer(val) } ); } catch (IllegalArgumentException e) { e.printStackTrace(); --- 1776,1792 ---- Method m = (Method) cb[1]; try { ! switch (m.getParameterTypes().length) { ! case 0: ! m.invoke(o, new Object[] { } ); ! break; ! case 1: ! m.invoke(o, new Object[] { arg1 } ); ! break; ! case 2: ! m.invoke(o, new Object[] { arg1, arg2 } ); ! break; ! default: ! throw new BDDException("Wrong number of arguments for "+m); ! } } catch (IllegalArgumentException e) { e.printStackTrace(); |