           libSBML NEWS -- History of user-visible changes

====================================================================
5.21.0 (2026-01-09)
====================================================================

This release further improves the ODE to Reaction converter, 
improves the ASTNode::derivative function to support all allowed 
math constructs, and resolves a number of build and stability 
issues.

====================================================================
5.20.5 (2025-05-05)
====================================================================

This release adds support for retrieving / setting notes via Markdown 
(using the 3rdParty libraries html2md and maddy). Additionally, a 
number of stability and build issues were resolved.

====================================================================
5.20.4 (2024-08-07)
====================================================================

This is mostly a bug fix release enhancing stability and improving 
performance when validating models. Main points: 

* support compilation when using libxml 2.12.0 and later
* improved performance when testing for assignment cycles 
* cmake build system honors the BUILD_SHARED_LIB flag if defined


====================================================================
5.20.2 (2023-09-21)
====================================================================

This is mostly a bug fix release enhancing stability when validating
and converting models.

* New features / improvements

  - Access to error logs from the C API  

  - Attributes of the ModelHistory can now be accessed from 
    const objects. 

  - The FBC V3 package has been updated to reflect the latest
    specification. There are now optional attributes `fbc:reaction2` 
    on the FluxObjective and `fbc:variable2` on the 
    UserDefinedConstraintComponent.

* Bug fixes

  - A bug converting / validating models with the 'comp' package
    has been fixed.

  - A crash when inferring units has been resolved. 

  - A fix to the CMake Build system ensures that check for dependencies
    is more robust. Thanks to first time contributor @adelhpour

  - The type of the FBC V3 `coefficient` attribute on the 
    UserDefinedConstraintComponent has been corrected, it was mistakenly
    a double before, now it has been corrected to be a SIdRef as 
    described in the specification.
  

====================================================================
5.20.0 (2023-04-03)
====================================================================

Given the length of time since our last release the list of changes
and acknowledgements of contributions is incomplete. We apologise and
offer thanks to anyone who has been involved and those people who have
contributed their spare time to continuing maintenance and development.

* Addition of support for the SBML Spatial package

  - Now that the first official version of the specification for the
    SBML Level 3 Spatial package is available, the libSBML API for
    'spatial' is now included in the stable release of libSBML. 
    Thus a CMake build using '-WITH_STABLE_PACKAGES' will now include
    the spatial package code.

* New features

  - There is a new converter SBMLRateRuleConverter which will take 
    a model with RateRules and infer the corresponding reaction network.
    This is still considered under development and we would really
    appreciate any feedback.


* Bug fixes

  - A large number of code 'smells' have been cleaned up. Thanks to
    Jamie Quinn for undertaking this laborious task.

  - The python examples have been updated for Python 3.8 changes.
    Thanks to Akira Funahashi for committing these fixes.

  - The python code used for creating documentation has been
    updated for Python 3.10 changes. Thanks to
    Zbigniew Jędrzejewski-Szmek for submitting the changes.

* Configuration/build system changes

  - Extensive continuous integration testing has been added to 
    the GitHub repository.

* Miscellaneous

  - Note there is now a Julia interface to libSBML available
    at https://lcsb-biocore.github.io/SBML.jl/stable/


====================================================================
5.19.0 (2020-11-27)
====================================================================

********************************************************************

        The libSBML source code has moved to GitHub.
            (https://github.com/sbmlteam/libsbml). 

The stable branch reflects the latest released code. The development 
branch is the main branch and we encourage users to create and 
submit pull requests against this branch. We are no longer 
maintaining a separate repository for experimental code for as yet 
unfinished packages. 

Please use the GitHub issue tracker to file any reports or submit a
fix and do a Pull Request.
 
We will gradually move away from SourceForge, but for this release 
code will be available from both SourceForge and GitHub. 



* Addition of support for the SBML Distributions package

  - Now that the first official version of the specification for the
    SBML Level 3 Distributions package is available, the libSBML API for
    'distrib' is now included in the stable release of libSBML.  This
    means that all prebuilt binaries for the stable release will
    include the 'distrib' package code. The src archive containing
    libSBML core code will continue to be available, with additional
    archives of the individual package code.
    
    NOTE: The libSBML GNU make-based build system has not been updated
          for packages. Thus, to build from src, it is necessary to
          use the CMake build system.

* New features

  - Functions get/set/isSetMath have been added to the SBase class.
    These do not allow interacting with a non-existant <math> element 
    but may facilitate using more generic functions.

* Bug fixes

  - There was a memory leak introduced in the SWIG wrapper. Thanks to  
    Fabian Fröhlich for spotting and fixing this.
	
  - The SBMLNamespaces class was being leaked in a number of places, 
    these have now been plugged. 

  - The MathML to infix parser was also leaking memory. Thanks to  
    Liam Keegan for spotting and fixing these. 

  - The validation code detecting assignment cycles was incorrectly 
    including local parameters within its search. These have now 
    been removed from the relevant code. 

  - Conversion code was failing to detect when a local parameter used 
    the 'id' of a speciesReference which is allowed in SBML Level 3. 
    These can be converted to SBML Level 2 and the code has now been
    corrected so this conversion will take place. 

  - The L3 infix parser has been improved to recognize the use of a 
    name without parentheses as a misused function name or a csymbol,
    if appropriate.
    
  - There was an anomaly when using the addCVTerm() and 
    appendAnnotation() functions which meant that if used in a certain
    order information could be lost. This has been corrected.  Thanks
    to Colin Halupczok for the detailed report.
    
  - Converting a <localParameter> to a global <parameter> object was
    failing if the metaid attribute was set. This has been changed to
    produce the correct behavior.

* Configuration/build system changes

 - Import of the python library has been sorted in line with recent Linux
   changes to the location of the shared file.

 - Code has been fixed to be MingGW compliant. 

 - The build configuration was updated to work with the latest version of R.

* Miscellaneous

 - A number of memory leaks and possible access violations have been solved. 


STABLE PACKAGES


  - 'distrib' package-specific updates:
  
    - A new converter, AnnotationToDistribConverter, has been added 
      to allow conversion from the existing annotation format used 
      with <functionDefinitions> to the new 'distrib' format. This
      complements the existing DistribToAnnotationConverter that converts
      'distrib' to annotations.
      

* Bug fixes

  - 'comp' package-specific bug fixes:

    - Comp flattening dropped conversion factors for particular 
      instances of assignment rules. This has been corrected. 
      Thanks to Matthias König for reporting this. 
      
  - 'distrib' package-specific bug fixes:

    - There was unfortunately an infinite loop in the code using
      the <uncertainty> element. This has been removed.
      
  - 'render' package-specific bug fixes:
  
    - Some render classes were not handled correctly by language
      bindings. This has been fixed.

EXPERIMENTAL PACKAGES

* New features

  - 'spatial' package-specific updates:
  
    - Compression in the 'spatial' package is now based on strings. 
      The code has been changed to reflect this. 

    - Support for int and uint as DataKinds has been added to the 
      spatial code in line with changes in the specification. 

    - A range of validation tests have been added to the spatial 
      code. As this is an experimental passage package still in 
      development, we cannot guarantee that all validation has been
      implemented. 

 * Bug fixes

  - 'spatial' package-specific bug fixes:
  
    - There were some memory leaks in the spatial code. 
      Thanks to Liam Keegan for spotting these and congratulations 
      for being our first GitHub user to address problems using a 
      Pull Request. 
  

      

====================================================================
5.18.0 (2019-04-18)
====================================================================

STABLE RELEASE

* New features

  - LibSBML now defines a DefinitionURLRegistry to allow a user to log
    their own values of the 'definitionURL' attribute on a math <csymbol>
    element. Once logged these definitionURL values will not trigger the
    unknown csymbol error when reading a model that uses them. 

  - LibSBML now defines a CallbackRegistry which allows a user to register
    a callback to interrupt a long running read operation. Examples for C++
    and Python are included. In future it would be anticipated that would
    have callbacks to interrupt long running validation or conversion 
    processes.
	

* Bug fixes

  - Validation was incorrectly stating that the id of a <localParameter>
    that mirrorred the id of a <species> should be listed as a 
    <modifierSpeciesReference> in the enclosing <reaction>. It no longer
    issue an incorrect error.

  - The string to MathML parser was failing to identify known constants
    as arguments to a lambda function. lambda(pi, pi*2) should treat 'pi'
    as an unknown argument not the constant pi. This has been fixed.

  - The MathML parser adds logbase and degree to log and root elements 
    respectively. These are dimensionless integers and but unit
    validation was failing.  This has been corrected.  Note this means
    that for L3 models libSBML will write out the dimensionless units 
    on the relevant <cn> element explicitly.  This may cause an 
    apparent difference in models if reading and then writing. 

  - In MathML a <bvar> element within a <lambda> can only contain a 
    <ci> child element. Validation was failing to spot when this was 
    not the case. This has been corrected.

  - MathML within a <semantics> element was not being properly validated.
    This has been improved.

  - 'layout' package-specific bug fixes:

    - Code was failing to roundtrip glyphs that contained both a <curve>
      and a <boundingBox> element. This has been fixed.


* Configuration/build system changes

  - The cmake files that enable using the check library on 
    a Linux OS have been updated to make this easier.

  - Python 3.7 is now supported.


* Miscellaneous
 
  - Several obscure memory leaks have been plugged.


EXPERIMENTAL RELEASE

* New features

  - 'distrib' package-specific updates:

     - The code has been updated to reflect the specification
       agreed during HARMONY 2019 version 0.24.
        
  - 'spatial' package-specific updates:

    - The code has been updated to reflect the specification 
      version 0.93.

    - Attributes 'id' and 'name' have been added to the SpatialPoints
      class in anticipation of these being added to the specification.

    - Plugin code has changed so that child element class members are
      initialised to NULL.  This saves memory but may cause existing
      code to hit an issue when using a getAbc function; which may now
      return a NULL object when previously it did not.


====================================================================
5.17.2-experimental (2018-12-06)
====================================================================

***                 Experimental only release                    ***

This is an experimental only release, that is, a release of those
files provided in the experimental folder of a full release. 

This includes updates to all the SBML L3 packages that are not yet
accepted and undergoing development.

NOTE: An experimental release is not as rigorously tested as a 
full release.  Any changes/fixes listed as either referring to
stable or experimental code may change before the next full release.


STABLE RELEASE

* New features

  - The math code has been refactored to use the more efficient 
    math-legacy code in combination with a math plugin system. 
    This code has been optimized and we welcome feedback on any 
    performance issues.  This means there is no longer a math-legacy 
    build option.

  - The new math constructs introduced in SBML L3V2 have been refactored 
    as a math extension; which facilitates the use of these math functions
    in an SBML L3V1 document.

  
  - 'comp' package-specific updates:

    - The 'comp' specification states that an external model must be
      an L3V1 document. Since this specification predates SBML L3V2
      we have relaxed the restriction to allow an L3V2 model using 
      Model Composition to use an L3V2 external model.

    - The converter that 'flattens' a comp model has been optimized
      for speed with significant improvement for larger models.

  - Python interface specific updates:

    - In libSBML the set/add/unset methods return a code to indicate
      success or failure of the operation. The Python interface has
      been improved to produce a warning when a function fails. This 
      behaviour can be enabled by setting a CMAKE configure option
      or an environment variable.

    - Sourceforge Tracker item #456: The Python interface has
      been changed to return an empty List of CVTerms rather
      than a None object.

    - Users have raised issued about Model objects retrieved from within an
      SBMLDocument object going out of scope when the document object
      is removed from scope. We have adjusted the code to allow a Model
      to remain in scope without it's parent document. Feedback would
      be apprceiated about whether this is sufficient or whether all child
      objects should be available regardless of whether their parent is
      still available. 

    - Sourceforge Tracker item #468:  Functions deprecated in Python 3.6
      have been replaced to avoid deprecation warning messages. 
    

* Bug fixes

  - The function SBMLTypeCode_toString was not retuning the correct 
    string for a ListOf element originating in a package. This
    has been corrected.

  - Using an SBML L3 package in an L2 document could cause a crash.
    This has been fixed. Thanks to Thomas Hamm for reporting it.

  - The code that checked for use of an L3V2 package with an L3V1
    document could cause a crash. This has been fixed. 

  - Writing out a document without a model and no level and version
    was using level = version = 0; which is not valid. This has been
    changed to write a L3V2 document with no model.

  - There was an issue with newer architectures when casting a
    NaN to an integer - this has been now been avoided.

  - MATLAB interface specific bug fixes:

    - The matlab binding was failing to distinguish between a
      functionDefinition where the id ended with a logical operator,
      e.g. 'myor' and the actual logical function. This has been corrected.


  - 'comp' package-specific bug fixes:

    - There was an issue with flattening 'comp' models using conversion 
      factors. This has been tracked down and fixed. Thanks to Matthias 
      Konig for reporting it and providing examples.

  - 'render' package-specific bug fixes:

    - Historical render code did not create a NULL BoundingBox. 
      Current code has been brought in line with this.

* Configuration/build system changes

  - Python 3.7 is now supported and included in the builds.

  - The USE_LEGACY_MATH option has been removed as code has been
    reverted to use this math implementation (see above).


EXPERIMENTAL RELEASE

* New features

  - 'distrib' package-specific updates:

    - The distrib package code has been updated to include the use
      of csymbols to reference distributions. This is in line with 
      the latest distrib specification.


====================================================================
5.17.0 (2018-05-21)
====================================================================

STABLE RELEASE

* Addition of support for the SBML Render package

  - Now that the first official version of the specification for the
    SBML Level 3 Rendering package is available, the libSBML API for
    'render' is now included in the stable release of libSBML.  This
    means that all prebuilt binaries for the stable release will
    include the 'render' package code. The src archive containing
    libSBML core code will continue to be available, with additional
    src archives available in the stable branch: one containing
    libSBML core plus all stable packages and additional archives of
    the individual package code.
    
    NOTE: The libSBML GNU make-based build system has not been updated
          for packages. Thus, to build from src, it is necessary to
          use the CMake build system.


* New features

  - The MATLAB language interface function TranslateSBML has been
    optimized for speed.

  - The MATLAB interface function OutputSBML can now be called with an
    output argument and no inputs; doing so will return information
    about the libSBML version and enabled packages used to build the
    binary files.

  - A new function getDefaultSBMLStruct has been added to the MATLAB
    interface. This function takes a string name of the element with
    level and version information and returns the relevant MATLAB-SBML
    structure for the element. Many thanks go to Thomas Pfau for
    supplying this function.

  - On occasion, the function getDerivedUnitDefinition that returns
    calculated units would report incorrect units without flagging any
    issues. This has been made less ambiguous and a derived
    UnitDefinition will not contain any units if it cannot be
    correctly determined.

  - Unit validation has been optimized and significantly speeded up for
    larger models. 
  
  - 'comp' package-specific updates:

    - The C API for comp has been completed.

  - 'fbc' package-specific updates:

    - SourceForge Tracker item #455: Error messages have been improved.
        
  - 'multi' package-specific updates:

    - The C API for multi has been completed.

  - 'qual' package-specific updates:

    - SourceForge Tracker item #455: Error messages have been improved.

  - 'render' package-specific updates:

    - A full C API for the render package has been added.

* Bug fixes

  - SourceForge Tracker item #459: An error in the function that
    converts libSBML infix notation to MATLAB infix notation failed
    when log functions failed. This is fixed. Thanks to Sven Thiele
    for reporting the issue.

  - The validation check for duplicate values of the 'metaid'
    attribute was not being extended to all packages. This has
    been fixed. 

  - Python examples have been updated to work with Python v3.

  - 'qual' package-specific bug fixes:

    - SourceForge Tracker item #457: Validation of rule qual-20311
      was producing an error when it should have been a warning.
      Thanks to Justin McManus for reporting the problem.


EXPERIMENTAL RELEASE

* New features

  - 'distrib' package-specific updates:

    - The 'distrib' package has undergone significant changes.
      The code has been fully updated to match this. We have also 
      used a Distrib prefix on all classes to prevent clashes with
      other packages or even other libraries. We welcome feedback 
      on this approach.


====================================================================
5.16.0 (2017-12-07)
====================================================================



STABLE RELEASE

* Note

  The L3 Render Package has been approved by the SBML Editors, but
  approval came too late in the libSBML release cycle to include it
  in this stable release of libSBML.

  There are now two implementations of support for SBML Level 3
  Version 2 Core.  The libSBML code for L3V2 can now be considered
  stable and will only change for bug fixes.

* New features

  - The MATLAB interface now supports both the 'qual' and 'groups' 
    packages, in addition to 'fbc'. 

  - Unit checking has been expanded to include checking the <math>
    of <trigger>, <constraint> and <stoichiometryMath> to at least
    allow detection of values with undeclared units.

  - Writing out an XMLNode that represented XHTML with multiple
    nested text elements could distrupt indentation (see bug fixes).
    A new function XMLNode::writeToStream(XMLOutputStream&) checks
    the indentation is correctly recovered after writing out the
    XMLNode.
  
  - 'comp' package-specific updates:

    - There has been some improvements made to the reporting of line
      numbers for errors and warnings.

* Bug fixes

  - SF Tracker #450: Code validating the shadowing of localParameter
    was checking both 'id' and 'species' attributes. This rule should
    only check the species attribute.

  - SBML validation failed to distinguish between LocalParameters and
    Parameters in L3V1 when reporting errors. This is fixed.

  - libSBML had incorrectly reported that the 'fast' attribute was a
    required attribute of L3V2 <reaction> elements. This is fixed.

  - The libSBML C API does not work with default arguments. There were
    previously a few stray ones left in the API code. These have been
    removed.

  - The SBMLTransforms::evaluateASTNode function previously failed to
    check that model values had been evaluated prior to trying to
    evaluate an ASTNode. The relevant function now checks whether the
    map of values is present and populates it, if necessary.

  - Code that checked the syntax for attributes of type ID and IDREF
    did not always use the appropriate function. These cases have been
    fixed.

  - The use of an invalid syntax as the sbml:units attribute on a math
    <cn> element was not being detected. This has been fixed. Thanks
    to Nicolas Rodriguez for the report.

  - The SBMLTransforms::evaluateASTNode function missed the fact that
    in SBML Level 2, stoichiometry defaulted to '1'. This has been
    corrected.

  - The use of certain combinations of text elements in a <notes> element
    could derail the entire indentation of the document. This has been
    reported by several people. Hopefully this time we have fixed the
    situation for all cases where it may occur. 

  - The interactive help text stored with the functions and classes in
    the Python bindings had many formatting problems and outright
    omissions due to bugs in our "rewrite_pydoc.py" code. Many of
    these problems should be fixed now.

  - 'fbc' package-specific bug fixes:

    - Validation incorrectly reported an empty <listOfFluxObjectives>
      even when a model was being created and did in fact have a
      <fluxObjective> element. This has been fixed. Thanks to Arthur
      Goldberg for reporting it.

    - An empty <geneProductAssociation> caused the reading of model
      files to crash libSBML. This no longer happens.

  - 'layout' package-specific bug fixes:

    - Conversion between Level 2 annotations using both layout and render
      and Level 3 packages has been corrected.
  
  - 'qual' package-specific bug fixes:

     - Functions to get math on a <functionTerm> element were missing
       from the C API. They have been added.

* Configuration/build system changes

  - SourceForge Tracker item #447: Configuration no longer defines
    HAVE_IEEEFP_H when using MSVC compilers as it is not needed 
    and not always present. Thanks to Alan Garny for spotting this.

  - SourceForge Tracker item #443 & separate unreported problems:
    Build failures with Java 9 should be fixed now.  Thanks to Chris
    West for reporting the issue related to building the docs.

* Miscellaneous

  - SWIG only supports Javascript node 6x. Thus we cannot currently
    support later versions of node.

  - Documentation for the C API has been extensively improved.

  - Support has been added for Python 2 unicode input.

  - Currently we supply lib files built with MSVC2010 as part of the 
    windows installers. These will be removed from future releases. 
    Please let us know if this is an issue for you.


EXPERIMENTAL RELEASE

* New features

  - 'render' package-specific updates:

    - At the request of the SBMLEditors the attribute 'name' has been
      added to render elements.

 * Bug fixes
 
  - 'render' package-specific bug fixes:

    - Conversion between Level 2 annotations using both layout and
      render and Level 3 packages has been corrected.

  - 'spatial' package-specific bug fixes:

    - There was a mismatch in the SetOperation enumeration in the
      specification.  This has been agreed as 'union', 'intersection'
      and 'difference' and libSBML code has changed to reflect this.

    - Corrected the output of a <csGeometry> element to correctly use
      an upper case G.
      


====================================================================
5.15.2 (2017-07-27)
====================================================================

***                 Experimental only release                    ***

This is an experimental only release, that is, a release of those
files provided in the experimental folder of a full release. 

This includes updates to all the SBML L3 packages that are not yet
accepted and undergoing development.

NOTE: An experimental release is not as rigorously tested as a 
full release.  Any changes/fixes listed as either referring to
stable or experimental code may change before the next full release.

STABLE RELEASE

* New features

  There are no features in the stable branch; although there has 
  been some optimization of code. We have also included testing 
  of examples code in our test protocol.
  
* Bug fixes

  - Infix parsing of lambda functions was failing to consider
    variable names as variables, when they might overlap with
    other names for MathML constructs or csymbols e.g. 'time' 
    or 'pi'. This has been corrected so that a lambda function
    will correctly produce the necessary <bvar> elements.

  - Conversion of interchangeable booleans and numbers was not
    reporting consistent information. This has been improved. 

  - Conversion between SBML levels and versions was failing to 
    correctly identify a speciesReference identifier. This is
    now sorted.

  - Sourceforge Tracker #8: The MATLAB bindings were failing to 
    correctly convert logical functions. This has been fixed. Thanks
    to Fabian Froehlich for the report.

  - The check that reports <localParameters> shadowing other identifiers
    was not noticing when it shadowed a speciesReference.  This has 
    been corrected.

  - The evaluateAST function was not correctly dealing with a 
    missing math element.


  - 'comp' package-specific bug fixes:

    - Reading in externally referenced documents during 'comp' 
      validation and/or flattening was consuming large amounts of memory.
      This has now been optimized.

    - There were some slight discrepancies with writing out the id
      attribute in an L3V2 document using 'comp' L3V1V1. These have
      been sorted out.

    - There was a very obscure endless loop in validation that
      Chris Myers managed to find. This is now closed. Thanks Chris.

  - 'groups' package-specific bug fixes:

    - Sourceforge libSBML Tracker #438: The C API for the plugin 
      objects was missing. This has been corrected. Thanks to CJF for
      the report.
       

EXPERIMENTAL RELEASE

* New features

  - 'arrays' package-specific updates:

    - A basic ArraysFlatteningConverter has been added. As yet, this does
      not deal with arrays of submodels from the 'comp' package.

  - 'distrib' package-specific updates:

    - NOTE: the code has not been updated to the latest proposed version
      of the 'distrib' specification as this is currently under major
      review.

 * Bug fixes
 
  - 'arrays' package-specific bug fixes:

    - The 'arrays' code was not always correctly reading and writing the 
      namespace. This has been fixed.


====================================================================
5.15.0 (2017-04-06)
====================================================================

NOTE: This release includes support for the SBML L3V2(RC1)
Release Candidate specifications.  This specification is not yet
official and thus it, and the supporting code, may change.

STABLE RELEASE

* Multistate and Multicomponent Species

  - The first official version of the specification of the Multistate
    and Multicomponent Species package is now available, and thus the 
    libSBML code for 'multi' is now included in the stable release of 
    libSBML.  This means that all prebuilt binaries for the stable 
    release will include the 'multi' package code. The src archive 
    containing libSBML core code will continue to be available, with
    additional src archives available in the stable branch: one
    containing libSBML core plus all stable packages and additional
    archives of the individual package code.
    
    NOTE: The libSBML GNU make-based build system has not been updated
          for packages. Thus, to build from src, it is necessary to
          use the CMake build system.

* New features

  - A new option has been added to the L3ParserSettings to allow
    users to turn off the parsing of the new L3 math elements. If 
    enabled the parser will treat the new functions as generic
    user defined functions.

  - The L3Parser has been updated to parse '%' as rem.

  - The MATLAB binding has been updated to support SBML L3V2(RC 1).

  - Additional options are available for the TranslateSBML/OutputSBML
    functions for the MATLAB binding allowing users to add their own
    validation and customize the input/output of some fbc elements.
    (See documentation for more details.)

  - A new structure field 'cvterms' has been added to the MATLAB_SBML
    structure.  This supports annotations as a set of fields relating
    to qualifiers and resources rather than relying on annotation
    in the string format.

  - A new function setCharacters has been added to the XMLToken class.

  - The SBMLDocument object resulting from an invalid read will now
    report level and version as '0'. This facilitates distinguishing
    between an invalid read and a Level 3 Version 2 document that 
    does not contain a <model> element.
  
* Bug fixes

  - Code was failing to recognize the math elements <pi/> and
    <exponentiale/> as returning numeric values. This has been
    corrected.

  - A <stoichiometryMath> element with no child <math> was causing
    code to crash. This has been sorted.

  - Validation of MathML was failing to report when a <math> element
    contained two top-level elements. This is now caught and correctly
    reported.

  - A speciesReference id which has been declared 'constant' cannot be 
    changed by an event. Validation was failing to catch this situation.
    This is now fixed.

  - Several fixes have been made to the conversion of SBML documents
    to lower levels and versions. These include: loss of compartment
    size; evaluation of functionDefinitions and initialAssignments;
    conversion of fast reactions; evaluation of stoichiometry using
    initialAssignment and rules and expanding functionDefinitions with
    no bvar elements.

  - The export of the Avagadro constant as an exponential number was
    losing precision. This has been fixed.

  - Unit checking was failing to correctly associate the model 'timeUnits' 
    with the use of the csymbol for time. This has been corrected. Thanks
    to Matthias König for reporting it.

  - 'comp' package-specific bug fixes:

    - Validation of a model that indirectly referenced a replacedBy element
      was causing a problem. This has been resolved.

    - The flattening routine was failing to correctly adjust the metaid
      referenced by annotation where necessary.  This has been fixed. 
      Thanks to Matthias König for reporting it.

  - 'fbc' package-specific bug fixes:

    - Validation was incorrectly reporting that a lower fluxBound could
      not have a value of -INF. This has been corrected. 

    - The 'unsetActiveObjective' function now returns an OperationReturnValue
      in line with other set/unset functions.

* Configuration/build system changes

  - The minizip library used for compression supported has been updated.
    There are no backwards compatability issues. 

  - The CMake build has been extended to enable export of the configuration
    used in building. This will facilitate users who use libsbml and/or its
    dependencies as dependencies in other projects.

* Miscellaneous

 - Beware that Doxygen 1.8.12 and later changed something in the HTML
   it creates, and as a result, the libSBML documentation-generation
   currently does not work for Doxygen versions after 1.8.11.  This will
   be fixed in a later release.  For the time being, use Doxygen 1.8.11.

 - We are aware that the released MATLAB binaries do not appear to work
   with MATLAB 2017a on Mac OSX. At present we are unable to address this 
   issue but will resolve it and issue new binaries as soon as possible.

 - We are aware that the octave binding is not functioning as expected.  
   We would be very interested to know of any users of the libsbml
   octave interface that are affected by this. 

EXPERIMENTAL RELEASE

* New features

  - 'spatial' package-specific updates:

    - The spatial code has been adjusted for minor changes in the
      specification and now reflects rel0.91 of the specification.
      Some, but not all, validation has been added to the code.


====================================================================
5.14.0 (2016-09-15)
====================================================================

***                 Experimental only release                    ***

This is an experimental only release, that is, a release of those
files provided in the experimental folder of a full release. 

This includes updates to all the SBML L3 packages that are not yet
accepted and undergoing development.

NOTE: An experimental release is not as rigorously tested as a 
full release.  Any changes/fixes listed as either referring to
stable or experimental code may change before the next full release.

This release includes support for the SBML L3V1R2(RC1) and L3V2(RC1)
Release Candidate specifications.

STABLE RELEASE

* New features

  - An Iterator class has been added to the List utility.
  
* Bug fixes

  - Validation was not being correctly invoked on <localParameter>
    objects. This has been fixed.

  - The functions for parsing a string to an ASTNode would cause a
    crash if passed a NULL pointer.  This has been fixed.  Thanks to
    Matthias König for reporting it.

  - The L3Parser has been improved to catch a case when a NULL input 
    has been provided and return an error to the user.

EXPERIMENTAL RELEASE

* New features

  - 'multi' package-specific updates:

    - Code has been updated to reflect the latest v 1.0.7 specification.

====================================================================
5.13.0 (2016-04-14)
====================================================================

STABLE RELEASE

* Groups

  - The first official version of the specification of Groups 
    is now available, and thus the libSBML code for
    'groups' is now included in the stable release of libSBML.  This
    means that all prebuilt binaries for the stable release will
    include the 'groups' package code. The src archive containing
    libSBML core code will continue to be available, but there will be
    additional src archives available in the stable branch: one
    containing libSBML core plus all stable packages and additional
    archives of the individual package code.
    
    NOTE: The libSBML GNU make-based build system has not been updated
          for packages. Thus, to build from src, it is necessary to
          use the CMake build system.


* New features


  - New functions have been added to the XMLOutputStream to allow the 
    optional XML comment to be further customized. 

  - The Python binding now includes a __version__ field.
  
  - 'comp' package-specific updates:

    - The SBMLResolver interface has been exposed within language bindings.

  - 'fbc' package-specific updates:

    - The MATLAB interface has been expanded to include a dedicated 
      FBC V2 structure.  Thanks to the COBRA Toolbox team for their
      feedback and testing. 
      
    - There was an issue with round-tripping geneProductAssociations
      between the expression and the infix representation.  This has
      been sorted.
       
  - 'groups' package-specific updates:

    - A function named 'copyInformationToNestedLists' has been
      added to facilitate keeping information consistent when multiple 
      <group> objects refer to the same thing.

* Bug fixes

  - Validation was failing to catch when the <piece> element of a
    <piecewise> had an incorrect number of children.  This has been
    fixed. Thanks to Jason Zwolak for the report.

  - Unit consistency checking was failing to interpret the units of 
    <cn> elements when passed to a <functionDefinition>. This has been fixed.

  - The getListOfElements code was not being correctly ported to 
    language bindings. This has been corrected.

  - Unit consistency checking was failing to correctly handle non-integer
    power expressions. This has been corrected. Thanks to Matthias König
    for reporting this.

  - The StrictUnitConsistencyValidator has been corrected to identify
    matching base SI units. Thus, 1000 litre will be correctly equated
    with 1 metre cubed. 

  - Sourceforge libSBML Tracker #421: The MATLAB binding was failing 
    to round-trip multi-byte characters used in strings. This has
    been fixed. Thanks to Will Matern for the report.

  - Validation was failing to report that a 'variable' attribute is
    not permitted on an AlgebraicRule.  This has been corrected.

  - Sourceforge libSBML Tracker #418: Using the isnan() function can
    cause issues with some compilers. LibSBML has a util_isNaN() function
    which should be used when necessary.  Thanks to Alan Garny for
    reporting this issue.

  - The functions that convert an enumeration value to a string had
    not been ported to language bindings.  This has now been sorted.
    Thanks to Matthias König for letting us know.

  - The new ASTNode class instances were failing to deal correctly with 
    semantic annotations.  This has been fixed.

  - 'comp' package-specific bug fixes:

    - Failing to access an external model could cause an endless
      loop while attempting validation.  This has been corrected.
      Thanks to Chris Myers for the report.

  - 'fbc' package-specific bug fixes:

    - Sourceforge libSBML Tracker #419: The converters provided for
      converting from COBRA style SBML models to SBML+fbc style models
      were losing a charge of '0' if explicitly set. This has been
      corrected. Thanks to Ali Ebrahim for reporting the problem. 

  - 'layout' package-specific bug fixes:

    - In some cases the value of the 'id' attribute was being written out
      as the 'name'.  This has been fixed.

* Configuration/build system changes

  - The Python bindings can now be configured to install using setup.py.


* Miscellaneous

  - The Python version of libSBML available via PyPi now includes binary
    wheels for Windows and Mac OSX operating systems. 

  - The Python version of libSBML available via PyPi now includes all
    dependencies. 

  - We conducted a review of the mathml-infix parsing code and compared
    inputs and outputs with those of JSBML. This has produced a more 
    synchronized approach between the two APIs.

  - There is a known bug in GCC versions 5.1 and 5.2 which results in the 
    problem that calling the copy constructor of a base class in the 
    constructor of derived classes produces crashing code.  The problem 
    manifests itself in libSBML when using a language binding such as the 
    Python interface. Workarounds have been added to the libSBML 
    'Known Issues' documentation.

  - Sourceforge libSBML Tracker #417: Documentation was failing to write
    using Python 3.5.  This has been fixed.  Thanks to  Antonio Trande for
    reporting this.


EXPERIMENTAL RELEASE

* New features

  - 'multi' package-specific updates:

    - The code has been updated to reflect v 1.0.6 of the specification.


====================================================================
5.12.0 (2015-11-12)
====================================================================

STABLE RELEASE

* New features

  - In SBML Level 2, some units were defined by default and did not 
    need to be explicitly included in a model. The 
    SBMLLevelVersionConverter adds these units explicitly when 
    converting to SBML Level 3. We have an added an option to
    disable this functionality and return Level 3 models without
    the units implied by Level 2.

  - Sourceforge libSBML Tracker #242: 'addProduct etc using a species'
    We have added functions addProduct/addReactant/addModifier that 
    take a Species as argument, along with a number of other optional 
    values to completely specify the SpeciesReference object being 
    created. This is a slight divergence from the direction libSBML
    usually takes and we would be grateful for any feedback
    on these functions. 
  
  - Validation speed has been dramatically improved for models that
    make use of FunctionDefinitions and in particular nested 
    FunctionDefinitions.	
  
  - 'comp' package-specific updates:
  
    - The 'flattening' routines have been expanded to correctly deal
    with FBC V2.
  
  - 'fbc' package-specific updates:

    - The FBC Version 2 package has been accepted by the SBML Editors.
      The code supporting this is now available as part of the stable
      release.


* Bug fixes

  - There was a very subtle bug in unit checking that incorrectly
    applied a multiplication factor. Thanks to Mike Cooling for 
    the detailed example and anaylysis that revealed this. It 
    has now been fixed.

  - In the new math code using the children of an ASTNode could result
    in the math namespace declaration being unecessarily written out
    in many places. This has been sorted out.

  - Sourceforge libSBML Tracker #414: "A missing break statement" was
    added.


* Configuration/build system changes

  - The CMake files have added an option to dynamically link to a
    python version on Mac OSX systems rather than automatically link.
    Thanks to Kyle Medley for supplying the initial patch for this.

  - The test code has been tweaked to build and run with MSVC 2015.
    Fortunately the main code base worked with no issues.


* Miscellaneous

  - Further documentation improvements have been added, especially for
    the FBC package.


EXPERIMENTAL RELEASE

* New features

  - 'multi' package-specific updates:

    - Full validation has been added to the multi package code.  
      Thanks to Fengkai Zhang for his continued efforts on this.


====================================================================
5.11.6-experimental (2015-07-16)
====================================================================

***                 Experimental only release                    ***

This is an experimental only release, that is, a release of those
files provided in the experimental folder of a full release. 

This includes updates to all the SBML L3 packages that are not yet
accepted and undergoing development.

NOTE: An experimental release is not as rigorously tested as a 
full release.  Any changes/fixes listed as either referring to
stable or experimental code may change before the next full release.

STABLE RELEASE

* New features

  - There is a new function on SBMLDocument, checkConsistencyWithStrictUnits(),
    which applies the same validation as the checkConsistency() function with
  one difference being that it will always apply unit validation using 
  exact identity comparison between units and it logs all unit
  violations as Error regardless of the SBML Level and Version.

  - There is a new converter that will convert to SBML L1V1. The 'regular'
    SBMLLevelVersionConverter does not support this level and version
    as we generally discourage the use of it. However users have requested
    the facility and thus we have included a separate converter to meet
    that need.
  
  - 'const' versions of the getElementBySId() and getElementByMetaId()
    functions have been added.
  
  - 'fbc' package-specific updates:
  
    -  Code has been updated to use support the FBC V2 format that is currently
     available as a Release Candidate document. Full validation for this
     format has been included.
     
* Bug fixes

  - The static function UnitDefinition::reorder failed to correctly deal
    with situations where the same unit kind appeared multiple times. This
    has been fixed. Thanks to Matthias König for reporting the problem.
  
  - There were some discrepancies between math and math-legacy code reporting
    the incorrect use of the MathML <apply> tag. This has been standardized 
  and more rigorously tested.

* Miscellaneous

  - Several functions in libSBML checked for a NULL reference; something
    that it is considered a well-formed program should not be able to 
    create. As more and more compilers are complaining about this code,
    on the grounds it should not be possible to create the NULL reference,
    we made the decision to remove this code. Please let us know if this
    is an issue for you.

EXPERIMENTAL RELEASE

* New features

  - L2V5 specific updates:
  
    - A new validation rule was identified during the review of the SBML
    Level 2 Version 5 specification. Support for this has been added.

  - 'arrays' package-specific updates:
  
    - The MathML elements included in the 'arrays' package has been 
    reduced. The code now reflects this.
    
  - 'multi' package-specific updates:
  
    - The code has been updated to reflect v 1.0.4 of the specification.
    This includes full validation. Thanks to Fengkai Zhang for 
    contributing the code.
    
====================================================================
5.11.4 (2015-04-09)
====================================================================

STABLE RELEASE

* New features

  - The ASTNode class has a new function double getValue() that
    returns the numerical value of the ASTNode as a double.  This
    includes returning values for constants such as AST_CONSTANT_PI,
    AST_CONSTANT_E, and AST_NAME_AVOGADRO, or '1' for an ASTNode of type
    AST_CONSTANT_TRUE and '0' for AST_CONSTANT_FALSE.  Note, it does
    not attempt to evaluate the node and thus will return NaN for a
    function or node representing a named variable, and AST_NAME_TIME.

  - There has been a complete review of validation messages.  These
    have been unified in terms of spacing and line returns.  In
    addition many have been enhanced with additional model specific
    information designed to assist in locating and fixing the issues.

  - There is now an interface to PHP.  This has been tested on all
    platforms.

  - Historically libSBML did not provide unsetFoo functions where
    the attribute was a required attribute with a default value.
    At user request we have changed this so every attribute has a 
    corresponding unset function.  Note that where the attribute 
    has a default value it is still considered 'set' but not 
    considered to have been explicitly set and will therefore not
    appear in the written output. 

  - The L3Parser will now correctly parse a unary plus.

  - The L3Parser will now parse chains of relational operators.
    Identical operators become ASTNodes with relational type and
    each argument as a direct child.  Thus 'x < y < z' becomes
    an ASTNode of type AST_RELATIONAL_LT with three children
    representing x, y and z.  Non identical operators use a logical
    'and' function to combine the arguments. Thus 'x < y > z' 
    becomes an ASTNode of type AST_LOGICAL_AND with two children
    each representing the relational operator; that is 
    and(lt(x,y), gt(y,z)) 

  - The ability to index lists in the python bindings has been improved.

  - A new value 'LIBSBML_MISSING_METAID' has been added to the 
    OperationReturnValues_t enumeration.  This value will be returned
    when a user attempts to set an annotation on an object that has
    no metaid attribute set.  Note this is a change in behaviour as
    previously the value returned would have been 
    'LIBSBML_UNEXPECTED_ATTRIBUTE'.  We hope this change makes the 
    issue clearer to users.

  - The package extension mechanism has been expanded to allow the 
    extension of individual ListOfFoo classes.

* Bug fixes

  - Conversion from SBML Level 3 to Level 2 was losing some 
    LocalParameters. This has been sorted.  Thanks to Matthias 
    König for spotting and reporting the problem.

  - Fixed a bug where using the expat parser failed to correctly
    report the presence of invalid XML namespaces.

  - Sourceforge libSBML Tracker #393: LibSBML was failing when
    built on an ARM processor running Fedora.  This has been
    sorted out.  Thanks to Zbigniew Jedrzejewski-Szmek for 
    reporting the issue and testing solutions.

  - The formulaParser was incorrectly parsing particular syntax
    involving exponential, plus/minus signs and no spacing i.e.
    '2e3-3' was failing to parse.  This has been corrected. 
    Thanks to Kieran Smallbone for reporting this and apologies
    for the length of time it took to fix.

  - Sourceforge libSBML Tracker #402: The functions that deal with
    user data on both ASTNode and SBase objects have been made
    to work with const versions of objects where appropriate.
    Thanks to Takeshi Abe for the request and the patch.

  - 'comp' package-specific bug fixes:

    - The code for determining whether an external file is available
      has been further tightened up. 

  - 'fbc' package-specific bug fixes:

    - A bug in the code that reads GeneAssociations as an annotation
      meant information was being lost.  This has been corrected.
      Thanks to Matthias König for reporting the problem.


  - 'layout' package-specific bug fixes:

    - The names of some functions meant they were failing to 
      correctly port to the Python bindings.  The binding mechanism
      has been fixed to correct this.  Thanks to Kieran Smallbone
      for reporting this.

    - The SpeciesReferenceGlyph attribute 'role' can take the value
      'undefined' but this was not written out. This has been 
      changed.

* Configuration/build system changes

  - This release includes pre-built binaries for the MATLAB 
    bindings that should work for many Linux and MacOSX
    platforms.  Please advise us it you find a combination
    of platform and MATLAB version for which these fail. 

* Miscellaneous

  - The names of some arguments to functions have 
    been modified to convey the fact that the object
    is not owned by the collection object to which it
    has been added.

EXPERIMENTAL RELEASE

* New features

  - 'distrib' package-specific updates:

    - There are new example programs that will create the
      examples given in the current specification. 

  - 'multi' package-specific updates:

    - The multi code has been updated in line with the specification
      Release 1.0.2 dated November 2014. This code has been contributed
      by Fengkai Zhang. Many thanks, Fengkai.

  - 'spatial' package-specific updates:

    - The spatial code has been updated in line with the specification
      Release 0.90 dated March 2015.

* Bug fixes

  - 'multi' package-specific bug fixes:

    - The multi attributes that can be added to a math <ci> element
      where being lost when written out.  This has been fixed.
    
====================================================================
5.11.2-experimental (2015-01-15)
====================================================================

********************************************************************

***                 Experimental only release                    ***

This is an experimental only release, that is, a release of those
files provided in the experimental folder of a full release. 

This includes updates to all the SBML L3 packages that are not yet
accepted and undergoing development.

NOTE: An experimental release is not as rigorously tested as a 
full release.  Any changes/fixes listed as either referring to
stable or experimental code may change before the next full release.

********************************************************************

STABLE RELEASE

* New features

  - Functions have been added to allow users to determine the
    number of SBML L3 packages within a document that the build
    of libSBML does not support.

  - The StripPackageConverter has a new option 
    'stripAllUnrecognized' which if set to true will strip all SBML 
    L3 packages that are not supported by the build of libSBML 
    being used.

  - The XMLErrorLog::remove(unsigned int errorId) function only 
    removes the first instance of the error with the matching 
    identifier. A new function removeAll(unsigned int errorId) 
    has been added that will remove all instances of the error 
    with the given id.

* Bug fixes

  - A stack overflow could occur when libSBML was built with certain 
    compilers on certain platforms. We have eliminated this problem
    from the situations in which we can replicate it. The issue 
    occurred when performing intensive validation.

  - The math-legacy code was being caught in an endless loop when 
    trying to read a nested piecewise function.  
    This has been fixed.
    
  - Validation was failing to recognize some cases when the 
    conditional part of a piecewise function returned a boolean and 
    incorrectly indicated that such a model was incorrect.  We have 
    fixed this as robustly as possible but encourage reports of 
    situations where we have missed something.

  - 'layout' package-specific bug fixes:

    - Validation of layout was not correctly reporting line
      and column numbers. This has been corrected.

* Configuration/build system changes

  - The CMake configuration has been improved to clearly
    report failure to find files necessary to work with
    particular language bindings.

  - Sourceforge libSBML Tracker #394: The '\n' symbol
    was not being correctly expanded on some systems. This
    has been made more robust.  Thanks to Antonio Trande 
    for reporting this.

EXPERIMENTAL RELEASE

* New features

 - Support for the SBML Level 2 Version 5 Release 1 
   (Release Candidate) specification has been added.  
   Additions to libSBML include:
     - new API for adding Nested Annotations used on 
       the existing CVTerm object:
         int addNestedCVTerm(const CVTerm* term)
         CVTerm* removeNestedCVTerm(unsigned int n)
         unsigned int getNumNestedCVTerms()
         CVTerm* getNestedCVTerm(unsigned int n)
         List* getListNestdCVTerms()
     - new and changed validation rules as in the specification
     - the ability to convert core SBML to and from L2V5

  - 'multi' package-specific updates:

    - The multi code has been updated in line with the specification
      Release 1.02 dated November 2014.

    
  - 'spatial' package-specific updates:

    - The spatial code has been updated in line with the specification
      Release 0.89 dated November 2014.

 * Bug fixes
 
  - 'spatial' package-specific bug fixes:

    - Sourceforge libsbml Tracker #387: The C# bindings for spatial 
      were not working as expected. These have been fixed. Thanks to 
      Harold Gómez for reporting this.

       
====================================================================
5.11.0 (2014-11-27)
====================================================================

STABLE RELEASE

* New features

  - There is now an interface for JavaScript.  This has been tested
    on all platforms.  Building requires SWIG version 3.0.2 or greater 
    and depends on node-gyp.  Feedback on this would be greatly
    appreciated.
  
  - We have made a source package for the libSBML R interface
    available for Linux and OSX users.    

  - The facility of using the data members of objects as attributes
    in python has been extended to work with Python version 3.
    
  - The SBMLDocument class now has an 'isSetModel()' function.
  
  - There is a new writSBMLToStdString() function that returns a 
    std::string rather than a char * that has to be freed by the caller. 
    This facilitates cleaner memory management. Similarly there is
    a writeMathMLToStdString() function.
    
  - The errors reported by OutputSBML in the MATLAB binding have been
    extended to provide more information about the specific field
    causing a problem.  Thanks to Thomas Pfau for providing a template
    for adding this information.
    
  - Support for the MIRIAM qualifiers hasTaxon, isInstanceOf and 
    hasInstance has been added.
    
  - More information has been added to error messages.

  - There are new functions to allow users to retrieve and print errors
    from the ErrorLog based on the severity of the error.  These are
    SBMLError* getErrorWithSeverity(unsigned int n, unsigned int severity)
    and printErrors(std::ostream& stream, unsigned int severity).


  
  - 'comp' package-specific updates:
  
    - A new flag has been added to the CompFlatteningConverter to 
      allow a user to specify a comment separated list of packages
      that should be stripped before flattening is attempted.
      
    - The CompFlatteningConverter has been made more rigorous
      when it comes to specifying users options on models declared
      as ExternalModelDefinitions.
      
 
* Bug fixes

  - There was an issue with using the libsbml namespace and the
    ReactionConverter.  This has been fixed.  Thanks to Andy Somogyi
    for reporting it.

  - The facility to use data members of objects as attributes
    was broken.  This has now been fixed.

  - Code checking the values of units attributes was incorrectly 
    allowing the default Level 2 units, such as substance, to
    be used in Level 3.  This has been corrected.
    
  - Using unicode filenames with MATLAB on a Windows system proves to
    be very problematic. We have solved the problem but only for the
    case where filenames are entered directly via the dialogs that 
    OutputSBML / TranslateSBML open up. There appears to be an issue
    with MATLAB using such filenames directly from the workspace. 
    This has been added to the known issues documentation.
    
  - The C API function ConversionProperties_removeOption now returns
    a pointer to the option being removed.  This is in line with other
    remove functions.
    
  - Validation failed to report an error when more than one model
    element was encountered and merely returned a document with the 
    last model read.  This has now been corrected.
    
  - The getDerivedUnitDefinition function returns a pointer to an
    existing unitDefinition object maintained by the model.  However
    in the case of a Parameter a new unitDefinition object was being
    created, thus causing an inconsistency when it comes to freeing
    memory. This has now been corrected and 
    Parameter::getDerivedUnitDefinition now returns an existing pointer.

  - 'comp' package-specific bug fixes:
  
    - Validation was failing to report when a portRef attribute
      had been used on a Port object and indeed this situation caused
      validation to crash in some cases.  This has now been sorted.
      

* Configuration/build system changes

  - When javac fails to compile a class no error was reported
    and a useless jar file was created.  The build has been
    changed to highlight the issue.
    
  - Sourceforge libsbml Tracker #380: The use of #include Windows.h
    has been changed to lowercase to facilitate building using
    MinGW.  Thanks to Takeshi Abi for reporting the problem.


* Miscellaneous

  - We have continued our review of code and many more memory leaks 
    have been plugged.  Thanks to people, in particular Andy Somogyi, 
    for reporting these.  Stable code has been rigorously tested using
    both Valgrind (http://valgrind.org/) and Visual Leak Detector for
    Visual C++ (https://vld.codeplex.com/). Experimental code is
    currently being reviewed.

  - Sourceforge libsbml Tracker #372: Documentation has been corrected. 
    Thanks to Gerard Weatherby for reporting the issues.

  - The sample Java programs and configuration/importing instructions
    for Java now use a shortened and simplified static loading block
    (i.e., the part that explains how to use System.loadLibrary() to
    load libSBML).
    
  - We've made efforts to simplify the instructions for downloading,
    configuring and accessing libSBML.  Among the changes are that the
    API language manuals for Java, Python and C# now focus their
    instructions more on just those languages, rather than giving long
    generic instructions for all possible languages.

  - The SBML package extension mechanisms are now more thoroughly
    documented.


EXPERIMENTAL RELEASE

* New features

  Code for the Dynamic Structures ('dyn') package has been added. 
  This reflects the draft specification Release 0.1 dated 
  October 1 2014.
  

  - 'distrib' package-specific updates:

    - The UncertMLNode now uses a std::vector to save child members
      rather than the List class.
      
  - 'spatial' package-specific updates:
  
    - The spatial code has been updated in line with the specification
      Release 0.88 dated September 2014.

 * Bug fixes
 
  - 'distrib' package-specific bug fixes:
  
    - A number of memory leaks have been plugged. 
      Thanks to Andy Somogyi for reporting them.
  
  - 'groups' package-specific bug fixes:
  
    - The values of the enumeration of SBMLGroupsTypeCode_t clashed
      with the values used by the comp enumeration.  The ones in
      the groups package have been changed.
      
  - 'req' package-specific bug fixes:

    - Sourceforge libsbml Tracker #373: The code was not keeping
      proper track of parent-child relationships which could
      lead to incorrect namespaces being used.  This is now sorted.
      Thanks to Gerard Weatherby for reporting it.

     
====================================================================
5.10.2 (2014-07-17)
====================================================================

STABLE RELEASE

* New features

  - The static functions implemented by the SBMLTransforms class
    that are used by the converters that in-line FunctionDefinitions 
    or expand InitialAssignments has been made available to all language 
    bindings.  These are: replaceFD, expandInitialAssignments 
    and evaluateASTNode.  Examples of using these functions 
    are also provided.
  
  - The L3ParserSettings object can now be configured to compare
    built-in functions and constants caselessly (as it did in the
    past; the default), or to only accept the lower-case forms.

  - 'layout' package-specific updates:
  
    - The C API has been improved and appropriate argument checking
      has been implemented.
      
* Bug fixes

  - There was an issue with detecting NULL elements with the 
    R bindings.  This turns out to be a consequence of SWIG. A
    bug report has been filed with the SWIG development team,
    in the meantime, a revised SWIG file is included with the
    libSBML source and is used by the libSBML build when
    creating the R bindings. 

  - The unit consistency checking code was ignoring numerical
    factors when checking the units of a KineticLaw matched the 
    model wide units of extent per time (substance per time in 
    SBML L1/L2). This has been changed.  Thanks to Daniel Palm
    for the report that exposed this.
    
  - Unit checking code determines whether a math expression contains 
    parameters or numbers with undefined units. However, depending
    on where these occurred within the expression, libSBML was
    not always correctly establishing this.  This has been fixed.
    Thanks to Daniel Palm for reporting this.
    
  - The unit consistency checking code was losing numerical factors
    that were left after cancelling out units.  This could affect
    the overall definition of the remaining unit and thus impact code
    that looked for exact identity between units.  This has been fixed.
    Thanks to Daniel Palm for providing an example of a case where this
    was happening.

  - There was a bug in writing out MathML that manifested itself
    using the in-lining functionDefinition converter for a narrow 
    set of functions.  This has been fixed.
    
  - Validation has been improved so as to no longer warn a user that 
    a variable has no initial value if there exists an initialAssignment
    or assignmentRule that would set the value.
    
  - The SBMLError reporting an over-determined model was being logged
    with the incorrect category of error. This has been changed.
    
  - LibSBML incorrectly reported the units of 'pi' as radians. This
    has been corrected to report 'dimensionless'.  Thanks to Matthias
    König for reporting this.

  - The L3 parser did not recognize 'arcsinh' or 'asinh' as valid
    built-in functions.  This has been fixed.

  - 'comp' package-specific bug fixes:
  
    - When libSBML detects an SBML L3 package that it does not support
      validation of 'comp' references can report that a reference may
      be to an identifier within the unknown package. However, the code
      was failing to check whether the reference could be located within
      the xml relating to supported packages before issuing this warning.
      This has been fixed.  Thanks to Chris Myers for reporting it.
      
* Configuration/build system changes

  - The CMake build system will now produce an uninstall target.

* Miscellaneous

  - Continue our review of code a number of potential problems were 
    highlighted during static analysis. These have been fixed.
    
  - Code review has also eliminated a number of compiler warnings
    raised by various different compilers on various different
    systems.
    
  - Various memory leaks have been plugged.  Thanks to people,
    in particular Andy Somogyi, for reporting these.

  - The short error messages for the following error codes in
    SBMLErrorTable.h had trailing periods, which was inconsistent with
    most of the other messages; the periods have been removed: 20109,
    99109, 99401, 99402, 99403, 99404, 99405, 99406.

  - In the API documentation, the instructions for setting PYTHONPATH
    was not correct for the installation produced by using CMake
    instead of GNU configure.  Further, the PYTHONPATH instructions
    for Ubuntu were actually for other Linux/Unix variants and vice
    versa.  This has been fixed by making the instructions use a
    single, more general approach that should work everywhere.

  - The API documentation lacked information about using PyPI for 
    Python, and about how to install the R interface.  Fixed.

  - Various issues in the Python documentation have been fixed.  For
    example, in the table of member methods for each class in the API
    documentation for Python, the brief descriptions were missing --
    all the short member descriptions had the same text, "Python
    method signature(s)".  This was caused by a bug in our custom
    libSBML documentation generation tools.

  - The error code table in the documentation for SBMLError has been
    updated.


EXPERIMENTAL RELEASE

* New features

  - 'arrays' package-specific updates:
  
    - The arrays code has been updated in line with the specification
      dated June 19 2014. Changes include a change in attribute names
      and a revised set of supported math constructs.
      
    - Support for parsing from infix to ASTNodes and vice versa has
      been added for the majority of the math constructs currently
      listed within the arrays specification.
      
  - 'req' package-specific updates:
  
    - The req code has been updated in line with the specification
      Release 0.5 dated 30 May 2013.  Users should be aware that
      this update represents a significant change in code to reflect 
      the change in structure of the package.
      
  - 'spatial' package-specific updates:
  
    - The spatial code has been updated in line with the specification
      Release 0.87 dated June 2014.  Users should be aware that
      this update represents a significant change in code to reflect 
      the change in structure of the package. 
  
 * Bug fixes
 
  - There was a potential stack-overflow issue with packages that
    extend SBase directly.  This has been fixed where appropriate.
    Thanks to Chris Myers for reporting it.

====================================================================
5.10.0 (2014-04-10)
====================================================================

STABLE RELEASE

* New features

  - New ASTNode infrastructure
  
    The code underlying the ASTNode class has been refactored to
    facilitate the extension of MathML by SBML L3 packages.  The
    API and behaviour has not changed except in places where 
    invalid MathML was being incorrectly parsed or created. It is 
    no longer possible to add a child to an ASTNode that represents
    a number, for example.
    
    Extensive testing has been done to ensure that the API and 
    correct behaviour of the ASTNode class remains unchanged and 
    unless you have derived your own classes from the ASTNode class 
    this change should not affect your implementation in any way. 
    
    ** Please inform us if this turns out to be incorrect. We have 
    tried to anticipate and test use cases but we are aware that
    it is possible that we have missed some.
    
    In order to allow people to continue to use the original AST code
    if they choose, the source code archives provide this code within
    a 'math-legacy' directory and the libSBML configuration system
    provides an option to build libSBML using this legacy code.

  - General maintenance: we have done a number of sweeps of code to
    identify and add such things as missing virtual functions.  We
    have also investigated memory leaks reported by users and have
    done some extensive memory leak checking on the more intensive
    functionality such as validation/comp flattening etc.  However,
    this remains an ongoing task.
    
  - There is a new converter, the SBMLReactionConverter, which
    will replace any Reactions within a Model with the equivalent
    RateRules.  An example of the use of this converter can be
    found at examples/c++/convertReactions.cpp.
    
  - There are new functions available on the Model class:
    InitialAssignment* getInitialAssignmentBySymbol(const std::string& symbol);
    Rule* getRuleByVariable(const std::string& variable);
    AssignmentRule* getAssignmentRuleByVariable(const std::string& variable);
    RateRule* getRateRuleByVariable(const std::string& variable);
    These functions return the designated object using the 'symbol' or
    'variable' attribute.  This is duplicate functionality as the
    objects can be retrieved using getRule and getInitialAssignment.
    However the other similar functions on the Model class retrieve
    objects by the 'id' attribute. If future versions of SBML
    introduce the 'id' attribute on Rules and InitialAssignments we
    will need functions that act differently.
    

  - 'comp' package-specific updates:
  
    - The code that facilitates resolving files in relation to
      ExternalModelDefinitions has been reviewed and made as robust
      as possible.
      
    - The ability to customize the way SIds and SIdRefs are
      renamed during the flattening process has been added. A
      class of type PrefixTransformer can be created and assigned. 
      This allows the user to add additional changes to the renaming
      process. An example that illustrates the use of this facility
      to also rename the 'name' attribute of objects originating in
      subModels has been included in the examples/c++/comp directory.
  
    - Unit tests have been added for the C API, and this exposed some
      missing functions. The missing functions have now been added.
    

* Bug fixes

  - There were issues with propagating the package-enabling
    functionality through the children of an element.  These issues
    have been resolved.
    
  - The converters that apply structural changes to the SBML document
    used a setDocument function that expected a const SBMLDocument
    object. Since the converters change the document, and in fact
    immediately re-cast the document object, this function was both
    confusing and inaccurate.  There is now a setDocument function
    that does not expect a const SBMLDocument object.
    
  - There were some inconsistencies in the behaviour of LocalParameter
    objects from SBML Level 3 in relation to the 'constant'
    attribute. These have been fixed.


  - 'layout' package-specific bug fixes:
  
    - There were some discrepancies between the naming of arguments
      to some constructors and the actual values being set using
      these arguments. These have been corrected without changing
      the resulting behaviour. 
  
    - Sometimes when an SBML Level 2 document with 'layout' and
      'render' annotations was upgraded to SBML Level 3, the 'render'
      namespace went missed from the annotation in the Level 3
      document.  This has been fixed.
      
    - The 'render' package "objectRole" attribute was not being
      correctly handled by the 'layout' code when the 'render' package
      was disabled.  This has been corrected.


  - 'qual' package-specific bug fixes:
  
    - Certain validation errors were not being correctly reported,
      with either missing information or bad line numbers.  This
      problem has been fixed.  Thanks to Nicolas Rodriguez for
      reporting the problem.


* Configuration/build system changes

  - WARNING: There is a bug in the Microsoft Visual Studio 2013
    compiler that can cause strange output when doing repetitive file
    reading and writing.  We became aware of this when running our
    unit tests on the comp flattening routines.
    http://connect.microsoft.com/VisualStudio/feedback/details/
    808199/visual-c-2013-floating-point-broken-on-first-use We
    included a fix in our test files (libsbml/src/sbml/packages
    /comp/util/test/TestRunner.c) but users should be aware that this
    is an issue that may arise with this particular version of the
    MSVC compiler.

  - The CMake files have been updated to allow for the use when
    libSBML is merely being referenced within a CMake build, rather
    being specifically built.
    
  - Both the GNU make and CMake configuration systems generate certain
    header files that are specific to the libSBML build being
    requested.  Previously, libSBML source code included project
    definition files for MSVC.  These files were checked into SVN and
    included within the released src archive distribution.  Their
    inclusion could potentially cause problems for people who wanted
    to create different build configurations from the same source
    code.  Given that with CMake it is possible to generate MSVC
    project files directly, we no longer include them in the source
    archive distribution, and therefore, it is also not necessary to
    include the header files generated by the configuration process.
    Thus, these header files have been removed, and for CMake users
    they will be generated within the build directory to facilitate
    different builds using the same src tree.
  
  - There were issues with classes exported across the Windows dll
    interface.  These have been fixed, and we have added additional
    tests to catch these issues.  Thanks to Andy Somogyi for reporting
    the problem.


* Miscellaneous

  - Python installers for various Linux distributions are now
    available from the Open Build Service and via pypi. Links to the
    relevant release can be found in the documentation on SourceForge
    download pages for libSBML.

  - The copyright statement for all example programs that we produced
    ourselves has been changed to use a less restrictive license, so
    that users can use the examples in their software without
    limitation.  The new license is the MIT license.

  - The LICENSE.* files for libSBML now include a previously-missing
    3rd party software acknowledgement for the Python argparse library
    by Steven J. Bethard.  (The argparse.py module is included with
    libSBML distributions.)

  - A number of extraneous files have been removed from the
    documentation source directory (docs/src/); in addition, the
    directory has undergone some minor restructuring.

  - The Python API documentation lacked all the class constructors,
    due to a bug in the libSBML documentation production pipeline.
    This is now fixed.


EXPERIMENTAL RELEASE

* New features

  - Support for the 'arrays' package according to the specification
    dated September 11, 2013 (0.1 alpha) has been added to the
    experimental release files. Note the extended MathML is accessible
    via the ASTNode class; however, the current version version does
    not yet include support for parsing to and from infix notation.


  - 'multi' package-specific updates:
  
    - The ability to extend ASTNodes and hence use extended MathML
      has been added and thus it is now possible to use the attributes
      on the <ci> elements of math as specified by the 'multi' 
      package. The example relating to this has been updated accordingly.


 * Bug fixes

  - 'render' package-specific bug fixes:

    - On occasion when an L2 document with layout and render
      annotations was being upgraded to L3 the render namespace 
      was missed from the annotation in the L3 document. 



====================================================================
5.9.2-experimental (2014-01-31)
====================================================================

********************************************************************

***                 Experimental only release                    ***

This is an experimental only release, that is, a release of those
files provided in the experimental folder of a full release. 

This includes updates to all the SBML L3 packages that are not yet
accepted and undergoing development.

NOTE: An experimental release is not as rigorously tested as a 
full release.  Any changes/fixes listed as either referring to
stable or experimental code may change before the next full release.

********************************************************************


STABLE RELEASE

* New features

  - The error messages relating to invalid SId syntax have been
    improved to report the attribute causing the problem.
    
  - The SBMLLevelVersionConverter has an option to ignore
    unrequired L3 packages. However there was no way to access
    this option when using the helper 'setLevelAndVersion' 
    function.  This function has no been given a default argument
    to allow users to specify the ignore packages option.
  
  - A new version of the SBMLTransforms::evaluateASTNode function
    is available; allowing the user to pass a map of ids and values
  to the function rather than needing a whole model.
  
  - Two new functions are available to allow users to determine
    the compiled dependencies for the given instance of libSBML.
  int isLibSBMLCompiledWith(const char* option) will take the name
  of a dependency library e.g. 'expat' as argument and return a
  positive integer this library was used to compile libSBML, 0 
  otherwise.  
  const char* getLibSBMLDependencyVersionOf(const char* option)
  takes the name of the library and returns the version number
  of this library.

* Bug fixes

  - Some of the perl examples had syntax errors - these have been fixed.
    Thanks to Joern Behre for reporting them.

  - Some subtle bugs in the ASTNode class have been fixed. These
    include returning 'bad allocation' as the name of a node; 
    failing to replace the definitionURL of a csymbol node; 
    not removing the units member when a node represents a function
    and incorrectly reporting failure when setting user data to NULL.
    Many additional tests have been added.

  - The Borland compiler does not handle implicit casts and 
    unfortunately there was one such cast in the new code introduced 
    for 5.9.0. This has now been fixed. Thanks to Totte Karlsson for 
    reporting it.
    
  - A memory leak in SBasePluginCreator has been plugged. Thanks to 
    Andy Somogyi for reporting it. 
  
  - The instances of the extensions loaded into the ExtensionRegistry
    to facilitate plugins were not being correctly deleted. This 
  has been corrected.

  - 'fbc' package-specific updates:
    
    - The CobraToFbcConverter was losing the charge and the 
      capitalization of the formula when parsing the notes element.  
      This has been fixed. 

* Configuration/build system changes

  - Any necessary fixes to facilitate the use of the new version
    of Mac OSX - Mac OSX 10.9 Mavericks - have been made.


EXPERIMENTAL RELEASE

* New features

  - 'req' package-specific updates:
    
  - The attributes in the req package are mandatory on all
    elements.  This caused huge numbers of errors when reading
    files which used the req package but did not actually
    need to attributes on many elements.  Thus the error has been
    suppressed.

  - 'spatial' package-specific updates:
  
    - The API for accessing compressed data has been improved
      to allow access to this data using language bindings.
      ImageData is now uncompressed during the first call to
      this and saved for subsequent access. Previously the data
      was uncompressed each time it was accessed.
      
    - Functions to determine whether an attribute has been set;
      i.e. the isSetFoo functions, have been provided where these
      were missing. Boolean attributes that have not been set are
      no longer written out.

* Bug fixes

  - 'req' package-specific updates:
  
    - The csharp binding for this package was not complete. 
      This has been corrected.

  - 'spatial' package-specific updates:
  
    - Errors relating to missing attributes have been sorted
      to correctly relate to attributes required by the specification.


====================================================================
Version 5.9.0 (2013-11-14)
====================================================================

STABLE RELEASE

* Qualitative Models

  - The first official version of the specification of the Qualitative
    Models package is now available and thus the libSBML code for
    'qual' is now included in the stable release of libSBML.  This
    means that all prebuilt binaries for the stable release will
    include the 'qual' package code. The src archive containing
    libSBML core code will continue to be available but there will be
    additional src archives available in the stable branch: one
    containing libSBML core plus all stable packages and additional
    archives of the individual package code.
    
    NOTE: The libSBML GNU make-based build system has not been updated
          for packages. Thus, to build from src, it is necessary to
          use the CMake build system.

* Layout

  - The layout specification for SBML Level 3 has been accepted and
    thus layout is now considered an official L3 package.  Since
    layout code has been included with libSBML for many years, this
    has no impact on the code included within the stable release.

* New features

  - There are two new function SBML_formulaToL3String(ASTNode_t*) and
    SBML_formulaToL3StringWithSettings(ASTNode_t* L3ParserSettings_t*)
    that provide reciprocal AST to infix functionality based on the
    previously released L3Parser code.

  - Within an SBML file it may be possible to infer units for
    parameters based on their use within mathematical expressions.  A
    limited version of this functionality is now available using the
    SBMLInferUnitsConverter which will return a document with units
    attached to any parameters where it is possible to infer the
    units.

  - The SyntaxChecker class has a new function named
    isValidXMLanyURI(std::string) that can check whether a given
    string has the valid syntax for an XML anyURI datatype
    http://www.w3.org/TR/xmlschema-2/#anyURI.

  - There is a new base class ElementFilter that can be passed as an
    optional argument to the getAllElements function.  When
    implemented this allows the elements to be filtered in whatever
    fashion before being added to the List returned by the
    getAllElements() function. The example getAllElementsWithNotes
    illustrates this functionality.

  - There is new functionality to facilitate replacing the id
    attribute and all references to that id within a model. There is a
    new base class IdentifierTransformer that when passed to the
    function renameAllIds on the Model object will perform the
    transformation specified by the IdentifierTransformer class on all
    id attributes within the model. Users should derive their own
    IdentifierTransformer class to perform the transformation they
    require.  The example setIdFromName illustrates this
    functionality.
  
  - The class IdList which allows users to create and manipulate lists
    of 'id' strings has been made publically available.  Previously
    this class has been used internally by validation and conversion
    code.  It is now available in the sbml/util directory.
  
  - There is a new converter, the SBMLIdConverter, that will allow a
    user to replace several ids within a model. The converter requires
    a comma seperated list of existing ids and another of the
    replacement ids and will perform the necessary replacements.
    
  - There is a new converter, the SBMLLocalParameterConverter, that
    will allow a user to replace any localParameters with global
    parameters.  The promoteParameters example illustrates the use of
    this converter.
    
  - Following the results of the user survey the L3Parser has changed
    the precedence of the '^' operator to be greater than a unary '-'
    operator and the precedence of the '!' operator to be higher than
    algebraic operators (and equal to the unary '-' operator). The
    precedence of '&&' remains the same as the precedence of '||'.

  - It is now possible to override the severity of errors logged or to
    disable error logging completely. Any override is applied to the
    errorLog until such time as the status is reset.  This facilitates
    the use of functions, that may on occasion log errors, in a
    situiation were error logging is not required.
  
  - There is a new function XMLErrorLog::changeErrorSeverity
    (XMLErrorSeverity_t , XMLErrorSeverity_t, std::string package)
    that will change the severity of errors within the errorLog based
    on the package name supplied.
    
  - The XMLErrorLog and SBMLErrorLog classes now have explicit
    implementations for the copy and assignment constructors.
    
  - The SBase functions getURI() and getPrefix() that return 
    information relating to the namespace of the object have been
    made public. Formerly these functions were protected.
  
  - The function removeTopLevelAnnotationElement(const std::string
    elementName, const std::string elementURI = "") allows users to
    remove a single top level element from the annotation node. If,
    having removed the specified annotation, the overall annotation
    node had no child elements the entire node was being deleted.
    There is now an additional optional argument to this function,
    bool removeEmpty, that allows the user to specify that they do not
    wish the annotation to be deleted.

  - There are two new function on the SBase class that allow an
    element to be read from and written to an XMLNode.  The XMLNode is
    the underlying class used by the XML parsing layer of libSBML.
    The function XMLNode* SBase::toXMLNode() returns a pointer to an
    XMLNode that represents the SBase object; which will facilitate
    the ability to look up attributes of an object by name. The
    function void SBase::read(XMLNode& node,
    XMLErrorSeverityOverride_t) invokes the read functionality on a
    given XMLNode. This facilitates reading blocks of annotation that
    may represent SBML in some way.  It should be noted that these
    functions are computational expensive in that they serialise to a
    string. This drawback will be addressed in future libSBML
    architecture but cannot be overcome with the current libSBML-5
    implementation.
    
  - All set or add functions in libSBML return a value from the
    enumeration OperationReturnValue_t. There is now a function
    OperationReturnValue_toString that will return a string
    representation of the reason for the failure.
  
  - 'layout' package-specific updates:
  
    - The example code for layout has been moved to subdirectories
      named 'layout' beneath the appropriate language subdirectories
      in the examples directory.  This reflects the structure used for
      example code from all packages.
  
    - The code reading and writing layout as an annotation has been
      adapted to use the new read/write to/from XMLNode functions.
      This greatly reduces the complexity and repetition of code
      previously needed to perform these functions.

  - 'comp' package-specific updates:
  
    - All the validation rules have been fully implemented, up through
      release 3 of the specification.

    - Validation is now incorporated into the flattening process.  If
      there are no errors (or only warnings), the flattening process
      will proceed to produce a flattened version of the model.  If
      there are errors, the flattening process will halt and return an
      unchanged version of the model, with the errors noted in the
      model's error log.  This provides the user with detailed
      information regarding why a document has failed to flatten as
      well as detailing any warnings related to the document returned
      on success.
    
    - There is an additional option for the CompFlatteningConverter to
      allow the users to request that the document not be validated
      before or after flattening. This allows the user to produce a
      flattened model irrespective of the validity of the original
      model.  Errors produced during flattening will still stop the
      flattening process, as they make it impossible to flatten the
      model.
      
    - There is a further additional option for the
      CompFlatteningConverter to allow the users to specify how the
      required status of any unflattenable package should influence
      whether flattening is attempted or not. By default this option
      has a value of 'requiredOnly' which indicates that flattening
      will abort if it encounters an unflattenable package that has a
      'required' attribute of 'true'. Other options are 'all' or
      'none'.
      
    - The flattening routine has been extended to include all packages
      available within the stable release: layout, qual and fbc.
      NOTE: This means that the behavior of the flattening converter
      will be different than it used to be: in the past, the converter
      would either refuse to flatten a model with information from any
      of these packages, or would leave unmodified package information
      from the main model only.  Now, all information from all
      submodels will be properly integrated into the flattened model.
    
* Bug fixes

  - The converter that expanded functionDefinitions was failing to
    correctly deal with any csymbols it encountered in the math.  This
    has been fixed.

  - Conversion between SBML Levels was not correctly handling the
    units attributes that appear on the Model object in an Level 3
    model. This has been fixed. Thanks to Pratham Shah for the report.

  - The UnitDefinition::printUnits function had a mismatch between
    integer and double values for the exponent; causing incorrect
    values to be used on occasion. This has been fixed. Thanks
    to Pratham Shah for reporting this.
  
  - An annotation on a package element is permitted to use the SBML
    namespace.  However, this situation was logging an error.  This
    has been corrected.
    
  - A memory leak in the TranslateSBML function has been plugged.
    Thanks to Neil Swainston for reporting the issue and testing the
    fix.

  - 'comp' package-specific bug fixes:
  
    - It is possible to construct a model which tries to delete an
      object more than once.  This was not being detected correctly.
      This has been addressed and flattening code will report this
      issue as an error.
    
    - Similarly replacing both an object and independently replacing
      a child of that object could also cause problems. These have
      been sorted.
 
* Miscellaneous

  - The API manuals for Java, Python and C# now include information
    about the SBML Level 3 package extensions.  In addition, many
    content errors have been fixed, many formatting errors have been
    resolved, new sections have been added, and finally, the overall
    look and feel of the documentation has been updated (and hopefully
    improved).

  - The copyrights and license statements in LICENSE.txt/LICENSE.html
    have been updated to reflect the inclusion of code from Ralph
    Gauges (EML, Heidelberg, Germany), a small program from Sun
    Microsystems used in generating documentation, and the PrettyTable
    and Google Code Prettify utilities mentioned below.  

  - To help produce better documentation, the libSBML sources now use
    (and incorporate) two utilities, PrettyTable 0.7.2 (in
    src/bindings/python/doc-converter) and Google Code Prettify (in
    docs/src).  Both are redistributable under terms compatible with
    the LGPL terms used for libSBML as a whole.  Please see the file
    LICENSE.txt or LICENSE.html for specific information about the
    authors and license terms of these packages.

  - A new, simple tutorial example of creating a model using the
    Python language interface is now available in the Python
    documentation.  The example was kindly provided by Martins Mednis
    (in 2012!).


EXPERIMENTAL RELEASE

* New features
 
* Distributions

  - There is now a stabilized version of the specification for the
    Distributions package and the experimental release now includes
    code for this 'distrib' package.  As is the case with all packages
    included in the Experimental Release the binaries are built with
    'distrib' enabled and the libSBML source archive includes the
    source code.
    
* Multistate, Multicomponent and Multicompartment Species

  - There is now a stabilized version of the specification for the
    Multistate, Multicomponent and Multicompartment Species Package
    and the experimental release now includes code for this 'multi'
    package.  As is the case with all packages included in the
    Experimental Release the binaries are built with 'multi' enabled
    and the libSBML source archive includes the source code.  It
    should be noted that it is not yet possible to extend the math
    <ci> element; which the 'multi' proposal does; however the
    definitionURL attribute can be used on the <ci> element to convey
    the necessary information until libSBML provides the ability to
    extend the math.
    
* Groups
  
  - The 'groups' package code has been updated to include revisions
    made to the latest specification.

  
====================================================================
Version 5.8.0 (2013-02-28)
====================================================================

STABLE RELEASE

* Flux Balance Constraints

  - The first official version of the specification of Flux Balance
    Constraints is now available and thus the libSBML code for
    'fbc' is now included in the stable release of libSBML.  This
    means that all prebuilt binaries for the stable release will
    include the 'fbc' package code. The src archive containing
    libSBML core code will continue to be available but there will be
    additional src archives available in the stable branch: one
    containing libSBML core plus all stable packages and additional
    archives of the individual package code.
    
    NOTE: The libSBML GNU make-based build system has not been updated
          for packages. Thus, to build from src, it is necessary to
          use the CMake build system.

* New features

  - The converter that expands SBML FunctionDefinition constructs has
    been extended with an additional option that allows the user to
    specify particular <functionDefinition> objects that should not be
    expanded.
    
  - We have changed the behavior of the converter that converts
    between core Levels and Versions of SBML.  This converter has a
    boolean option, 'strict', that determines whether an invalid model
    can be converted or produced.  The code originally assumed that
    'strict = false' refers to syntactic validity only, and so even
    when the flag was set to false, the converter could fail to
    convert a model if semantic validity was not preserved.  This
    interpretation has been changed because people felt it was not
    useful; now, setting 'strict' to 'false' will always convert a
    model, and if there are errors related to altered semantics, the
    errors will be logged in the usual error log.
   
  - Documentation for the 'comp' and 'fbc' C++ API is now available.

  - 'comp' package updates:
  
    - The C API for comp is now available with an example of
      creating a model using this API.
      
    - The majority of 'comp' package validation rules have now been
      implemented and will be reported.  Validation has also been
      expanded to apply validation from core and other packages
      (where appropriate) to any ModelDefinitions contained within a
      comp model.
      
* Bug fixes

  - LibSBML was still writing out the deprecated, and in some cases
    removed, attribute 'charge' on a <species>. This is no longer the
    case.
    
  - Some files caused the SBML Level and Version converter to enter an
    endless loop. This has been fixed.  Thanks to the good folks at
    Persistent Systems Ltd. for reporting this.
    
  - Reading an attribute with a value of type 'double' was failing 
    to report when a different type was encountered for the value.
    This has now been sorted and will be correctly logged as an 
    error by the readSBML functions.
    
  - The Level and Version converter was in some cases running unit
    validation even if the user had specified that they did not
    require strict unit validation.  This was in fact done by libSBML
    to allow an error to be logged; however, it has become clear that
    the large computational overhead of running unit validation is
    unecessary to merely log an error.  Thus, if the user has declared
    that they do not require unit validity, the checks will no longer
    be applied.

  - 'layout' package-specific bug fixes:
  
    - The extension namespaces were not being correctly set. This
      has been fixed.

  - 'comp' package-specific bug fixes:
  
    - The function 'renameSIdRefs' now functions properly for
      SBaseRef-derived classes.

* Configuration/build system changes

  - 'fbc' package-specific build system changes:
  
    + The GNUMake build system has not been implemented for
      packages. Thus, to build from src, it is necessary to use CMake.

* Miscellaneous

  - The structure of the API documentation has been slightly
    overhauled to provide clearer access to relevant information.


EXPERIMENTAL RELEASE

* New features

  - 'qual' package-specific new features:
    
    - New functions getInputBySpecies(std::string) and 
      getOutputBySpecies(std::string) have been added to the
      Tranisition class. These will return the first Input/Output
      in the relevant list that matches the qualitativeSpecies
      attribute value supplied as argument.

* Bug fixes

  - 'qual' package-specific bug fixes:

    - As validation of packages is starting to be introduced the 
      situation whereby a ListOfFunctionTerms can contain no 
      FunctionTerm elements but only a DefaultTerm caused issue
      with the code that reports an empty ListOf object. This
      has been fixed.
  
  - 'render' package-specific bug fixes:
  
    - Conversion between L3 and L2 annotation was not working as
      expected. This has been fixed.
      
    - The interaction between layout GraphicalObjects and the 
      render 'objectRole' attribute was removing the attribute
      on occasion. This has been fixed and more fully tested.


====================================================================
Version 5.7.0 (2013-01-14)
====================================================================

STABLE RELEASE

* Hierarchical Model Composition

  - The first official version of the specification of Hierarchical
    Model Composition is now available and thus the libSBML code for
    'comp' is now included in the stable release of libSBML.  This
    means that all prebuilt binaries for the stable release will
    include the 'comp' package code. The src archive containing
    libSBML core code will continue to be available but there will be
    additional src archives available in the stable branch: one
    containing libSBML core plus all stable packages and additional
    archives of the individual package code.
    
    NOTE: The libSBML GNU make-based build system has not been updated
          for packages. Thus, to build from src, it is necessary to
          use the CMake build system.

    Known limitations of the 'comp' code:
    
      + Documentation has not yet been integrated into the libSBML 
        documentation.
      
      + Whilst the majority of validation rules have been implemented,
        some will report the schema error id rather than the specific
        comp validation rule id.  The more involved rules involving
        circular dependencies and in-depth referencing have not been
        implemented.  Validation of ModelDefinitions is implemented
        with respect to comp validation, but not with respect to core
        validation.

      + There is no C API for interacting directly with comp
        objects. However the C API for reading and validation will
        apply to the 'comp' package and flattening can be accessed via
        the converter C API to call the CompFlatteningConverter.

* New features

  - Convenience functions have been added to the SBMLExtensionRegistry
    class to facilitate enabling/disabling packages using just the
    package name. For example: disablePackage(const std::string&
    package); enablePackage(const std::string& package);

  - Previously the setNotes function accepting a string as argument
    expected the string to contain the appropriate XHTML tags and
    would not set the value of the <notes> element to a string that
    did not meet this requirement.  The functionality of the
    setNotes(const std::string&) function has been extended to allow a
    user to add an optional boolean argument addXHTMLMarkup. When the
    value of this argument is 'true' the function will accept a
    string; wrap it with the XHTML <p> tag and set the <notes> element
    to this.
    
  - A C API for use with the converters has been added. Examples of
    using the converter API are available in all supported languages.
    
  - 'comp' package
   
    - Access to the flattening routines has been restricted to the
      CompFlatteningConverter.  This allows options to be specified by
      the user regarding ignoring other packages and whether to
      produce a document with no comp namespace or a document with the
      comp namespace but the required attribute set to 'false'.
      
    - Validation has been implemented (see note above). This is called 
      via the checkConsistency function within core libSBML; which now
      accesses a checkConsistency function in the comp plugin.
      There are two categories of validation: 
      LIBSBML_CAT_GENERAL_CONSISTENCY and LIBSBML_CAT_IDENTIFIER_CONSISTENCY
      which are enables or disable via the setConsistencyChecks()
      function on the SBMLDocument (in libSBML core).
      
    - The API for resolving external models has been updated to use a
      registry of resolvers. This facilitates the addition of user
      specific resolvers.

* Bug fixes

  - The number of arguments expected by a piecewise function
    was incorrectly assumed to be two. However, a piecewise
    function can have a single argument. This has been corrected.

  - Validation of SBML Level 3 was issuing a general warning about
    missing required attributes but failing to identify which
    attribute had caused the error to be reported.  This has been
    corrected. Thanks to Nicolas Rodriguez for pointing this out.
    
  - Validation was failing to report the incorrect use of a function
    call if the lambda function usesd expected no arguments. This
    has been fixed.
    
  - The L3Parser was not dealing with the sqrt function correctly.
    This has been sorted.
    
  - 'comp' package-specific bug fixes:
  
    + SBOTerms were not being correctly dealt with when they 
      occured on a Port element. This has been corrected. Thanks
      to Chris Myers for reporting this.

* Configuration/build system changes

  - Building the MATLAB binding for libSBML can be problematic due to
    the need to identify and use the MATLAB mex compiler.  When MATLAB
    is being accessed over a network this can result in misleading
    error messages.  The build system has been improved to halt
    compilation if the mex compiler is not available and to give a
    clearer error message as to how to proceed.

  - The build system has been updated to facilitate use with the 
    Mac OS X 10.8 operating system (Mountain Lion).
    
  - 'comp' package-specific build system changes:
  
    + The GNUMake build system has not been implemented for
      packages. Thus, to build from src, it is necessary to use CMake.

* Miscellaneous

  - It was reported that gcc 4.7 found the various definitions of
    isnan used within some parts of libSBML to be problematic.  This
    problem has been addressed and there are now functions util_isNaN
    and util_isFinite in the util file that are used throughout
    libSBML.  Thanks to Totte Karlsson for reporting this.

  - Where test files compare double values the comparisons have
    been unified to use the util_isEqual(double, double) function
    and thus avoid inaccurate results that can be machine dependent.

  - This NEWS.txt file has reduced in size with NEWS dating from
    prior to libSBML-5 now saved as an OLD_NEWS.txt file.


EXPERIMENTAL RELEASE

* New features

  - 'Qual' package:
    
    - The package specification redefined whether some attributes or
      elements were required; the code has been updated appropriately.
  
  - 'Fbc' package:
    
    - The package specification added some optional attributes
      and deprecated the use of strict less than or greater than; 
      the code has been updated appropriately.

* Bug fixes

  - 'Render' package:
    
    - In some cases the code was failing to add expected attributes
      to particular elements.  This has been corrected.
  

====================================================================
Version 5.6.0 (2012-08-03)
====================================================================

A note on the use of SWIG:
 
All aspects of libSBML-5.6.0 requiring SWIG are known to work with
SWIG version 2.0.4.  Issues with later versions have been found 
with respect to some areas of a libSBML build.  These will be
addressed in future releases but for libSBML-5.6.0 we recommend
the use of SWIG 2.0.4.


STABLE RELEASE

* New features

  - LibSBML now includes a binding to R (The R Project for Statistical
    Computing). The binding is generated using SWIG and thus can be 
    built by users. Alternatively, the libSBML-5.6.0 release provides
    R packages that can be installed directly into R.

  - During HARMONY 2012, people discussed the issue of providing
    support for Level 3 Layout in other SBML Level 3 packages.  The
    conclusion was that additional GeneralGlyph elements should be
    added in order to support references to as-yet unknown types of
    objects to be defined in Level 3 packages. These additional
    elements have been included in the libSBML layout code.
    
  - Although libSBML GNU makefiles have technically supported Python 3
    for some time, there had been no feedback regarding the use of
    Python 3 until recently.  In response to the feedback, we have the
    updated the build system to facilitate the use of different
    versions of Python 3.  On Windows, the libSBML release also
    includes prebuilt installers for Python 3.2.

  - The libSBML 'configure' command now accepts the additional option
    --with-python-interpreter, which allows you to specify the Python
    interpreter that should be used.  This is useful when a system has
    multiple versions of Python installed in the same directories, and
    the version that should be used can be selected by explicitly
    invoking the desired version.  The option takes a full path, as in
    "--with-python-interpreter=/usr/bin/python2.7".
        
  - In order to facilitate the use of identifiers.org URLs, we added
    an additional function, getSBOTermAsURL, to the SBase class.  This
    function returns a string representation of the SBOTerm in its
    resolvable identifiers.org URL format; e.g., 
    "http://identifiers.org/biomodels.sbo/SBO:NNNNNNN"
    
  - The use of libSBML get and set functions in Python; a by-product
    of the use of SWIG; is not particularly intuitive. LibSBML-5.6.0 
    applies a patch that allows the use of indexing in the python
    environment i.e. model->getSpecies(0)->getId() can be replaced
    with model.species[0].id. This patch is limited to Python 2 versions
    at present. It does not adversely effact existing functions for 
    either Python 2 or Python 3.  Many thanks to Gordon Ball 
    (Computational Medicine, Karolinska Institute) for creating and
    sharing this patch.

* Bug fixes

  - When using a copy of libSBML compiled with Level 3 package
    support, attributes from the "sbml" namespace were not given a
    namespace prefix when they should have been.  This has been fixed.
    
  - The L3Parser had some subtle bugs on some operating systems when 
    dealing with very long numbers or exponentials. These have been
    tracked down and fixed.
    
  - Although libSBML explicitly prevented History or CVTerm objects
    from being added to the annotation of an object when that object
    had no metaid attribute value, it was still possible to add
    History and CVTerm directly to the annotation.  This could lead to
    invalid MIRIAM annotations because they lacked a metaid attribute
    value.  LibSBML now checks that an object to which any MIRIAM
    compliant annotation is being added has a metaid.
    
  - When returning a MIRIAM-compliant annotation, all CVTerms were
    lost if just one had an invalid qualifier.  This has been fixed.
    
  - The decompression code uses a macro OF that is not defined for all
    versions of linux.  A definition has been added to avoid problems.
    Thanks to Kai Wohlfahrt for reporting this.
    
  - There was a potential memory leak issue while registering  
    SBMLConverters.  Thanks to Akira Funahashi and his team for spotting
    the problem and supplying a fix.
 
* Configuration/build system changes


  - As SBML Level 3 packages and their code become available, there is
    a increasing number of possibilities in the matrix of what a
    particular instance of libSBML has included. In order to
    facilitate code that may rely on the presence of one or more
    packages, the CMake configuration process has been improved to
    include a set of flags that identify the packages included in a
    particular build.  The file convertLayout.cpp in the examples/c++
    directory illustrates the use of these #define's.
    
  - The MATLAB bindings failed to build on Mac OS X whenever an Xcode
    version was used that did not include the Mac OS 10.6 SDK.  This
    has been fixed.
    
  - The CMake build system has been made more resilient to finding 
    include files from previous libSBML installations.


EXPERIMENTAL RELEASE

* New features

  - The Qualitative Modeling package "qual" is now supported. 
  
  - The R binding is available for all packages.

  - 'Groups' package:
    
    - At HARMONY it was agreed that the 'group' element needed an
      additional attribute 'kind'. This has been added.

  - 'Spatial' package:

    - There was an issue with the encoding of image data for the
      spatial package. This has been solved by providing a function
      that will uncompress the data and return it to the user in a
      usable form.

  - 'Comp' package:

    - Instantiated Model objects in Submodels now are set to have that
      Submodel as their parent.  The SBMLDocument is still set to the
      document of the original Model, so that its own Submodel
      references can be properly tracked down.

====================================================================
Version 5.5.0 (2012-05-11)
====================================================================

STABLE RELEASE

* Revision of annotation and SBML MIRIAM RDF

  Following discussions on the libsbml-development mailing list
  we have adjusted the way functions affecting annotations interact
  with the SBML MIRIAM RDF classes for History and CVTerms.  
  
    - Previously any annotation was assessed and if it contained 
      MIRIAM RDF the corresponding classes were created and the original 
      annotation XMLNodes relating to these objects was removed from the 
      annotation. When the annotation was retrieved the xml was reconstructed
      from the History and CVTerm classes.  This is no longer the case.
      In 5.5 we have changed the code so that the MIRIAM objects are
      created BUT the original annotation remains intact. It is only 
      reconstructed if the code has directly altered the History or CVTerm 
      classes via the class API, otherwise the original annotation
      is returned.
      
    - We reassessed the use of the appendAnnotation function. Previously
      any annotation was appended regardless of whether the existing
      annotation already contained a top level element with the same
      namespace.  We considered this to be a bug, since it would result
      in invalid SBML. Thus, the appendAnnotation function now checks
      whether there is an existing top-level element with the same
      namespace of any it is to append and does not append if it 
      encounters a duplicate. It returns an OperationReturnValue of
      LIBSBML_DUPLICATE_ANNOTATION_NS to indicate this to the user.
      
    - In our reassessment of appendAnnotation we came to the conclusion
      that it was virtually impossible to correctly determine the intent
      of the user in cases where both the existing and appending annotation
      contained RDF that complied with the SBML MIRIAM RDF History or
      CVTerms. Thus the appendAnnotation function no longer treats RDF
      as a "special" case.  If there is existing RDF, no further RDF will 
      be appended. Users wishing to alter existing History or CVTerms should
      use the API provided or construct their own annotation and use the
      setAnnotation function. 

    - New functions removeTopLevelAnnotationElement(std::string name) and 
      replaceTopLevelAnnotationElement(XMLNode* annotation) have been 
      introduced to allow users to remove or replace a single top level
      annotation element whilst conserving any other annotation that may be
      present.

* New features

  - There is now a version of the infix to MathML parser that is independent
    of L1 constructs. This parser is available as three functions: 
    SBML_parseL3Formula(""), SBML_parseL3FormulaWithModel("", Model*) and
    SBML_parseL3FormulaWithSettings("", L3ParserSettings *). There is 
    a new object L3ParserSettings that allows the user to tailor the
    results of the function, for example to parse "log" as natural log
    or log base 10; to allow users to enter units on numbers as "10m" or
    to disable this feature along with some other options. 

  - The getLine() and getColumn() functions did on some occasions
    return a maximum int value when the correct lines and columns
    could not be determined. This produced inconsistent behaviour as
    some XML parsers return '0' as if they cannot determine location.
    This has been unified and libSBML's getLine()/getColumn() will now
    return '0' if the location is unknown.

  - There is a new class SBMLDocumentPluginNotRequired which allows a 
    package code to derive from an object where the required attribute is
    considered 'false' until it has been set. Note this is not a "default"
    value it is just the value with which the boolean attribute is 
    initialised.  The existing SBMLDocumentPlugin class assumes a value
    of 'true'.  This is in fact a change in behaviour but since users
    should set this value it should not cause a problem.

* Bug fixes

  - Tracker issue#3509843
    The annotation element in SBML should contain only elements.  Schema
    validation reports this but libSBML was not. This has been corrected.  
    Thanks to Camille Laibe for still running schema validation and reporting 
    the issue.

  - There was a subtle bug involving accessing a NULL ModelHistory object.
    This has been fixed.

  - Area units were not being properly converted between SBML Levels. They 
    are now.

  - An AST plus or times node that was created with more than two children
    was written out as only having two children; thus losing information.
    This behaviour has been corrected.

  - Functions used to add objects to other objects in libSBML check that
    the SBML Level/Version/Namespaces of the objects correspond. However
    these checks were imposing the condition that the number of namespaces
    on both objects be the same.  This is not a necessary condition and
    the code has been relaxed.  Thanks to Chris Myers for pointing it
    out.

  - In XML if the sbml element is not prefixed but the only declaration 
    of the sbml namespace is, then technically the sbml element has not
    been placed into the sbml namespace. LibSBML was failing to report this.
    This has now been fixed.
    
  - There was a curious indentation issue that arose if notes used text as
    child elements of an element that also had another non-text child element.
    This could proliferate and cause models where the indentation ran into
    the thousands of spaces.  This has been sorted out and no longer
    happens.

* Miscellaneous

  - The uninstallation instructions were out of date.  This is now
    updated, for example to mention that the Mac OS X installer does
    in fact provide an uninstall script.

* Configuration/build system changes

  - Doxygen versions 1.7 and 1.8 are now supported, but due to
    differences in the new version, older versions of Doxygen are no
    longer supported.  The 'configure' script will now only accept
    version 1.7 at minimum.

  - Some changes have been made to facilitate building libSBML
    with the Borland compiler.  This included standardising the use
    of #ifdefined rather than using #if.  Thanks to Totte Karlsson for
    the effort of getting this to work.

  - The CMake build has been updated to facilitate the use of the Intel
    compiler.


EXPERIMENTAL RELEASE

* New features

  - New macros provided so that SBMLNamespaces objects may easily be created
    to allow package elements to be extended by other packages (for example:
    a comp:modelDefinition to have a layout:listOfLayouts).  These macros
    now used throughout package system when creating new package elements.

  - In 'comp':
    -  ExternalModelDefinitions have a new function, 'getReferencedModel'
       that tries to find the referenced document and model, if the reference
       URI is a 'file' type.  If the SBMLDocument has its fileURI set, this will
       use that to search for relative filenames.

    -  With the above in place, automated flattening now works with
       ExternalModelDefinitions that point to local files.

    -  May now use ModelDefinitions to create the main Model of an SBMLDocument.


======================================================================
Version 5.4.1 (2012-02-24)
======================================================================

STABLE RELEASE

* Bug fixes

  - The MATLAB binding function isSBML_Model had a subtle bug
    that meant it could crash in certain circumstances.  This has 
    been addressed.  Thanks to Ying Zhang for the report.

  - When determining units from rate rules unit checking failed 
    to catch the case where time had been redefined as dimensionless.
    This is now fixed.  Thanks to Kieran Smallbone for reporting it.

  - Documentation files for MATLAB were missing from the dmg 
    installers for MacOS.  This has been fixed.

  - 'getElementBySId' could potentially return initial assignments,
    event assignments, assignment rules, and rate rules that assigned
    *to* the SId in question, instead of returning the actual element
    with the SId.  This has been fixed.

EXPERIMENTAL RELEASE

* Bug fixes

  - LibSBML will now automatically register any packages that are 
    enabled in code. Previously libSBML could be built including 
    package code but users needed to perform an additional step
    to actually use it. This was causing some confusion.
    
     
  
======================================================================
Version 5.4.0 (2012-02-16)
======================================================================

STABLE RELEASE

* New features

  - Basic validation of MIRIAM compliant RDF annotations that 
    are parsed into ModelHistory or CVTerm objects has been
    added to facilitate the use of annotations that are not
    yet quite complete.  Warnings are now issued relating to 
    whether or not the rdf:about attribute accurately points to
    the metaid of the containing object and whether the object
    that was created was consisdered a valid object in the
    attributes and subelements that are required.

  - It has been noted that unless the checkConsistency function is
    called immediately after reading an SBML document, it does not
    report all potential errors.  Since users may wish to apply the
    function to a model being constructed this seems to be a
    disadvantage of the function.  However, as this function has been
    in libSBML for many years it was decided not to alter the
    functionality but to add a new function 'validateSBML' which, when
    called from a document object, will force a write and read of the
    in memory object and report validation errors for the object as
    written.  Thus, all errors will be reported with line numbers that
    would correspond to the document if written out.

  - Conversion of a model containing FunctionDefinitions to L1
    is now supported.
    
  - Conversion of a model containing InitialAssignments to L2V1 
    and L1 is now supported.
    
  - There is a new isSetBody() function for the FunctionDefinition
    class that returns true if the body of the lambda function
    has been set.
    
  - The MATLAB/Octave binding function OutputSBML now takes an 
    additional optional flag (extensions_allowed defaulting to true) 
    that allows a user to specify whether the MATLAB_SBML structure 
    should be considered valid if it contains any additional fields.
    
  - Multiple namespaces using the same prefix are not allowed in XML.
    The function that added XMLNamespaces in libSBML checks for an
    existing namespace with the prefix of the namespace being added
    and overwrites the original if a duplicate is found.  This 
    behaviour meant that it was possible to unintentionally remove
    the sbml namespace.  The behaviour of the function has been altered
    such that if the namespace being added has a prefix that duplicates
    that of the existing sbml namepace then the function returns failure
    and the new namespace is not added.  Should the sbml namespace need
    to be replaced it can be done by using the remove function before
    adding the new namespace.
    
  - SBase objects that occur in Level 3 package code need to keep
    track of the namespace of the package to which they belong. However,
    a conversion might alter the namespace; for example with layout
    where the level 2 layout annotation has its own namespace.  
    The getURI function has been altered to adopt the approach used for 
    tracking the core sbml namespace of any object i.e. the namespaces of 
    the containing document take precedence and the namespace stored on 
    an actual object is only considered if it does not belong to a document. 
    An additional function getElementNamespace() can be used to obtain
    the namespace stored on the actual object. 
    
 
* Bug fixes

  - Tracker issue #3472034
    Line numbers were not being reported as accurately for L2 models 
    as for L3 models. We have overviewed all the code relating
    to line numbers and improved the accuracy and consistency
    of line numbers reported. Thanks to Raimund Rönn for the report.  

  - Tracker issue #3471902
    The documentation for the readSBMLFromString function claimed it
    prepend the xml encoding if it was not present. In fact, the 
    function did not do this. This has been corrected. Thanks to
    Raimund Rönn for reporting it.  
    
  - Tracker issue #3466104
    Fixed inaccuracies in the documentation. Thanks to Raimund Rönn
    for his careful reading and taking the time to report the errors.
    
  - Validation failed to notice that csymbol avogadro was not valid
    in Level 2. This is fixed.

  - Exceptions were not being correctly wrapped for language bindings
    causing potential code crashes.  This has been corrected.
    
  - A number of minor issues with regard to conversion between levels
    and versions have been fixed. These include conversion from L3 to 
    L1 failing to include a compartment; stopping conversion of models
    with hasOnlySubstanceUnits = true to L1; correcting conversion of 
    L3 models with localParameters and preventing conversion of L3 
    models where Events had Priorities or where the csymbol avogadro
    had been used.
    
  - The internalConsistency validator was incorrectly reporting that
    the an Event must have a listOfEventAssignments in a level 3 model.
    This restriction was actually removed in SBML Level 3.
    
  - The MathML subset used by SBML has plus/times/and/or/xor.  In the 
    MathML specification all these functions are nary functions i.e.
    they are permitted to have any number of arguments including zero.
    LibSBML had in fact restricted these functions to two or more
    arguments.  This inconsistency has been corrected.
    
  - Validation was failing to apply constraints to L3 LocalParameters.
    This has been corrected.
    
  - Using a value for a units attribute that was not a builtin unit or
    the identifier of a UnitDefinition is invalid.  However, the way in
    which this was reported varied according to which unit attribute
    caused the issue.  This has been standardized to produce an id
    warning about a dangling UnitSIdRef and (if selected) unit warnings
    relating to the impact of the actual attribute.
    
  - In certain situations libSBML would write out both the stoichiometry
    attribute and a stoichiometryMath element. Since these are mutually
    exclusive this should not happen.  It has been fixed.
    
  - The code that checked for consistent namespaces when adding one
    object to another was too restrictive.  This has been sorted.  Thanks
    to Chris Myers for reporting it.
    
  - Conversion between levels was inconsistent when it came to dealing
    with rational stoichiometry.  This has been fixed.
    
  - The tests for the Perl bindings use of BigInt caused ActivePerl 
    to crash on a Windows system. A workaround to prevent this has 
    been put in place.

  - LibSBML class constructors currently throw exceptions rather than
    create objects with invalid SBML namespace/level/version
    information.  This could potential result in code crashing
    when using one of the language bindings.  These have now been
    rigorously tested and measures put in place to prevent such
    crashes from happening.
    
  - The SBMLTransforms class now correctly evaluates piecewise
    expressions.
    
  - The MathML infix converter now deals correctly with unary plus
    and times. 
    
  - The help text for classes and methods in the Python library were
    previously unformatted, marked-up Doxygen input text, making the
    help text unhelpful.  We wrote a new conversion program to process
    the marked-up text and produce plain-text documentation strings in
    the Python library.  Users can now use the standard Python 'help'
    function to obtain help as expected.
    
  - The StripPackageConverter was not working as expected. This has been
    fixed.

* Miscellaneous


* Configuration/build system changes

  - As libSBML has evolved over the years the header files 
    included by a given code file have expanded. This makes it 
    necessary to recompile many files when only a single header 
    file has been altered.  In an attempt to eliminate unnecessary 
    dependencies we have done an overview of the code. However, 
    merely replacing existing include files with those that are 
    actually required may cause build issues for other users. Thus we have 
    introduced a LIBSBML_USE_STRICT_INCLUDES flag. This flag is 
    not defined by default and thus no includes will change. Defining 
    the flag means that code will only include the minimum number of 
    necessary header files. We encourage people to consider using this 
    flag as it may become the default behaviour in later versions of 
    libSBML.  The flag is available via the CMake build interface.

 

EXPERIMENTAL RELEASE

* New features

 - Code for the 'render' extension is now available.

 - All package code has been updated to use the new line/column 
   number reporting mechanism.
   
 - Package language bindings have been updated to properly wrap
   exceptions and use covariant return types.
   
 - There is a new example with the 'layout' package that demonstrates
   conversion between the layout and render L3 package representation
   and the L2 annotation representation.


======================================================================
Version 5.3.0 (2011-12-23)
======================================================================

STABLE RELEASE

* New features

  - Errors reported by the matlab binding function 'OutputSBML' 
    have been improved to provide information about why the
    structure is invalid.
    
  - There is a new virtual function on an SBase object 'setElementText'. 
    This enables a user to store text that the read functions encounter
    within an XML element.  Previously such text was ignored as no such
    text existed as a part of an SBML Core element.  Some L3 packages
    may use this XML feature and can thus utilize this function.
    
  - There is a new function on an ASTNode 'returnsBoolean' that returns
    a predicate indicating that the math of the ASTNode will return a 
    boolean result or not.  The function has an argument of type Model 
    with a default value of NULL. Where necessary, that is, when the
    ASTNode involves a call to a user defined function, the check is 
    done in the context of the supplied argument Model or the parent 
    Model of the particular ASTNode if no argument is supplied.
    
  - There are new functions to facilitate the use of packages. The 
    SBMLExtensionRegistry has a 'disableUnusedPackages' function which
    disables registered packages that are not being used by the target
    SBMLDocument.  The base SBMLExtension class has a function 'isInUse'
    that will establish whether a package is being used by the target
    document.
    
* Bug fixes

  - The conversion code incorrectly converted an L3 model where the
    stoichiometry was changed by a RateRule.  This has been fixed.
    
  - Conversion from L3 to L2 was failing to write out the spatialDimensions 
    attribute of a Compartment regardless of the value.  It now
    correctly writes out a non default value. 
    
  - The RegisterConverters class was not included in the
    LIBSBML_CPP_NAMESPACE.  This has been corrected.  Thanks to
    Christoph Flamm for letting us know.
    
  - There was a slight discrepancy in how the assignment operator 
    for the SBMLExtensionNamespaces was behaving depending on OS.
    This has been sorted so that behaviour is the same for all.
      
  - Tracker issue #3438777
    The XercesParser was failing to find the line and column number
    definitions with some compilers. This is now fixed.  Thanks to
    David Fange for reporting it.
    
  - Tracker issue #3441615
    There was an issue with SWIG, C# and MSVC compilers caused by 
    conflict with MS MFC and GDI classes.  This has been fixed by 
    explicilty excluding these classes.  Thanks to  Totte Karlsson 
    for reporting this.

  - Tracker issue #3461400
    Writing out an L2 model with Layout annotation caused duplicate
    annotations to be written out.  This has been fixed.  Thanks to
    Raimund Rönn for reporting the problem.

  - Tracker issue #3462055  
    A couple of typos have been corrected.  Thanks to Raimund Rönn 
    for taking the time to report these.
       
  - The documentation for Python did not omit internal libSBML
    methods.  This is now fixed, and the docs more properly reflect
    the public libSBML API.

  - We have fixed a number of errors in the Python API documentation,
    such as return values being reported as "char" when in fact they
    were strings, and have filled out more of the missing
    documentation.

  - We have fixed many other small documentation bugs and filled out
    more of the missing documentation.

* Miscellaneous
    
  - The matlab binding contains a function 'isSBML_Model' that checks
    that the structure contains all the fields that are expected
    in an SBML model.  This function is used by OutputSBML to determine
    if the model can be written out.  Previously this function would
    only report that a model was valid if each of the substructures had 
    the expected fields and no additional fields.  This behaviour has 
    changed to allow users to include extra information within the 
    structure. Thus a model is considered invalid if it does not have 
    all the expected fields; additional fields are ignored.   
  
  - The libSBML examples code has been ported to all language bindings;
    so all examples exist in each language. 

  - The API manuals for languages besides Java now feature a more
    modern and attractive appearance.

* Configuration/build system changes

  - Using CMake to link against the static runtime libraries on windows
    when using libxml2 it was necessary to manually add links to other
    libraries.  The build system now takes care of these.


EXPERIMENTAL RELEASE

* New features

  - There is now code to support the L3 render package.
    

======================================================================
Version 5.2.0 (2011-11-11)
======================================================================

* Download directory structure

  - Prior to this release we have provided stable libSBML source 
    code and associated binary installers, but only provided the 
    source code of the L3 packages that are in beta development. 
    In response to requests to provide binaries including the package 
    code, we have slightly reorganised the directory structure of 
    the 5.2.0 release.

    The top level directory remains as expected

    https://sourceforge.net/projects/sbml/files/libsbml/5.2.0 

    This directory contains two sub-directories 'stable' and 
    'experimental'.

    1) files/libsbml/5.2.0/stable

    This directory contains the source code and various binary 
    installers arranged in a structure identical to that used 
    in the  5.1.0-b0 and 5.0.0 releases.

    2) files/libsbml/5.2.0/experimental
    
    This directory also contains two subdirectories.

    a) files/libsbml/5.2.0/experimental/src

    This directory contains the archives of the beta source 
    code for the L3 packages; similar to those previously contained 
    in the separate top level directory /5.1-packages-beta/.

    b) files/libsbml/5.2.0/experimental/binaries
    
    This directory contains binaries that include the stable 
    source code plus the beta code for ALL of the packages. It 
    should be noted that these binaries may be untested and 
    are provided 'as-is' to facilitate experimentation with L3 packages.


* New features

  - There is a new method 'removeFromParentAndDelete()' that enables
    the complete removal of child objects from any SBase object.
    
  - There is a new method 'getAllElements()' that returns a List
    containing all the children, both direct and indirect, of the
    object on which it is invoked.
    
  - There are new methods that will rename any references to
    SId and UnitSId throughout the model.

  - A new converter has been added that will convert the units
    of a model to base SI units.  
    
  - A new converter has been added that will order AssignmentRules 
    and InitialAssignments in such a way that forward references 
    are avoided.
    
  - The validation API has been refactored to facilitate the use of
    third-party validators. The existing API has been maintained; in
    addition, it is now possible to call any external validator,
    regardless of programming language, using the new validator API.
    
  - There is a new UserData object on the SBase class. This
    facilitates storing additional application-specific information
    that may be useful to particular software.
    
  - A new function, appendFrom(ListOf *), on the ListOf class allows
    the contents of one ListOf object to be appended to another. 
    
  - There are new functions getNumRegisteredPackages() and
    getRegisteredPackageName(index) that allow the user to establish
    which Level 3 packages have been enabled in the instance of the
    libSBML library being used.
    
  - The C API for interacting with the package plugin mechanism
    has been expanded.
    
* Bug fixes

  - The functions that add SBase objects were only checking that the 
    object being added had the correct Level and Version of SBML.  It
    failed to check that any SBML namespaces used also matched.  This has
    been corrected.
    
  - Error checking failed to catch SBML L3 models with an empty
    <listOfEventAssignments>.  Fixed.
    
  - If the units of an object referred to a UnitDefinition that had no
    <lisOfUnits>, the warnings generated by the unit checking code
    were inconsistent.  These have now been standardized.
    
  - The UnitDefinition::isVariantOfMass() function did not check that
    the exponent of any unit was '1'.  This has been fixed.
        
  - The postal address for the Free Software Foundation was out of
    date in all files where it was mentioned.  Fixed.
    
  - It was (erroneously) possible to allow the SBML namespace to be
    replaced and lead to the production of a document with no SBML
    namespace.  Fixed.
    
  - Some of the older libSBML C code called the exit() function when a
    memory allocation error occurred. This is not an ideal way to
    handle a problem. Since the functionality has existed in libSBML
    for many years it has been removed from a standard build but can
    be reenabled using a configuration flag should any users wish to
    do so.

  - The point at which an MSVC call to the c_str() function tidies up its 
    memory usage when running in debug mode is different to the point at 
    which the memory is tidied up when running in release mode or with other 
    C compilers.  This means that a C function that returns a char * which 
    is created using c_str() will return an invalid pointer. Unit testing 
    does not highlight this issue as it only occurs in an MSVC Debug build. 
    Duplicating the string before returning it solves the problem. 
    LibSBML-5.1.0-b0 had three new functions where the string duplication 
    was missing.  This has now been fixed.
    
  - In the layout code, adding a <Point> to a <BoundingBox> produced
    an element with the wrong name. This has been fixed; a fix that 
    revealed further issues with the constructors for packageNamespaces.
    This issue has also been fixed.  Thanks to Chris Myers for reporting 
    the original problem.   

* Miscellaneous

  - There were inconsistencies arising from the naming of functions
    related to packages; some being named doPkgFoobar and others 
    doPackageFoobar.  All of these functions now use the doPackageFoobar
    naming format.  Existing functions using the Pkg format will still
    work but should be considered deprecated.

  - The text of many SBML validation and consistency-checking error
    messages have been edited to hopefully improve readability,
    clarity and consistency.

  - All example files have been overhauled and new ones added.
  
  - Users reported that some of the SBML files in the "test-data"
    directories were invalid, not realizing that this was actually
    intentional because the files are used for testing libSBML.  In
    order to avoid confusion, the files containing invalid SBML have
    been renamed to append '-invalid' to their file names.
    
  - The files located in the validator/test-data directory, used for
    testing the SBML validation code, have been reorganised into
    smaller subdirectories.  The new subdirectories group the files
    according to the type of validation being tested.

* Configuration/build system changes





======================================================================
Version 5.1.0-b0 (2011-08-25)
======================================================================

This release includes a provisional implementation of support for an
SBML Level 3 package for "layout" based on code from Ralph Gauges of
the COPASI group.  No other packages are included with this release;
this applies to the "groups" package as well, which was in the beta
release but is not in this release.  However, the SVN repository on
SourceForge has a branch for packages where ongoing development is
proceeding, and as specifications and code for SBML Level 3 packages
are settled, future libSBML releases will include stable versions of
packages as they become available.  Source code for beta versions of
packages will also be made available from a separate download area,
http://sf.net/projects/sbml/files/libsbml/5.1-packages-beta


* New features

 - The inline formula code will now deal with a unary plus. 
 
 - There is a new API for performing conversions between SBML Levels,
   Versions, and SBML Level 3 packages on an SBML Document.  Existing
   functions such as setLevelAndVersion() have been reimplemented
   using the new API and so will continue to work as expected.  The
   new API will facilitate the introduction of conversion routines
   that deal with Level 3 packages.
   
 - The MATLAB_SBML Structure produced using the MATLAB/Octave bindings
   now includes fields for the SBML Level and Version on all 
   sub-structures.
   
 - There are new functions getElementBySId() and getElementByMetaId()
   that will traverse the entire document and return a pointer to an
   SBase object with the SId or MetaId supplied.
   
 - There are new functions on the SBO class to reflect the new top-level
   names introduced in the SBO ontology.
 
* Bug fixes

 - There were a couple of places where the clone methods failed to
   create a proper copy.  These have been fixed.  Thanks to Nicolas 
   Rodriguez for reporting this.  
   
 - The introduction of the ability to place a units attribute from
   the SBML L3V1 core namespace into a <cn> MathML element meant that
   the code for reading and writing MathML needed to be fully aware
   of which SBML namespaces it was working with.  This has been done.
   
 - Tracker issue #3296228
   Importing a file with a large number of validation errors into
   MATLAB was causing memory issues within MATLAB.  The handling of
   errors has been improved to avoid this situation.

* Miscellaneous

 - Necessary updates to support the latest version of swig. 

* Configuration/build system changes

 - The introduction of Mac OS X 10.7 Lion produced issues with both 
   XCode 4.0 and MATLAB.  These have been addressed. 



======================================================================
Version 5.0.0 (2011-04-14)
======================================================================

This is the first release of libSBML-5.0.0.  

There are three types of potential changes in this release compared to
the beta 5.0.0 release: changes that relate to support for SBML Levels
1, 2 and Level 3 Core; changes that relate to support for L3 packages,
and changes that were introduced in libSBML-4.3.1. These are listed
separately below for convenience.

This release includes a provisional implementation of support for an
SBML Level 3 package for "layout" based on code from Ralph Gauges of
the COPASI group.  No other packages are included with this release;
this applies to the "groups" package as well, which was in the beta
release but is not in this release.  However, the SVN repository on
SourceForge has a branch for packages where ongoing development is
proceeding, and as specifications and code for SBML Level 3 packages
are settled, future libSBML releases will include stable versions of
packages as they become available.  Source code for beta versions of
packages will also be made available from a separate download area,
http://sf.net/projects/sbml/files/libsbml/5.0-packages-beta


-------------------------
Known limitations
-------------------------

At present, libSBML 5 will not attempt to convert a model between SBML
Levels (e.g., from Level 3 to Level 2) if the model uses SBML Level 3
packages.  This applies to SBML layout elements and annotations too.
Our aim is to support conversion between L2 layout annotations and the
L3 layout package, but this functionality will be introduced in a
future release of libSBML.

--------------------------------------
SBML Level 3 Package extension changes
--------------------------------------

* New features

 - The extension mechanism for supporting SBML Level 3 packages now
   includes a full C API.
 
 - LibSBML now has greatly improved detection and error reporting of 
   unimplemented/unknown SBML Level 3 packages.

* Bug fixes

 - The "layout" extension now provides more seamless access to L2
   layout annotations in L2 models.

* Additional documentation

 - There is now more detailed and integrated documentation describing
   the use of CMake as an alternative to GNU make for building and
   installing libSBML.

   
-------------------------------
General libsbml-core changes
-------------------------------

* New features

 - There are now functions will set the Qualifier on a CVTerm from a
   string; in addition to the existing functions that use values from
   the enumeration of QualifierTypes.
   
 - SBML L2 contains an number of attributes that have default values.
   LibSBML does not write these values out.  This behaviour has
   changed slightly for libSBML-5.  If a user explicitly sets the
   value of an attribute to be the default value; then it will be
   written out.  For example setting the spatialDimensions of an L2
   <compartment> to be '3' will result in a document where this is
   explicitly written.
   
 - In SBML L3, it is possible to have a compartment with no
   spatialDimensions attribute declared.  LibSBML-4 would not convert
   such a model to L2, since an L2 compartment has spatialDimensions
   '3' by default.  This behaviour has been altered for libSBML-5 and
   if the user opts for nonstrict units when applying the conversion
   function, a compartment with no spatialDimensions declared will be
   converted.
   
 - There are additional functions XMLNamespaces::getNumNamespaces and
   XMLAttributes::getNumAttributes.  These are aliases for the existing
   getLength functions but are more in keeping with the rest of the API.

* Bug fixes

 - The conversion functions for converting an L2 model to L3 were
   failing to set the stoichiometry value.  This has been fixed.

 - The internalConsistencyCheck was failing to report when required
   attributes or elements were missing from an object.  This has been 
   corrected.  
   
 - The XMLConstructorException was not exposed.  It is now.

* Configuration/build system changes

  - The header files libsbml-config-win and libsbml-config-unix have
    been replaced with a single libsbml-config-common file.

  - The organization of the source directories has been radically
    changed, moving the previous directories src/annotation, src/math,
    etc., to become subdirectories of src/sbml.  This allows us to
    entirely avoid a step that was previously to create a copy of all
    the header files into <libsbml>/include.  That copy operation lead
    to a lot of wasted time when debugging code and accidentally
    making changes to the wrong file.    
    
  - The 'win' directory that previously containing MSVC project files
    has been removed.  The addition of packages made maintaining this
    directory problematic.  The CMake build system provides an easy
    alternative for generating any project files required.   


-------------------------------
Libsbml-core changes from 4.3.x
-------------------------------

Also available in Version 4.3.1 (Released 2011-03-29)

* New features

  - There is now API documentation for the MATLAB and Octave bindings.

* Bug fixes

  - Certain versions of the libxml2 parser fail to catch a prefix
    being assigned to an empty namespace. Additional code has
    been included to catch this error if the version of libxml2 has
    not reported it.

  - The improved build of the MATLAB interface proved unsuccessful
    in cases where the user had a startup.m file that changed
    directory.  This has been corrected.  

  - The SyntaxChecker::hasExpectedXHTMLSyntax(xhtml) function had not
    applied the relaxation on the XHTML restrictions for SBML 
    Level 3.  This has been sorted out.

  - The SyntaxChecker::isValidSBMLSId(string) function was incorrectly
    reporting that an empty string was a valid id.  This has been corrected.

* Miscellaneous changes

  - Choosing --enable-universal-binary on MacOS 10.5 now includes all
    three of the following architectures: i386, x86_64, ppc.  It
    previously only selected i386 and ppc.


Also available in Version 4.3.0 (Released 2011-03-04)

* New features

  - There was some disagreement about what libSBML when asked to write
    out a required attribute in Level 3 where the value of the attribute
    had not in fact been set. Following discussion within the libSBML 
    team and subsequently the libsbml-development mailing list it was 
    decided that the appropriate behaviour was to ignore the attribute
    when writing out the model and thus not inadvertently give the
    impression it has a value.   
    
  - Conversion from Level 3 to Level 2 involving variable stoichiometry
    has now been implemented and this feature of L3 can now be converted
    to L2.

  - There is a getSupportedNamespaces function on the SBMLNamepaces
    class which returns a List of the SBMLNamespaces supported by
    this version of libSBML.

  - Tracker issue #2082682
    The unit checking of math involving the root function has been
    fully addressed. Previously unit checking was only applied to 
    the expression root(n, x) if n was an integer. It can now handle
    any value of n including an expression.
  
  - Checking of the units of measurement in math expressions has been
    further improved to provide checking to a deeper level with the
    overall math of the model.  Thus, the units of the expression a^b
    can now be validated even if the value of b is assigned b = c and
    the model states elsewhere that c = 2.

  - SBML Level 3 has no default attribute values and thus a number of
    new isSetXYZ functions were introduced in libSBML-4.1.0.  Users
    pointed out it was inconsistent that these functions returned
    'false' for a Level 2 model in which the attribute concerned *did*
    have a default value.  Thus, any newly introduced isSetXYZ
    function that deals with an attribute that had a default value in
    Level 2 will now return 'true' regardless of whether the user has
    explicitly set the function or not.

  - The MATLAB and Octave bindings now include the function
    OutputSBML() for writing the structure used in these environments
    back to SBML.  This function has previously shipped as part of
    SBMLToolbox.
    
  - There is an additional constructor for an SBMLDocument object that
    takes an instance of SBMLNamespaces as its argument.  This is similar
    to the constructors for all SBML objects.

  - There is now a custom manifest file included in the Java JAR file.
    It contains the version number of the libSBML release.  An example
    program demonstrating how to access the information is included
    as the file examples/java/printLibSBMLVersion.java.

  - An API manual for the C# language bindings is now available.  It
    is not as complete as the C++ and Java versions, but it is quite
    close.


* Bug fixes

  - The InternalConsistency validator was failing to report the absence
    of required attributes or elements within an in-memory model.
    This has been sorted out with a large number of tests added.

  - Tracker issue #2960646
    When writing out an SBML model containing the root function 
    Octave was failing to convert the formula into the appropriate
    MathML.  This has been fixed.

  - The code that checks for allowed functions in a Level 1 
    document was reporting an error if it encountered one of the 
    predefined functions.  This has been corrected.

  - Checking for NULL references has been greatly improved
    throughout.
    
  - The appendNotes function was not correctly checking for the
    xhtml namespaces declared at the top level.  This has been
    fixed.
    
  - In some cases the facility to create new 'Bags' within CVTerms
    was not performing as expected.  This has been sorted out.

  - Validation previously failed to report an error if a lambda
    function contained only <bvar> arguments and no actual function
    body.  This has been fixed.

  - LibSBML checks that each element within a model being read has
    the correct default namespace.  However, if the namespace had been
    'declared' via a prefix this check was not being performed.  
    This has been corrected.
    
  - The code that checked that the top-level elements of an annotation
    had unique namespaces was incorrectly comparing prefixes rather
    than actual XML namespaces.  This has been fixed.  Thanks to
    Waclaw Kusnierczyk for reporting this and supplying the fix.
    
  - The XML namespace for a <math> element may be declared on the
    <sbml> element.  In this case, the XML namespace declaration must
    use a prefix.  Code that checked that the MathML elements had a
    declared namespace failed to check whether a prefix was correctly
    used.  This is now fixed.  Thanks to the JSBML developers for
    spotting this.
    
  - The code that allows users to use LocalParameter and Parameter
    interchangeably had a small bug where it failed to spot a
    duplicate id for a Parameter but not a LocalParameter.  This has
    been fixed.
    
  - If a <kineticLaw> element is present, it must contain a <math>
    element.  Prior to SBML Level 3 Version 1 Core, this has never
    been explicitly stated as a validation rule but should have been
    reported as a schema error.  In some case this was not happening.
    This is now fixed.

  - The printUnits.java example in examples/java incorrectly used
    getId() on SBML objects that aren't defined to have id's in SBML.
    Talk about setting a bad example!  Fixed.


* Configuration/build system changes

  - MATLAB 2010b introduced some inconsistencies in the build system
    on certain platforms.  This has been fixed.  In addition, the
    'configure' script for Linux and MacOS no longer attempts to
    divine various properties of the MATLAB installation and run mex
    itself, and instead, invokes MATLAB to compile TranslateSBML and
    OutputSBML.  This should lead to fewer problems building the
    bindings for MATLAB.

  - Beginning with this release, LibSBML requires SWIG version 2.0.0
    or higher.  This is to avoid a problem where the C# bindings will
    not work with .NET 4 with SWIG versions prior to 2.0.0.



======================================================================
Version 5.0.0-b1 (2010-12-31)
======================================================================

This is the first beta release of libSBML-5.0.0. There are two types
of potential changes from the alpha release: those that relate to
support for SBML L1, L2 and L3 core, and those that relate to support
for L3 packages. These are listed separately for convenience.

-------------------------
Package extension changes
-------------------------

* New features

  - Language bindings can now be generated to include and use the
    package extension mechanisms.  Given the slightly different
    nature of the MATLAB/Octave bindings, support for packages
    has not yet been extended to these languages.
  
  - Unit tests have been added for the code that implements the
    package extension mechanisms within libSBML core.
    
  - The appendAndOwn() function (used to add items to ListOf elements)
    has been updated to check that the item being added is appropriate
    for the ListOf to which it is being added.  This makes use of the
    virtual function SBase::isValidTypeForList().  Package developers
    need to be aware that in cases where a ListOf element can contain
    items of different types, they will need to provide
    implementations for this function.  ListOfRules provides an
    example; it can contain any of AlgebraicRule, AssignmentRule or
    RateRule.

* API changes

  - Originally, information relating to packages, e.g. PackageName,
    PackageVersion, etc., was stored in static variables.  This proved
    problematic with dynamic libraries on Windows, and therefore these
    variables have been replaced with static methods on the Extension
    classes.  Example: getPackageName().
    
  - The setEnable() and isEnable() functions have been renamed to
    setEnabled() and isEnabled().
    
  - The getExtension() function now returns a clone of the required
    extension.  This avoids a situation whereby a user could
    inadvertently delete an extension object.
    
  - The Check unit testing framework has been adapted to enable the
    tests to be run in a native Windows environment.  This has lead to
    some slight changes in the signature of some methods in the
    annotation classes.  C++ methods that previously return
    std::string now return a const std::string&.
  
* Bug fixes

  - It is no longer possible to register the same extension on multiple
    occasions.

* Configuration/build system changes

  - We anticipate moving from a GNU Make build system to a CMake
    system because this facilitates the inclusion of L3 packages.
    This libSBML release includes all the necessary files to use the
    CMake system in addition to the existing makefiles.  The latter
    have been updated where necessary.  Support for makefiles will be
    phased out in the near future as we move toward having package
    code developed by others outside of the libSBML Team.
    Documentation on using CMake has been included in the docs
    directory.
    
* Additional documentation

  - README-Building_libsbml-5_with_CMake.pdf
 
  - README-Package_Integration.pdf
    Details how to create CMake files for package code that will enable
    one step integration with libsbml-5 source code or an existing 
    libsbml-5 installation. 
   
-------------------------------
General libsbml-core changes
-------------------------------

* New features

  - Checking of the units of measurement in math expressions has been
    further improved to provide checking to a deeper level with the
    overall math of the model.  Thus, the units of the expression a^b
    can now be validated even if the value of b is assigned b = c and
    the model states elsewhere that c = 2.

  - SBML Level 3 has no default attribute values and thus a number of
    new isSetXYZ functions were introduced in libSBML-4.1.0.  Users
    pointed out it was inconsistent that these functions returned
    'false' for a Level 2 model in which the attribute concerned *did*
    have a default value.  Thus, any newly introduced isSetXYZ
    function that deals with an attribute that had a default value in
    Level 2 will now return 'true' regardless of whever the user has
    explictily set the function or not.
    
  - The MATLAB and Octave bindings now include the function
    OutputSBML() for writing the structure used in these environments
    back to SBML.  This function has previously shipped as part of
    SBMLToolbox.

* Bug fixes

  - Checking for NULL references has been greatly improved
    throughtout.

  - Validation previously failed to report an error if a lambda
    function contained only <bvar> arguments and no actual function
    body.  This has been fixed.

  - The documentation for a number of methods had fallen slightly out
    of date with respect to the possible operation return codes they
    could return.  We've updated those documentation strings now.  The
    methods affected are in the classes Compartment, KineticLaw,
    Model, Reaction, Rule, SBase, Species, Unit, UnitDefinition, and
    XMLToken.

  - A number of validation checks had an incorrect ErrorCategory
    labels; thus, though these were reported by the correct part of
    the libSBML validator, querying the category would produce an
    inconsistent value.  These have been updated.
    
  - There were some character encoding issues in a number of error
    messages. These have been corrected.
    
  - The code that checked that the top-level elements of an annotation
    had unique namespaces was incorrectly comparing namespace
    prefixes, not the actual namespaces.  This has been fixed.  Thanks
    to Waclaw Kusnierczyk for reporting this and supplying the fix.
    
  - The XML namespace for a <math> element may be declared on the
    <sbml> element.  In this case, the namespace must use a prefix.
    Code that checked that the MathML elements had a declared
    namespace failed to check whether any required prefix was
    correctly used.  Thanks to the JSBML developers for spotting this.
    
  - The code that allows users to use LocalParameter and Parameter
    interchangeably had a small bug where it failed to spot a
    duplicate id for a Parameter but not a LocalParameter.  This has
    been fixed.
    
  - If a <kineticLaw> element is present, it must contain a <math>
    element.  Prior to SBML Level 3 Version 1 Core, this has never
    been explicitly stated as a validation rule but should have been
    reported as a schema error.  In some case this was not happening.
    This is now fixed.

  - The 'configure' script help text incorrectly claimed that Xerces
    was the default XML parser; it now correctly states libxml2 is.

* Configuration/build system changes

  - MATLAB 2010b introduced some inconsistencies in the build system 
    on certain platforms.  This has been fixed. 

  - The organization of the source directories has been radically
    changed, moving the previous directories src/annotation, src/math,
    etc., to become subdirectories of src/sbml.  This allows us to
    entirely avoid a step that was previously to create a copy of all
    the header files into <libsbml>/include.  That copy operation lead
    to a lot of wasted time when debugging code and accidentally
    making changes to the wrong file.      


======================================================================
Version 5.0.0-a1 (released 2010-10-05)
======================================================================

This is the next alpha release of libSBML-5.

This includes full support for SBML Level 3 Core; as found in
libSBML-4.2.0.

It also includes mechanisms for support of a 'layout' and a 'groups'
extension.  This support extends to all language bindings with the
exception of matlab/octave.  Note these are dummy packages based on
proposals for the layout and groups packages.  They do not represent 
fully approved L3 packages.

There have been no API changes from the pre-alpha release.

It is anticipated that the next release (beta) will rearrange the 
directory structure for contributed package code and provide
a new build system to facilitate the inclusion/exclusion of
packages. 

* Changes to dependencies on 3rd-party libraries:

  - The language bindings now require SWIG 2.0.0 or later. 

* Known issues:

  - The C API is not yet implemented.



======================================================================
Version 5.0.0-a0 (released 2010-01-18)
======================================================================

This is a pre-alpha release of libSBML-5 which provides support for 
package extensions in SBML Level 3. Since libSBML-5 is currently in 
development stage the API may be changed in the future. Also, some 
features for package extensions (e.g. validation, language bindings 
and etc.) are not supported yet (please see "Known Issues" below).

Currently, the code is based on the SVN trunk of Revision:10522
(i.e. based on 4.1.0-beta), and thus validating/converting SBML 
Level 3 core has not been supported yet.

Please see the following bundled README files for details:

   (1) docs/00README-HowToUsePackageExtension.txt

  (For package developers)

   (2) docs/00README-ExtensionSupportClasses.txt
   (3) docs/00README-HowToImplementPackageExtension.txt
   (4) docs/00README-ChangesInSBase.txt
 

* New Features:

- Added new classes for supporting package extensions in 'src/extension'.

- Added a new directory 'src/packages' in which additional package 
  extensions will be located.

- Added new functions for supporting package extensions in existing 
  classes. Most of the new functions are implemented in SBase and 
  SBMLNamespaces classes.

- Added a package of layout extension as an example package in
  'src/packages/layout'. The package is based on existing 
  implementation of layout extension (implemented by Ralph Gauges) 
  bundled with libSBML-4.  
  "--enable-layout" option is required when running configure script to 
  build the layout package. Example codes using the layout package are 
  provided in "examples/layout/".
  Currently, the package is built as additional shared library files 
  (e.g. libsbml-layout.a and libsbml-layout.so on Linux) that depend on 
  the shared library of core libSBML (e.g. libsbml.a and libsbml.so on 
  Linux) when built with make command.
  The package is built into existing libsbml.dll when built with MSVC 
  on Windows. This build configuration may be changed in the future
  release. 

- Added a package of groups extension (based on the proposal on 2009-10) 
  as another example package in 'src/packages/groups'.  
  "--enable-groups" option is required when running configure script to 
  build the groups package. Example codes using the groups package are 
  provided in "examples/groups".
  Currently, the package is also built as additional shared library files 
  (e.g.  libsbml-groups.a and libsbml-groups.so on Linux) when built with 
  make command whereas the package is built into libsbml.dll when built 
  with MSVC on Windows. This build configuration may also be changed in 
  the future release. 

* Changes:

- Moved source files of layout extension from 'src/sbml/layout' to 
  'src/packages/layout'.

- SBMLTypeCode_t (enum type) now contains only typecodes of SBase 
  objects defined in the SBML core. Each package extension should 
  define a similar enum type for typecodes of SBase objects defined 
  in each package extension (e.g. SBMLLayoutTypeCode_t for "layout" 
  extension (defined in LayoutExtension.h) , and SBMLGroupTypeCode_t 
  for "groups" extension (defined in GroupExtension.h).)

- Changed the type of return value of SBase::getTypeCode() and 
  ListOf::getItemTypeCode() functions (SBMLTypeCode_t -> int).

- Changed the usage of SBase::getTypeCode() and ListOf::getItemTypeCode() 
  functions. Currently, the value of each typecode can be duplicated 
  between those of different packages (this duplication problem doesn't 
  happen with existing code which uses only SBase objects of the SBML 
  core). To distinguish the typecodes of different packages, not only 
  the return value of getTypeCode() but also that of getPackageName() 
  should be checked as follows:

     void example (const SBase *sb)
     {
       const std::string pkgName = sb->getPackageName();

       if (pkgName == "core")
       {
         switch (sb->getTypeCode())
         {
           case SBML_MODEL:
              ....
              break;
           case SBML_REACTION:
              ....
         }
       }
       else if (pkgName == "layout")
       {
         switch (sb->getTypeCode())
         {
           case SBML_LAYOUT_LAYOUT:
              ....
              break;
           case SBML_LAYOUT_REACTIONGLYPH:
             ....
         }
       }
       ...
     }


- API changes:

  (- : libSBML-4 API,  + : libSBML-5 API)
  

    - virtual SBMLTypeCode_t SBase::getTypeCode() const  
    + virtual int            SBase::getTypeCode() const 


    - virtual SBMLTypeCode_t ListOf::getItemTypeCode() const  
    + virtual int            ListOf::getItemTypeCode() const 


    - const char* SBMLTypeCode_toString (SBMLTypeCode_t typecode) 
    + const char* SBMLTypeCode_toString (int typecode, 
                                         const char* pkgName) 


    - SBase* SBase::getAncestorOfType(SBMLTypeCode_t type)    
    + SBase* SBase::getAncestorOfType(int type, 
                                      const std::string pkgName="core") 


    - virtual void SBase::readAttributes (const XMLAttributes& attributes)
    + virtual void SBase::readAttributes (const XMLAttributes& attributes,
                                          const ExpectedAttributes& expattr)


* Known Issues:

- Validating functions need to be extended for package extensions.

- Converting functions need to be extended for package extensions.

- Language bindings (SWIG configuration files and underlying support 
  code such as local.cpp) need to be modified for supporting package 
  extensions. Currently, language bindings of "layout" extension 
  (Java, Python, Ruby, and C#) should work.

- SBML Core and additional package extensions should be located in 
  their own namespaces to avoid potential name conflictions.

- C wrapper API needs to be added/updated.




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