File: OLD_NEWS.txt

package info (click to toggle)
libsbml 5.10.0+dfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 141,800 kB
  • ctags: 98,793
  • sloc: cpp: 804,405; xml: 206,907; ansic: 66,144; cs: 52,916; java: 25,093; python: 23,449; sh: 9,847; perl: 8,414; makefile: 7,580; ruby: 4,760; csh: 3
file content (2824 lines) | stat: -rw-r--r-- 116,727 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
           libSBML OLD_NEWS -- History of user-visible changes
           
This file stores the NEWS distributed with earlier versions of libSBML.


======================================================================
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. &#0168;) or predefined entity 
   (e.g. &amp;) could be wrongly replaced with &amp; (e.g. &#0168; 
   -> &amp;#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 "&amp;" (a predefined entity reference of ampersand)
    in an attribute value was wrongly converted to "&amp;#38;" when
    libSBML used libxml2 as the underlying XML parser.  This is now
    fixed.  Thanks to Chen Li for reporting this bug.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

* New features:

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

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

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

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

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

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

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

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

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

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

* Bug fixes:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


* Changes

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

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

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

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

* New features:

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

* Bug fixes:

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

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

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

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

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

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

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

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

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

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

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


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

* Dependency changes:

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

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

* New features:

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

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

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

* Bug fixes:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

* Changes:

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

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

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

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

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

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

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


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

* Changes:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

* Changes:

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

* Bug fixes and enhancements:

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

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

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

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

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

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

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

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

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

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

* New features relative to 3.0.0 prerelease:

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

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

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

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

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

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

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

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

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

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

  - Libxml2 version as old as 2.6.16 are now supported.

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


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

* New Features relative to 3.0.0 beta_2:

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

    + The classes OstreamWrapper and OfstreamWrapper.

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

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

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

    + Other API changes:

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

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

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


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


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

* New Features:

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

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

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

* Bug Fixes:

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

* Released March 31, 2007




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

* New Features:

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

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

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

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


* Bug Fixes:

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

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

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

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

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

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

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

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


* Changes:

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

* Known Bugs:

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

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

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


* Released October 3, 2005




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

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


* Released September 26, 2005



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


* New Features:

  - New example programs:

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

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

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

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


* Bug Fixes:

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

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

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

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

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

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

  - Minor layout extension bug fixes.


* Known Bugs:

  - Same as for libSBML 2.3.1


* Released May 27, 2005



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


* New Features:

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


* Bug Fixes:

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

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

    Thanks to Jo Matthews for reporting this bug.

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

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

* Changes:

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


* Known Bugs:

  - Same as for libSBML 2.3.0


* Released May 9, 2005


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

* New Features:

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

      ./configure --enable-layout
      make

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


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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Thanks to Damon Hachmeister for suggesting this idea.


* Bug Fixes:

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

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

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

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

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

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


* Changes:

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

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

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

  - Renamed two methods on the Reaction class:

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

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

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

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

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

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

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


* Known Bugs:

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

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

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

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


* Released May 2, 2005




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

* New Features:

    - Perl

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

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

    - Lisp

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

    - Windows Installation Program

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

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

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

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

        if (d.hasNamespaces()) ...


* Bug Fixes:

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

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

        1. The ASTNodeType AST_NAME_DELAY is changed to
           AST_FUNCTION_DELAY.

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

        3. The infix expression parser will parse:

             delay(...)

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

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

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

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


* Changes:

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

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


* Released October 6, 2004




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

* New Features:

    - C++

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

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

    - Java

      A full libSBML Java API is also available.  See:

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

    - Python

      A full libSBML Python API is also available. See:

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


    - Validation Engine / Consistency Checks

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

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

        http://sbml.org/wiki/Semantic_Validation

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

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

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

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


    - Additional Convenience Functions:

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

        int   n;
        Model m;

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

      In C, two separate functions are provided:

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


* Bug Fixes:

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

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

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

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

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

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

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

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

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


* Changes:

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

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

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

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

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

* Released July 23, 2004




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

* Major New Features:

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

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

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

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

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

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


* Bug Fixes:

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

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

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

* Released December 19, 2003




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

* Major New Features:

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

* Bug Fixes:

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

* Released October 24, 2003



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

* Bug Fixes:

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

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

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

* Major New Features:

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

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

        - Converts name fields to id fields

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

      In the future this function will also:

        - Add FunctionDefinitions for L1 predefined functions

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

* Major New APIs:

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

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

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

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

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

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

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

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

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


* New example program:

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

* Improved Windows build and binary distribution:

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

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

* Minor improvements:

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

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

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

* Released August 6, 2003




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

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

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

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


* New L2 Structures:

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

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

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


* New L2 Functions:

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

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

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

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

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


* L1 to L2 Changes:

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

    - Compartment:

        - .volume has been renamed to .size.

    - Species:

        - .units has been renamed to .substanceUnits.

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

    - Reaction:

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

    - SpeciesReference:

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

        - The use of .denominator is deprecated in L2.

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

    - CompartmentVolumeRule:
    - SpeciesConcentrationRule:
    - ParameterRule:

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

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

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


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

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

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

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


* Released July 23, 2003




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

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

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

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

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

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

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

* Added method: SBMLDocument_setModel().

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

    ./configure  --enable-check

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

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


* Released June 6, 2003




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

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

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

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

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

* SBML (XML) namespace handling is much improved.

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

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

* Builds successfully on Solaris 2.8.

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

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

    SBMLDocument_printXXXs(SBMLDocument_t *d, FILE *stream).

  Where XXX is Warning, Error or Fatal.


* Released May 11, 2003.




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

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

* Released March 14, 2003.




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



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