           libSBML NEWS -- History of user-visible changes

======================================================================
Version 3.3.2 (released 2009-03-03)
======================================================================

* New features:

 - [Tracker issue #1820528]
   The ASTNode class has as a user data field.  This is a new member
   variable of type void * which allows a user to add/retrieve their
   own data.  Thanks to Sebastian Bauer for contributing this code.

* Bug fixes:

 - Conversion of an L2V4 model to an earlier version of SBML was 
   causing the code to crash if an invalid unit had been used within 
   the model.  This has been fixed.  Thanks to Norihiro Kikuchi for 
   reporting this

 - An object being read from a file/string was not correctly 
   recording the SBMLDocument and ParentSBMLObject information.  This
   is fixed.  Thanks to Andreas Drager for reporting this.
   
 - In a couple of cases the return type for the clone function in 
   the C API was still an SBase_t *, rather than a pointer to the 
   structure being cloned.  These have been changed.
   
 - The code that converted a string to an XMLNode uses a dummy node 
   as part of the process.  This empty dummy node was left in the 
   resulting XMLNode which, whilst not invalid, meant manipulating 
   the XMLNode was not intuitive.  The code has been changed to 
   remove the dummy node from the resulting XMLNode.
   
 - A potential memory leaks present within the appendNotes function 
   have been identified and fixed.

 - The documentation for Java lacked content for the 'libsbml' class
   (which mostly consists of functions outside of C++ classes).
   Fixed.

 - [Tracker issue #2641323]
   In certain cases validation was failing to report that a species 
   used in a kineticLaw had not been listed as a reactant/product/
   modifier of the reaction.  Thanks to Lukas Endler and Ralph Gauges 
   who independently reported this (on the same day!).
   
 - [Tracker issue #2599679] 
   Python bindings didn't work with the latest SWIG 1.3.38 due to  
   incompatible changes in SWIG-generated Python proxy code (libsbml.py).
   The problem has been fixed.
   
======================================================================
Version 3.3.1 (released 2009-02-03)
======================================================================

* Changes
  
  - Validation relating to attributes that have been removed from
    later SBML Levels/Versions (e.g. 'offset' on <unit>) has changed
    slightly.  Reading in a model that contains such an invalid
    attribute reports a schema error.  This has not changed but
    checking the consistency of a document that has been created using
    an invalid attribute will now report an error stating that the
    attribute has been removed.  This affects, e.g., validation rule
    20411 in the SBML L2V2 specification.
    
  - The code used to a convert an SBML L2V4 model would fail to 
    perform the conversion if the units in the L2V4 model would 
    produce a target model that had invalid units.  Ralph Gauges 
    pointed out that this behaviour was inconsistent with existing 
    behaviour, which allows conversion of invalid models.  The code 
    has been changed to merely log the invalid units as a warning, 
    but still perform the conversion if it is otherwise possible.
    
  - The RDFAnnotationParser class was not marked as external within 
    the Windows prebuilt dlls.  This has been changed and the relevant
    functions have been implemented within the C API.
    
  - The helper function 'printUnits' on the UnitDefinition class was 
    only printing out the knid and exponent of any unit.  Sven Sahle 
    requested that this be extended to include scale and multiplier.  
    The unit 
    <unit kind="mole" exponent="-1" multiplier="2" scale="1"/> 
    will now be output as 
    "mole (exponent = -1, multiplier  2, scale = 1)".  
    In addition, the function now has an optional argument, 
    defaulting to false, that if set to true will write the units out
    in a more compact form e.g.
    "(20 mole)^-1"


* Bug fixes:

  - The makefile for the java examples directory incorrectly tested
    only for Java 1.5.0, not for versions greater than or equal to
    1.5.0 as it should have.  Fixed.  Thanks to Nicolas Rodriguez for
    reporting this.

  - A problem in error logging whilst reading a file meant that files
    with certain errors caused libSBML to crash.  This has been fixed.
    
  - 'configure' requested doxygen version 1.5.4, but actually some of
    the latest documentation code requires 1.5.8.
    
  - The parseCVTerms function was crashing if the qualifier used 
    within one of the CVTerms was unknown.  This has been fixed.  
    Thanks to Allyson Lister for the effort involved in tracking this
    down.


======================================================================
Version 3.3.0 (released 2009-01-20)
======================================================================

* Dependency changes:

  - Configuring and compiling libSBML with Java binding from sources 
    now requires Java version 1.5.0 or later. This was needed for 
    supporing virtual functions with covariant return types.

* New features:
  
  - SBML Level 2 Version 4 support is now implemented.

  - There is a new validator for checking the consistency of the
    internal representation of a model.  The need for this grew out of
    the following situation.  LibSBML classes representing SBML
    components internally maintain all variables associated with
    attributes from every Level/Version of SBML.  This in fact makes
    it possible to have an internal representation that is invalid
    SBML.  For example, one can create a Level 1 compartment in memory
    with a 'spatialDimensions' attribute value of 2.  This is invalid
    for SBML Level 1, but previously, libSBML was only equipped to
    catch this at the time the application attempted to write out the
    internal representation.  Until then, the (invalid) internal
    representation could exist and confuse software applications.  The
    new validator can be called using the SBMLDocument class method
    checkInternalConsistency().  As with all validators, errors are
    logged in the SBMLErrorLog attached to the SBMLDocument.

  - New methods getNumResources() and getResourceURI() are available
    for the class CVTerm.  These are convenience methods that allow
    the user to determine how many resources are stored for the
    particular term and to index into the values directly.
    
  - Previously the error reported when the 'level' and 'version' 
    attributes on an SBMLDocument did not refer to a valid SBML 
    specification did not make the cause of the error clear.  This
    error should now be reported more clearly.  Thanks to Lucian
    Smith for noticing this.

  - LibSBML was not reporting the use of invalid attributes on the
    ListOfXXX classes as errors. This has now been fixed.

  - The MATLAB language binding now correctly identifies the use of
    the MathML <csymbol> 'delay' and provides the information to the
    user in a similar fashion to <csymbol> 'time'.

  - There is a new section in the user documentation for C++,
    "Tutorial: Creating a complete model, from start to finish".  This
    describes the basics of constructing a model from scratch using
    the libSBML API.

  - [Tracker issue #2376930]
    Validation rules 10401 and 10402 had not previously been
    implemented.  Thanks to Nicolas Rodriguez for reminding us.

  - [Tracker issue #2183855]
    Added methods to return the severity and category of the SBMLError
    class as strings.  Since the ErrorId is drawn from an enumeration, 
    returning the actual ErrorId or corresponding symbol did not see
    useful.  Instead, a getShortMessage function has been implemented 
    that returns a very brief description of the error.
  
  - [Tracker issue #2136796]
    There is now additional code to check the ordering of assignment
    rules in a L1 or L2V1 model.

  - [Tracker issue #2114473]
    UnitDefinition has a new method, isVariantOfSubstancePerTime(),
    which returns true if the unitDefinition is a variant of the SBML
    predefined unit of 'substance' per the predefined unit of 'time'.
    In other words, it returns true if, when multiplied by a unit of
    'second', the resulting UnitDefinition is a variant of
    'substance', meaning moles or items (and grams or kilograms from
    SBML Level 2 Version 2 onwards) with only abritrary variations in
    scale or multiplier values.  The method returns false if the
    UnitDefinition is not a variant of 'substance' per 'time'.

  - [Tracker issue #2086644]
    Validation was crashing when checking the math/units of an
    expression using a functionDefinition that had not been properly
    defined.  The code that caused the crash has been fixed and the
    MathML reader now checks that a <math> element or the body of a
    <lambda> element use appropriate tags as detailed in the schema
    for the subset of MathML supported.
    
  - [Tracker issue #2086608]
    Added new methods to the ASTNode class.  They are: removeChild(n)
    which removes the nth child; replaceChild(n, node) which replaces
    the nth child with the given node; and insertChild(n, node) which
    inserts the given node into the list of children such that it
    becomes the nth child.  These methods all return an integer
    indicating success (0) or failure (-1).  Failure is only reported
    if n exceeds the size of the node; invalid ASTNodes resulting from
    the operation are not reported.

  - [Tracker issue #2015847]
    Each ListOfXXX class now has derived "get" methods that return an
    object of the expected class.  E.g.: ListOfEvents->get() returns
    an Event *.

  - [Tracker issue #2015847]
    The clone method on each SBML component class now returns a
    pointer to the appropriate class instead of the SBase * previously
    returned.

  - [Tracker issue #1862805]
    The ListOf class has a new method "void ListOf::clear(bool
    doDelete = true)".  When doDelete is true, all the items in the
    ListOf are cleared and deleted; doDelete is false, the items are
    cleared from the ListOf but not deleted and the user is
    responsible for deleting the items.
 
* Bug fixes:

  - LibSBML could be built without an underlying XML parser if 
    --with-libxml=no is given whereas neither --with-expat nor
    --with-xerces given when running the configure script, which
    generated broken shared libraries.
    Thanks to Giuseppe Aprea for reporting this problem.

  - LibSBML was failing to check that the value of the
    'spatialDimensions' attribute on a <compartment> was correct.
    This is in fact a schema error.  Thanks to Norihiro Kikuchi for
    spotting this.

  - The code that checks for AssignmentCycles was failing to check
    for an assignment that referred to the subject of that assignment,
    e.g., an assignment rule with variable "c" and math "2 * c", was
    not returning an error.  This is now fixed.

  - The code that checks for AssignmentCycles was failing to check
    for an assignment to a compartment that referred to the a species
    concentration within that compartment.  This is an implicit
    reference to the compartment itself, since the concentration of
    the species depends on the compartment value.  This is now fixed.

  - The SBMLWriter::writeSBML() function could create a zip file in
    which an SBML file was stored with its path name.  Thanks to
    Florian Kamm for reporting this bug.

  - A missing 'level' or 'version' attribute on <sbml> was not being
    correctly reported.

  - Fixed a memory leak in the assignment operator of the ListOf
    class.  Thanks to Sven Sahle for reporting this problem.

  - [Tracker issue #2498694]
    Fixed a typo in documentation. Thanks to Sven Sahle for reporting 
    this.

  - [Tracker issue #2442566]
    LibSBML incorrectly restricted the number of 'modified' date
    elements that could be added to a ModelHistory element.  This has
    now been changed.

  - [Tracker issue #2418883]
    The SBML_formulaToString function was crashing if the ASTNode
    passed to it was NULL.  The code now catches this and returns an
    empty string.  Thanks to Lucian Smith for reporting this.
   
  - [Tracker issue #2219230]
    LibSBML-2.3.4 enabled a user to write an xml comment containing
    information on the program being used to write the file.  This
    used functions setProgramName and setProgramVersion on the
    SBMLWriter class.  Whilst the documentation for libSBML-3.2
    described this functionality; it was not in fact implemented.
    This has been remedied.

  - [Tracker issue #2209773]
    libSBML couldn't be built with the Xerces 3.0.0 due to
    incompatible API changes in Xerces 3.  Fixed.

  - [Tracker issue #2209729]
    Fixed a problem where libSBML built with Xerces on Linux could
    crash due to Xerces dereferencing a null pointer when parsing some
    invalid SBML files.  Thanks to Jordan Atlas for reporting this.

  - [Tracker issue #2189194]
    Fixed a crash when using bzip2-based compression.  Thanks to
    Florian Kamm for reporting this bug and providing a patch.

  - [Tracker issue #2188734]
    The sequence "&amp;" (a predefined entity reference of ampersand)
    in an attribute value was wrongly converted to "&amp;#38;" when
    libSBML used libxml2 as the underlying XML parser.  This is now
    fixed.  Thanks to Chen Li for reporting this bug.

  - [Tracker issue #2187684]
    The unit checking code was not correctly interpreting the units of
    a reaction id used as a ci element in a math expression.  This is
    fixed and tested.

  - [Tracker issue #2157800]
    When <csymbol> 'time' was used in a functionDefinition, it was not
    being correctly considered as a numerical value.  Fixed.

  - [Tracker issue #2146714]
    syncAnnotation() functions in SBase, Model, and SpeciesReference
    class could internally delete an old annotation object (XMLNode*)
    in an SBase object.  This could lead to an invalid pointer to an
    already deleted annotation object when syncAnnotation() functions
    were internally invoked from getAnnotation() function.  This is
    now fixed.  Thanks to Ralph Gauges for reporting the problem.

  - [Tracker issue #2138670]
    Conversion of an L1 model to L2 previously always produced
    parameters and compartments with their 'constant' attributes set
    to 'true'.  Now the libSBML conversion code checks whether
    parameters and compartments are the subject of rules, and if so,
    sets their 'constant' attribute to 'false'.  Thanks to Ralph
    Gauges for reporting the problem.

  - [Tracker issue #2136530]
    When adding a child to an XMLNode marked as an 'end' node, the
    XMLNode remained marked as an 'end' node.  This caused incorrect
    XML to be written out.  This is now fixed.  Thanks to Ralph Gauges
    for reporting the bug.

  - [Tracker issue #2130568]
    The check for AssignmentCycles incorrectly reported non-existant
    loops in some situations.  This is now fixed.  Thanks to Kieran
    Smallbone for reporting it.

  - [Tracker issue #2129044]
    The writeRootFunction in the MathML writer was failing to output a
    root function correctly when it had only one child; i.e., the
    default degree value of 2 was being used.  This is now fixed.
    Thanks to Ralph Gauges for spotting this.

  - [Tracker issue #2114500]
    The Octave language binding failed to build under Cygwin.  This is
    now fixed.

  - [Tracker issue #2086644]
    The validation code would crash when checking the math/units of an
    expression using a functionDefinition that had not been properly
    defined.  The code that caused the crash has been fixed.

  - [Tracker issue #2082584]
    Fixed a memory leak reported by Jonathan Cooper.
    
* Other changes:

  - The Lisp binding code has been disabled from the configuration and
    build systems because it no longer functions (and has not been for
    quite some time).  The code is still in the distribution because
    we hope someone, someday will help get it working again.

  - The configuration system now will automatically disable support
    for reading/writing compressed SBML if the 'configure' script
    cannot find the necessary libraries (zlib and bzip2).  There is
    also a configuration flag, --enable-compression, that can be used
    to enable/disable both compression libraries in one go.

  - The allowable values for an integer have been restricted to the
    range of the standard 32-bit signed integer values (2147483647 to
    -2147483648), as per the SBML specification.

  - The Java API documentation has been substantially improved.  Many
    methods previous exposed should not have been, and many methods
    lacked documentation due to glitches in the software used to
    generate the Java documentation from the C++ source files.  This
    release corrects almost all of these errors.  The Java docs are
    now much closer to the intended API, although a few glitches
    remain.  A number of classes still remain poorly documented in
    both the Java and C++ API documentation.

  - There is now a mailing list (libsbml-team@caltech.edu) for the
    core libSBML developers separate from the SBML Team mailing list.
    People are still encouraged to post questions to the
    sbml-interoperability and libsbml-development mailing lists, but
    this new list allows us to advertise a direct contact address in
    the libSBML documentation.

  - [Tracker issue #2182856]
    A CVTerm uses the 'metaid' attribute of the object it describes as
    a reference.  Since adding a CVTerm to an object that has no
    'metaid' creates an empty <rdf:about> element, the addCVTerm
    function will no longer add a CVTerm to an object that has no
    'metaid' attribute set.

  - [Tracker issue #2175098] 
    Unit validation was producing a 'dimensionless' unit with an
    'exponent' of -1 and then failing to consider it equivalent to a
    'dimensionless' unit with an 'exponent' of 1.  The underlying code
    no longer assigns an exponent of -1 to a 'dimensionless' unit and
    the comparison code no longer considers the 'exponent' attribute
    when comparing 'dimensionless' units.  Thanks to Lukas Endler for
    reporting this.

  - [Tracker issue #2118126]
    The getDerivedUnitDefinition() method always returned NULL for a
    local parameter.  Andreas Draeger requested that it return a
    unitDefinition derived from the units attribute.  This has now
    been implemented.

  - [Tracker issue #2082682]
    The unit checking code was not dealing correctly with expressions
    containing MathML <root> except in cases where exact integers were
    involved.  The code now reports situations where it is unable to
    check the unit consistency due to non-integral exponents.  Thanks
    to Jonathan Cooper for reporting the problem.


======================================================================
Version 3.2.0 (released 2008-08-20)
======================================================================

* New features:

  - Tracker issue #1912123.
    There is a new API that allows the user to directly manipulate 
    XML objects.  The function style mimics the existing libSBML
    format; i.e., getters/setters allow attributes to be read or
    written, and hasXXX functions allow a user to determine whether an
    attribute has a value.  The XMLNode class has functions that allow
    child elements to be added/removed and returned.  See the
    documentation for full details.
    
  - C# (C sharp) bindings are now available.  Thanks to Frank Bergmann
    for the work in creating and testing these.

  - LibSBML can now read/write compressed SBML files.  It supports the
    following compression formats: gzip, zip, and bzip2.  If a given
    SBML filename ends with one of extensions for the above compressed
    file (.gz, .zip, or .bz2), readSBML()/writeSBML() will
    automatically read/write the file as the corresponding compressed
    file.  If the filename has no such extension, it will be read
    uncompressed as before.  For example, a gzip'ed file named
    "test.xml.gz" will be read, and then a zip'ed file name
    "test.xml.zip" will be created by the following sample libSBML code:
        SBMLDocument* d = readSBML("test.xml.gz");
        writeSBML(d, "test.xml.zip");
    The compression feature requires zlib (for gzip/zip) and bzip2
    (for bzip2).  These features are enabled by default, and can be
    disabled at libSBML configuration time using the using the options
    --with-zlib=no and --with-bzip2=no.

  - The constants defining the libSBML version number are now
    accessible from the various language bindings.  In addition,
    functions to directly access these values have been included.

  - Tracker issue #2030837.
    There is a new function getMessageString() on the Constraint 
    class that returns the <message> element as a string rather
    than an XMLNode. 

  - (Thanks to Chen Li for bringing up the following.) The return
    value of getSBOTerm() is potentially unintuitive: rather than
    being a string in the form "SBO:XXXXXXX" (i.e., a full SBO
    identifier), the returned value is an integer.  This was done for
    the convenience of calling applications, because the integer form
    is more efficient to manipulate.  To support applications and
    users who prefer the text-string form, libSBML now has a function
    getSBOTermID() that returns a "proper" SBO identifier.

  - The SBase class has a new member "SBase * mParentSBMLObject" which
    points to the direct SBML parent of the object. For example:
      StoichiometryMath->SpeciesReference->ListOf->Reaction->ListOf
      ->Model->SBMLDocument
    There are two new functions 'getParentSBMLObject()'; which returns the 
    direct parent of the object; and 'getAncestorOfType(SBMLTypeCode_t)';
    which returns the ancestor of the given typecode or NULL if none exists.

  - The ASTNode class has a new member "SBase * mParentSBMLObject" which 
    points to the direct SBML parent of the ASTNode object and a
    corresponding getParentSBMLObject() function that returns it.
    
  - Tracker issue #1966696.
    It was requested by Michael Lawrence that the logical functions
    "and", "or", and "xor" reduce their correpsonding ASTNodes to a
    binary tree in the same way that the "plus" and "times" functions
    do.  However, doing this would change the way the node was output
    as a string; i.e., 'and(x, y, z)' would be output as 'and(and(x,
    y), z)'.  To avoid potential problems such a behavioral change
    could cause existing libSBML users, there is now has a separate
    new function, ReduceToBinary(), in the ASTNode class, whose action
    is to reduce an expression to a binary tree representation on demand.

  - In order to check unit consistency of a model,
    ListFormulaUnitsData must be populated with data from the entire
    model being checked.  The functions populateListFormulaUnitsData
    and isPopulatedListFormulaUnitsData have been exposed within the
    API. These functions allow a user to run unit consistency checks
    multiple times whilst adding/editing objects within the model on
    which unit checking is required.

  - Tracker issue #1883067.
    The functions setStoichiometry() and setStoichiometryMath() have
    been changed so that each unsets the other.  This reflects the
    fact that the SBML species reference attributes 'stoichiometry'
    and 'stoichiometryMath' are mutually exclusive.

  - Tracker issue #1928168.
    LibSBML was not checking the values imported as numbers from within
    MathML statements in a model. Thus, if the string being converted was
    either not converted or incorrectly imported, the error was not detected.
    There are now checks on all these imports. 
    

* Bug fixes:

  - Tracker issue #2041898.
    A bug in the FormulaTokenizer code led to incorrect handling of
    some pow() expressions.  This has been fixed.

  - Tracker issue #1733299.
    The long-standing bug involving Windows, Xerces and multibyte
    characters has been resolved.  Akiya's great detective work
    uncovered that the Xerces transcode function converts characters
    to the default encoding for the current platform, and this is not
    always UTF-8.  The code for use with Xerces now encodes
    specifically to UTF-8 regardless of platform.

  - Lukas Endler reported that when a division operation cancelled the
    units of an expression, the resulting units were reported as
    "indeterminate".  This has been fixed, and where units are
    cancelled by division the resulting unit is now considered
    dimensionless.
    
  - Unit checking of a piecewise function failed to examine all
    children for literal numbers/parameters with undeclared units.
    This is now fixed.  Thanks to Lukas Endler for discovering and
    reporting the problem.
 
  - The code for checking that an SBML identifier had correct the
    syntax failed to catch the case where the id had been entered as
    an empty string.  This is now fixed, and id="" will be reported as
    an error.
 
  - Annotations for CVTerms in a Model object were wrongly deleted when a
    ModelHistory object in the Model object was not explicitly initialized.
    Due to this bug, the corresponding annotation XML node or string
    were removed in the functions that return or print the annotation 
    XML node or sring (e.g. getAnnotation(), getAnnotationString(), 
    writeSBML() and writeSBMLToString() )

  - Tracker issue #2013528.
    SBMLDocument::setLevelAndVersion() did not properly check the
    results of compatibility checking, sometimes leading to
    conversions being wrongly performed even if the level/version
    checking step reported an error.  Thanks to Robert Platt for
    reporting this.

  - In some circumstances, parts of reaction elements could be wrongly
    ignored when reading an SBML L2V1 file with an empty math element.
    For example, when reading an SBML L2V1 file containing three
    reactions ("r1", "r2", and "r3") and a kineticlaw in the reaction
    "r1" contained an empty math element (i.e., <math ...></math>),
    the reactions "r2" and "r3" (and indeed, all reactions after the
    reaction "r1") were ignored and only "r1" was stored in the
    listOfReactions object.  This is now fixed.

  - Eric Fernandez reported that the latest gcc version (gcc-4.3.1) 
    caused compilation errors in the current libSBML.  These have been
    caught and corrected.

  - Tracker issue #1967472
    Different events can assign values to the same variable.  This 
    was not being correctly handled by the unit validation code -- again
    thanks to Chris Myers for spotting this! This has been corrected and 
    additional test cases have been added.

  - Tracker issue #1965490.
    When the math of an ASTNode is set using a string formula, then
    both the isSetFormula and isSetMath functions return true.
    However, when the string is not an accurate representation of a
    formula, the ASTNode created from the string was NULL.  Thus,
    using the isSetMath function to determine whether a math element
    can be accessed was causing problems.  The isSetMath function now
    checks that an ASTNode can be created from a formula and returns
    false if it cannot.  NOTE: This situation only arises for the math
    elements of Rules and KineticLaws, because these are the only SBML
    components in Level 1 that have formulas.

  - Tracker issue #1961979.
  - Tracker issue #1958998.
    There was a memory leak in the code to check for an overdetermined
    model.  Chris Myers used it enough to actually hit the problem.  There 
    was also a small bug in the code that got fixed at the same time.

  - Tracker issue #1965485.
    There was bug in the checking of units from a functionDefinition.
    Thanks to Chris Myers for reporting this.

  - Tracker issue #1943865.
    The member variables of an ASTNode; definitionURL and 
    semanticsAnnotation; were missing from the deepCopy function.
    These have now been added.
 
  - Tracker issue #1942898.
    The MATLAB binding failed to correctly import a root function.
    Thanks to Arne B. Gjuvsland for reporting the problem and 
    supplying the fix.

  - Tracker issue #1966122.
    A segmentation fault was occuring when using libSBML + Xerces to
    read a file with a malformed schemaLocation attribute placed on
    the <sbml> element.  This problem was first reported by Gwenael
    Kervizic to Nicolas Le Novere.  Xerces was returning an error code
    that libSBML did not recognize, and the failure to catch the code
    properly eventually lead to a seg fault with some operation
    systems.  This has now been fixed.

  - Tracker issue #1966122.
    A segmentation fault was occuring when using libSBML + Xerces to
    read a file with a malformed schemaLocation attribute placed on
    the <sbml> element.  This problem turned out to be caused by more
    than one issue (see bug fixes below).  One issue was that
    libsbml's Xerces parser code called getLine()/getColumn() in a
    situation where it doesn't report a valid number.  On some
    systems, the end result was a seg fault, whereas on others the
    numbers returned are merely crazy.  This problem has been
    addressed and it is now possible to catch the case where the line
    and column numbers returned by libSBML are inaccurate.  NOTE: This
    only applies to libSBML with the Xerces XML Parser.
    
  - Tracker issue #1966122.
    Xerces would return an unexpected error code when an SBML document
    contained a 'schemaLocation' attribute on <sbml>, and in addition,
    libSBML would also attempt to get the line number from Xerces and
    this attempt resulted in a segmentation fault on some
    architectures.  This problem was first discovered inadvertently by
    Gwenael Kervizic while using the Online SBML Validator.  The fix
    involved changing not only the error trapping for Xerces but also
    the line/column number reporting behavior of XMLError and the
    introduction of two new constants, LIBSBML_UNKNOWN_LINE and
    LIBSBML_UNKNOWN_COLUMN.

  - The code for checking units created a clone of the model to perform
    certain checks.  This was extremely memory intensive with larger
    models.  The relevant code has been changed so that it no longer
    does this.  Run-times for validating units in large models have
    been significantly reduced as a result.

  - The code for generating documentation using Doxygen failed to
    include the code directory for the candidate layout extension; as
    a result, the docs would never include the layout extension code.
    Now fixed.  If libSBML is configured with --enable-layout and a
    "make docs" is run, the layout code is included in the docs.
      
  - Tracker issue #1942338.
    The member variables of an ASTNode were stored as a union of data.
    This caused problems with the get* functions.  These unions have
    been removed and the data is now stored separately.
    
  - A number of memory leaks have been fixed.


* Changes

  - The text of the error message for error code 1006 has been changed
    to "XML content is not well-formed." for greater clarity.

  - In some circumstances, the line & column numbers reported by the
    underlying XML parser are meaningless.  This typically happened
    when a severe error occurred while reading the SBML document.
    However, it is not always obvious whether XMLError's getLine() and
    getColumn() methods can be called to obtain usable line/column
    numbers following a severe error.  To provide an indication that
    the line/column numbers reported by XMLError are actually
    meaningless numbers, the behavior of XMLError's getLine() and
    getColumn() methods have been changed.  They will now return the
    values LIBSBML_UNKNOWN_LINE and LIBSBML_UNKNOWN_COLUMN in those
    circumstances.  Although the values returned are potentially valid
    line/column numbers for a file, the real-life probability that
    this would happen (and lead to confusion) is believed to be too
    small to worry about.  (The numbers are equal to the C/C++
    constant ULONG_MAX.)

  - We changed the revision control system for all SBML project files,
    including libSBML, from using CVS to SVN.  CVS access is no longer
    available.  Please see the following page for information about SVN
    access on SourceForge: https://sourceforge.net/svn/?group_id=71971
    We also have an information page about the SBML SVN repository at
    http://sbml.org/SBML_Projects/SVN_Repository_Access    

    
======================================================================
Version 3.1.1 (released 2008-02-25)
======================================================================

* New features:

  - The utility functions for unitDefinitions and units in files 
    Utils_UnitDefinition.cpp/.h and Utils_Units.cpp/.h have now been
    incorporated as static functions within the UnitDefinition and
    Unit classes respectively.

* Bug fixes:

  - There were cases where warnings/errors that were not applicable
    to the particular level and version of SBML were being reported.
    This has now been corrected.

  - The ModelingPractice validator now only reports warnings related
    to units if the UnitConsistency validator is enabled.

  - Tracker issue #1892238.
    Fixed a bug that meant the name of a nested functionDefinition
    was being lost during the unit checking process.
    
  - Tracker issue #1883605.
    It seems that when a new object was created within a model where
    this new object was the first of its type, e.g., the first element 
    of a ListOfRules, the parent document for the object was not set.
    This has now been corrected.

  - Tracker issue #1881852.
    Fixed a bug that caused a crash when checking
    the consistency of variables used in a StoichiometryMath
    element. Added validation files that would have caught this.
    Thanks to Chris Meyers for reporting this.

  - Tracker issue #1880570.
    The previous fix for a piecewise without an otherwise statement
    did not propagate for the use of piecewise within a lambda
    function. This is now fixed and multiple tests included to catch
    this and similar potential failures.

  - Tracker issue #1880892.
    A number entered as an exponent was being written out as an 
    integer without exponent where the integral value was small
    enough. For example 1e3 was written as 1000. This has been
    changed so that a value entered as an exponent will be written 
    out as an exponent. 

  - The FormulaUnitsData class was previously exposed accidentally in
    the documentation.  It's now (more) private.

  - The text of a few XML error messages have been changed slightly in
    an effort to aid readability.  No numbers were harmed in the
    process.
 
  - We made additional fixes to the C++, Python and Java API
    documentation.  Among them: including documenting of more
    constants that are defined as enumerations (and weren't easy to
    find previously in the language binding docs), not exposing
    internal methods, plus fixes to the formatting of some method
    signatures in the Python docs, and more.

  - The Java API docs now have a section about ASTNode similar to the
    same section available in the other API manuals.

  - ASTNode.swapChildren() was not accessible, but should have been.

  - This NEWS.txt file is now accessible from the API documents.


======================================================================
Version 3.1.0 (released 2008-01-25)
======================================================================

* Dependency changes:

  - Configuring and compiling LibSBML from sources now requires SWIG
    version 1.3.33.  This was needed for supporing the Ruby bindings.

  - Generating documentation from LibSBML sources now requires a
    Doxygen version of at least 1.5.4.  This was needed to generate
    correct documentation for Python and make other improvements.

* New features:

  - LibSBML now provides a binding for the language Ruby
    (http://www.ruby-lang.org).  This was initially contributed by
    Alex Gutteridge and further developed and integrated (with test
    code) by Akiya Jouraku.

  - LibSBML now provides methods on most SBML components to return a
    UnitDefinition object representing its interpretation of the units
    for that component's quantity.  Two new methods are involved:
    getDerivedUnitDefinition() and containsUndeclaredUnits().

  - The function Layout_setDimensions has been added to the C API.

* Bug fixes:

  - Fixed a bug that meant that a model was not correctly read
    if a piecewise function had been used with no 'otherwise'
    element. Thanks to Chris Meyers for reporting this. 

  - Fixed a bug that caused a crash if a FunctionDefinition was
    applied to an incorrect number of arguments.

  - The readMathMLFromString function was failing if the string
    did not begin with an XML declaration.  The code now adds a
    declaration if necessary to prevent this from happening.

  - The MATLAB binding was failing to store the message field on a 
    Constraint.  It does now.

  - Corrected the fact that a UnitDefinition redefining a builtin
    unit can have more than one unit provided the UnitDefinition
    *simplifies* to only one unit. This would allow the use of
    dimensionless as a unit within the redefinition. Prior to this
    point libSBML would have rejected a redefinition with more than
    one unit without considering the possibility that dimensionless
    was being used.

  - Fixed a couple of bugs where attributes were not being
    written out.

  - Unit validation within libSBML creates a list of a class
    FormulaUnitsData.  This was implemented as a instance of the
    ListOf class.  However, since the FormulaUnitsData class is not an
    SBML construct this was an inaccurate derivation.  This has now
    been corrected and the list of FormulaUnitsData within the Model
    object is now an instance of the List class.

  - libSBML-3.0.0 correctly derived the StoichiometryMath, 
    Trigger and Delay components from SBase, but the MATLAB language
    binding did not reflect this.  It now does.

  - The MATLAB binding was failing to copy the metaid field. 
    This is now corrected.

  - It is permissible in MathML to use a lambda function with
    no bvar elements. However, libSBML was not handling such a
    situation correctly. Thanks to Stefan Hoops for identifying
    this.

  - Caught bug whereby the ASTNode created to substitute values
    for the FunctionDefinition was failing to copy the name of
    any FunctionDefinitions used by the calling FunctionDefinition.
    This was causing the validation process to crash.

  - examples/java/printMath.java had a bug in which the wrong loop
    variable was being referenced, causing crashes in SBML files
    containing FunctionDefinition objects.  Thanks to Hongseok Yun for
    contributing the report and a fix.

  - The auto-generated documentation for the Python API was previously
    lousy and sometimes outright wrong, for example in showing
    incorrect scoping syntax.  This was due to defects in Doxygen
    versions prior to 1.5.x, and now fixed by requiring Doxygen
    version 1.5.4.

  - Added more missing sections in the Java and Python API documentation.

  - Added explicit lists of the various constants defined and used in
    libSBML, such as ASTNodeType_t, XMLErrorCode_t, etc..  The API
    documents generated by Doxygen for Python and Javadoc for Java in
    particular didn't provide easy access to this information.  The
    new docs list the constants with the relevant object definitions.


======================================================================
Version 3.0.3 (released 2007-12-17)
======================================================================

* Changes:

  - Fixed a bug that meant Annotations and Notes were not being written
    out when they occurred on a Rule. Thanks to David Adler and Damon 
    Hachmeister for pointing this out.

  - The enumerations for the XMLError severity and category codes have
    changed again, because unfortunately our last attempt clashed with
    a Microsoft Windows system include file.  The libSBML severity
    codes are now prefixed with LIBSBML_SEV_ and the category codes
    with LIBSBML_CAT_.  Hopefully these are truly unique.

  - LibSBML will now build on Ubuntu Linux. 
  
  - The incorrect dependencies in the Perl makefiles have been corrected. 

  - Added a clearLog() function to XMLErrorLog.  This empties the
    existing XMLErrorLog but does not destroy it.  This facilitates
    the repeated use of checkConsistency() with different validators
    enabled.

  - Fixed a bug in the code to check for cycles in assignments between
    rules, initial assignments and reactions. This was both failing to
    report all cycles where they were present and in the case of very
    complex models it was reporting cycles where there were none.

  - Fixed a bug in the checkUnitSyntax() function reported by Florian
    Kamm.

  - The documentation and README file incorrectly said Xerces is the
    default parser library used.  In fact, it is libxml2 now.


======================================================================
Version 3.0.2 (released 2007-11-28)
======================================================================

* Changes:

  - ASTNode has a new function ReplaceArgument().  It takes a string
    representing a name within the ASTNode object and an argument
    respresenting a name/value/formula ASTNode, and replaces
    occurrences of the name string with the argument ASTNode.

  - SBase now has an unsetCVTerms() function which clears the CVTerm()
    List associated with the object.
    
  - The addCVTerm() method on SBase now checks whether each resource 
    string is already present in the list of resources for any 
    Qualifier within the CVTerms of the object and does not add that 
    particular resource if it would either create a duplicate within 
    the resources already present with the same qualifer or create a 
    situation where the same resource was present with different 
    qualifiers. 
    
  - LibSBML now includes support for the biological-qualifiers
    recently added to the MIRIAM standard
    http://www.ebi.ac.uk/compneur-srv/miriam-main/mdb?section=qualifiers
    
  - There are two additional functions on an SBase object:
    getResourceBiologicalQualifier() and getResourceModelQualifier()
    These functions take a string representing the resource to be
    found, and return the qualifier that has been used to include this
    resource within the CVTerms on the object concerned.  If the
    resource is not present, an UNKNOWN qualifier is returned instead.

  - Occasionally models delare the SBML XML namespace twice; once by
    default and then again explicitly. If the model is converted
    between levels/versions of SBML both these occurrences need to be
    updated.  This is now implemented.

  - libsbml-version.h is now included automatically, so that the
    libSBML version #define constants are accessible.  (See notes in
    3.0.1 below about the version constants.)

  - Fixed problem wherein the enumerations for error codes, severity
    codes and error categories were in fact not visible outside of
    C++.  The problem stemmed from the fact the enum definitions were
    placed inside C++ classes.  Unfortunately, this required changing
    the symbols.  We renamed many of them to try to make them less
    likely to conflict with symbols in user code.

  - Fixed bug that incorrectly caused the hasOnlySubstanceUnits
    attribute on species to be set to true when a Level 1 model was
    converted to Level 2.  This bug would have impacted the validation
    of unit consistency in Level 1 models, causing models to fail
    validation when in fact they were correct.

  - Fixed bug where some consistency checks for math/units were not
    checking all the children of the math element.

  - Fixed memory leak in ASTNode (reported and fixed by Rainer Machne).

  - Fixed bug in UnitFormulaFormatter.cpp where the order in which
    parameters/ species/compartments were searched for an identifier
    was incorrect.  This was reported as a unit consistency problem by
    Damon Hachmeister.

  - Fixed a bug involving cloning of objects.  The clone() method on
    an SBMLDocument was cloning the model contained by the document
    but failing to adjust the parent document pointer within the
    cloned model.  Thanks to Rainer Machne for identifying that there
    was a problem.

  - (Linux/UNIX) Fixed Makefiles in MATLAB bindings directory so that
    "make check" actually does something (namely, run testBindings.m).

  - (Linux/UNIX) The pkgconfig/libsbml.pc file no longer gets
    installed with the execute bit set.

  - The Makefiles in examples/c++ and examples/c used an incorrect
    order of dependencies on libraries, causing cygwin builds to
    fail.

  - (Cygwin) A libsbml.la file is now constructed and installed under
    cygwin.  The .la files appear to be used by the Cygwin compilation
    environment to determine library dependencies.

  - During installation, the Python bindings installation would ignore
    the value of the variable DESTDIR if it was given in the
    invocation of make install.  Fixed.

  - Python build was not sufficiently isolated from the user's
    installation directories and could have picked up
    previously-installed older versions of libsbml on the system at
    build time and test time.  Fixed. 

  - "make uninstall" should now properly remove everything installed
    by a "make install".  One remaining issue is that "make uninstall"
    can only know to remove those libSBML features currently
    configured in.  If you do a "make install", then run configure
    with different options, and then try "make uninstall", it will
    attempt to uninstall the files implied by the most recent run of
    configure, not the files installed by the original "make install".


======================================================================
Version 3.0.1 (released 2007-10-19)
======================================================================

* Changes:

  - The default XML parser is now libxml2, not Xerces, following the
    results of a survey of user preferences conducted in September '07.

* Bug fixes and enhancements:

  - Fixed a memory leak in XercesParser.cpp, reported (with the fix)
    by Sebastian Bauer.

  - There is a new file, common/lisbml-version.h, that provides
    constants called LIBSBML_VERSION, LIBSBML_VERSION_STRING, and
    LIBSBML_DOTTED_VERSION, so that applications can more easily find
    out the version of a particular installation of libSBML.

  - SBML_formulaToString was incorrectly limiting the length of the buffer
    used to write a number and thus truncating the exponent on numbers
    with 15 digits. This is now fixed.
  
  - It appears there is a difference in the way gcc and MSVC deal with
    the clean-up of strings following calls to the c_str() function. In
    the case of MSVC this can on occasion result in a returned char * 
    being garbage. Since the unit tests for libSBML run using gcc this 
    has only recently come to light and should now be fixed.

  - The MATLAB binding function has a second optional argument
    that indicates whether the model is to be validated prior to import.
    The default value is 0; indicating no validation. In the case of no
    argument to the function; which opens a browse window to locate the
    file to import; the user will be prompted to indicate whether 
    validation should be done. In the case of validation errors these will
    be displayed to the user, who will be prompted as to whether to import
    the model regardless.
  
  - An additional 'ModelingPractice' validator has been added to the
    set of validators available for consistency checking. This validator
    reports 
    1) a compartment with no size assigned
    2) a local parameter id that shadows an id in the global namespace

  - A document with a missing XML declaration now correctly reports the 
    MissingXMLDecl error EXCEPT when using libxml2. The reason for this
    inconsistency is that libxml2 assigns a default (1.0) xml version if 
    either the XML version or the entire XML declaration is missing.  

  - The error ids for a small number of consistency checks has changed. 
    These relate to validation rules that were never part of the written 
    specification of SBML and thus do not have published numbers.
    These rules check that the timeUnits/substanceUnits and formula of a 
    KineticLaw are valid in versions of SBML prior to Level 2 Version 2. 
    The changes are as follows:
			21127  changed to  99127
			21128  changed to  99128
			21129  changed to  99129
			
  - The error id of the check on the general consistency of MathML has changed
    from 10219 to 99219.    

  - Support for <annotation> and <annotation-xml> with a <semantics>
    element in MathML has been added.

  - The format of error, warning and other diagnostic messages has
    been improved and made more regular, and the message strings of
    validation rules been updated to match more closely those in the
    Level 2 Version 3 specification.  The formatting of messages
    printed by SBMLDocument.printErrors() has changed as a result.

  - A document with a missing XML encoding attribute should cause
    XMLError::MissingXMLEncoding to be returned, not MissingXMLDecl,
    as was mistakenly the case previously.

 
======================================================================
Version 3.0.0 (released 2007-08-29)
======================================================================

* New features relative to 3.0.0 prerelease:

  - Notes and annotations can now once again be set and retrieved as
    strings, not only as objects.  Thanks to Akiya Jouraku for the
    hard work behind this.

  - The MATLAB bindings now support setting notes and annotations as
    strings.

  - Error and consistency checking and reporting have been
    significantly overhauled:

    + A new method, SBMLDocument::setConsistencyChecks(...), allows an
      application to indicate which set of validation rules should be
      applied.  By default, all SBML validation rules are applied; 
      setConsistencyChecks() thus a caller to turn some off prior to
      calling checkConsistency().

    + LibSBML now has an internal table relating errors and validation
      rules, the SBML Levels and Versions in which they are valid, and
      their severities for each Level and Version.  The testing is now
      more accurate for different SBML Levels/Versions.  As an
      additional benefit, rather than all being errors, some issues
      are now reported as warnings.

    + Errors now have "severity" levels.  This can be used by an
      application to gauge the implications of a particular warning or
      error.

  - SBMLDocument::setLevelAndVersion(...) now returns a boolean value
    to indicate whether the conversion was successful, if a conversion
    was implied by setting the SBML Level and Version of a given
    model.  Applications should make sure to check the return value,
    because a return value of false implies that something went wrong
    and the model may be invalid.  Applications should next call
    getNumErrors() and getError() to find out what happened.

  - The interface between CVTerms and ModelHistory and annotations is
    now hidden so getAnnotation() or getCVTerm() will return the same
    information in both cases (i.e., in the annotation and CVTerm
    forms).  Manipulating either will cause the other to be updated,
    so if setCVTerm() is called, then getAnnotation() will return the
    CVTerm info.  Likewise, if you then manipulate that and
    setAnnotation() followed by getCVTerm(), the changes will be
    reflected in the CVTerm form.

  - Added support for Octave.  Thanks to Bill Denney for having worked
    out how to do it.

  - Support for the candidate layout implementation is now included by
    default in the Windows binaries we distribute.

  - Libxml2 version as old as 2.6.16 are now supported.

  - Python documentation is now available using the same Doxygen-based
    system as for C++, Java and C.


======================================================================
Version 3.0.0 Prerelease
======================================================================

* New Features relative to 3.0.0 beta_2:

  - Java, Perl and Python bindings are once again available, thanks to
    work by Akiya Jouraku.  
    
  - MATLAB binding is available without support for Notes and Annotations.
    
  - The following is a partial list of API changes relative to previous 
    versions of the Java bindings. Almost all are due to changes in the 
    core of libSBML itself introduced in version 3.0.0.

    + The classes OstreamWrapper and OfstreamWrapper.

    + SBMLDocument.setLevel(int) and SBMLDocument.setVersion(int) are
      no longer available because they have been replaced by
      SBMLDocument.setLevelAndVersion(int, int).

    + The methods Event.getTrigger() and Event.getDelay() now return
      objects of class Trigger and Delay, respectively.  Previously
      they returned mathematical formulas directly; now you have to
      invoke getMath() on the returned objects.

    + The methods KineticLaw.setFormulaFromMath() and
      KineticLaw.setMathFromFormula() have been removed because they
      are unnecessary; the methods setMath() and setFormula() can be
      used in their place.

    + Other API changes:

        const string& SBase::getNotes()           /* libsbml 2.3.4 */
        XMLNode*      SBase::getNotes()           /* libsbml 3.0.0 */
    
        void SBase::setAnnotation(const std::string&) /* libsbml 2.3.4 */
        void SBase::setAnnotation(XMLNode*)       /* libsbml 3.0.0 */
    
        void SBase::setNotes(const std::string&)  /* libsbml 3.0.0 */
        void SBase::setNotes(XMLNode*)            /* libsbml 2.3.4 */

        const ASTNode* Event::getDelay()          /* libsbml 3.0.0 */
        const Delay*   Event::getDelay()          /* libsbml 2.3.4 */
     
        const ASTNode* Event::getTrigger()        /* libsbml 3.0.0 */
        const Trigger* Event::getTrigger()        /* libsbml 2.3.4 */
         
        void Event::setDelay(ASTNode*)            /* libsbml 3.0.0 */
        void Event::setDelay(const Delay*)        /* libsbml 2.3.4 */
    
        void Event::setTrigger(ASTNode*)          /* libsbml 3.0.0 */
        void Event::setTrigger(const Trigger*)    /* libsbml 2.3.4 */
    

  - There is new API documentation for C++, C and Java.  The
    documentation is much more complete than before, and is generated
    from code comments, so it reflects more accurately the actual
    code.  The API manuals are located in docs/formatted under
    subdirectories for the individual languages.


See the sections below for other changes relative to earlier versions
of libSBML such as version 2.3.4.


======================================================================
Version 3.0.0 beta_2
======================================================================

* New Features:

  - There is a new XML parser abstraction layer, and identical
    functionality and checking of XML syntax is now available no
    matter whether you use Expat, Xerces or libxml2 as the underlying
    XML parser.
  
  - LibSBML now implements a thorough system for dimensional analysis
    and checking units of quantities in a model.  The validation rules
    for units that are specified in SBML Level 2 Vers. 2 and Vers.  3
    are fully implemented, including the checking units in
    mathematical formulas.
  
  - Annotations and notes are now read and manipulated as XML structures
    instead of text strings.  Further, in order to facilitate the
    support of MIRIAM compatible annotations, there are new object
    classes ModelHistory and CVTerm.  These classes facilitate the
    creation and addition of RDF annotations inside <annotation>
    elements by providing parsing and manipulation functions that treat
    the annotations in terms of XMLNode objects implemented by the new
    XML layer.  Both ModelHistory and CVTerm follow the general libSBML
    format of providing getters and setters for each variable stored
    within the class.
  
  - LibSBML 3.0.0 implements a number of changes to memory handling
    improve consistency and memory management.  Examples: LibSBML
    methods now copy objects passed to them, and classes implement
    virtual copy constructors via .clone() methods.
  
  - The Level 2 and Level 1 object models are now unified.  All objects
    have .getSBMLDocument(), .getModel(), .getLevel(), and
    .getVersion(), among other things.  Also, the interface to SBML
    rules abstracts away some of the individual rule type (assignment,
    rate, algebraic) differences.

  - The setLevel() and setVersion() methods on SBMLDocument have been
    unified into a single method, setLevelAndVersion().
  
  - FunctionDefinitions now have convenience methods to access function
    arguments (getArgument() and getNumArguments()) and the function
    body (getBody()) directly.  Arguments may be accessed by position or
    variable name.  Corresponding functions for the libSBML C interface
    exist as well.
  
  - Errors/Warnings/Fatals have been amalgamated into one Error class
    with a Severity field that stores information relating to the type
    of error.  There is only one printError function but the individual
    errors can be queried to determine their severity.
  
  - LibSBML 3.0.0 implements all the validation rules defined in the
    SBML specifications for L2 Version 2 and Version 3.
  
  - The Trigger and Delay elements of an Event are now properly
    implemented as SBase objects.  By side-effect, this means that the
    methods on Event called getDelay() and getTrigger() have changed;
    they now return objects of class Delay and Trigger, respectively.
    To access the formulas of delays and trigger, use the getMath()
    methods on the Delay and Trigger classes.

  - The methods KineticLaw::setFormulaFromMath() and
    KineticLaw::setMathFromFormula() have been removed because they
    are unnecessary; the methods setMath() and setFormula() can be
    used in their place.
  

* Bug Fixes:

   - MathML <csymbol> delay functions were incorrectly converted to
     user-defined functions, i.e. their type was AST_FUNCTION instead
     of AST_FUNCTION_DELAY.  Thanks to Nicolas Rodriguez for reporting
     this bug.

* Released March 31, 2007




======================================================================
Version 2.3.4
======================================================================

* New Features:

  - The SBML and MathML XML Schemas are now stored in the libSBML
    Xerces library itself.  This vastly simplifies XML Schema
    validation as it is no longer necessary to store and locate the
    XML Schemas on the end-users filesystem.

  - Validator Constraint 1801, which ensures an event trigger is a
    boolean now takes into account FunctionDefinitions and piecewise
    functions, in additional to inline MathML.  Sarah Keating provided
    this extra functionality.

  - ASTNode now has a deepCopy() method which will clone an ASTNode
    and all of its children, and so on.  Thanks to Andrew Finney for
    suggesting this feature.

  - In libSBML Java and Python it is no longer necessary to pass an
    absolute path and filename to readSBML() and SBMLReader.readSBML().
    Relative path and filenames now work as expected.


* Bug Fixes:

  - When reading nested <piecewise> elements, libSBML looses the outer
    piecewise elements.  Thanks to Martin Ginkel for reporting this
    bug and providing a test case.  Sarah Keating tracked down the
    cause of the bug and provided a fix.

  - In some rare cases libSBML Expat would not be able to read all
    characters between <cn> and </cn> or <ci> and </ci> elements which
    would cause their contents to be parsed incorrectly.  Thanks to
    Ralph Gauges for reporting this bug and Stefan Hoops for providing
    a fix.

  - When compiled with MSVC++ on Windows libSBML's ASTNode.getReal()
    would return zero when the ASTNode represented a
    <cn type="e-notation">.  This bug did *not* manifest itself on
    Linux, Mac OS X (gcc compiler) systems.  Thanks to Andrew Finney
    and Jordan Atlas for reporting this bug and Andrew Finney for
    suggesting a fix.

  - ASTNode::swapChildren() and ASTNode_swapChildren() are now
    accessible (public) in the libSBML Windows DLL.  These functions
    were already public on Linux and Mac OS X.  Thanks to Rainer
    Machne and Akira Funahashi for reporting this problem.

  - When formatting numbers, libSBML would not obey the "C" locale if
    another locale was set.  For example, if a program using libSBML
    called, setlocale(LC_ALL, "de_DE") (or setlocale(LC_ALL, "German")
    under Windows), thereafter libSBML would only read and write
    floating point numbers where the decimal was a comma (instead of a
    period).  Such behavior is in violation of the SBML
    specifications.  Thanks to Pedro Mendes for asking a question (via
    sbml-discuss) that lead to the discovery of this bug.

  - Thanks to Ralph Gauges for reporting i) a discrepancy between the
    Xerces-C++ Attributes and the ExpatAttributes interface which was
    causing the layout extension to occasionally malfunction, and ii)
    for reporting a mismatched new / free in ExpatXMLString.  These
    were bugs that only a libSBML extension developer is likely to
    notice. ;)  They have been fixed.

  - 'make tags' now creates tags files, for use with [X]Emacs.  The
    tags files are created in the individual source directories,
    however.  To use them, visit the individual tags files needed.  
    In the future there will be a scheme for creating one master tags
    file.

  - 'make uninstall' was actually not implemented almost anywhere
    (except for the implementation contributed by Martin Ginkel for
    the Lisp bindings).  There is now a mostly-complete implementation
    (but it has not seen significant testing, so caveats apply).


* Changes:

  - The xml-schema files are no longer included as part of the libSBML
    download as these are no longer necessary for validation. However 
    the files are available via the SBML web-site.
 

* Known Bugs:

  - Qualified (prefixed) element names are broken in the Xerces-C++
    2.6.0 SAX2 handler.  Currently, libSBML does not work around this
    bug.  As a result, when libSBML converts <annotation>s to strings,
    qualified element names with intervening element content
    (e.g. <foo:bar> <baz:bop> </foo:bar>) will result in end elements
    with incorrect prefixes (e.g. </baz:bar>).  If you prefer
    Xerces-C++, for now please use 2.5.0 or earlier.

  - In libSBML C++, adding objects created on the *stack* to a
    container object (e.g. adding a Species to a Model or a Unit to a
    UnitDefinition) may cause libSBML to crash.  LibSBML assumes:
    i) container objects adopt the the objects they contain
    (i.e. container objects will freeing objects they contain) and
    ii) all such objects are heap based (e.g. created with new).

    This bug will be fixed in a future release (2.4.0?) with reference
    counted objects.  Note this bug *does not occur* in any of LibSBML
    C, Java, Python, Perl, Lisp, or Matlab.


* Released October 3, 2005




======================================================================
Version 2.3.3
======================================================================

* libSBML 2.3.3 was a prerelease for libSBML 2.3.4.  Thanks to Frank
  Bergmann, Christoph Flamm, Ed Frank, Ralph Gauges, Herbert Sauro,
  Jeremy Zucker, Tim (?), and other members of the libsbml-discuss
  mailing list for taking the time to test this release and report and
  fix problems.


* Released September 26, 2005



======================================================================
Version 2.3.2
======================================================================


* New Features:

  - New example programs:

    - At the 3rd SBML Hackathon, Nicolas Rodriguez converted all C++
      example programs to Java.  See examples/java/README.txt for more
      information.

    - Christoph Flamm has started to convert the C++ example programs
      to Perl.  See examples/perl.

    - Sarah Keating converted the printMath.c example program to C++.
      See examples/c++/printMath.cpp.

  - Christoph Flamm added the following functions to the Perl binding:
    LibSBML::printWarnings, LibSBML::printErrors, and
    LibSBML::printFatals.


* Bug Fixes:

  - libSBML 2.3.0 and 2.3.1 required both PREFIX/include and
    PREFIX/include/sbml (e.g. /usr/local/include and
    /usr/local/include/sbml) to be on the include path when compiling
    programs with libSBML.  This has been fixed.  Once again, only
    PREFIX/include is required to find all appropriate libSBML header
    files.  Thanks to Colin Gillespie and many others at the recent
    SBML Hackathon for reporting this bug.

  - readMathMLFromString() would crash if the returned MathMLDocument
    was freed in-between subsequent calls to the function.  This bug
    only manifested itself when libSBML was configured to use Expat.
    Thanks to Herbert Sauro for reporting this bug and Frank Bergmann
    for providing a fix.

  - AST_PLUS, AST_MINUS, AST_TIMES, AST_DIVIDE, and AST_POWER
    enumerations may (once again) be used in Java switch statements.
    Thanks to Nicolas Rodriguez for reporting this bug.

  - Local Parameters with the same ids in separate KineticLaws were
    incorrectly reported as duplicates / conflicting by the libSBML
    consistency checker (consistency check id 902).  Thanks to Jo
    Matthews for reporting this bug.

  - In the libSBML Matlab 'IsSetFast' was renamed to 'isSetFast'
    (TranslateSBML.c).  This bug caused no problem with Matlab 6, but
    would crash Matlab 7.

  - Configuring with --with-check on MacOSX would cause -Lyes/lib to be
    added to the LDFLAGS.  This bug in config/libcheck.m4 is now fixed.
    (Tracker libsbml case #57.)

  - Minor layout extension bug fixes.


* Known Bugs:

  - Same as for libSBML 2.3.1


* Released May 27, 2005



======================================================================
Version 2.3.1
======================================================================


* New Features:

  - LibSBML now keeps infix formula strings and ASTs internally
    synchronized for Rules and KineticLaws.  This means you may use
    whichever you prefer: get/setFormula(), get/setMath(), or freely
    intermix them.  This brings the libSBML object model another step
    closer to SBML level and version transparency (where reasonably
    possible).  As a result, the methods / functions
    setFormulaFromMath() and setMathFromFormula() are no longer
    necessary, but are kept around for backward compatibility.


* Bug Fixes:

  - LibSBML now converts plural <annotations> into their singular form
    when reading and storing annotation strings.  This prevents
    technically incorrect SBML from being written when a plural
    annotations are read-in and an L1v2 or L2v1 SBML document is
    subsequently written-out.

    Note: It is still possible to pass setAnnotation() an incorrectly
    formatted annotation string.  This is one of the many shortcomings
    of the libSBML annotation system, which will be overhauled soon.

    Thanks to Jo Matthews for reporting this bug.

  - Doxygen generated HTML documentation, which was broken in libSBML
    2.3.0, is working again.

  - ./configure --with-expat=... works again.  There was a small typo
    in the config/expat.m4 script that caused LDFLAGS to be set
    incorrectly.  Thanks to Ed Frank for reporting this bug.

* Changes:

  - The methods / functions setFormulaFromMath() and
    setMathFromFormula() for Rules and KineticLaws are no longer
    necessary, but are kept around for backward compatibility (see New
    Features).


* Known Bugs:

  - Same as for libSBML 2.3.0


* Released May 9, 2005


======================================================================
Version 2.3.0
======================================================================

* New Features:

  - Ralph Gauges extension to libSBML to support the diagram layout
    proposal (previously available as a separate patch) is now part of
    the libSBML distribution.  Since the layout extension is still
    experimental at this point, it is not compiled into libSBML by
    default.  To enable it:

      ./configure --enable-layout
      make

    The layout extension may be used from libSBML C, C++, Java and
    Python.  It has not been tested under Windows (the MSVC++ 6 and
    MSVC++ 7 project files do not even attempt to compile it).
    Example code can be found in examples/layout.


  - The new and much improved libSBML Validator framework may be found
    in src/validator.  This framework has been used to implement 45
    (out of approximately 50) SBML model consistency checks listed on
    the SBML Wiki (http://sbml.org/wiki/Semantic_Validation).

    The libSBML Validator framework is designed to allow you to
    express model validation constraints in a succinct yet readable
    manner.  The constraint "language" has a declarative feel while
    still allowing you to use the full expressive power of C++ when
    necessary.  To see the current set of 45 consistency constraints,
    see src/validator/contraints/ConsistencyConstraints.cpp.

    The most up-to-date validator documentation is available on the
    libSBML website (http://www.sbml.org/software/libsbml).


  - LibSBML now supports SBML Level 2 to SBML Level 1 conversions for
    certain classes models.  To use, on an SBML L2 document, simply
    call SBMLDocument.setLevel(1).  If no errors were logged,
    conversion was successful.  Currently, libSBML is somewhat
    conservative about the classes of models it will allow to be down
    converted.  The sophistication of this conversion will improve
    over time.  See also examples/c++/convertSBML.cpp.


  - libSBML now implements a variant of the Visitor pattern (Design
    Patterns, GoF, 1995, p. 331).  The parent Visitor class is called
    SBMLVisitor and each SBML class now has an accept() method to
    accept subclasses of SBMLVisitor.  See the libSBML Developer's
    Manual for more information.

  - The Java and Python language bindings now include documentation
    strings for each method and function.  The docstrings are
    extracted from the C/C++ docstrings and added to each language
    bindings (see src/bindings/swig/swigdoc.py for more information).

      - Since the SWIG generated sources are annotated, Java
        docstrings can be accessed by running JavaDoc on the generated
        Java source files.

      - Python docstrings may be accessed via help() (since Python
        2.1), pydoc, docutils, HappyDoc, etc.

  - SBMLWriter and MathMLWriter are now full-fledged classes.  Plus,
    thanks to Stefan Hoops, it is now possible to:

      1.  To use these classes to write to a C++ std::ostream, and

      2.  Set a program and version name when writing SBMLDocuments,
          which will write the following XML comment (intended for
          human consumption) at the beginning of the file:

            <!-- Created by <program name> version <program version>
            on yyyy-MM-dd HH:mm with libsbml version <libsbml version>. -->

  - Added const versions of the getListOfXXX() methods for Model,
    UnitDefinition, Reaction, KineticLaw, and Events.

  - There are several new convenience methods (and functions) on Unit
    and UnitDefinition.  These make many libSBML consistency checks
    much readable.  In particular the following were added:

      - Unit.isXXX() C++ methods (and corresponding Unit_isXXX() C
        functions) for each UnitKind.  For example, Unit.isMetre() (or
        Unit_isLitre()).

      - A static C++ method Unit::isBuiltIn() (and the corresponding C
        function Unit_isBuiltIn()).  It takes a string as an argument
        and returns true if it is one of the five SBML built-in units:
        'area', 'length', 'substance', 'time', or 'volume'.

      - Five new methods that allow you to ask whether or not a
        particular UnitDefinition is a variant of a built-in unit.
        That is, the unit expresses the built-in type and varies
        arbitrarily in only scale, multiplier, and/or offset.  The
        methods are:

          - isVariantOfArea()
          - isVariantOfLength()
          - isVariantOfSubstance()
          - isVariantOfTime()
          - isVariantOfVolume()

  - ParseMessages can now have an integer identification number
    associated with them to uniquely identify each message.  The id
    the first argument passed to the ParseMessage constructor and
    ParseMessage_createWith().

    The new and improved libSBML consistency check facility makes use
    of ParseMessage ids.

    Thanks to Damon Hachmeister for suggesting this idea.


* Bug Fixes:

  - XML namespace handling is now working properly with libSBML Expat.
    Thanks to Ben Skrainka for reporting this bug.

  - Because libSBML did not trim leading and trailing whitespace on
    <notes> and <annotation> content, each time libSBML read and then
    wrote a file, the amount of leading and trailing whitespace within
    this content would grow (i.e. the extra whitespace and libSBML's
    modest pretty printing were interfering with each other).  Thanks
    to Damon Hachmeister for reporting this bug.

  - There's a bug in Xerces-C++ 2.6.0 (#1308) that caused libSBML to
    record an incorrect XML namespace on a </annotation> element in
    some instances.  Thanks to Johan Hattne for discovering this bug
    and providing a workaround.  Thanks also to Eryk Wolski who sent
    in runs of 'make check' that also revealed this bug.

  - When converting L1 models to L2, any Compartment or Parameter
    involved in a CompartmentVolumeRule or ParameterRule,
    respectively, now correctly has its constant attribute set to
    false (instead of the L2 default of true).  (As for Species, their
    constant attribute defaults to false in L2).  Thanks to Andrew
    Finney and Nicolas Le Novere for reporting this bug.

  - When reading SBML with libSBML Expat some classes of errors would
    result in segmentation faults.  This has been fixed.

  - When reading SBML from an in-memory string with libSBML Expat
    parse errors were not be logged.  This has been fixed.


* Changes:

  - Leading and trailing whitespace is now removed before storing
    <notes> and <annotation> content.  Note that whitespace *within*
    <notes> and <annotation> content is preserved as always.

  - readSBML(filename), SBMLReader_readSBML(filename) and
    SBMLReader::readSBML(filename) now log specific fatal error
    ParseMessages if the file could not be found or the content is not
    SBML.  See the function / method docstrings for more information.
    Thanks to Eryk Wolski and Ralph Gauges for suggesting this idea.

  - Removed support for writing various character encodings.  This
    change has been a long time coming.  LibSBML should support
    writing only UTF-8 because that is what the SBML standard
    requires.

  - Renamed two methods on the Reaction class:

      - getReactantById() -> getReactant()
      - getProductById()  -> getProduct ()

    The naming scheme takes advantage of C++ overloading (i.e. you can
    specify either a string id or an integer position to get the nth
    reactant or product) and is consistent with similar methods
    elsewhere in libSBML.  The 'ById' portion of the name was a
    holdover from the C API and was introduced by mistake when
    converting the C API to C++.

  - Started upgrading some unit tests to 'check' 0.92.  In version
    0.92, NULL may be omitted as the second argument to fail_unless()
    and fail_if().

  - All header files use forward class declarations in order to
    minimize dependencies and increase compilation speed.

  - The make system tries harder to use the user's LD_LIBRARY_PATH
    setting, especially when running tests with 'make check'.

  - 'make install' now strips the installed library on systems where
    we can do it at installation time (which currently are non-MacOSX
    systems).
  
  - 'make install' no longer installs the documentation by default;
    use 'make install-docs' for this.  The install-docs formats the
    latex-based documentation in the docs subdirectory and requires
    latex and pdflatex to be available on your system.  It can also be
    a time-consuming step.  To reduce annoyances for people who
    frequently do 'make install', we took out the docs installation
    step and make it separate.

  - The default documentation creation procedure no longer creates 
    DVI files, only PDF and HTML.  Some people's TeX/LaTeX installations
    apparently don't have a latex, only a pdflatex, and the default
    actions could fail.  DVI and PS formats can still by obtained by
    using explicit commands.  (See the Makefile in docs/src for more.)


* Known Bugs:

  - Qualified (prefixed) element names are broken in the Xerces-C++
    2.6.0 SAX2 handler.  Currently, libSBML does not work around this
    bug.  As a result, when libSBML converts <annotation>s to strings,
    qualified element names with intervening element content
    (e.g. <foo:bar> <baz:bop> </foo:bar>) will result in end elements
    with incorrect prefixes (e.g. </baz:bar>).  If you prefer
    Xerces-C++, for now please use 2.5.0 or earlier.

  - When reading nested <piecewise> elements, libSBML looses the outer
    piecewise elements.  Martin Ginkel has reported this bug and
    provided a test case.

  - In libSBML C++, adding objects created on the *stack* to a
    container object (e.g. adding a Species to a Model or a Unit to a
    UnitDefinition) may cause libSBML to crash.  LibSBML assumes:
    i) container objects adopt the the objects they contain
    (i.e. container objects will freeing objects they contain) and
    ii) all such objects are heap based (e.g. created with new).

    This bug will be fixed in a future release (2.4.0?) with reference
    counted objects.  Note this bug *does not occur* in any of LibSBML
    C, Java, Python, Perl, Lisp, or Matlab.


* Released May 2, 2005




======================================================================
Version 2.2.0
======================================================================

* New Features:

    - Perl

      A full libSBML Perl API was contributed by Christoph Flamm and
      Rainer Machne.  For more information, see
      bindings/perl/README.txt.

      The Perl API is not yet integrated into the libSBML 'configure'
      system.  To build and install it, after installing libSBML,
      change to bindings/perl and follow the CPAN-style build
      instructions in the README.txt file.

    - Lisp

      A full libSBML Lisp API was contributed by Martin Ginkel.
      For more information, see bindings/lisp/README.txt.

    - Windows Installation Program

      Sarah Keating created Windows setup programs in two flavors:
      libsbml-2.2.0-win-xerces.exe and libsbml-2.2.0-win-expat.exe.

    - XML namespace definitions may be retrieved from or added to any
      SBML object.  It's good practice, however, to put namespaces
      only on the top-level <sbml> element.  For example:

        SBMLDocument d;
        d.getNamespaces().add("jd", "http://www.sbml.org/2001/ns/jdesigner");

      To find out if an SBML object (XML element) has any namespaces
      defined, use hasNamespaces(), for e.g.:

        if (d.hasNamespaces()) ...


* Bug Fixes:

    - <notes> and <annotation> elements on the top-level <sbml>
      element were not being written-out for L2 documents.  Thanks to
      Damon Hachmeister for reporting this bug.

    - <csymbol> delay functions were being handled incorrectly
      throughout libSBML as symbols (similar to <csymbol> time, which
      is a symbol) instead of functions.  The fix results in three
      changes:

        1. The ASTNodeType AST_NAME_DELAY is changed to
           AST_FUNCTION_DELAY.

        2. As a result of (1), ASTNode.isFunction() will now return
           true for delay function nodes.

        3. The infix expression parser will parse:

             delay(...)

           as an AST_FUNCTION_DELAY (This does not mean delay
           functions must be called "delay" in MathML, it simply means
           if you want to create them in infix, you need to use the
           name "delay").

      I'm reasonably confident the effect of these changes on existing
      code will be minimal.  My guess is that if anyone had been using
      this aspect of libSBML, they would have reported it as a bug.
      Thanks to Sarah Keating for reporting this bug.

    - The consistency checks were referencing ids instead of names
      when checking L1 models.  Thanks to Jo Matthews, Mike Hucka, and
      Manuel Martin for reporting this bug.

    - XML namespace definitions were not being preserved when writing
      out an SBML document.  Thanks to Jo Matthews, Michael Lawrence,
      and Herbert Sauro for reporting this bug.


* Changes:

    - The API SBMLDocument.validate() has been deprecated and will be
      removed in a future release of libSBML.  Use
      SBMLDocument.checkConsistency() instead.

    - A HTML version of the libSBML Developer's Manual is now available.
      Thanks to Mike Hucka for working that out.


* Released October 6, 2004




======================================================================
Version 2.1.0
======================================================================

* New Features:

    - C++

      While it's always been possible to call the C API from C++ code,
      this version of libSBML features a true object-oriented API that
      mirrors the SBML specifications.  To get a feel for the C++ API,
      see src/TestReadFromFile5.cpp.

      For those that prefer the straight C API, it's still available
      and over 730 unit tests prove its backward compatible with
      previous releases.

    - Java

      A full libSBML Java API is also available.  See:

        docs/formatted/java.txt  -  For more information
        bindings/java/Test.java  -  For example code

    - Python

      A full libSBML Python API is also available. See:

        docs/formatted/python.txt  -  For more information
        bindings/python/accept.py  -  For example code


    - Validation Engine / Consistency Checks

      In addition to validating an SBML document against the SBML XML
      Schema, we've added a (customizable) validation engine.

      Currently libSBML comes pre-configured with 39 consistency check
      rules described at:

        http://sbml.org/wiki/Semantic_Validation

      To test whether or not an SBML document violates any of these
      consistency checks, simply load an SBML document, d, and call:

        SBMLDocument_validate(d)  -  C
        d.validate()              -  C++, Java, Python

      Every violation adds an error message to the SBML document
      (accessible with getNumErrors() and getError()) and validate()
      returns the total number of errors found.

      The ability to add your own rules is still a bit rough around
      the edges.  The API was started before libSBML was ported to
      C++, so new rules must be written in C or C++ (no Java or
      Python).  If you're interested, please see
      src/ValidationRules.c.


    - Additional Convenience Functions:

      It's now possible retrieve objects from a Model either via their
      ordinal position or their SId.  In C++, Java, and Python the
      same method name is overloaded to take either an integer or a
      string:

        int   n;
        Model m;

        m.getXXX(n);
        m.getXXX("SomeSId");

      In C, two separate functions are provided:

        Model_getXXX(n);
        Model_getXXXById("SomeSId");


* Bug Fixes:

    - All bugs reported for the libSBML betas, 2.0.4 and 2.0.5, have
      been fixed.

    - Infix formula strings with grouped non-associative operators of
      the same precedence were being formatted incorrectly.  That is:

        "a - (b - c)"  ->  "a - b - c"
        "a - (b / c)"  ->  "a / b / c"

      To be clear, the formula string would parse correctly, but would
      be written out incorrectly.  Thanks to Rainer Machne for
      reporting this bug.

    - Double precision numbers (in attribute values, infix formulas,
      or MathML) were being printed to a maximum precision of six
      digits.  This artifically low limit has been increased to 15
      digits (the maximum precision possible for an IEEE-754 doubles).
      Thanks to Tatsuya Ishida for reporting this bug.

    - MathML incorrectly nested inside <notes> or <annotation>
      elements would cause libSBML to crash.  Thanks to Adam Halasz
      reporting this bug.

    - Negative numbers in MathML <cn> elements were being incorrectly
      parsed.  Thanks to Nadia Ugel and Victoria Gor, both of whom
      independently discovered and reported this bug.

    - A <rateRule> element would be written without the closing angle
      bracket (!) if it had a note and/or annotation associated with
      it.  Thanks to Konstantin Kozlov for reporting this bug and
      providing a fix.

    - A MathML expression involving a <csymbol> did not "reduce" to
      the correct syntax tree when it was the last argument of an
      <apply>.  Thanks to Jacek Puchalka for reporting this bug and
      providing a fix.


* Changes:

    - SBMLTypes.h now includes MathMLDocument.h, MathMLReader.h and
      MathMLWriter.h

    - Mike Hucka rewrote the entire build/make system.  It no longer uses
      automake or libtool; as a result, it is smaller, leaner and faster.
      Other features include changes to configure to add --with-python,
      --with-java, --with-matlab.

    - Mike Hucka updated the libsbml-manual.tex to make it reflect the
      current state of the API.  Mike also created a new LaTeX class file
      called sbmlmanual.tex, available in the docs/src/tex subdirectory.

    - In order to make the generation of the manuals self-contained, we've
      put all the necessary LaTeX class files and extensions they use in
      docs/src/tex.  This bloats the distribution, but is the only safe way
      to ensure that people can actually make the docs.

    - Mike Hucka also updated the doxygen documentation configuration and
      the makefile that drives it.  However, it's still not ready for
      prime-time and we are not yet distributing it as a standard part of
      the regular distributions.

* Released July 23, 2004




======================================================================
Version 2.0.3
======================================================================

* Major New Features:

    - Stephan Hoops has contributed a port of libsbml to use the Expat
      XML parser library as an alternative to Xerces.  To build
      libsbml to use Expat:

        ./configure --with-expat[=PATH]

      All checks but one pass with Expat enabled (See Bugs below).
      There are currently two caveats to using Expat with libsbml:

        1.  libsbml *will not* be able to validate SBML and MathML
            content against an XML Schema.  Expat has no facilities
            for XML Schema validation.

        2.  XML entity references (e.g. &#160;), which are most likely
            to occur in XHTML <notes> sections, will be output as
            their UTF-8 byte sequence instead of the more human
            readable entity reference (see Bugs below for more
            information).

    - Rainer Machne has contributed an example program that evaluates
      infix expressions and prints their results using the libsbml AST
      API.  See examples/evaluateMath.c.


* Bug Fixes:

    - The correct namespace is now output for both SBML Level 1 and
      Level 2 documents.  This bug was introduced as a result of a bug
      fix in the 2.0.1 release which output only Level 1 namespaces.
      The bug is fixed now.  Honest.  Thanks to Akira Funahashi for
      reporting this bug.

    - XML entity references (e.g. &#160;), which are most likely to
      occur in XHTML <notes> sections, are now output using the same
      entity reference notation instead the corresponding UTF-8 byte
      sequence.  Thanks to Jo Matthews for reporting this bug.

      NOTE: This bug has not yet been fixed in the Expat version of
      libsbml.  While Expat reads and writes UTF-8 by default, it
      comes with no APIs to manipulate or translate Unicode encodings.
      Writing such a conversion routine and ensuring it is
      cross-platform is non-trivial and would hold up this release of
      libsbml for too long.

* Released December 19, 2003




======================================================================
Version 2.0.2
======================================================================

* Major New Features:

    - Sarah Keating has contributed a Matlab interface to libsbml and
      tools to load, store and view (via a Matlab GUI) a database of
      models (from a .mat file).  See the README.txt in
      bindings/matlab/SBMLToolbox for build instructions and
      additional information.

* Bug Fixes:

    - Writing SBML L2 documents with FunctionDefinitions would cause
      libsbml to crash (segfault).  The cause was a typo in
      SBMLFormatter.cpp where a call to listOfUnitDefinitions() should
      have been (and is now) listOfFunctionDefinitions() (Thanks to Jo
      Matthews for reporting an anomaly that led to the discovery of
      this bug).

* Released October 24, 2003



======================================================================
Version 2.0.1
======================================================================

* Bug Fixes:

    - The correct namespace is now output for SBML Level 2 documents.

    - The MathMLHandler now correctly constructs ASTs for calls to
      user-defined function containing numeric arguments (Thanks to
      Colin Gillespie for reporting an anomaly that lead to the
      discovery of this bug).

    - SBML_formulaToString() did not correctly reproduce (sub)
      expressions with operators of the same precedence, but modified
      associativity.  For example, "1 / (2 * 3)" was correctly parsed
      (in infix or MathML) but incorrectly converted to "1 / 2 * 3".
      This bug has been fixed!

* Major New Features:

    - When reading SBML Level 2, MathML expressions are automatically
      converted to and stored as SBML L1 infix expressions for maximum
      backward compatibility with L1.  That is, either XXX_getMath()
      or XXX_getFormula() may be used.  There is no need to call
      SBML_formulaToString() under most circumstances.

    - SBML_convertToL2(SBase_t *sb) converts any SBML Level 1 object
      and its subordinate objects to SBML Level 2.  Currently this
      function:

        - Converts name fields to id fields

        - Adds ModifierSpeciesReferences when converting Reactions
          (via SBML_addModifiersToReaction(Reaction_t *r, const Model_t *m))

      In the future this function will also:

        - Add FunctionDefinitions for L1 predefined functions

     SBMLDocument_setLevel() calls SBML_convertToL2() automatically
     when the current level is 1 and the new level is 2.

* Major New APIs:

    - char *
      writeMathMLToString (MathMLDocument_t *d)
  
    - unsigned int
      Model_getNumSpeciesWithBoundaryCondition (const Model_t *m)

    - Species_t *
      Model_getSpeciesById (const Model_t *m, const char *sid)
 
    - SpeciesReference_t *
      Reaction_getReactantById (const Reaction_t *r, const char *sid)

    - SpeciesReference_t *
      Reaction_getProductById (const Reaction_t *r, const char *sid)

    - ModifierSpeciesReference_t *
      Reaction_getModifierById (const Reaction_t *r, const char *sid)

    - unsigned int
      ListOf_countIf (const ListOf_t *lo, ListItemPredicate p);

    - void *
      ListOf_find (const ListOf_t *lo, const void *item1, ListItemComparator c)

    - List_t *
      ASTNode_getListOfNodes (const ASTNode_t *node, ASTNodePredicate p)

    Where ListItemPredicate, ListItemComparator and ASTNodePredicate
    are pointers to functions with a particular signature.  This
    allows for convenient and powerful Lisp map-like or C++ STL
    operations over a container (In fact, the XXX_countIf() name was
    inspired by the C++ STL).  For example,
    Model_getNumSpeciesWithBoundaryCondition() (above) is implemented
    simply as follows:

      return ListOf_countIf( m->species,
                            (ListItemPredicate) Species_getBoundaryCondition );


* New example program:

    - translateMath.c is an interactive console program that translates infix
      formulas into MathML and vice-versa.

* Improved Windows build and binary distribution:

    - Andrew Finney constructed an MSVC++ project file and a set of
      batch files to build both regular and debug versions of libsbml
      and all example programs.

    - Xerces-C++ 2.2.0 headers, DLLs and .lib files are included with
      the Windows distribution (libsbml-2.0.1.zip; see the win32/
      subdirectory).

* Minor improvements:

  - Public API header files no longer include references to C-specific
    header files (e.g. stdio.h).  This should make it easier for
    automated tools to read these header files and generate API
    bindings for other languages (e.g. Delphi; Thanks to Herbert Sauro
    for suggesting this).

  - SBMLTypes.h now #includes both SBMLReader.h and SBMLWriter.h.

  - Internal utility classes and functions are now officially public.
    See List.h, Stack.h, StringBuffer.h and util.h.

* Released August 6, 2003




======================================================================
Version 2.0.0
======================================================================

* Near complete L2 support.  The two features not yet supported are:

    1. RDF (although the metaid attribute is read, stored and written)

    2. Processing of the MathML <semantic> element (for annotating
       MathML elements with additional content, e.g. TeX).


* New L2 Structures:

    - FunctionDefinition
    - Event
    - EventAssignment
    - SimpleSpeciesReference    (abstract)
    - ModifierSpeciesReference
    - AssignmentRule            (no longer abstract)
    - RateRule

    - MathML and L1 infix expressions (when parsed) are both stored in
      the same Abstract Syntax Tree (AST) structure ASTNode.

    - ListOf stores lists of others SBML objects and may contain a
      metaid, notes or annotations.


* New L2 Functions:

    - The getters, setters, isSet and unset functions are too numerous
      to mention here.  Like L1, they parallel the UML structures
      defined in the SBML specification.  All L1 functions are kept
      for backward compatibility (see below).

    - Any structure containing a list now has a getListOfXXX()
      function which returns the corresponding ListOf structure.

    - There are currently three convenience functions for converting
      between SBML infix and MathML formulae:

        - ASTNode_t        *SBML_parseFormula(const char *formula)
        - char             *SBML_formulaToString(const ASTNode_t *math)
        - MathMLDocument_t *readMathMLFromString(cont char *xml)

      Again, these are provided purely for convenience.  Under normal
      circumstances, libsbml performs all conversions behind the
      scenes when necessary.


* L1 to L2 Changes:

  libsbml stores both L1 and L2 models in the same memory structure.
  While the L1 getters, setters, isSet and unset functions exist for
  backward compatibility there are some changes of which users of
  previous versions of libsbml should be aware:

    - Compartment:

        - .volume has been renamed to .size.

    - Species:

        - .units has been renamed to .substanceUnits.

        - .initialAmount and .initialConcentration are stored in a
          union called .initial with discriminators .Amount and
          .Concentration.

    - Reaction:

        - .fast is optional in L2 which introduces Reaction_isSet /
          unsetFast() functions.

    - SpeciesReference:

        - .stoichiometry is now of type double which necessitated a
          change in the signature of the getter and setter functions.

        - The use of .denominator is deprecated in L2.

          However, libsbml still uses denominator in L2 models.  When
          reading a <stoichiometry Math> if the content is a single
          <CNN type='rational'>, libsbml will discard the
          stoichiometry Math and set stoichiometry and denominator
          directly.  Similarly, libsbml will write <stoichiometryMath>
          in L2 documents if the .stoichiometryMath field is not set
          and the denominator is not 1.

    - CompartmentVolumeRule:
    - SpeciesConcentrationRule:
    - ParameterRule:

        - .compartment, .species and .parameter have all been renamed
          to .variable.

    - The XXX_createWith() functions now set the .id field instead of
      the .name field.

    - List_t has been replaced by ListOf_t to store a metaid, notes,
      and annotations.  ListOf_t is simply a wrapper around List_t.


* SBMLReader allows you to set up to three Schema filenames (one each
  for L1v1, L1v2 and L2v1) and it will automatically use the
  appropriate Schema for the SBML document being read.

* A simple command-line executable that converts L1 models to L2 was
  added to the examples/ subdirectory.

* A new subdirectory, xml-schemas/, contains schemas for SBML L1v1,
  L1v2, L2v1 and MathML 2.

* Xerces-C 2.3.0 is now supported by libsbml.  Older versions of
  Xerces-C (2.2.0 and 2.1.0) are still supported.


* Released July 23, 2003




======================================================================
Version 1.1.2
======================================================================

* A new subdirectory, examples, contains a few small programs that
  demonstrate how libsbml may be used.

* IEEE-754 NaN, +Inf, -Inf and -0.0 are handled correctly and
  consistently on all supported platforms.  In previous versions, these
  values were not represented, read or written correctly on native
  Windows and under Cygwin.

  When writing these values to XML, libsbml now strictly adheres to the
  XML Schema specification for doubles, namely exactly: "NaN", "INF",
  "-INF" and "-0".

* The build platform was upgraded to Libtool 1.5.  This means dynamic
  libraries will build correctly on all platforms: Linux (.so),
  Solaris (.so), Cygwin (.DLL) and MacOS X (.dylib).

* SBMLWriter now defaults to an output encoding of UTF-8.

* SBML_parseFormula() now returns NULL if the formula contains an
  error.  The next version of libsbml will return the position of the
  syntax error.

* Added method: SBMLDocument_setModel().

* To build and run the libsbml test suite now requires an explicit
  configure option:

    ./configure  --enable-check

  In addition, 'check' needs to be installed (http://check.sf.net/).
  Under Cygwin ONLY, due to a limitation of Libtool, if libsbml is
  built with --check-enabled, a DLL cannot be built.  So, after
  testing, re-run configure without enabling check then 'make' and
  'make install' as usual.

  Running the test suite on any platform is completely optional.
  Libsbml is tested on all supported platforms before it is released.


* Released June 6, 2003




======================================================================
Version 1.1.0
======================================================================

* A Developer's Manual (DRAFT) is available in docs/formatted/.

* Formula strings may optionally be parsed into abstract syntax trees.
  See ASTNode.h, and SBML_parseFormula() in FormulaParser.h.

* XXX_isSetYYY() and XXX_unsetYYY() methods are available for optional
  fields without default values.

* XXX_getYYY() and XXX_setYYY() methods are available for every field.

* SBML (XML) namespace handling is much improved.

* '<annotations>' is treated as a synonym for the correct form
  '<annotation>' (singular).

* Notes and annotations on the top-level <sbml> element are read-in
  and stored (SBMLDocument_t now "inherits" from SBase_t), but not
  written.  When this occurs, a warning message is logged.

* Builds successfully on Solaris 2.8.

* SBML documents may now be validated against their XML schema.  This
  is still off by default.  To turn validation on see
  SBMLReader_create(), SBMLReader_readSBML() and possibly SBMLReader.h
  for more information.

* Three new convenience functions exist to quickly print warnings,
  errors and fatal errors that occurred while reading an SBMLDocument.
  The prototype for this class of function is:

    SBMLDocument_printXXXs(SBMLDocument_t *d, FILE *stream).

  Where XXX is Warning, Error or Fatal.


* Released May 11, 2003.




======================================================================
Version 1.0.1
======================================================================

* The build system detects and supports Xerces-C 2.1.0, Xerces-C 2.2.0
  compiled with or without namespace support.

* Released March 14, 2003.




======================================================================
Version 1.0.0
======================================================================



* Initial release, March 12, 2003.
# The following is for [X]Emacs users.  Please leave in place.
# Local Variables:
# fill-column: 70
# End:
