Cleaned up example_imagesegmentation
[libdai.git] / ChangeLog
index 17dc97e..1d475a5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
-* Renamed RegionGraph::Check_Counting_Numbers into
-  RegionGraph::checkCountingNumbers
-  (and provided an alias for backwards compatibility)
-* Renamed RegionGraph::Calc_Counting_Numbers into
-  RegionGraph::calcCountingNumbers
-  (and provided an alias for backwards compatibility)
-* Renamed Permute::convert_linear_index into Permute::convertLinearIndex
-  (and provided an alias for backwards compatibility)
-* Added examples/example_permute.cpp
-* Added TProb<T>::divided_by(const TProb<T>&) const
-* Fixed bug in BipartiteGraph::eraseEdge()
-* Added python and octave ports for examples/example_sprinkler.cpp
-* [Patrick Pletscher] Added SWIG wrapper code for python and octave
-* Added init parameter to HAK/GBP to allow for random initialization
-* Replaced the standard assert() macro by DAI_ASSERT, which throws a
-  dai::Exception and is even active if NDEBUG is defined
-* Added a constructor TProb<T>::TProb<T>( const std::vector<S> &v )
-* Introduced CCNODEBUGFLAGS in Makefile
+git master HEAD
+---------------
+
+* Added examples/example_imagesegmentation
+* [Ofer Meshi] Added a script for converting from FastInf to libDAI format
+* Made all "verbose" properties optional
+* Unit tests should now also work on WINDOWS
+* [Stefano Pellegrini] Fixed bug in JTree::findMaximum()
+* Fixed some bugs in the MatLab interface build system
+* Fixed a bug in utils/fginfo.cpp
+* Added utils/uai2fg, a utility to convert the UAI inference competition file
+  formats to the libDAI factor graph file format
+* utils/createfg now has a new factor type ('ISINGUNIFORM') and the old
+  'ISING' factor type has been renamed to 'ISINGGAUSS'
+* tests/testdai option "marginals" now has five possible values: NONE
+  outputs no marginals, VAR only variable marginals, FAC only factor
+  marginals, VARFAC both types of marginals, and ALL outputs all
+  marginals calculated by the algorithm.
+* Improved mf.h/cpp:
+  - Added an "init" option that allows to initialize randomly
+  - Added an "updates" option that allows to choose between standard
+    mean field and "hard-spin" mean field
+* Improved exactinf.h/cpp:
+  - Added ExactInf::findMaximum()
+* Improved treeep.h/cpp:
+  - changed TreeEP::construct( const RootedTree& ) into
+    TreeEP::construct( const FactorGraph&, const RootedTree& )
+  - Now also supports disconnected factor graphs
+* Improved jtree.h/cpp:
+  - changed JTree::construct( const std::vector<VarSet>&, bool ) into
+    JTree::construct( const FactorGraph&, const std::vector<VarSet>&, bool )
+  - changed JTree::GenerateJT( const std::vector<VarSet> & )
+    into JTree::GenerateJT( const FactorGraph &, const std::vector<VarSet> & )
+  - Now also supports disconnected factor graphs
+  - Fixed a bug in JTree::findMaximum() and simplified the code
+* Improved regiongraph.h/cpp:
+  - Made (previously public) members RegionGraph::G, RegionGraph::ORs,
+    RegionGraph::IRs and RegionGraph::fac2OR protected.
+  - Removed partial constructor RegionGraph::RegionGraph( const FactorGraph& fg )
+  - Added some error checking code
+  - Renamed RegionGraph::calcCountingNumbers() into
+    RegionGraph::calcCVMCountingNumbers() and made it protected, because
+    exposing it to the world serves no purpose.
+  - Added RegionGraph::DAG() accessor which returns a reference to the 
+    region graph DAG structure (currently implemented as a BipartiteGraph)
+  - Made RegionGraph::RecomputeORs(), RegionGraph::RecomputeORs( const VarSet& )
+    and RegionGraph::RecomputeOR( size_t ) protected and renamed them by changing
+    the "Recompute" into "recompute", because exposing them to the world serves no 
+    purpose.
+  - RegionGraph::WriteToFile( const char* ), RegionGraph::ReadFromFile( const char * )
+    and RegionGraph::printDot( std::ostream& ) incorrectly called their respective
+    FactorGraph ancestor methods; this has been corrected by letting them throw a
+    NOT_IMPLEMENTED exception.
+  - Changed the way a RegionGraph is streamed to an std::ostream.
+* Improved clustergraph.h/cpp:
+  - Made (previously public) members ClusterGraph::G, ClusterGraph::vars and 
+    ClusterGraph::clusters private and added ClusterGraph::bipGraph(), 
+    ClusterGraph::vars() and ClusterGraph::clusters() methods which offer 
+    read-only access to these members.
+  - Deprecated ClusterGraph::toVector()
+  - Added ClusterGraph::nrVars() method
+  - Renamed ClusterGraph::size() method into ClusterGraph::nrClusters()
+  - Added ClusterGraph::var( size_t ) method
+  - Added ClusterGraph::cluster( size_t ) method
+* Improved factorgraph.h/cpp:
+  - FactorGraph::clamped() now contains a delta factor for the clamped variable
+  - Renamed FactorGraph::Cliques() into FactorGraph::maximalFactorDomains()
+    and made it faster
+  - Added FactorGraph::MarkovGraph()
+  - Fixed bug in FactorGraph::clone()
+  - FactorGraph::findVars( const VarSet& ) now returns a SmallSet<size_t>
+    and its argument now has a const-qualifier (which fixes a small bug).
+  - Made (previously public) member FactorGraph::G private and added the 
+    FactorGraph::bipGraph() method, which offers read-only access to it.
+  - Deprecated the iterator interface:
+    o FactorGraph::iterator typedef
+    o FactorGraph::const_iterator typedef
+    o FactorGraph::begin() members
+    o FactorGraph::end() members
+  - Deprecated FactorGraph::factor(size_t) which offered write access to a factor
+    because using this functionality in the descendant RegionGraph is dangerous,
+    as the outer regions are not automatically recomputed.
+* Improved factor.h/cpp:
+  - Fixed bug in min( const TFactor<T> &, const TFactor<T> & )
+  - Fixed bug in max( const TFactor<T> &, const TFactor<T> & )
+  - Added TFactor<T>::takeAbs()
+  - Added TFactor<T>::takeExp()
+  - Added TFactor<T>::takeLog( bool )
+  - Added TFactor<T>::operator-() const
+  - Added TFactor<T>::sumAbs() const
+  - Added TFactor<T>::operator==( const TFactor<T> &y )
+  - Renamed TFactor<T>::states() into TFactor<T>::nrStates()
+  - Added TFactor<T>::get(size_t) and TFactor<T>::set(size_t,T) operators; 
+    get() is equivalent to "operator[](size_t) const" and set() should
+    be used instead of the non-const operator[], which has been deprecated
+* Improved prob.h/cpp:
+  - Deprecated TProb::TProb( TIterator begin, TIterator end, size_t sizeHint=0 )
+    constructor: the sizeHint argument no longer defaults to 0
+  - Deprecated TProb::accumulate( T init, binOp op1, unOp op2 );
+    instead, TProb::accumulateSum( T init, unOp op ) and
+    TProb::accumulateMax( T init, unOp op, bool minimize ) should be used.
+  - Deprecated TProb::NormType and TProb::DistType;
+    ProbNormType and ProbDistType should be used instead.
+  - Added TProb<T>::operator==( const TProb<T> &q )
+  - TProb<T>::accumulate() now also applies op2 to init
+  - Fixed bug by renaming TProb<T>::operator<=() to TProb<T>::operator<()
+  - TProb<T>& operator/= (T x) now yields 0 when dividing by 0
+  - Changed format of TProb<T> when streamed to an ostream
+  - Added TProb<T>::get(size_t) and TProb<T>::set(size_t,T) operators; 
+    get() is equivalent to "operator[](size_t) const" and set() should
+    be used instead of the non-const operator[], which has been deprecated
+  - Added TProb<T>::resize(size_t)
+* Improved index.h/cpp:
+  - Added multifor::reset()
+* Improved properties.h/cpp:
+  - Renamed PropertySet::Set() -> PropertySet::set()
+  - Renamed PropertySet::Get() -> PropertySet::get()
+  - Renamed PropertySet::GetAs<T>() -> PropertySet::getAs<T>()
+  - Renamed PropertySet::ConvertTo<T>() -> PropertySet::convertTo<T>()
+  - Added PropertySet::size()
+  - Added PropertySet::clear()
+  - Added PropertySet::erase()
+  - Fixed bug in PropertySet::setAsString<T>()
+* Improved util.h/cpp:
+  - Added std::string toString( const T& x )
+  - Fixed a bug in rnd_seed()
+  - Removed max( const std::vector<Real> &v )
+* Improved weightedgraph.h/cpp:
+  - Renamed MaxSpanningTreePrims into MaxSpanningTree
+  - Renamed MinSpanningTreePrims into MinSpanningTree
+  - Added option to MaxSpanningTree and MinSpanningTree for
+    choosing between Prim's algorithm and Kruskal's algorithm
+  - Better error checking in RootedTree constructor
+  - The vertices in DEdge and UEdge are now named "first" and "second"
+    for compatibility with a std::pair<size_t,size_t>
+  - Added GraphEL::GraphEL( const GraphAL& G ) constructor
+* Improved bipgraph.h/cpp:
+  - Fixed bug in BipartiteGraph::eraseNode1()
+  - Fixed bug in BipartiteGraph::eraseNode2()
+  - Fixed bug in BipartiteGraph::isTree()
+  - Added BipartiteGraph::hasEdge()
+  - Added BipartiteGraph::findNb1()
+  - Added BipartiteGraph::findNb2()
+  - Added BipartiteGraph::nb1Set()
+  - Added BipartiteGraph::nb2Set()
+  - BipartiteGraph::delta1() and BipartiteGraph::delta2() now 
+    return a SmallSet<size_t> instead of a vector<size_t>
+  - Added BipartiteGraph::operator==( const BipartiteGraph& )
+  - Added BipartiteGraph( size_t nr1, size_t nr2 ) constructor
+  - Added operator<<( std::ostream&, const BipartiteGraph& )
+* Improved graph.h/cpp:
+  - Fixed bug in GraphAL::nrEdges()
+  - Fixed bug in GraphAL::addEdge()
+  - Fixed bug in GraphAL::isTree()
+  - Fixed bug in GraphAL::eraseNode()
+  - Fixed bug in GraphAL::printDot()
+  - Fixed bug in createGraphGrid3D()
+  - Fixed bug in createGraphRegular()
+  - Added GraphAL::hasEdge(size_t,size_t)
+  - Added GraphAL::operator==( const GraphAL& )
+  - Added operator<<( std::ostream&, const GraphAL& )
+* Improved smallset.h/cpp:
+  - The sizeHint argument of the iterator constructor
+     SmallSet::SmallSet( TIterator begin, TIterator end, size_t sizeHint=0 )
+    no longer has a default value in order to avoid confusion with the
+     SmallSet::SmallSet( const T &t1, const T &t2 )
+    constructor.
+  - Added SmallSet::insert( const T& t ) method
+* Removed RandomDRegularGraph(), please use createGraphRegular() instead
+* Compressed Makefile
+* Added unit tests for var, smallset, varset, graph, bipgraph,
+  weightedgraph, enum, util, exceptions, properties, index, prob, 
+  factor, factorgraph, clustergraph, regiongraph, daialg, alldai
+* Added unit testing framework
+* Added initialization of TRWBP weights by sampling spanning trees
+* Cleaned up MR code:
+  - rewrote response propagation implementation with help of BBP
+  - now uses GraphAL to represent the Markov graph
+  - miscellaneous smaller cleanups
+* Fixed bug in BBPCostFunction::operator=() which prevented the desired 
+  assignment from happening
+* [Stefano Pellegrini] Fixed bug in BP[logdomain=1,inference=MAXPROD]
+* Removed deprecated functionality
+* Updated ChangeLog for libDAI-0.2.4 (forgot a few entries)
+
+
+libDAI-0.2.4 (2010-02-11)
+-------------------------
+
+New features:
+* Implemented Tree-Reweighted BP
+* [Frederik Eaton] Implemented Fractional Belief Propagation
+
+Miscellaneous improvements:
+* Improved documentation
+* [Frederik Eaton] Added constructors for BBPCostFunction
+* [Frederik Eaton] Added accessor/mutator for the elements of a SmallSet<>
+* [Frederik Eaton] Added unary minus to TProb<>
+* [Frederik Eaton] Added Hellinger distance to TProb<>::DistType
+* [Frederik Eaton] Two small patches for src/jtree.cpp and utils/createfg.cpp
+* tests/testdai option "marginals" now has three possible values: NONE
+  outputs no marginals, VAR only variable marginals, and ALL outputs all
+  marginals calculated by the algorithm.
+* Strengthened convergence criteria of various algorithms
+* Added GraphAL, an adjacency list implementation for graphs,
+  similar to (but simpler than) BipartiteGraph
+* Added some functionality to create various standard factors
+  (the functions whose names start with "createFactor")
+* Added examples example_sprinkler_gibbs and example_sprinkler_em
+* Implemented various heuristics for choosing a variable elimination sequence 
+  in JTree
+* Added BETHE method for GBP/HAK cluster choice
+* Made alias support official part of the library
+
+Build system:
+* Moved platform independent build options into Makefile.ALL
+* Windows platform now needs Boost 1.37 or higher
+
+Code cleanup:
+* Cleaned up utils/createfg and tests/testdai
+* Cleanup of some duplicate code in BP, FBP, TRWBP
+
+Interface changes (the old interface is marked obsolete and will be removed in the next release):
+* Removed obsolete/deprecated stuff
+* Renamed Graph into GraphEL (for Graph, implemented as Edge List)
+* Renamed some functions of BipartiteGraph:
+    add1() -> addNode1()
+    erase1() -> eraseNode1()
+    nr1() -> nrNodes1()
+    add2() -> addNode2()
+    erase2() -> eraseNode2()
+    nr2() -> nrNodes2()
+* Renamed some functions in ClusterGraph:
+    ClusterGraph::eliminationCost() -> ::eliminationCost_MinFill() 
+    ClusterGraph::VarElim() -> ClusterGraph::VarElim( sequentialVariableElimination( ElimSeq ) ) 
+    ClusterGraph::VarElim_MinFill() -> ClusterGraph::VarElim( greedyVariableElimination( eliminationCost_MinFill ) )
+* Changed interface of one RegionGraph constructor
+* Renamed "Clamped BP" into "Conditioned BP"
+
+Bug fixes:
+* Fixed regression in scripts/regenerate-properties (now all errors are 
+  gathered before throwing the exception, as used to be the case)
+* Fixed FTBFS errors on MACOSX (thanks to Sebastian Riedel for reporting this bug)
+* [Alexander Schwing] Fixed error in BP that occured with damping
+  and using log-domain updates
+* Fixed bug in HAK for trivial region graphs (with only one outer region
+  and no inner regions), reported by Alejandro Lage.
+* Fixed long-standing bug in TreeEP (now, within-loop propagation optimization works)
+
+
+libDAI-0.2.3 (2009-11-16)
+-------------------------
+
+New features:
+* Complete doxygen documentation (although more detailed documentation still
+  has to be written)
+* [Charles Vaske] Added parameter learning for conditional probabilities by 
+  Expectation Maximization
+* [Patrick Pletscher] Added SWIG wrapper code for experimental python and 
+  octave interfaces
+* Added Max-Product functionality to JTree
+* [Frederik Eaton] Added Back-Belief-Propagation
+* [Frederik Eaton] Added approximate inference method "Clamped Belief Propagation"
+* [Frederik Eaton] Added approximate inference method "Gibbs sampling"
+
+Code cleanup:
 * Updated copyright headers
 * Updated copyright headers
-* Added max-product functionality to JTree
-* [Charlie Vaske] EM bugfix (was using abs() instead of fabs() in 
-  determining EM termination, which caused a loss of precision).
-* [Charlie Vaske] New constructor in Permute for canonical variable ordering
-* [Charlie Vaske] New constructor in Factor that reorders variables to canonical ordering
-* [Charlie Vaske] New accessor in Properties for getting all keys
-* [Charlie Vaske] New function for getting inferred parameters
 * Cleaned up error handling by introducing the DAI_THROWE macro
 * Introduced DAI_DEBASSERT macro to abbreviate a common pattern
 * Cleaned up error handling by introducing the DAI_THROWE macro
 * Introduced DAI_DEBASSERT macro to abbreviate a common pattern
-* Changed FactorGraph::clamp and DAIAlg::clamp interfaces (the variable to be
-  clamped is now indicated by its index, not as a Var) and marked the old
-  interface as obsolete
-* [Patrick Pletscher] Fixed performance issue in FactorGraph::clamp
-* [Sebastian Nowozin] MEX file dai now also optionally returns the MAP state
-  (only for BP)
-* [Sebastian Nowozin] Fixed memory leak in MEX file dai
+* Replaced the standard assert() macro by DAI_ASSERT, which throws a
+  dai::Exception and is even active if NDEBUG is defined
+* Removed all the virtual default constructors *::create(), as they are not used
+* [Frederik Eaton] Removed unnecessary copy constructors and assignment operators
+* [Frederik Eaton] Change cout to cerr in warnings and error messages
 
 
-git ae0fc30e10be6683cbfc209dcee56f34234a6cb8
---------------------------------------------
-* Added work-around for bug in Boost Graph Library
-* Improvements of TFactor<T>:
+Miscellaneous improvements:
+* BipartiteGraph:
+  - Added eraseEdge( size_t n1, size_t n2 )
+  - [Frederik Eaton] Improved documentation of Neighbor
+* TProb<T>:
+  - Added divided_by(const TProb<T>&) const
+  - Added constructor TProb<T>( const std::vector<S> &v )
+  - Added size_t draw(), which draws a random index
+  - [Frederik Eaton] Added setUniform()
+  - [Frederik Eaton] Added sumAbs()
+  - [Frederik Eaton] Added argmax()
+  - [Giuseppe Passino] Added begin(), end()
+* TFactor<T>:
+  - [Giuseppe Passino] Added begin(), end()
+  - [Charles Vaske] Added TFactor( const std::vector<Var> &vars, const std::vector<T> &p ),
+    which reorders variables to canonical ordering before storing the table
+  - Added constructor TFactor<T>( const VarSet &vars, const std::vector<S> &v )
   - Extended functionality of TFactor<T>::operators +,-,+=,-= to handle different VarSets
   - Added TFactor<T>::maxMarginal (similar to marginal but with max instead of sum)
   - Extended functionality of TFactor<T>::operators +,-,+=,-= to handle different VarSets
   - Added TFactor<T>::maxMarginal (similar to marginal but with max instead of sum)
-* Added BipartiteGraph::eraseEdge
-* Removed all the virtual default constructors *::create(), as they are not used.
-* Fixed bug in MaxSpanningTree (it wrongly assumed that the tree was not empty).
-* [Charlie Vaske] Added Expectation Maximization code.
-* Added MatLab QuickStart to README.
-* MEX file dai now also returns variable and factor beliefs.
-* Cleanups and extra documentation of the code contributed by Frederik Eaton
-* Removed erroneous 'inline' directives in gibbs.cpp
+* State:
+  - [Giuseppe Passino] Added prefix ++ operator
+* Permute:
+  - [Charles Vaske] Added constructor in Permute for canonical variable ordering
+* FactorGraph:
+  - [Frederik Eaton] Added clampVar()
+  - [Frederik Eaton] Added clampFactor()
+  - [Giuseppe Passino] Added begin(), end()
+* PropertySet:
+  - Added keys(), for getting all keys
+  - [Frederik Eaton] Added default constructor
+  - [Frederik Eaton] Added constructor from string
+* InfAlg:
+  - Added setProperties(), getProperties() and printProperties()
+  - [Frederik Eaton] Added beliefV(), beliefF()
+* ExactInf:
+  - Added calcMarginal(const VarSet &)
+* HAK:
+  - Added "init" parameter to allow for random initialization
+* BP:
+  - [Giuseppe Passino] Added findMaximum(), which can be used after running
+    max-product BP to construct a global state with maximum probability
+* JTree:
+  - Added findMaximum(), which can be used after running
+    max-product JTree to construct a global state with maximum probability
+* MatLab interface:
+  - MEX file dai now also returns variable and factor beliefs
+  - [Sebastian Nowozin] MEX file dai now also optionally returns the MAP state
+    (only for BP and JTree)
+* README is now created automatically from doxygen documentation
 * [Frederik Eaton] Added script for automatically generating properties code (used by CBP and BBP)
 * [Frederik Eaton] Added script for automatically generating properties code (used by CBP and BBP)
-* [Frederik Eaton] Updated doxygen.conf to version 1.5.9
 * [Frederik Eaton] Added newInfAlgFromString to alldai.h/cpp
 * [Frederik Eaton] Added newInfAlgFromString to alldai.h/cpp
-* [Frederik Eaton] Added FactorGraph::clampVar and FactorGraph::clampFactor
-* [Frederik Eaton] Changed BP to be able to record order in which messages are sent (for use by BBP)
-* [Frederik Eaton] Improved documentation of BipartiteGraph::Neighbor
-* [Frederik Eaton]: Extended InfAlg interface with beliefV() and beliefF() methods;
-* [Frederik Eaton]: Improved PropertySet class:
-  - Added default constructor
-  - Allow construction from string
-  - Added method allKeys() to produce list of keys
-  - In getStringAs(), check for typeid(ValueType) before typeid(std::string)
-    (this fixes a strange bug for empty string property)
-* [Frederik Eaton]: Added some utility macros (DAI_PV, DAI_DMSG, DAI_ACCMUT, DAI_IFVERB)
-  and functions (concat(),rnd()) to include/dai/util.h
-* [Frederik Eaton] Added backwards compatibility layer for edge interface to
-  BipartiteGraph and FactorGraph (which will be obsoleted soon)
-* [Frederik Eaton] Added BP_dual, BBP and CBP algorithms
-* [Frederik Eaton] Added Gibbs::state() accessors/mutators
-* [Frederik Eaton] Fixed Gibbs::getVarDist(size_t) to return uniform
-  distribution if no state is allowed
+* [Frederik Eaton] Added some utility macros (DAI_PV, DAI_DMSG, DAI_IFVERB)
+  and functions (concat(),rnd()) to util.h
+* Changed output stream operator<< for Var and VarSet
 * [Frederik Eaton] Improved parsing code in tests/testdai to allow recursive
   alias substitutions
 * [Frederik Eaton] Improved parsing code in tests/testdai to allow recursive
   alias substitutions
-* Interface changes:
-    TProb<T>::minVal()     -> TProb<T>::min()
-    TFactor<T>::minVal()   -> TFactor<T>::min()
-    TProb<T>::maxVal()     -> TProb<T>::max()
-    TFactor<T>::maxVal()   -> TFactor<T>::max()
-    TProb<T>::totalSum()   -> TProb<T>sum()
-    TFactor<T>::totalSum() -> TFactor<T>::sum()
-* [Frederik Eaton] Added methods setUniform (), sumAbs(), argmax() to TProb<T>
-* [Frederik Eaton] Added TAGS, lib targets to Makefile
-* [Frederik Eaton] Add useful aliases to aliases.conf
-* [Frederik Eaton] Removed unnecessary copy constructors and assignment
-  operators
-* [Frederik Eaton] Change cout to cerr in warnings and error messages
+* [Frederik Eaton] Added useful aliases to aliases.conf
 * [Giuseppe Passino] Optimised maximum-residual BP by using a reversed ordered
   set instead of the linear search (which can yield enormous speedups - a
   factor 500 has been measured on a binary Ising grid with 128x128 variables!)
 * Added debug assertions to Var which check for inconsistent dimensions of
   variables with the same labels
 * [Giuseppe Passino] Optimised maximum-residual BP by using a reversed ordered
   set instead of the linear search (which can yield enormous speedups - a
   factor 500 has been measured on a binary Ising grid with 128x128 variables!)
 * Added debug assertions to Var which check for inconsistent dimensions of
   variables with the same labels
-* [Giuseppe Passino] Added prefix ++ operator to State (State::operator++())
-* [Giuseppe Passino] Added iterators to FactorGraph (FactorGraph::begin,
-  FactorGraph::end)
-* [Giuseppe Passino] Added iterators to TFactor (TFactor::begin, TFactor::end)
-* [Giuseppe Passino] Added iterators to TProb (TProb::begin, TProb::end)
-* [Giuseppe Passino] Added BP::findMaximum(), which can be used after running
-  max-product BP to construct a global state with maximum probability
-* Improved Makefile (libDAI now also builds out-of-the-box on MacOSX,
-  thanks to Dan Preston; merged Makefile.win and Makefile.shared into Makefile)
-* Fixed bug in calcMarginal, calcPairBeliefs, calcPairBeliefsNew where
-  states with zero probability mass were clamped, leading to NaNs or assertion
-  errors (thanks to Dan Preston for reporting this)
 * toc() now returns POSIX system time with maximum accuracy of microseconds
 * Exception objects now remember their error code
 * toc() now returns POSIX system time with maximum accuracy of microseconds
 * Exception objects now remember their error code
-* Added examples/example_sprinkler.cpp
-* [Peter Gober] Made libDAI build out-of-the-box on Cygwin.
-* [Frederik Eaton] Added Gibbs sampler to algorithms
-* Improved documentation of include/dai/{bipgraph.h, prob.h, smallset.h,
-  var.h, varset.h, factor.h, enum.h} and of examples/example.cpp
-  Merged TODO and FILEFORMAT into doxygen documentation
-* examples/
+* Examples:
   - Moved example.cpp to examples/
   - Added examples/example_bipgraph.cpp
   - Added examples/example_varset.cpp
   - Moved example.cpp to examples/
   - Added examples/example_bipgraph.cpp
   - Added examples/example_varset.cpp
-* Interface changes:
-  - Replaced TProb<T>::log0() by TProb<T>::log(true)
-  - Replaced TProb<T>::takeLog0() by TProb<T>::takeLog(true)
-  - Replaced TFactor<T>::log0() by TFactor<T>::log(true)
-  - Removed TProb<T>::hasNonPositives()
-  - Renamed smallSet<T> to SmallSet<T>
-  - Removed TFactor<T>::divided_by, use operator/ instead
-  - Removed TFactor<T>::divide, use operator/= instead
-  - Removed TFactor<T>::partSum(const VarSet&), use marginal(const VarSet&,true) instead
-  - Improved constructors of TProb and TFactor to use iterators instead of pointers
-* Miscellaneous small changes and cleanups:
-  - Changed regression test so that it also works under Windows
-  - Changed output stream operator<< for Var and VarSet
-  - Added TProb::draw() function, which draws a random index
-  - Cleanup of matlab interface code
-  - Small improvement of utils/fginfo
-  - Small cleanup of BP code
+  - Added examples/example_sprinkler.cpp
+  - Added examples/example_permute.cpp
+  - Added python and octave ports for examples/example_sprinkler.cpp
+
+Build system:
+* Improved Makefile:
+  - Merged Makefile.win and Makefile.shared into Makefile
+  - Macros DAI_VERSION and DAI_DATE have been introduced,
+    in order to store this information in a central place
+  - Introduced CCNODEBUGFLAGS in Makefile
   - Switched Makefile.win to GNU Make syntax
   - Switched Makefile.win to GNU Make syntax
+  - [Frederik Eaton] Added TAGS, lib targets to Makefile
+* Compatibility:
+  - [Peter Gober] libDAI can now be built on Cygwin
+  - [Dan Preston] libDAI can now be built on Mac OS X
+  - Changed regression test so that it also works under Windows
+
+Interface changes (the old interface is marked obsolete and will be removed in the next release):
+* Var:
+  - Variable labels are now nonnegative (of type size_t)
+* VarSet:
+  - Replaced calcState() by non-member calcLinearState()
+  - Replaced calcStates() by non-member calcState()
+* Permute:
+  - Renamed convert_linear_index into convertLinearIndex
+* TProb<>:
+  - Replaced log0() by log(true)
+  - Replaced takeLog0() by takeLog(true)
+  - Removed hasNonPositives()
+  - Renamed minVal() to min()
+  - Renamed maxVal() to max()
+  - Renamed totalSum() to sum()
+* TFactor<>:
+  - Replaced log0() by TFactor<T>::log(true)
+  - Removed divided_by, use operator/ instead
+  - Removed divide, use operator/= instead
+  - Removed partSum(const VarSet&), use marginal(const VarSet&,false) instead
+  - Renamed minVal() to min()
+  - Renamed maxVal() to max()
+  - Renamed totalSum() to sum()
+* FactorGraph:
+  - Changed clamp and clamp interfaces (the variable to be
+    clamped is now indicated by its index, not as a Var)
+* RegionGraph:
+  - Renamed Check_Counting_Numbers into checkCountingNumbers
+  - Renamed Calc_Counting_Numbers into calcCountingNumbers
+* Miscellaneous:
+  - Renamed Treewidth(const FactorGraph &) into boundTreewidth(const FactorGraph &)
+  - Replaced UEdgeVec by Graph
+  - Replaced DEdgeVec by new RootedTree class
+  - Moved functionality of GrowRootedTree() into constructor of RootedTree
+  - Merged calcPairBeliefsNew() into calcPairBeliefs()
+  - Removed calcMarginal2ndO()
+  - Renamed smallSet<T> to SmallSet<T>
+  - Removed class Diffs
+  - [Frederik Eaton] Added backwards compatibility layer for edge interface to
+    BipartiteGraph and FactorGraph (which will be obsoleted soon)
+
+Bug fixes:
+* Fixed reversal of min and max in 
+  TFactor<T> min( const TFactor<T> &, const TFactor<T> & )
+  TFactor<T> max( const TFactor<T> &, const TFactor<T> & )
+* [Sebastian Nowozin] Fixed memory leak in MEX file dai
+* [Frederik Eaton] In PropertySet::getStringAs(), check for typeid(ValueType) 
+  before typeid(std::string) (this fixes a strange bug for empty string property)
+* Added work-around for bug in Boost Graph Library
+* Fixed bug in MaxSpanningTree (it wrongly assumed that the tree was not empty).
+* Fixed bug in calcMarginal and calcPairBeliefs where states with zero probability 
+  mass were clamped, leading to NaNs or assertion errors (thanks to Dan Preston 
+  for reporting this)
 
 
 libDAI-0.2.2 (2008-09-30)
 
 
 libDAI-0.2.2 (2008-09-30)
@@ -582,4 +862,4 @@ description in the help).
 
 0.1.0   (2006-02-28)
 --------------------
 
 0.1.0   (2006-02-28)
 --------------------
-First version worthy a version number.
+First version worthy of a version number.