libSBML NEWS -- History of user-visible changes ====================================================================== 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. ====================================================================== Version 4.1.0-b2 ====================================================================== This is a second beta version which adds support for setting new attributes as defined in the L3 specification Public Review Draft published 2009-08-22. Features introduced in this version: - setFoo(xxx) functions for all new attributes - unsetFoo() functions for all new optional attributes - the "sbml:units" attribute on the cn element is now supported. This includes reading and writing and getUnits, isSetUnits, setUnits and unsetUnits functions for manipulating the attribute on an ASTNode. Note that the support for reading/writing is minimal and writing out a math element that uses the attribute will always use 'sbml' as the prefix. This implementation is temporary to allow users to work with the attribute but complete implementation will require some internal redesign. Features that are not yet implemented: - the "required" attribute for packages on the sbml element - validation - conversion to or from L3 * Bug fixes: - [Tracker issue #2895082] Building matlab bindings failed due to a wrong build argument. This has been fixed. Thanks to Javier for reporting this problem. - No errors were reported when reading an SBML file/string which contains one or more default namespaces which are not schema conformant. This has been fixed. Thanks to Camille Laibe for reporting this problem. - [Tracker issue #2878770] The code that checked uniqueness of metaids was not checking all of them. This has been fixed. Thanks to Frank Bergmann for spotting this problem. - [Tracker issue #2859186] When the exponent argument to a power function is itself an expression it was messing up unit checking. This is now reported more clearly. - SpeciesReference::isSetStoichiometry() function wrongly returned false when a stoichiometry attribute is absent in an input SBML Level 2. This has been fixed. Thanks to Frank Bergmann for spotting this. - The configure script failed in a test program for expat when cross compiling detected. This has been fixed. Thanks to Lucian Smith for reporting this. - [Tracker issue #2865288] Removed C++ style comments in C code (in List.h and ListOf.h) which can cause compilation errors. - Macros in SBMLDocument.h containd unnecessary ';'. This has been fixed. Thanks to Lucian Smith for reporting this problem. - MIRIAM annotations could not be properly cleared after SBase::unsetCVTerms() function invoked. This has been fixed. Thanks to Allyson Lister for spotting this problem. - MIRIAM annotations could be wrongly updated when adding/removing MIRIAM annotations. This has been fixed. Thanks to Allyson Lister for spotting this problem. - Compartment::setSpatialDimensions(unsigned int) function didn't update a corresponding internal double value of spatialDimensions attribute. This has been fixed. Thanks to Frank Bergmann for reporting this. - [Tracker issue #2856390] FunctionDefinition elements and Event elements were not written when writing an SBML Level 2 file/string. This has been fixed. Thanks to Lucian for reporting this problem. ====================================================================== Version 4.1.0-b1 (released 2009-09-04) ====================================================================== This is a beta version that includes support for reading SBML L3 core as currently defined in the L3 specification Public Review Draft published 2009-08-22. Features that are supported: - reading an L3V1 SBML file - getFoo() functions for all new attributes - isSetFoo() functions for all newly required attributes Features that are not yet implemented: - the "required" attribute for packages on the sbml element - the "sbml:units" attribute on the cn element - the setFoo() functions - validation - conversion to or from L3 Note that since the type of both the spatialDimensions attribute on a <Compartment> and the exponent attribute on a <Unit> have changed to double there are functions double getSpatialDimensionsAsDouble() double getExponentAsDouble() in addition to the existing unsigned int getSpatialDimensions() int getExponent(). The former functions will return L2 values as doubles whilst the latter will only return the value of the L3 attribute if it can be cast appropriately. The implementation works for all language bindings except MATLAB and Octave. ====================================================================== Version 4.0.0 (released 2009-08-26) ====================================================================== * Dependency changes: - The language bindings now require SWIG 1.3.39 or later. This is necessary to support Python 3.x. * New features: - [Tracker issue #2835929] There is a new variant of setSBOTerm that takes a string as argument. - Classes now have removeXYZ functions for removing elements. These take arguments of either an integer specifying the place in the listOf or an id. - Python bindings now support Python 3.x. - libSBML RPM packages can be created using a spec file which is generated by configure script. Please see libsbml.spec.in. - libSBML package (.dmg file) for MacOSX can be created by running "make create-dmg". Please see macosx/Makefile.in. Thanks to Akira Funahashi for contributing skeleton files for creating the package. * Bug fixes: - [Tracker issue #2840685] Some include files incorrectly declared 'use namespace std'. This has been fixed. Thanks to Lucian Smith for reporting it. - [Tracker issue #2837191] Code for checking the return type from equality functions was crashing if the function had an incorrect number of arguments. Thanks to Lucian Smith for testing this. - [Tracker issue #2818945] The documentation of the getDerivedUnitDefinition functions was not clarifying when the function might return NULL. The documentation has been updated. Thanks to Ralph Gauges for reporting this. - [Tracker issue #2818943] The FormulaUnitsData class was not completely copying all data and had no assignment operator defined. This has been fixed. Thanks to Ralph Gauges for reporting this. - Unit consistency checks were producing reporting incorrect mismatches between units where the multiplier calculated for comparison purposes contained rounding errors. This has been corrected. Thanks to Sven Sahle for reporting this. - '&' in a character reference (e.g. ¨) or predefined entity (e.g. &) could be wrongly replaced with & (e.g. ¨ -> &#0168;) when writing an SBML file or string. This has been fixed. Thanks to Andreas Drager for reporting this problem. - The SBML_formulaToString function could crash if called with a NULL argument. This has been fixed. - A number of memory leaks have been fixed. * Changes: - [Tracker issue #2801571] The function for converting strings to XMLNodes has been streamlined to be less confusing. - The directory structure for Windows specific builds has been rearranged. Please see win/README.txt. - Code that checks the syntax of XHTML now checks that an html node contains a head node with a title. - The constructors that take an SBMLNamespace as an argument will now throw an exception if the argument is NULL. - C functions that create a new SBase_t based object have been changed to be consistent with corresponding C++ constructors. There are two types of create functions like C++ constructors. XXXX_create() functions take the SBML level and version. XXXX_createWithNS() functions take an SBMLNamespaces_t structure. - The readMathMLFromString function now returns NULL if the given MathML string is NULL or invalid. - A number of deprecated functions have been removed. ====================================================================== Version 4.0.0-b2 (released 2009-07-04) ====================================================================== This is a second beta release of libSBML-4.0.0. Changes from the first beta release: * New features: - [Tracker issue #2766428] In reponse to feedback a helper function has been implemented to allow manipulation of the 'id' and 'name' attributes from an SBase object. - There is a new function setConsistencyChecksForConversion that allows users to specify which validators are applied when a 'strict' conversion is requested. The setLevelAndVersion function now defaults to a strict conversion and applies all validators to both the source and target model to determine validity. Users can choose to set the strict flag to false or customize the validation that is applied. - There is a new SyntaxChecker class which provides static functions enabling users to check that attributes such as 'id', 'name' and 'metaid' and 'notes' elements have the correct syntax. - Conversion of a model where annotations with duplicate top level elements was permissible to a level/version where this is invalid are now performed without producing invalid SBML. Duplicate top level elements are placed into a single top level element named duplicateTopLevelElements in the namespace http://www.sbml.org/libsbml/annotation. - The C++ library can now be built with the namespace 'libsbml'. This feature can be enabled during configuration. Details of macros used can be found in the new file common/libsbml-namespace.h. - There is a new ListWrapper type in the SWIG bindings that allows functions related to List objects to be wrapped. Each language now has types ListModelCreators, ListCVTerms, ListDates and ListASTNodes to allow Lists containing different types to be used. * Bug fixes: - [Tracker issue #2812794] Validation was not correctly identifying that references to reaction 'id' was invalid in L2V1. This has been fixed. Thanks to Ralph Gauges for reporting it. - Validation was incorrectly identifying some configuration of notes as invalid. This has been fixed. Changes also applied to Version 3.4.0 (released 2009-06-12) * New features: - There is a new class SBMLNamespaces. The SBMLNamespaces object class tracks 3-tuples (triples) consisting of SBML Level, Version, and the corresponding SBML XML namespace. - There are new constructors for SBML objects that take an SBMLNamespaces object as an argument, thereby allowing the constructor to produce the proper combination of attributes and other internal data structures for the given SBML Level and Version. - It is possible to use create functions to construct new SBML objects within a model. However, createTrigger, createDelay and createStoichiometryMath functions were missing. These have now been added. Thanks to Chris Myers and Lucian Smith, who both spotted the ommission. - [Tracker issue #2787514] Additional const versions of the getDerivedUnitDefinition() and containsUndeclaredUnits() functions have been added. * Bug fixes: - The code that tests for assignment cycles could cause an infinite loop in certain cases. This was in fact a result of an earlier fix that had intended to stop incorrect cycles being reported. The code that been rewritten to solve both the issues. Thanks to the many people who reported this one. - The assignment operator functions now check for self assignment. - The MATLAB binding was incorrectly importing SBO terms in certain circumstances. This has been fixed. Thanks to Kieran Smallbone for reporting it. - [Tracker issue #2787352] Annotations that included MIRIAM compliant RDF annotations and additional RDF annotations were not being correctly roundtripped. This has been fixed. - [Tracker issue #2778709] Validation of units was incorrectly reporting mismatches between units. This has been fixed and further tests added. Thanks to Lukas Endler for reporting this. - [Tracker issue #2749067] Models using FunctionDefinitions where the math element did not contain a lambda expressions was causing validation code to crash. This has been fixed. Thanks to Lucian Smith for reporting this. - [Tracker issue #2748785] The code that looks for assignment cycles was leaking memory; which is now fixed. Thanks to Lucian Smith for reporting this. - [Tracker issue #2714870] The function getSBOTermID was crashing when called for an object on which the SBO term had not been set. The function now returns an empty string in this situation. Thanks to Alice Villeger for reporting this. - A number of documentation bugs in the Java documentation have been fixed. Thanks to Nicolas Rodriguez and Alice Villeger for reporting them during the 2009 SBML Hackathon. Also, all the javadoc errors are now fixed, and most cross-references in the Java API documentation are fixed as well. - We have considerably expanded the documentation of SBase methods. * Changes: - Python bindings are now installed into an approprite directory with Python 2.6 on Ubuntu 9.04. ====================================================================== Version 4.0.0-b1 (released 2009-03-16) ====================================================================== This is a beta release of libSBML-4.0.0. LibSBML-4 focuses on reducing opportunities for users to create invalid SBML. This has been done by changing the API and underlying operations. The 'Major changes and new features' table at http://sbml.org/SBML_Projects/Development/libSBML/LibSBML_Development_Roadmap provides detailed information about the changes, together with explanations of the rationale behind each change. ====================================================================== Version 3.3.2 (released 2009-03-03) ====================================================================== * New features: - [Tracker issue #1820528] The ASTNode class has as a user data field. This is a new member variable of type void * which allows a user to add/retrieve their own data. Thanks to Sebastian Bauer for contributing this code. * Bug fixes: - Conversion of an L2V4 model to an earlier version of SBML was causing the code to crash if an invalid unit had been used within the model. This has been fixed. Thanks to Norihiro Kikuchi for reporting this - An object being read from a file/string was not correctly recording the SBMLDocument and ParentSBMLObject information. This is fixed. Thanks to Andreas Drager for reporting this. - In a couple of cases the return type for the clone function in the C API was still an SBase_t *, rather than a pointer to the structure being cloned. These have been changed. - The code that converted a string to an XMLNode uses a dummy node as part of the process. This empty dummy node was left in the resulting XMLNode which, whilst not invalid, meant manipulating the XMLNode was not intuitive. The code has been changed to remove the dummy node from the resulting XMLNode. - A potential memory leaks present within the appendNotes function have been identified and fixed. - The documentation for Java lacked content for the 'libsbml' class (which mostly consists of functions outside of C++ classes). Fixed. - [Tracker issue #2641323] In certain cases validation was failing to report that a species used in a kineticLaw had not been listed as a reactant/product/ modifier of the reaction. Thanks to Lukas Endler and Ralph Gauges who independently reported this (on the same day!). - [Tracker issue #2599679] Python bindings didn't work with the latest SWIG 1.3.38 due to incompatible changes in SWIG-generated Python proxy code (libsbml.py). The problem has been fixed. ====================================================================== Version 3.3.1 (released 2009-02-03) ====================================================================== * Changes - Validation relating to attributes that have been removed from later SBML Levels/Versions (e.g. 'offset' on <unit>) has changed slightly. Reading in a model that contains such an invalid attribute reports a schema error. This has not changed but checking the consistency of a document that has been created using an invalid attribute will now report an error stating that the attribute has been removed. This affects, e.g., validation rule 20411 in the SBML L2V2 specification. - The code used to a convert an SBML L2V4 model would fail to perform the conversion if the units in the L2V4 model would produce a target model that had invalid units. Ralph Gauges pointed out that this behaviour was inconsistent with existing behaviour, which allows conversion of invalid models. The code has been changed to merely log the invalid units as a warning, but still perform the conversion if it is otherwise possible. - The RDFAnnotationParser class was not marked as external within the Windows prebuilt dlls. This has been changed and the relevant functions have been implemented within the C API. - The helper function 'printUnits' on the UnitDefinition class was only printing out the knid and exponent of any unit. Sven Sahle requested that this be extended to include scale and multiplier. The unit <unit kind="mole" exponent="-1" multiplier="2" scale="1"/> will now be output as "mole (exponent = -1, multiplier 2, scale = 1)". In addition, the function now has an optional argument, defaulting to false, that if set to true will write the units out in a more compact form e.g. "(20 mole)^-1" * Bug fixes: - The makefile for the java examples directory incorrectly tested only for Java 1.5.0, not for versions greater than or equal to 1.5.0 as it should have. Fixed. Thanks to Nicolas Rodriguez for reporting this. - A problem in error logging whilst reading a file meant that files with certain errors caused libSBML to crash. This has been fixed. - 'configure' requested doxygen version 1.5.4, but actually some of the latest documentation code requires 1.5.8. - The parseCVTerms function was crashing if the qualifier used within one of the CVTerms was unknown. This has been fixed. Thanks to Allyson Lister for the effort involved in tracking this down. ====================================================================== Version 3.3.0 (released 2009-01-20) ====================================================================== * Dependency changes: - Configuring and compiling libSBML with Java binding from sources now requires Java version 1.5.0 or later. This was needed for supporing virtual functions with covariant return types. * New features: - SBML Level 2 Version 4 support is now implemented. - There is a new validator for checking the consistency of the internal representation of a model. The need for this grew out of the following situation. LibSBML classes representing SBML components internally maintain all variables associated with attributes from every Level/Version of SBML. This in fact makes it possible to have an internal representation that is invalid SBML. For example, one can create a Level 1 compartment in memory with a 'spatialDimensions' attribute value of 2. This is invalid for SBML Level 1, but previously, libSBML was only equipped to catch this at the time the application attempted to write out the internal representation. Until then, the (invalid) internal representation could exist and confuse software applications. The new validator can be called using the SBMLDocument class method checkInternalConsistency(). As with all validators, errors are logged in the SBMLErrorLog attached to the SBMLDocument. - New methods getNumResources() and getResourceURI() are available for the class CVTerm. These are convenience methods that allow the user to determine how many resources are stored for the particular term and to index into the values directly. - Previously the error reported when the 'level' and 'version' attributes on an SBMLDocument did not refer to a valid SBML specification did not make the cause of the error clear. This error should now be reported more clearly. Thanks to Lucian Smith for noticing this. - LibSBML was not reporting the use of invalid attributes on the ListOfXXX classes as errors. This has now been fixed. - The MATLAB language binding now correctly identifies the use of the MathML <csymbol> 'delay' and provides the information to the user in a similar fashion to <csymbol> 'time'. - There is a new section in the user documentation for C++, "Tutorial: Creating a complete model, from start to finish". This describes the basics of constructing a model from scratch using the libSBML API. - [Tracker issue #2376930] Validation rules 10401 and 10402 had not previously been implemented. Thanks to Nicolas Rodriguez for reminding us. - [Tracker issue #2183855] Added methods to return the severity and category of the SBMLError class as strings. Since the ErrorId is drawn from an enumeration, returning the actual ErrorId or corresponding symbol did not see useful. Instead, a getShortMessage function has been implemented that returns a very brief description of the error. - [Tracker issue #2136796] There is now additional code to check the ordering of assignment rules in a L1 or L2V1 model. - [Tracker issue #2114473] UnitDefinition has a new method, isVariantOfSubstancePerTime(), which returns true if the unitDefinition is a variant of the SBML predefined unit of 'substance' per the predefined unit of 'time'. In other words, it returns true if, when multiplied by a unit of 'second', the resulting UnitDefinition is a variant of 'substance', meaning moles or items (and grams or kilograms from SBML Level 2 Version 2 onwards) with only abritrary variations in scale or multiplier values. The method returns false if the UnitDefinition is not a variant of 'substance' per 'time'. - [Tracker issue #2086644] Validation was crashing when checking the math/units of an expression using a functionDefinition that had not been properly defined. The code that caused the crash has been fixed and the MathML reader now checks that a <math> element or the body of a <lambda> element use appropriate tags as detailed in the schema for the subset of MathML supported. - [Tracker issue #2086608] Added new methods to the ASTNode class. They are: removeChild(n) which removes the nth child; replaceChild(n, node) which replaces the nth child with the given node; and insertChild(n, node) which inserts the given node into the list of children such that it becomes the nth child. These methods all return an integer indicating success (0) or failure (-1). Failure is only reported if n exceeds the size of the node; invalid ASTNodes resulting from the operation are not reported. - [Tracker issue #2015847] Each ListOfXXX class now has derived "get" methods that return an object of the expected class. E.g.: ListOfEvents->get() returns an Event *. - [Tracker issue #2015847] The clone method on each SBML component class now returns a pointer to the appropriate class instead of the SBase * previously returned. - [Tracker issue #1862805] The ListOf class has a new method "void ListOf::clear(bool doDelete = true)". When doDelete is true, all the items in the ListOf are cleared and deleted; doDelete is false, the items are cleared from the ListOf but not deleted and the user is responsible for deleting the items. * Bug fixes: - LibSBML could be built without an underlying XML parser if --with-libxml=no is given whereas neither --with-expat nor --with-xerces given when running the configure script, which generated broken shared libraries. Thanks to Giuseppe Aprea for reporting this problem. - LibSBML was failing to check that the value of the 'spatialDimensions' attribute on a <compartment> was correct. This is in fact a schema error. Thanks to Norihiro Kikuchi for spotting this. - The code that checks for AssignmentCycles was failing to check for an assignment that referred to the subject of that assignment, e.g., an assignment rule with variable "c" and math "2 * c", was not returning an error. This is now fixed. - The code that checks for AssignmentCycles was failing to check for an assignment to a compartment that referred to the a species concentration within that compartment. This is an implicit reference to the compartment itself, since the concentration of the species depends on the compartment value. This is now fixed. - The SBMLWriter::writeSBML() function could create a zip file in which an SBML file was stored with its path name. Thanks to Florian Kamm for reporting this bug. - A missing 'level' or 'version' attribute on <sbml> was not being correctly reported. - Fixed a memory leak in the assignment operator of the ListOf class. Thanks to Sven Sahle for reporting this problem. - [Tracker issue #2498694] Fixed a typo in documentation. Thanks to Sven Sahle for reporting this. - [Tracker issue #2442566] LibSBML incorrectly restricted the number of 'modified' date elements that could be added to a ModelHistory element. This has now been changed. - [Tracker issue #2418883] The SBML_formulaToString function was crashing if the ASTNode passed to it was NULL. The code now catches this and returns an empty string. Thanks to Lucian Smith for reporting this. - [Tracker issue #2219230] LibSBML-2.3.4 enabled a user to write an xml comment containing information on the program being used to write the file. This used functions setProgramName and setProgramVersion on the SBMLWriter class. Whilst the documentation for libSBML-3.2 described this functionality; it was not in fact implemented. This has been remedied. - [Tracker issue #2209773] libSBML couldn't be built with the Xerces 3.0.0 due to incompatible API changes in Xerces 3. Fixed. - [Tracker issue #2209729] Fixed a problem where libSBML built with Xerces on Linux could crash due to Xerces dereferencing a null pointer when parsing some invalid SBML files. Thanks to Jordan Atlas for reporting this. - [Tracker issue #2189194] Fixed a crash when using bzip2-based compression. Thanks to Florian Kamm for reporting this bug and providing a patch. - [Tracker issue #2188734] The sequence "&" (a predefined entity reference of ampersand) in an attribute value was wrongly converted to "&#38;" when libSBML used libxml2 as the underlying XML parser. This is now fixed. Thanks to Chen Li for reporting this bug. - [Tracker issue #2187684] The unit checking code was not correctly interpreting the units of a reaction id used as a ci element in a math expression. This is fixed and tested. - [Tracker issue #2157800] When <csymbol> 'time' was used in a functionDefinition, it was not being correctly considered as a numerical value. Fixed. - [Tracker issue #2146714] syncAnnotation() functions in SBase, Model, and SpeciesReference class could internally delete an old annotation object (XMLNode*) in an SBase object. This could lead to an invalid pointer to an already deleted annotation object when syncAnnotation() functions were internally invoked from getAnnotation() function. This is now fixed. Thanks to Ralph Gauges for reporting the problem. - [Tracker issue #2138670] Conversion of an L1 model to L2 previously always produced parameters and compartments with their 'constant' attributes set to 'true'. Now the libSBML conversion code checks whether parameters and compartments are the subject of rules, and if so, sets their 'constant' attribute to 'false'. Thanks to Ralph Gauges for reporting the problem. - [Tracker issue #2136530] When adding a child to an XMLNode marked as an 'end' node, the XMLNode remained marked as an 'end' node. This caused incorrect XML to be written out. This is now fixed. Thanks to Ralph Gauges for reporting the bug. - [Tracker issue #2130568] The check for AssignmentCycles incorrectly reported non-existant loops in some situations. This is now fixed. Thanks to Kieran Smallbone for reporting it. - [Tracker issue #2129044] The writeRootFunction in the MathML writer was failing to output a root function correctly when it had only one child; i.e., the default degree value of 2 was being used. This is now fixed. Thanks to Ralph Gauges for spotting this. - [Tracker issue #2114500] The Octave language binding failed to build under Cygwin. This is now fixed. - [Tracker issue #2086644] The validation code would crash when checking the math/units of an expression using a functionDefinition that had not been properly defined. The code that caused the crash has been fixed. - [Tracker issue #2082584] Fixed a memory leak reported by Jonathan Cooper. * Other changes: - The Lisp binding code has been disabled from the configuration and build systems because it no longer functions (and has not been for quite some time). The code is still in the distribution because we hope someone, someday will help get it working again. - The configuration system now will automatically disable support for reading/writing compressed SBML if the 'configure' script cannot find the necessary libraries (zlib and bzip2). There is also a configuration flag, --enable-compression, that can be used to enable/disable both compression libraries in one go. - The allowable values for an integer have been restricted to the range of the standard 32-bit signed integer values (2147483647 to -2147483648), as per the SBML specification. - The Java API documentation has been substantially improved. Many methods previous exposed should not have been, and many methods lacked documentation due to glitches in the software used to generate the Java documentation from the C++ source files. This release corrects almost all of these errors. The Java docs are now much closer to the intended API, although a few glitches remain. A number of classes still remain poorly documented in both the Java and C++ API documentation. - There is now a mailing list (libsbml-team@caltech.edu) for the core libSBML developers separate from the SBML Team mailing list. People are still encouraged to post questions to the sbml-interoperability and libsbml-development mailing lists, but this new list allows us to advertise a direct contact address in the libSBML documentation. - [Tracker issue #2182856] A CVTerm uses the 'metaid' attribute of the object it describes as a reference. Since adding a CVTerm to an object that has no 'metaid' creates an empty <rdf:about> element, the addCVTerm function will no longer add a CVTerm to an object that has no 'metaid' attribute set. - [Tracker issue #2175098] Unit validation was producing a 'dimensionless' unit with an 'exponent' of -1 and then failing to consider it equivalent to a 'dimensionless' unit with an 'exponent' of 1. The underlying code no longer assigns an exponent of -1 to a 'dimensionless' unit and the comparison code no longer considers the 'exponent' attribute when comparing 'dimensionless' units. Thanks to Lukas Endler for reporting this. - [Tracker issue #2118126] The getDerivedUnitDefinition() method always returned NULL for a local parameter. Andreas Draeger requested that it return a unitDefinition derived from the units attribute. This has now been implemented. - [Tracker issue #2082682] The unit checking code was not dealing correctly with expressions containing MathML <root> except in cases where exact integers were involved. The code now reports situations where it is unable to check the unit consistency due to non-integral exponents. Thanks to Jonathan Cooper for reporting the problem. ====================================================================== Version 3.2.0 (released 2008-08-20) ====================================================================== * New features: - Tracker issue #1912123. There is a new API that allows the user to directly manipulate XML objects. The function style mimics the existing libSBML format; i.e., getters/setters allow attributes to be read or written, and hasXXX functions allow a user to determine whether an attribute has a value. The XMLNode class has functions that allow child elements to be added/removed and returned. See the documentation for full details. - C# (C sharp) bindings are now available. Thanks to Frank Bergmann for the work in creating and testing these. - LibSBML can now read/write compressed SBML files. It supports the following compression formats: gzip, zip, and bzip2. If a given SBML filename ends with one of extensions for the above compressed file (.gz, .zip, or .bz2), readSBML()/writeSBML() will automatically read/write the file as the corresponding compressed file. If the filename has no such extension, it will be read uncompressed as before. For example, a gzip'ed file named "test.xml.gz" will be read, and then a zip'ed file name "test.xml.zip" will be created by the following sample libSBML code: SBMLDocument* d = readSBML("test.xml.gz"); writeSBML(d, "test.xml.zip"); The compression feature requires zlib (for gzip/zip) and bzip2 (for bzip2). These features are enabled by default, and can be disabled at libSBML configuration time using the using the options --with-zlib=no and --with-bzip2=no. - The constants defining the libSBML version number are now accessible from the various language bindings. In addition, functions to directly access these values have been included. - Tracker issue #2030837. There is a new function getMessageString() on the Constraint class that returns the <message> element as a string rather than an XMLNode. - (Thanks to Chen Li for bringing up the following.) The return value of getSBOTerm() is potentially unintuitive: rather than being a string in the form "SBO:XXXXXXX" (i.e., a full SBO identifier), the returned value is an integer. This was done for the convenience of calling applications, because the integer form is more efficient to manipulate. To support applications and users who prefer the text-string form, libSBML now has a function getSBOTermID() that returns a "proper" SBO identifier. - The SBase class has a new member "SBase * mParentSBMLObject" which points to the direct SBML parent of the object. For example: StoichiometryMath->SpeciesReference->ListOf->Reaction->ListOf ->Model->SBMLDocument There are two new functions 'getParentSBMLObject()'; which returns the direct parent of the object; and 'getAncestorOfType(SBMLTypeCode_t)'; which returns the ancestor of the given typecode or NULL if none exists. - The ASTNode class has a new member "SBase * mParentSBMLObject" which points to the direct SBML parent of the ASTNode object and a corresponding getParentSBMLObject() function that returns it. - Tracker issue #1966696. It was requested by Michael Lawrence that the logical functions "and", "or", and "xor" reduce their correpsonding ASTNodes to a binary tree in the same way that the "plus" and "times" functions do. However, doing this would change the way the node was output as a string; i.e., 'and(x, y, z)' would be output as 'and(and(x, y), z)'. To avoid potential problems such a behavioral change could cause existing libSBML users, there is now has a separate new function, ReduceToBinary(), in the ASTNode class, whose action is to reduce an expression to a binary tree representation on demand. - In order to check unit consistency of a model, ListFormulaUnitsData must be populated with data from the entire model being checked. The functions populateListFormulaUnitsData and isPopulatedListFormulaUnitsData have been exposed within the API. These functions allow a user to run unit consistency checks multiple times whilst adding/editing objects within the model on which unit checking is required. - Tracker issue #1883067. The functions setStoichiometry() and setStoichiometryMath() have been changed so that each unsets the other. This reflects the fact that the SBML species reference attributes 'stoichiometry' and 'stoichiometryMath' are mutually exclusive. - Tracker issue #1928168. LibSBML was not checking the values imported as numbers from within MathML statements in a model. Thus, if the string being converted was either not converted or incorrectly imported, the error was not detected. There are now checks on all these imports. * Bug fixes: - Tracker issue #2041898. A bug in the FormulaTokenizer code led to incorrect handling of some pow() expressions. This has been fixed. - Tracker issue #1733299. The long-standing bug involving Windows, Xerces and multibyte characters has been resolved. Akiya's great detective work uncovered that the Xerces transcode function converts characters to the default encoding for the current platform, and this is not always UTF-8. The code for use with Xerces now encodes specifically to UTF-8 regardless of platform. - Lukas Endler reported that when a division operation cancelled the units of an expression, the resulting units were reported as "indeterminate". This has been fixed, and where units are cancelled by division the resulting unit is now considered dimensionless. - Unit checking of a piecewise function failed to examine all children for literal numbers/parameters with undeclared units. This is now fixed. Thanks to Lukas Endler for discovering and reporting the problem. - The code for checking that an SBML identifier had correct the syntax failed to catch the case where the id had been entered as an empty string. This is now fixed, and id="" will be reported as an error. - Annotations for CVTerms in a Model object were wrongly deleted when a ModelHistory object in the Model object was not explicitly initialized. Due to this bug, the corresponding annotation XML node or string were removed in the functions that return or print the annotation XML node or sring (e.g. getAnnotation(), getAnnotationString(), writeSBML() and writeSBMLToString() ) - Tracker issue #2013528. SBMLDocument::setLevelAndVersion() did not properly check the results of compatibility checking, sometimes leading to conversions being wrongly performed even if the level/version checking step reported an error. Thanks to Robert Platt for reporting this. - In some circumstances, parts of reaction elements could be wrongly ignored when reading an SBML L2V1 file with an empty math element. For example, when reading an SBML L2V1 file containing three reactions ("r1", "r2", and "r3") and a kineticlaw in the reaction "r1" contained an empty math element (i.e., <math ...></math>), the reactions "r2" and "r3" (and indeed, all reactions after the reaction "r1") were ignored and only "r1" was stored in the listOfReactions object. This is now fixed. - Eric Fernandez reported that the latest gcc version (gcc-4.3.1) caused compilation errors in the current libSBML. These have been caught and corrected. - Tracker issue #1967472 Different events can assign values to the same variable. This was not being correctly handled by the unit validation code -- again thanks to Chris Myers for spotting this! This has been corrected and additional test cases have been added. - Tracker issue #1965490. When the math of an ASTNode is set using a string formula, then both the isSetFormula and isSetMath functions return true. However, when the string is not an accurate representation of a formula, the ASTNode created from the string was NULL. Thus, using the isSetMath function to determine whether a math element can be accessed was causing problems. The isSetMath function now checks that an ASTNode can be created from a formula and returns false if it cannot. NOTE: This situation only arises for the math elements of Rules and KineticLaws, because these are the only SBML components in Level 1 that have formulas. - Tracker issue #1961979. - Tracker issue #1958998. There was a memory leak in the code to check for an overdetermined model. Chris Myers used it enough to actually hit the problem. There was also a small bug in the code that got fixed at the same time. - Tracker issue #1965485. There was bug in the checking of units from a functionDefinition. Thanks to Chris Myers for reporting this. - Tracker issue #1943865. The member variables of an ASTNode; definitionURL and semanticsAnnotation; were missing from the deepCopy function. These have now been added. - Tracker issue #1942898. The MATLAB binding failed to correctly import a root function. Thanks to Arne B. Gjuvsland for reporting the problem and supplying the fix. - Tracker issue #1966122. A segmentation fault was occuring when using libSBML + Xerces to read a file with a malformed schemaLocation attribute placed on the <sbml> element. This problem was first reported by Gwenael Kervizic to Nicolas Le Novere. Xerces was returning an error code that libSBML did not recognize, and the failure to catch the code properly eventually lead to a seg fault with some operation systems. This has now been fixed. - Tracker issue #1966122. A segmentation fault was occuring when using libSBML + Xerces to read a file with a malformed schemaLocation attribute placed on the <sbml> element. This problem turned out to be caused by more than one issue (see bug fixes below). One issue was that libsbml's Xerces parser code called getLine()/getColumn() in a situation where it doesn't report a valid number. On some systems, the end result was a seg fault, whereas on others the numbers returned are merely crazy. This problem has been addressed and it is now possible to catch the case where the line and column numbers returned by libSBML are inaccurate. NOTE: This only applies to libSBML with the Xerces XML Parser. - Tracker issue #1966122. Xerces would return an unexpected error code when an SBML document contained a 'schemaLocation' attribute on <sbml>, and in addition, libSBML would also attempt to get the line number from Xerces and this attempt resulted in a segmentation fault on some architectures. This problem was first discovered inadvertently by Gwenael Kervizic while using the Online SBML Validator. The fix involved changing not only the error trapping for Xerces but also the line/column number reporting behavior of XMLError and the introduction of two new constants, LIBSBML_UNKNOWN_LINE and LIBSBML_UNKNOWN_COLUMN. - The code for checking units created a clone of the model to perform certain checks. This was extremely memory intensive with larger models. The relevant code has been changed so that it no longer does this. Run-times for validating units in large models have been significantly reduced as a result. - The code for generating documentation using Doxygen failed to include the code directory for the candidate layout extension; as a result, the docs would never include the layout extension code. Now fixed. If libSBML is configured with --enable-layout and a "make docs" is run, the layout code is included in the docs. - Tracker issue #1942338. The member variables of an ASTNode were stored as a union of data. This caused problems with the get* functions. These unions have been removed and the data is now stored separately. - A number of memory leaks have been fixed. * Changes - The text of the error message for error code 1006 has been changed to "XML content is not well-formed." for greater clarity. - In some circumstances, the line & column numbers reported by the underlying XML parser are meaningless. This typically happened when a severe error occurred while reading the SBML document. However, it is not always obvious whether XMLError's getLine() and getColumn() methods can be called to obtain usable line/column numbers following a severe error. To provide an indication that the line/column numbers reported by XMLError are actually meaningless numbers, the behavior of XMLError's getLine() and getColumn() methods have been changed. They will now return the values LIBSBML_UNKNOWN_LINE and LIBSBML_UNKNOWN_COLUMN in those circumstances. Although the values returned are potentially valid line/column numbers for a file, the real-life probability that this would happen (and lead to confusion) is believed to be too small to worry about. (The numbers are equal to the C/C++ constant ULONG_MAX.) - We changed the revision control system for all SBML project files, including libSBML, from using CVS to SVN. CVS access is no longer available. Please see the following page for information about SVN access on SourceForge: https://sourceforge.net/svn/?group_id=71971 We also have an information page about the SBML SVN repository at http://sbml.org/SBML_Projects/SVN_Repository_Access ====================================================================== Version 3.1.1 (released 2008-02-25) ====================================================================== * New features: - The utility functions for unitDefinitions and units in files Utils_UnitDefinition.cpp/.h and Utils_Units.cpp/.h have now been incorporated as static functions within the UnitDefinition and Unit classes respectively. * Bug fixes: - There were cases where warnings/errors that were not applicable to the particular level and version of SBML were being reported. This has now been corrected. - The ModelingPractice validator now only reports warnings related to units if the UnitConsistency validator is enabled. - Tracker issue #1892238. Fixed a bug that meant the name of a nested functionDefinition was being lost during the unit checking process. - Tracker issue #1883605. It seems that when a new object was created within a model where this new object was the first of its type, e.g., the first element of a ListOfRules, the parent document for the object was not set. This has now been corrected. - Tracker issue #1881852. Fixed a bug that caused a crash when checking the consistency of variables used in a StoichiometryMath element. Added validation files that would have caught this. Thanks to Chris Meyers for reporting this. - Tracker issue #1880570. The previous fix for a piecewise without an otherwise statement did not propagate for the use of piecewise within a lambda function. This is now fixed and multiple tests included to catch this and similar potential failures. - Tracker issue #1880892. A number entered as an exponent was being written out as an integer without exponent where the integral value was small enough. For example 1e3 was written as 1000. This has been changed so that a value entered as an exponent will be written out as an exponent. - The FormulaUnitsData class was previously exposed accidentally in the documentation. It's now (more) private. - The text of a few XML error messages have been changed slightly in an effort to aid readability. No numbers were harmed in the process. - We made additional fixes to the C++, Python and Java API documentation. Among them: including documenting of more constants that are defined as enumerations (and weren't easy to find previously in the language binding docs), not exposing internal methods, plus fixes to the formatting of some method signatures in the Python docs, and more. - The Java API docs now have a section about ASTNode similar to the same section available in the other API manuals. - ASTNode.swapChildren() was not accessible, but should have been. - This NEWS.txt file is now accessible from the API documents. ====================================================================== Version 3.1.0 (released 2008-01-25) ====================================================================== * Dependency changes: - Configuring and compiling LibSBML from sources now requires SWIG version 1.3.33. This was needed for supporing the Ruby bindings. - Generating documentation from LibSBML sources now requires a Doxygen version of at least 1.5.4. This was needed to generate correct documentation for Python and make other improvements. * New features: - LibSBML now provides a binding for the language Ruby (http://www.ruby-lang.org). This was initially contributed by Alex Gutteridge and further developed and integrated (with test code) by Akiya Jouraku. - LibSBML now provides methods on most SBML components to return a UnitDefinition object representing its interpretation of the units for that component's quantity. Two new methods are involved: getDerivedUnitDefinition() and containsUndeclaredUnits(). - The function Layout_setDimensions has been added to the C API. * Bug fixes: - Fixed a bug that meant that a model was not correctly read if a piecewise function had been used with no 'otherwise' element. Thanks to Chris Meyers for reporting this. - Fixed a bug that caused a crash if a FunctionDefinition was applied to an incorrect number of arguments. - The readMathMLFromString function was failing if the string did not begin with an XML declaration. The code now adds a declaration if necessary to prevent this from happening. - The MATLAB binding was failing to store the message field on a Constraint. It does now. - Corrected the fact that a UnitDefinition redefining a builtin unit can have more than one unit provided the UnitDefinition *simplifies* to only one unit. This would allow the use of dimensionless as a unit within the redefinition. Prior to this point libSBML would have rejected a redefinition with more than one unit without considering the possibility that dimensionless was being used. - Fixed a couple of bugs where attributes were not being written out. - Unit validation within libSBML creates a list of a class FormulaUnitsData. This was implemented as a instance of the ListOf class. However, since the FormulaUnitsData class is not an SBML construct this was an inaccurate derivation. This has now been corrected and the list of FormulaUnitsData within the Model object is now an instance of the List class. - libSBML-3.0.0 correctly derived the StoichiometryMath, Trigger and Delay components from SBase, but the MATLAB language binding did not reflect this. It now does. - The MATLAB binding was failing to copy the metaid field. This is now corrected. - It is permissible in MathML to use a lambda function with no bvar elements. However, libSBML was not handling such a situation correctly. Thanks to Stefan Hoops for identifying this. - Caught bug whereby the ASTNode created to substitute values for the FunctionDefinition was failing to copy the name of any FunctionDefinitions used by the calling FunctionDefinition. This was causing the validation process to crash. - examples/java/printMath.java had a bug in which the wrong loop variable was being referenced, causing crashes in SBML files containing FunctionDefinition objects. Thanks to Hongseok Yun for contributing the report and a fix. - The auto-generated documentation for the Python API was previously lousy and sometimes outright wrong, for example in showing incorrect scoping syntax. This was due to defects in Doxygen versions prior to 1.5.x, and now fixed by requiring Doxygen version 1.5.4. - Added more missing sections in the Java and Python API documentation. - Added explicit lists of the various constants defined and used in libSBML, such as ASTNodeType_t, XMLErrorCode_t, etc.. The API documents generated by Doxygen for Python and Javadoc for Java in particular didn't provide easy access to this information. The new docs list the constants with the relevant object definitions. ====================================================================== Version 3.0.3 (released 2007-12-17) ====================================================================== * Changes: - Fixed a bug that meant Annotations and Notes were not being written out when they occurred on a Rule. Thanks to David Adler and Damon Hachmeister for pointing this out. - The enumerations for the XMLError severity and category codes have changed again, because unfortunately our last attempt clashed with a Microsoft Windows system include file. The libSBML severity codes are now prefixed with LIBSBML_SEV_ and the category codes with LIBSBML_CAT_. Hopefully these are truly unique. - LibSBML will now build on Ubuntu Linux. - The incorrect dependencies in the Perl makefiles have been corrected. - Added a clearLog() function to XMLErrorLog. This empties the existing XMLErrorLog but does not destroy it. This facilitates the repeated use of checkConsistency() with different validators enabled. - Fixed a bug in the code to check for cycles in assignments between rules, initial assignments and reactions. This was both failing to report all cycles where they were present and in the case of very complex models it was reporting cycles where there were none. - Fixed a bug in the checkUnitSyntax() function reported by Florian Kamm. - The documentation and README file incorrectly said Xerces is the default parser library used. In fact, it is libxml2 now. ====================================================================== Version 3.0.2 (released 2007-11-28) ====================================================================== * Changes: - ASTNode has a new function ReplaceArgument(). It takes a string representing a name within the ASTNode object and an argument respresenting a name/value/formula ASTNode, and replaces occurrences of the name string with the argument ASTNode. - SBase now has an unsetCVTerms() function which clears the CVTerm() List associated with the object. - The addCVTerm() method on SBase now checks whether each resource string is already present in the list of resources for any Qualifier within the CVTerms of the object and does not add that particular resource if it would either create a duplicate within the resources already present with the same qualifer or create a situation where the same resource was present with different qualifiers. - LibSBML now includes support for the biological-qualifiers recently added to the MIRIAM standard http://www.ebi.ac.uk/compneur-srv/miriam-main/mdb?section=qualifiers - There are two additional functions on an SBase object: getResourceBiologicalQualifier() and getResourceModelQualifier() These functions take a string representing the resource to be found, and return the qualifier that has been used to include this resource within the CVTerms on the object concerned. If the resource is not present, an UNKNOWN qualifier is returned instead. - Occasionally models delare the SBML XML namespace twice; once by default and then again explicitly. If the model is converted between levels/versions of SBML both these occurrences need to be updated. This is now implemented. - libsbml-version.h is now included automatically, so that the libSBML version #define constants are accessible. (See notes in 3.0.1 below about the version constants.) - Fixed problem wherein the enumerations for error codes, severity codes and error categories were in fact not visible outside of C++. The problem stemmed from the fact the enum definitions were placed inside C++ classes. Unfortunately, this required changing the symbols. We renamed many of them to try to make them less likely to conflict with symbols in user code. - Fixed bug that incorrectly caused the hasOnlySubstanceUnits attribute on species to be set to true when a Level 1 model was converted to Level 2. This bug would have impacted the validation of unit consistency in Level 1 models, causing models to fail validation when in fact they were correct. - Fixed bug where some consistency checks for math/units were not checking all the children of the math element. - Fixed memory leak in ASTNode (reported and fixed by Rainer Machne). - Fixed bug in UnitFormulaFormatter.cpp where the order in which parameters/ species/compartments were searched for an identifier was incorrect. This was reported as a unit consistency problem by Damon Hachmeister. - Fixed a bug involving cloning of objects. The clone() method on an SBMLDocument was cloning the model contained by the document but failing to adjust the parent document pointer within the cloned model. Thanks to Rainer Machne for identifying that there was a problem. - (Linux/UNIX) Fixed Makefiles in MATLAB bindings directory so that "make check" actually does something (namely, run testBindings.m). - (Linux/UNIX) The pkgconfig/libsbml.pc file no longer gets installed with the execute bit set. - The Makefiles in examples/c++ and examples/c used an incorrect order of dependencies on libraries, causing cygwin builds to fail. - (Cygwin) A libsbml.la file is now constructed and installed under cygwin. The .la files appear to be used by the Cygwin compilation environment to determine library dependencies. - During installation, the Python bindings installation would ignore the value of the variable DESTDIR if it was given in the invocation of make install. Fixed. - Python build was not sufficiently isolated from the user's installation directories and could have picked up previously-installed older versions of libsbml on the system at build time and test time. Fixed. - "make uninstall" should now properly remove everything installed by a "make install". One remaining issue is that "make uninstall" can only know to remove those libSBML features currently configured in. If you do a "make install", then run configure with different options, and then try "make uninstall", it will attempt to uninstall the files implied by the most recent run of configure, not the files installed by the original "make install". ====================================================================== Version 3.0.1 (released 2007-10-19) ====================================================================== * Changes: - The default XML parser is now libxml2, not Xerces, following the results of a survey of user preferences conducted in September '07. * Bug fixes and enhancements: - Fixed a memory leak in XercesParser.cpp, reported (with the fix) by Sebastian Bauer. - There is a new file, common/lisbml-version.h, that provides constants called LIBSBML_VERSION, LIBSBML_VERSION_STRING, and LIBSBML_DOTTED_VERSION, so that applications can more easily find out the version of a particular installation of libSBML. - SBML_formulaToString was incorrectly limiting the length of the buffer used to write a number and thus truncating the exponent on numbers with 15 digits. This is now fixed. - It appears there is a difference in the way gcc and MSVC deal with the clean-up of strings following calls to the c_str() function. In the case of MSVC this can on occasion result in a returned char * being garbage. Since the unit tests for libSBML run using gcc this has only recently come to light and should now be fixed. - The MATLAB binding function has a second optional argument that indicates whether the model is to be validated prior to import. The default value is 0; indicating no validation. In the case of no argument to the function; which opens a browse window to locate the file to import; the user will be prompted to indicate whether validation should be done. In the case of validation errors these will be displayed to the user, who will be prompted as to whether to import the model regardless. - An additional 'ModelingPractice' validator has been added to the set of validators available for consistency checking. This validator reports 1) a compartment with no size assigned 2) a local parameter id that shadows an id in the global namespace - A document with a missing XML declaration now correctly reports the MissingXMLDecl error EXCEPT when using libxml2. The reason for this inconsistency is that libxml2 assigns a default (1.0) xml version if either the XML version or the entire XML declaration is missing. - The error ids for a small number of consistency checks has changed. These relate to validation rules that were never part of the written specification of SBML and thus do not have published numbers. These rules check that the timeUnits/substanceUnits and formula of a KineticLaw are valid in versions of SBML prior to Level 2 Version 2. The changes are as follows: 21127 changed to 99127 21128 changed to 99128 21129 changed to 99129 - The error id of the check on the general consistency of MathML has changed from 10219 to 99219. - Support for <annotation> and <annotation-xml> with a <semantics> element in MathML has been added. - The format of error, warning and other diagnostic messages has been improved and made more regular, and the message strings of validation rules been updated to match more closely those in the Level 2 Version 3 specification. The formatting of messages printed by SBMLDocument.printErrors() has changed as a result. - A document with a missing XML encoding attribute should cause XMLError::MissingXMLEncoding to be returned, not MissingXMLDecl, as was mistakenly the case previously. ====================================================================== Version 3.0.0 (released 2007-08-29) ====================================================================== * New features relative to 3.0.0 prerelease: - Notes and annotations can now once again be set and retrieved as strings, not only as objects. Thanks to Akiya Jouraku for the hard work behind this. - The MATLAB bindings now support setting notes and annotations as strings. - Error and consistency checking and reporting have been significantly overhauled: + A new method, SBMLDocument::setConsistencyChecks(...), allows an application to indicate which set of validation rules should be applied. By default, all SBML validation rules are applied; setConsistencyChecks() thus a caller to turn some off prior to calling checkConsistency(). + LibSBML now has an internal table relating errors and validation rules, the SBML Levels and Versions in which they are valid, and their severities for each Level and Version. The testing is now more accurate for different SBML Levels/Versions. As an additional benefit, rather than all being errors, some issues are now reported as warnings. + Errors now have "severity" levels. This can be used by an application to gauge the implications of a particular warning or error. - SBMLDocument::setLevelAndVersion(...) now returns a boolean value to indicate whether the conversion was successful, if a conversion was implied by setting the SBML Level and Version of a given model. Applications should make sure to check the return value, because a return value of false implies that something went wrong and the model may be invalid. Applications should next call getNumErrors() and getError() to find out what happened. - The interface between CVTerms and ModelHistory and annotations is now hidden so getAnnotation() or getCVTerm() will return the same information in both cases (i.e., in the annotation and CVTerm forms). Manipulating either will cause the other to be updated, so if setCVTerm() is called, then getAnnotation() will return the CVTerm info. Likewise, if you then manipulate that and setAnnotation() followed by getCVTerm(), the changes will be reflected in the CVTerm form. - Added support for Octave. Thanks to Bill Denney for having worked out how to do it. - Support for the candidate layout implementation is now included by default in the Windows binaries we distribute. - Libxml2 version as old as 2.6.16 are now supported. - Python documentation is now available using the same Doxygen-based system as for C++, Java and C. ====================================================================== Version 3.0.0 Prerelease ====================================================================== * New Features relative to 3.0.0 beta_2: - Java, Perl and Python bindings are once again available, thanks to work by Akiya Jouraku. - MATLAB binding is available without support for Notes and Annotations. - The following is a partial list of API changes relative to previous versions of the Java bindings. Almost all are due to changes in the core of libSBML itself introduced in version 3.0.0. + The classes OstreamWrapper and OfstreamWrapper. + SBMLDocument.setLevel(int) and SBMLDocument.setVersion(int) are no longer available because they have been replaced by SBMLDocument.setLevelAndVersion(int, int). + The methods Event.getTrigger() and Event.getDelay() now return objects of class Trigger and Delay, respectively. Previously they returned mathematical formulas directly; now you have to invoke getMath() on the returned objects. + The methods KineticLaw.setFormulaFromMath() and KineticLaw.setMathFromFormula() have been removed because they are unnecessary; the methods setMath() and setFormula() can be used in their place. + Other API changes: const string& SBase::getNotes() /* libsbml 2.3.4 */ XMLNode* SBase::getNotes() /* libsbml 3.0.0 */ void SBase::setAnnotation(const std::string&) /* libsbml 2.3.4 */ void SBase::setAnnotation(XMLNode*) /* libsbml 3.0.0 */ void SBase::setNotes(const std::string&) /* libsbml 3.0.0 */ void SBase::setNotes(XMLNode*) /* libsbml 2.3.4 */ const ASTNode* Event::getDelay() /* libsbml 3.0.0 */ const Delay* Event::getDelay() /* libsbml 2.3.4 */ const ASTNode* Event::getTrigger() /* libsbml 3.0.0 */ const Trigger* Event::getTrigger() /* libsbml 2.3.4 */ void Event::setDelay(ASTNode*) /* libsbml 3.0.0 */ void Event::setDelay(const Delay*) /* libsbml 2.3.4 */ void Event::setTrigger(ASTNode*) /* libsbml 3.0.0 */ void Event::setTrigger(const Trigger*) /* libsbml 2.3.4 */ - There is new API documentation for C++, C and Java. The documentation is much more complete than before, and is generated from code comments, so it reflects more accurately the actual code. The API manuals are located in docs/formatted under subdirectories for the individual languages. See the sections below for other changes relative to earlier versions of libSBML such as version 2.3.4. ====================================================================== Version 3.0.0 beta_2 ====================================================================== * New Features: - There is a new XML parser abstraction layer, and identical functionality and checking of XML syntax is now available no matter whether you use Expat, Xerces or libxml2 as the underlying XML parser. - LibSBML now implements a thorough system for dimensional analysis and checking units of quantities in a model. The validation rules for units that are specified in SBML Level 2 Vers. 2 and Vers. 3 are fully implemented, including the checking units in mathematical formulas. - Annotations and notes are now read and manipulated as XML structures instead of text strings. Further, in order to facilitate the support of MIRIAM compatible annotations, there are new object classes ModelHistory and CVTerm. These classes facilitate the creation and addition of RDF annotations inside <annotation> elements by providing parsing and manipulation functions that treat the annotations in terms of XMLNode objects implemented by the new XML layer. Both ModelHistory and CVTerm follow the general libSBML format of providing getters and setters for each variable stored within the class. - LibSBML 3.0.0 implements a number of changes to memory handling improve consistency and memory management. Examples: LibSBML methods now copy objects passed to them, and classes implement virtual copy constructors via .clone() methods. - The Level 2 and Level 1 object models are now unified. All objects have .getSBMLDocument(), .getModel(), .getLevel(), and .getVersion(), among other things. Also, the interface to SBML rules abstracts away some of the individual rule type (assignment, rate, algebraic) differences. - The setLevel() and setVersion() methods on SBMLDocument have been unified into a single method, setLevelAndVersion(). - FunctionDefinitions now have convenience methods to access function arguments (getArgument() and getNumArguments()) and the function body (getBody()) directly. Arguments may be accessed by position or variable name. Corresponding functions for the libSBML C interface exist as well. - Errors/Warnings/Fatals have been amalgamated into one Error class with a Severity field that stores information relating to the type of error. There is only one printError function but the individual errors can be queried to determine their severity. - LibSBML 3.0.0 implements all the validation rules defined in the SBML specifications for L2 Version 2 and Version 3. - The Trigger and Delay elements of an Event are now properly implemented as SBase objects. By side-effect, this means that the methods on Event called getDelay() and getTrigger() have changed; they now return objects of class Delay and Trigger, respectively. To access the formulas of delays and trigger, use the getMath() methods on the Delay and Trigger classes. - The methods KineticLaw::setFormulaFromMath() and KineticLaw::setMathFromFormula() have been removed because they are unnecessary; the methods setMath() and setFormula() can be used in their place. * Bug Fixes: - MathML <csymbol> delay functions were incorrectly converted to user-defined functions, i.e. their type was AST_FUNCTION instead of AST_FUNCTION_DELAY. Thanks to Nicolas Rodriguez for reporting this bug. * Released March 31, 2007 ====================================================================== Version 2.3.4 ====================================================================== * New Features: - The SBML and MathML XML Schemas are now stored in the libSBML Xerces library itself. This vastly simplifies XML Schema validation as it is no longer necessary to store and locate the XML Schemas on the end-users filesystem. - Validator Constraint 1801, which ensures an event trigger is a boolean now takes into account FunctionDefinitions and piecewise functions, in additional to inline MathML. Sarah Keating provided this extra functionality. - ASTNode now has a deepCopy() method which will clone an ASTNode and all of its children, and so on. Thanks to Andrew Finney for suggesting this feature. - In libSBML Java and Python it is no longer necessary to pass an absolute path and filename to readSBML() and SBMLReader.readSBML(). Relative path and filenames now work as expected. * Bug Fixes: - When reading nested <piecewise> elements, libSBML looses the outer piecewise elements. Thanks to Martin Ginkel for reporting this bug and providing a test case. Sarah Keating tracked down the cause of the bug and provided a fix. - In some rare cases libSBML Expat would not be able to read all characters between <cn> and </cn> or <ci> and </ci> elements which would cause their contents to be parsed incorrectly. Thanks to Ralph Gauges for reporting this bug and Stefan Hoops for providing a fix. - When compiled with MSVC++ on Windows libSBML's ASTNode.getReal() would return zero when the ASTNode represented a <cn type="e-notation">. This bug did *not* manifest itself on Linux, Mac OS X (gcc compiler) systems. Thanks to Andrew Finney and Jordan Atlas for reporting this bug and Andrew Finney for suggesting a fix. - ASTNode::swapChildren() and ASTNode_swapChildren() are now accessible (public) in the libSBML Windows DLL. These functions were already public on Linux and Mac OS X. Thanks to Rainer Machne and Akira Funahashi for reporting this problem. - When formatting numbers, libSBML would not obey the "C" locale if another locale was set. For example, if a program using libSBML called, setlocale(LC_ALL, "de_DE") (or setlocale(LC_ALL, "German") under Windows), thereafter libSBML would only read and write floating point numbers where the decimal was a comma (instead of a period). Such behavior is in violation of the SBML specifications. Thanks to Pedro Mendes for asking a question (via sbml-discuss) that lead to the discovery of this bug. - Thanks to Ralph Gauges for reporting i) a discrepancy between the Xerces-C++ Attributes and the ExpatAttributes interface which was causing the layout extension to occasionally malfunction, and ii) for reporting a mismatched new / free in ExpatXMLString. These were bugs that only a libSBML extension developer is likely to notice. ;) They have been fixed. - 'make tags' now creates tags files, for use with [X]Emacs. The tags files are created in the individual source directories, however. To use them, visit the individual tags files needed. In the future there will be a scheme for creating one master tags file. - 'make uninstall' was actually not implemented almost anywhere (except for the implementation contributed by Martin Ginkel for the Lisp bindings). There is now a mostly-complete implementation (but it has not seen significant testing, so caveats apply). * Changes: - The xml-schema files are no longer included as part of the libSBML download as these are no longer necessary for validation. However the files are available via the SBML web-site. * Known Bugs: - Qualified (prefixed) element names are broken in the Xerces-C++ 2.6.0 SAX2 handler. Currently, libSBML does not work around this bug. As a result, when libSBML converts <annotation>s to strings, qualified element names with intervening element content (e.g. <foo:bar> <baz:bop> </foo:bar>) will result in end elements with incorrect prefixes (e.g. </baz:bar>). If you prefer Xerces-C++, for now please use 2.5.0 or earlier. - In libSBML C++, adding objects created on the *stack* to a container object (e.g. adding a Species to a Model or a Unit to a UnitDefinition) may cause libSBML to crash. LibSBML assumes: i) container objects adopt the the objects they contain (i.e. container objects will freeing objects they contain) and ii) all such objects are heap based (e.g. created with new). This bug will be fixed in a future release (2.4.0?) with reference counted objects. Note this bug *does not occur* in any of LibSBML C, Java, Python, Perl, Lisp, or Matlab. * Released October 3, 2005 ====================================================================== Version 2.3.3 ====================================================================== * libSBML 2.3.3 was a prerelease for libSBML 2.3.4. Thanks to Frank Bergmann, Christoph Flamm, Ed Frank, Ralph Gauges, Herbert Sauro, Jeremy Zucker, Tim (?), and other members of the libsbml-discuss mailing list for taking the time to test this release and report and fix problems. * Released September 26, 2005 ====================================================================== Version 2.3.2 ====================================================================== * New Features: - New example programs: - At the 3rd SBML Hackathon, Nicolas Rodriguez converted all C++ example programs to Java. See examples/java/README.txt for more information. - Christoph Flamm has started to convert the C++ example programs to Perl. See examples/perl. - Sarah Keating converted the printMath.c example program to C++. See examples/c++/printMath.cpp. - Christoph Flamm added the following functions to the Perl binding: LibSBML::printWarnings, LibSBML::printErrors, and LibSBML::printFatals. * Bug Fixes: - libSBML 2.3.0 and 2.3.1 required both PREFIX/include and PREFIX/include/sbml (e.g. /usr/local/include and /usr/local/include/sbml) to be on the include path when compiling programs with libSBML. This has been fixed. Once again, only PREFIX/include is required to find all appropriate libSBML header files. Thanks to Colin Gillespie and many others at the recent SBML Hackathon for reporting this bug. - readMathMLFromString() would crash if the returned MathMLDocument was freed in-between subsequent calls to the function. This bug only manifested itself when libSBML was configured to use Expat. Thanks to Herbert Sauro for reporting this bug and Frank Bergmann for providing a fix. - AST_PLUS, AST_MINUS, AST_TIMES, AST_DIVIDE, and AST_POWER enumerations may (once again) be used in Java switch statements. Thanks to Nicolas Rodriguez for reporting this bug. - Local Parameters with the same ids in separate KineticLaws were incorrectly reported as duplicates / conflicting by the libSBML consistency checker (consistency check id 902). Thanks to Jo Matthews for reporting this bug. - In the libSBML Matlab 'IsSetFast' was renamed to 'isSetFast' (TranslateSBML.c). This bug caused no problem with Matlab 6, but would crash Matlab 7. - Configuring with --with-check on MacOSX would cause -Lyes/lib to be added to the LDFLAGS. This bug in config/libcheck.m4 is now fixed. (Tracker libsbml case #57.) - Minor layout extension bug fixes. * Known Bugs: - Same as for libSBML 2.3.1 * Released May 27, 2005 ====================================================================== Version 2.3.1 ====================================================================== * New Features: - LibSBML now keeps infix formula strings and ASTs internally synchronized for Rules and KineticLaws. This means you may use whichever you prefer: get/setFormula(), get/setMath(), or freely intermix them. This brings the libSBML object model another step closer to SBML level and version transparency (where reasonably possible). As a result, the methods / functions setFormulaFromMath() and setMathFromFormula() are no longer necessary, but are kept around for backward compatibility. * Bug Fixes: - LibSBML now converts plural <annotations> into their singular form when reading and storing annotation strings. This prevents technically incorrect SBML from being written when a plural annotations are read-in and an L1v2 or L2v1 SBML document is subsequently written-out. Note: It is still possible to pass setAnnotation() an incorrectly formatted annotation string. This is one of the many shortcomings of the libSBML annotation system, which will be overhauled soon. Thanks to Jo Matthews for reporting this bug. - Doxygen generated HTML documentation, which was broken in libSBML 2.3.0, is working again. - ./configure --with-expat=... works again. There was a small typo in the config/expat.m4 script that caused LDFLAGS to be set incorrectly. Thanks to Ed Frank for reporting this bug. * Changes: - The methods / functions setFormulaFromMath() and setMathFromFormula() for Rules and KineticLaws are no longer necessary, but are kept around for backward compatibility (see New Features). * Known Bugs: - Same as for libSBML 2.3.0 * Released May 9, 2005 ====================================================================== Version 2.3.0 ====================================================================== * New Features: - Ralph Gauges extension to libSBML to support the diagram layout proposal (previously available as a separate patch) is now part of the libSBML distribution. Since the layout extension is still experimental at this point, it is not compiled into libSBML by default. To enable it: ./configure --enable-layout make The layout extension may be used from libSBML C, C++, Java and Python. It has not been tested under Windows (the MSVC++ 6 and MSVC++ 7 project files do not even attempt to compile it). Example code can be found in examples/layout. - The new and much improved libSBML Validator framework may be found in src/validator. This framework has been used to implement 45 (out of approximately 50) SBML model consistency checks listed on the SBML Wiki (http://sbml.org/wiki/Semantic_Validation). The libSBML Validator framework is designed to allow you to express model validation constraints in a succinct yet readable manner. The constraint "language" has a declarative feel while still allowing you to use the full expressive power of C++ when necessary. To see the current set of 45 consistency constraints, see src/validator/contraints/ConsistencyConstraints.cpp. The most up-to-date validator documentation is available on the libSBML website (http://www.sbml.org/software/libsbml). - LibSBML now supports SBML Level 2 to SBML Level 1 conversions for certain classes models. To use, on an SBML L2 document, simply call SBMLDocument.setLevel(1). If no errors were logged, conversion was successful. Currently, libSBML is somewhat conservative about the classes of models it will allow to be down converted. The sophistication of this conversion will improve over time. See also examples/c++/convertSBML.cpp. - libSBML now implements a variant of the Visitor pattern (Design Patterns, GoF, 1995, p. 331). The parent Visitor class is called SBMLVisitor and each SBML class now has an accept() method to accept subclasses of SBMLVisitor. See the libSBML Developer's Manual for more information. - The Java and Python language bindings now include documentation strings for each method and function. The docstrings are extracted from the C/C++ docstrings and added to each language bindings (see src/bindings/swig/swigdoc.py for more information). - Since the SWIG generated sources are annotated, Java docstrings can be accessed by running JavaDoc on the generated Java source files. - Python docstrings may be accessed via help() (since Python 2.1), pydoc, docutils, HappyDoc, etc. - SBMLWriter and MathMLWriter are now full-fledged classes. Plus, thanks to Stefan Hoops, it is now possible to: 1. To use these classes to write to a C++ std::ostream, and 2. Set a program and version name when writing SBMLDocuments, which will write the following XML comment (intended for human consumption) at the beginning of the file: <!-- Created by <program name> version <program version> on yyyy-MM-dd HH:mm with libsbml version <libsbml version>. --> - Added const versions of the getListOfXXX() methods for Model, UnitDefinition, Reaction, KineticLaw, and Events. - There are several new convenience methods (and functions) on Unit and UnitDefinition. These make many libSBML consistency checks much readable. In particular the following were added: - Unit.isXXX() C++ methods (and corresponding Unit_isXXX() C functions) for each UnitKind. For example, Unit.isMetre() (or Unit_isLitre()). - A static C++ method Unit::isBuiltIn() (and the corresponding C function Unit_isBuiltIn()). It takes a string as an argument and returns true if it is one of the five SBML built-in units: 'area', 'length', 'substance', 'time', or 'volume'. - Five new methods that allow you to ask whether or not a particular UnitDefinition is a variant of a built-in unit. That is, the unit expresses the built-in type and varies arbitrarily in only scale, multiplier, and/or offset. The methods are: - isVariantOfArea() - isVariantOfLength() - isVariantOfSubstance() - isVariantOfTime() - isVariantOfVolume() - ParseMessages can now have an integer identification number associated with them to uniquely identify each message. The id the first argument passed to the ParseMessage constructor and ParseMessage_createWith(). The new and improved libSBML consistency check facility makes use of ParseMessage ids. Thanks to Damon Hachmeister for suggesting this idea. * Bug Fixes: - XML namespace handling is now working properly with libSBML Expat. Thanks to Ben Skrainka for reporting this bug. - Because libSBML did not trim leading and trailing whitespace on <notes> and <annotation> content, each time libSBML read and then wrote a file, the amount of leading and trailing whitespace within this content would grow (i.e. the extra whitespace and libSBML's modest pretty printing were interfering with each other). Thanks to Damon Hachmeister for reporting this bug. - There's a bug in Xerces-C++ 2.6.0 (#1308) that caused libSBML to record an incorrect XML namespace on a </annotation> element in some instances. Thanks to Johan Hattne for discovering this bug and providing a workaround. Thanks also to Eryk Wolski who sent in runs of 'make check' that also revealed this bug. - When converting L1 models to L2, any Compartment or Parameter involved in a CompartmentVolumeRule or ParameterRule, respectively, now correctly has its constant attribute set to false (instead of the L2 default of true). (As for Species, their constant attribute defaults to false in L2). Thanks to Andrew Finney and Nicolas Le Novere for reporting this bug. - When reading SBML with libSBML Expat some classes of errors would result in segmentation faults. This has been fixed. - When reading SBML from an in-memory string with libSBML Expat parse errors were not be logged. This has been fixed. * Changes: - Leading and trailing whitespace is now removed before storing <notes> and <annotation> content. Note that whitespace *within* <notes> and <annotation> content is preserved as always. - readSBML(filename), SBMLReader_readSBML(filename) and SBMLReader::readSBML(filename) now log specific fatal error ParseMessages if the file could not be found or the content is not SBML. See the function / method docstrings for more information. Thanks to Eryk Wolski and Ralph Gauges for suggesting this idea. - Removed support for writing various character encodings. This change has been a long time coming. LibSBML should support writing only UTF-8 because that is what the SBML standard requires. - Renamed two methods on the Reaction class: - getReactantById() -> getReactant() - getProductById() -> getProduct () The naming scheme takes advantage of C++ overloading (i.e. you can specify either a string id or an integer position to get the nth reactant or product) and is consistent with similar methods elsewhere in libSBML. The 'ById' portion of the name was a holdover from the C API and was introduced by mistake when converting the C API to C++. - Started upgrading some unit tests to 'check' 0.92. In version 0.92, NULL may be omitted as the second argument to fail_unless() and fail_if(). - All header files use forward class declarations in order to minimize dependencies and increase compilation speed. - The make system tries harder to use the user's LD_LIBRARY_PATH setting, especially when running tests with 'make check'. - 'make install' now strips the installed library on systems where we can do it at installation time (which currently are non-MacOSX systems). - 'make install' no longer installs the documentation by default; use 'make install-docs' for this. The install-docs formats the latex-based documentation in the docs subdirectory and requires latex and pdflatex to be available on your system. It can also be a time-consuming step. To reduce annoyances for people who frequently do 'make install', we took out the docs installation step and make it separate. - The default documentation creation procedure no longer creates DVI files, only PDF and HTML. Some people's TeX/LaTeX installations apparently don't have a latex, only a pdflatex, and the default actions could fail. DVI and PS formats can still by obtained by using explicit commands. (See the Makefile in docs/src for more.) * Known Bugs: - Qualified (prefixed) element names are broken in the Xerces-C++ 2.6.0 SAX2 handler. Currently, libSBML does not work around this bug. As a result, when libSBML converts <annotation>s to strings, qualified element names with intervening element content (e.g. <foo:bar> <baz:bop> </foo:bar>) will result in end elements with incorrect prefixes (e.g. </baz:bar>). If you prefer Xerces-C++, for now please use 2.5.0 or earlier. - When reading nested <piecewise> elements, libSBML looses the outer piecewise elements. Martin Ginkel has reported this bug and provided a test case. - In libSBML C++, adding objects created on the *stack* to a container object (e.g. adding a Species to a Model or a Unit to a UnitDefinition) may cause libSBML to crash. LibSBML assumes: i) container objects adopt the the objects they contain (i.e. container objects will freeing objects they contain) and ii) all such objects are heap based (e.g. created with new). This bug will be fixed in a future release (2.4.0?) with reference counted objects. Note this bug *does not occur* in any of LibSBML C, Java, Python, Perl, Lisp, or Matlab. * Released May 2, 2005 ====================================================================== Version 2.2.0 ====================================================================== * New Features: - Perl A full libSBML Perl API was contributed by Christoph Flamm and Rainer Machne. For more information, see bindings/perl/README.txt. The Perl API is not yet integrated into the libSBML 'configure' system. To build and install it, after installing libSBML, change to bindings/perl and follow the CPAN-style build instructions in the README.txt file. - Lisp A full libSBML Lisp API was contributed by Martin Ginkel. For more information, see bindings/lisp/README.txt. - Windows Installation Program Sarah Keating created Windows setup programs in two flavors: libsbml-2.2.0-win-xerces.exe and libsbml-2.2.0-win-expat.exe. - XML namespace definitions may be retrieved from or added to any SBML object. It's good practice, however, to put namespaces only on the top-level <sbml> element. For example: SBMLDocument d; d.getNamespaces().add("jd", "http://www.sbml.org/2001/ns/jdesigner"); To find out if an SBML object (XML element) has any namespaces defined, use hasNamespaces(), for e.g.: if (d.hasNamespaces()) ... * Bug Fixes: - <notes> and <annotation> elements on the top-level <sbml> element were not being written-out for L2 documents. Thanks to Damon Hachmeister for reporting this bug. - <csymbol> delay functions were being handled incorrectly throughout libSBML as symbols (similar to <csymbol> time, which is a symbol) instead of functions. The fix results in three changes: 1. The ASTNodeType AST_NAME_DELAY is changed to AST_FUNCTION_DELAY. 2. As a result of (1), ASTNode.isFunction() will now return true for delay function nodes. 3. The infix expression parser will parse: delay(...) as an AST_FUNCTION_DELAY (This does not mean delay functions must be called "delay" in MathML, it simply means if you want to create them in infix, you need to use the name "delay"). I'm reasonably confident the effect of these changes on existing code will be minimal. My guess is that if anyone had been using this aspect of libSBML, they would have reported it as a bug. Thanks to Sarah Keating for reporting this bug. - The consistency checks were referencing ids instead of names when checking L1 models. Thanks to Jo Matthews, Mike Hucka, and Manuel Martin for reporting this bug. - XML namespace definitions were not being preserved when writing out an SBML document. Thanks to Jo Matthews, Michael Lawrence, and Herbert Sauro for reporting this bug. * Changes: - The API SBMLDocument.validate() has been deprecated and will be removed in a future release of libSBML. Use SBMLDocument.checkConsistency() instead. - A HTML version of the libSBML Developer's Manual is now available. Thanks to Mike Hucka for working that out. * Released October 6, 2004 ====================================================================== Version 2.1.0 ====================================================================== * New Features: - C++ While it's always been possible to call the C API from C++ code, this version of libSBML features a true object-oriented API that mirrors the SBML specifications. To get a feel for the C++ API, see src/TestReadFromFile5.cpp. For those that prefer the straight C API, it's still available and over 730 unit tests prove its backward compatible with previous releases. - Java A full libSBML Java API is also available. See: docs/formatted/java.txt - For more information bindings/java/Test.java - For example code - Python A full libSBML Python API is also available. See: docs/formatted/python.txt - For more information bindings/python/accept.py - For example code - Validation Engine / Consistency Checks In addition to validating an SBML document against the SBML XML Schema, we've added a (customizable) validation engine. Currently libSBML comes pre-configured with 39 consistency check rules described at: http://sbml.org/wiki/Semantic_Validation To test whether or not an SBML document violates any of these consistency checks, simply load an SBML document, d, and call: SBMLDocument_validate(d) - C d.validate() - C++, Java, Python Every violation adds an error message to the SBML document (accessible with getNumErrors() and getError()) and validate() returns the total number of errors found. The ability to add your own rules is still a bit rough around the edges. The API was started before libSBML was ported to C++, so new rules must be written in C or C++ (no Java or Python). If you're interested, please see src/ValidationRules.c. - Additional Convenience Functions: It's now possible retrieve objects from a Model either via their ordinal position or their SId. In C++, Java, and Python the same method name is overloaded to take either an integer or a string: int n; Model m; m.getXXX(n); m.getXXX("SomeSId"); In C, two separate functions are provided: Model_getXXX(n); Model_getXXXById("SomeSId"); * Bug Fixes: - All bugs reported for the libSBML betas, 2.0.4 and 2.0.5, have been fixed. - Infix formula strings with grouped non-associative operators of the same precedence were being formatted incorrectly. That is: "a - (b - c)" -> "a - b - c" "a - (b / c)" -> "a / b / c" To be clear, the formula string would parse correctly, but would be written out incorrectly. Thanks to Rainer Machne for reporting this bug. - Double precision numbers (in attribute values, infix formulas, or MathML) were being printed to a maximum precision of six digits. This artifically low limit has been increased to 15 digits (the maximum precision possible for an IEEE-754 doubles). Thanks to Tatsuya Ishida for reporting this bug. - MathML incorrectly nested inside <notes> or <annotation> elements would cause libSBML to crash. Thanks to Adam Halasz reporting this bug. - Negative numbers in MathML <cn> elements were being incorrectly parsed. Thanks to Nadia Ugel and Victoria Gor, both of whom independently discovered and reported this bug. - A <rateRule> element would be written without the closing angle bracket (!) if it had a note and/or annotation associated with it. Thanks to Konstantin Kozlov for reporting this bug and providing a fix. - A MathML expression involving a <csymbol> did not "reduce" to the correct syntax tree when it was the last argument of an <apply>. Thanks to Jacek Puchalka for reporting this bug and providing a fix. * Changes: - SBMLTypes.h now includes MathMLDocument.h, MathMLReader.h and MathMLWriter.h - Mike Hucka rewrote the entire build/make system. It no longer uses automake or libtool; as a result, it is smaller, leaner and faster. Other features include changes to configure to add --with-python, --with-java, --with-matlab. - Mike Hucka updated the libsbml-manual.tex to make it reflect the current state of the API. Mike also created a new LaTeX class file called sbmlmanual.tex, available in the docs/src/tex subdirectory. - In order to make the generation of the manuals self-contained, we've put all the necessary LaTeX class files and extensions they use in docs/src/tex. This bloats the distribution, but is the only safe way to ensure that people can actually make the docs. - Mike Hucka also updated the doxygen documentation configuration and the makefile that drives it. However, it's still not ready for prime-time and we are not yet distributing it as a standard part of the regular distributions. * Released July 23, 2004 ====================================================================== Version 2.0.3 ====================================================================== * Major New Features: - Stephan Hoops has contributed a port of libsbml to use the Expat XML parser library as an alternative to Xerces. To build libsbml to use Expat: ./configure --with-expat[=PATH] All checks but one pass with Expat enabled (See Bugs below). There are currently two caveats to using Expat with libsbml: 1. libsbml *will not* be able to validate SBML and MathML content against an XML Schema. Expat has no facilities for XML Schema validation. 2. XML entity references (e.g.  ), which are most likely to occur in XHTML <notes> sections, will be output as their UTF-8 byte sequence instead of the more human readable entity reference (see Bugs below for more information). - Rainer Machne has contributed an example program that evaluates infix expressions and prints their results using the libsbml AST API. See examples/evaluateMath.c. * Bug Fixes: - The correct namespace is now output for both SBML Level 1 and Level 2 documents. This bug was introduced as a result of a bug fix in the 2.0.1 release which output only Level 1 namespaces. The bug is fixed now. Honest. Thanks to Akira Funahashi for reporting this bug. - XML entity references (e.g.  ), which are most likely to occur in XHTML <notes> sections, are now output using the same entity reference notation instead the corresponding UTF-8 byte sequence. Thanks to Jo Matthews for reporting this bug. NOTE: This bug has not yet been fixed in the Expat version of libsbml. While Expat reads and writes UTF-8 by default, it comes with no APIs to manipulate or translate Unicode encodings. Writing such a conversion routine and ensuring it is cross-platform is non-trivial and would hold up this release of libsbml for too long. * Released December 19, 2003 ====================================================================== Version 2.0.2 ====================================================================== * Major New Features: - Sarah Keating has contributed a Matlab interface to libsbml and tools to load, store and view (via a Matlab GUI) a database of models (from a .mat file). See the README.txt in bindings/matlab/SBMLToolbox for build instructions and additional information. * Bug Fixes: - Writing SBML L2 documents with FunctionDefinitions would cause libsbml to crash (segfault). The cause was a typo in SBMLFormatter.cpp where a call to listOfUnitDefinitions() should have been (and is now) listOfFunctionDefinitions() (Thanks to Jo Matthews for reporting an anomaly that led to the discovery of this bug). * Released October 24, 2003 ====================================================================== Version 2.0.1 ====================================================================== * Bug Fixes: - The correct namespace is now output for SBML Level 2 documents. - The MathMLHandler now correctly constructs ASTs for calls to user-defined function containing numeric arguments (Thanks to Colin Gillespie for reporting an anomaly that lead to the discovery of this bug). - SBML_formulaToString() did not correctly reproduce (sub) expressions with operators of the same precedence, but modified associativity. For example, "1 / (2 * 3)" was correctly parsed (in infix or MathML) but incorrectly converted to "1 / 2 * 3". This bug has been fixed! * Major New Features: - When reading SBML Level 2, MathML expressions are automatically converted to and stored as SBML L1 infix expressions for maximum backward compatibility with L1. That is, either XXX_getMath() or XXX_getFormula() may be used. There is no need to call SBML_formulaToString() under most circumstances. - SBML_convertToL2(SBase_t *sb) converts any SBML Level 1 object and its subordinate objects to SBML Level 2. Currently this function: - Converts name fields to id fields - Adds ModifierSpeciesReferences when converting Reactions (via SBML_addModifiersToReaction(Reaction_t *r, const Model_t *m)) In the future this function will also: - Add FunctionDefinitions for L1 predefined functions SBMLDocument_setLevel() calls SBML_convertToL2() automatically when the current level is 1 and the new level is 2. * Major New APIs: - char * writeMathMLToString (MathMLDocument_t *d) - unsigned int Model_getNumSpeciesWithBoundaryCondition (const Model_t *m) - Species_t * Model_getSpeciesById (const Model_t *m, const char *sid) - SpeciesReference_t * Reaction_getReactantById (const Reaction_t *r, const char *sid) - SpeciesReference_t * Reaction_getProductById (const Reaction_t *r, const char *sid) - ModifierSpeciesReference_t * Reaction_getModifierById (const Reaction_t *r, const char *sid) - unsigned int ListOf_countIf (const ListOf_t *lo, ListItemPredicate p); - void * ListOf_find (const ListOf_t *lo, const void *item1, ListItemComparator c) - List_t * ASTNode_getListOfNodes (const ASTNode_t *node, ASTNodePredicate p) Where ListItemPredicate, ListItemComparator and ASTNodePredicate are pointers to functions with a particular signature. This allows for convenient and powerful Lisp map-like or C++ STL operations over a container (In fact, the XXX_countIf() name was inspired by the C++ STL). For example, Model_getNumSpeciesWithBoundaryCondition() (above) is implemented simply as follows: return ListOf_countIf( m->species, (ListItemPredicate) Species_getBoundaryCondition ); * New example program: - translateMath.c is an interactive console program that translates infix formulas into MathML and vice-versa. * Improved Windows build and binary distribution: - Andrew Finney constructed an MSVC++ project file and a set of batch files to build both regular and debug versions of libsbml and all example programs. - Xerces-C++ 2.2.0 headers, DLLs and .lib files are included with the Windows distribution (libsbml-2.0.1.zip; see the win32/ subdirectory). * Minor improvements: - Public API header files no longer include references to C-specific header files (e.g. stdio.h). This should make it easier for automated tools to read these header files and generate API bindings for other languages (e.g. Delphi; Thanks to Herbert Sauro for suggesting this). - SBMLTypes.h now #includes both SBMLReader.h and SBMLWriter.h. - Internal utility classes and functions are now officially public. See List.h, Stack.h, StringBuffer.h and util.h. * Released August 6, 2003 ====================================================================== Version 2.0.0 ====================================================================== * Near complete L2 support. The two features not yet supported are: 1. RDF (although the metaid attribute is read, stored and written) 2. Processing of the MathML <semantic> element (for annotating MathML elements with additional content, e.g. TeX). * New L2 Structures: - FunctionDefinition - Event - EventAssignment - SimpleSpeciesReference (abstract) - ModifierSpeciesReference - AssignmentRule (no longer abstract) - RateRule - MathML and L1 infix expressions (when parsed) are both stored in the same Abstract Syntax Tree (AST) structure ASTNode. - ListOf stores lists of others SBML objects and may contain a metaid, notes or annotations. * New L2 Functions: - The getters, setters, isSet and unset functions are too numerous to mention here. Like L1, they parallel the UML structures defined in the SBML specification. All L1 functions are kept for backward compatibility (see below). - Any structure containing a list now has a getListOfXXX() function which returns the corresponding ListOf structure. - There are currently three convenience functions for converting between SBML infix and MathML formulae: - ASTNode_t *SBML_parseFormula(const char *formula) - char *SBML_formulaToString(const ASTNode_t *math) - MathMLDocument_t *readMathMLFromString(cont char *xml) Again, these are provided purely for convenience. Under normal circumstances, libsbml performs all conversions behind the scenes when necessary. * L1 to L2 Changes: libsbml stores both L1 and L2 models in the same memory structure. While the L1 getters, setters, isSet and unset functions exist for backward compatibility there are some changes of which users of previous versions of libsbml should be aware: - Compartment: - .volume has been renamed to .size. - Species: - .units has been renamed to .substanceUnits. - .initialAmount and .initialConcentration are stored in a union called .initial with discriminators .Amount and .Concentration. - Reaction: - .fast is optional in L2 which introduces Reaction_isSet / unsetFast() functions. - SpeciesReference: - .stoichiometry is now of type double which necessitated a change in the signature of the getter and setter functions. - The use of .denominator is deprecated in L2. However, libsbml still uses denominator in L2 models. When reading a <stoichiometry Math> if the content is a single <CNN type='rational'>, libsbml will discard the stoichiometry Math and set stoichiometry and denominator directly. Similarly, libsbml will write <stoichiometryMath> in L2 documents if the .stoichiometryMath field is not set and the denominator is not 1. - CompartmentVolumeRule: - SpeciesConcentrationRule: - ParameterRule: - .compartment, .species and .parameter have all been renamed to .variable. - The XXX_createWith() functions now set the .id field instead of the .name field. - List_t has been replaced by ListOf_t to store a metaid, notes, and annotations. ListOf_t is simply a wrapper around List_t. * SBMLReader allows you to set up to three Schema filenames (one each for L1v1, L1v2 and L2v1) and it will automatically use the appropriate Schema for the SBML document being read. * A simple command-line executable that converts L1 models to L2 was added to the examples/ subdirectory. * A new subdirectory, xml-schemas/, contains schemas for SBML L1v1, L1v2, L2v1 and MathML 2. * Xerces-C 2.3.0 is now supported by libsbml. Older versions of Xerces-C (2.2.0 and 2.1.0) are still supported. * Released July 23, 2003 ====================================================================== Version 1.1.2 ====================================================================== * A new subdirectory, examples, contains a few small programs that demonstrate how libsbml may be used. * IEEE-754 NaN, +Inf, -Inf and -0.0 are handled correctly and consistently on all supported platforms. In previous versions, these values were not represented, read or written correctly on native Windows and under Cygwin. When writing these values to XML, libsbml now strictly adheres to the XML Schema specification for doubles, namely exactly: "NaN", "INF", "-INF" and "-0". * The build platform was upgraded to Libtool 1.5. This means dynamic libraries will build correctly on all platforms: Linux (.so), Solaris (.so), Cygwin (.DLL) and MacOS X (.dylib). * SBMLWriter now defaults to an output encoding of UTF-8. * SBML_parseFormula() now returns NULL if the formula contains an error. The next version of libsbml will return the position of the syntax error. * Added method: SBMLDocument_setModel(). * To build and run the libsbml test suite now requires an explicit configure option: ./configure --enable-check In addition, 'check' needs to be installed (http://check.sf.net/). Under Cygwin ONLY, due to a limitation of Libtool, if libsbml is built with --check-enabled, a DLL cannot be built. So, after testing, re-run configure without enabling check then 'make' and 'make install' as usual. Running the test suite on any platform is completely optional. Libsbml is tested on all supported platforms before it is released. * Released June 6, 2003 ====================================================================== Version 1.1.0 ====================================================================== * A Developer's Manual (DRAFT) is available in docs/formatted/. * Formula strings may optionally be parsed into abstract syntax trees. See ASTNode.h, and SBML_parseFormula() in FormulaParser.h. * XXX_isSetYYY() and XXX_unsetYYY() methods are available for optional fields without default values. * XXX_getYYY() and XXX_setYYY() methods are available for every field. * SBML (XML) namespace handling is much improved. * '<annotations>' is treated as a synonym for the correct form '<annotation>' (singular). * Notes and annotations on the top-level <sbml> element are read-in and stored (SBMLDocument_t now "inherits" from SBase_t), but not written. When this occurs, a warning message is logged. * Builds successfully on Solaris 2.8. * SBML documents may now be validated against their XML schema. This is still off by default. To turn validation on see SBMLReader_create(), SBMLReader_readSBML() and possibly SBMLReader.h for more information. * Three new convenience functions exist to quickly print warnings, errors and fatal errors that occurred while reading an SBMLDocument. The prototype for this class of function is: SBMLDocument_printXXXs(SBMLDocument_t *d, FILE *stream). Where XXX is Warning, Error or Fatal. * Released May 11, 2003. ====================================================================== Version 1.0.1 ====================================================================== * The build system detects and supports Xerces-C 2.1.0, Xerces-C 2.2.0 compiled with or without namespace support. * Released March 14, 2003. ====================================================================== Version 1.0.0 ====================================================================== * Initial release, March 12, 2003. # The following is for [X]Emacs users. Please leave in place. # Local Variables: # fill-column: 70 # End: