File: CHANGELOG

package info (click to toggle)
zimpl 3.7.0%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,772 kB
  • sloc: ansic: 21,719; yacc: 993; lex: 370; sh: 349; makefile: 278
file content (915 lines) | stat: -rw-r--r-- 28,756 bytes parent folder | download | duplicates (2)
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
3.7.0 23. November 2025 Release

  - added permute(S) to generate permutations
  - increased minimal required cmake version to 3.11

3.6.2 14. September 2024 Release

  - have cmake check for PCRE also if ZLIB is found in MSVC builds
  - have cmake look also for PCRE libs with -static name suffix

3.6.1 21. June 2024 Release

  - added penalty7 and penalty8

3.6.0 1. May 2024 Release

 - fixed some bugs with qubo attribute.

 - fixed bug in memory management for consecutive runs

 - add compile option -ffp-contract=off or /fp:precise to enhance reproducibility across different systems

3.5.2 23. June 2022 Release

 - added penalty1..6 to qubo attribute

 - Fixed bug in term_simplyfy

3.5.1 January 2022 no realeased

 - fix bug related to qudratic objective

3.5.0  7. November 2021 Release

 - Non linear objective functions are allowed.
   xlp interface slightly changed.

 - New file format qbo which writes out a QUBO file.
   Warning: This format is subject to change.

 - New "qubo" constraint attribute, which tries to convert the
   constraint into a qubo. So far only sum of binary variables
   equals one can be convertet. More planned.

 - Lots of code style changes and attributes etc.

3.4.0  June 2020 Release

 - Started to put in function attributes for gcc/clang

 - Support for pclint 1.3.5

 - Now possible to have "default" without any non default values.

 - Improved compiler warning settings

 - Fixed possible bug with setjump/longjump

 - Fixed very old bug in strstore2.

 - do print can now also print boolean values.

3.3.9  30. March 2020 Release

 - added -n option to internal call via SCIP.

 - corrected typo in documentation

 - fixed wrong warning about sprintf()

 - fixed bug wit quadratic constraints multiplied by 0

 - added note about scope to documentation

 - added -fvisibility=hidden to shared gcc builds

3.3.8  10. July 2019 Release

 - improved CMake

3.3.6  30. May 2018 Release

 - fixed bug not restoring gmp memory functions
   when using zimpl as a library

 - Zimpl now should be able to handle sets with more
   than 2 billion entries.

3.3.5  04. Feb 2018 Release

 - changed to C99

 - changed to PClint+ (in progress)

 - Removed more cppcheck messages

 - Fixed minor issues in the documentation found by Laurent Poirrier

 - Fixed strange behaviour when encountering another objective function.

 - Replaced my bool.h by stdbool.h

3.3.4  8. Mar 2017 Release

 - added cppcheck target to makefile

 - scan-build make OPT=dbg works

 - Corrected the spacing of the NAME field in MPS output.

 - Fixed bug in library call regarding setting
   the random seed by arguments.

 - Fixed two bugs in the examples of the documentation
   found by Maximilian Ernestus

3.3.3  1. Jul 2015 Release

 - Added Windows Makefile.

3.3.2 27. Feb 2014 Release

 - All -O6 changed to -O3 in submakefiles.

 - ZLIB=false works now.

 - Fixed bug when vif then or else is used with an
   non-linear function.

 - Fixed bug when using indicators with vif

 - Fixed bug that appeared when asking a param with a
   ranged index set and a default for a string entry.

3.3.1  9. Dec 2012 Release

 - Fixed bug when reading wrong index type.

 - Fixed bug with constants in non-linear expresions.

3.3.0 29. Jul 2012 Release

 - Added support for functions sqrt, exp, pow, log,
   ln, sgn, sgnpow, sin, cos, tan, abs
   in non-linear case.

 - Fixed bug with indicator constraints and >=

3.2.0 29. Oct 2011 Release

 - There are new Makefile variables SHARED and STATIC.
   If set either of them to true Zimpl will in some case
   be generated as a shared library or completly statically
   linked. Works for the moment for most gcc based targets.

 - Replaced a quadratic routine that could lead
   to excessive running times when generating constraints
   with many coefficients.

 - Restructured and documented the xlpglue interface.
   The documentation can not be generated by
   make doxygen

 - Removed the presolving option. This will be done
   at a later time in an independend program.

 - Made sure all warnings get silenced by -v0

 - Error 195 Genuine empty index set has been changed
   to Warning 195.

 - Zimpl now needs about 780 KB less stack space
   when using a read statement.

 - round() was working wrong with negative numbers.
   It shoud be now rounding to nearest integer by
   rounding half away from zero.

 - Implemented grouping of constraints. If two or more
   constraints are connected by "and" they can be used
   together within a forall or if.

 - It is now possible to conditional constraints without
   an else part.

 - Fixed bug in lp-file writer. Quadratic constraints are
   not to be divided by 2. Only objective functions.

3.1.0 30. Sep 2010 Release

 - Changed License to LGPL Version 3

 - Improved Documentation: Thanks Tuomo!

 - Experimental support for non-linear constraints.
   x*y*z and x^3 should work. Output either directly
   through the interface or in PIP format.

 - Reworked the file writing routines. Now supports
   PIP format. HUM and RLP format updated.

 - Fixed a bug that would happen in certain cases if a param
   is overridden by the commandline.

 - Fixed a bug in certain vif-then-else constructs.

 - Fixed a bug in the implementation of the xor operator on
   variables.

 - Speed up term processing significantly. Mostly needed for computer
   generated Zimpl programs with long explicit sums.

 - Possibly improved correct computation of operator precedences.

 - Parenthesis '(' ')' are now needed after min/max if no expression is evaluated.

 - Fixed bug in grammar: parse error at min({1..3})+2

3.0.0 10. Sep 2009 Release

 - New attribut for constraints: indicator
   If vif is part of the constraint it is modelled as an
   indicator constraint and not by an big-M formulation.

 - It is now possible to give attributes also to constraints
   which use vif.

 - New attribut for constraints: checkonly. Meaning as follows:
   separate: do not include in initial LP, separate later on,
             need not to be checked for feasibility
	     -> usercut in CPLEX
	     -> init=False,separate=True,check=False in SCIP
   checkonly: do not include in initial LP, separate only to
              check for feasibility.
	      -> Lazy cut in CPLEX
	      -> init=False,separate=False,check=True in SCIP
   It is possible to set both attributes. This will result
   in init=False,separate=True,check=True in SCIP and for
   the constraint to appear both in the User Cut and the
   Lazy Cut section in the LP file.

 - Fixed bug with extended functions in the objective

 - When using zpl_read* it is now possible to select whether
   Zimpl is doing GMP memory management.

 - Fixed bug in zpl_read_with_args

 - Constant computation are now pruned and not done repeatedly

 - Changed version naming scheme

 - Improved position of error pointer for some 133 errors

2.09 23. April 2009 Release

 - Fixed a bug leading to crashes at the end
   of the program especially on x86-64.

 - New round() function rounding towards zero.

 - It is now possible to read empty files.

2.08 26. Sep 2008 Release

 - Implemented subset(A, 3, 5) giving the all subsets with
   3, 4, and 5 elements.

 - Line length of program output as comment limited to 128 chars.

 - Updated SOS output. Now included into LPF and MPS output.
   No explicit .sos file is written anymore.

2.07 24. Aug 2007 Release

 - Fixed a bug in the new memory handling code.

 - Some changes in Makefiles, etc. to make it compatible
   with the ZIB Optimization Suite 1.0

2.06 02. Aug 2007 Release

 - If a variable is printed with "do print" the type and bounds
   of the variable are also given.

 - Implemented concatenating strings with the "+" operator.
   "hallo " + "wie" -> "hallo wie".

 - Removed a small bug which lead to incorrect variable names
   in the .tbl file if -l was used.

 - It is now possible to write out several strings and numbers
   with one PRINT statement. E.g.: do print "x= ", x, " m/s"

 - Improved memory handling for strings, tuples, and lists.

 - Implemented new file format RLP which permutes the
   order of the constraint and variables.

 - New parameter match "regular_expression" to the read
   function. If given, only those lines are read, which
   match the given expression.

 - New function substr(string_expression, start, length)
   returns the substring starting at start with the
   given length. In case start is negative, it is counted
   from the end of the string.

 - New function length(string_expression) returns the
   length of the string.

 - It is now possible to override a parameter value
   given in the Zimpl file with a command line -Dname=value.

 - Improved processing of initializer list for parameters and sets.
   Removed stack overflow for very long lists.

 - It is now possible to write
   var x <= if (test == 7) then 8 else infinity end;
   and similar.

 - Implemented "implicit" for binary and integer variables.

 - "{ }", "{  }", etc are now recognised as empty sets,
   not only "{}". Same for "<>".

 - The Zimpl-model is writte to the LP files as a comment.

 - It is now possible to have the output of a command as
   input to Zimpl.
      zimpl -P "cpp -DXXX=7 %s" test1.zpl
   will run test1.zpl through cpp with option -DXXX=7 and
   give the output to Zimpl.

 - A warning 215 is issued if the given start values violate a
   constraint.

 - If a .mst or .ord file is written, the constraints are tested
   against the given start values and a warning 215 is issued
   if a constraint is violated.

 - New product operator:
   prod <i> in I : p[i]
   computes the product of all p[i].

2.05 18. Sep 2006 Release

 - it is now possible to write just
   min A   or    max B   for a one dimensional set of numbers
   to get the minimum/maximum number of the set.

 - The maximum length for variable names can now be set with the
   "-l length" command line option.

 - If verbose is set to Normal (1) or Verbose (2)
   warnings are only given once per statement.

 - Fixed wrong precedence of ^ operator.

 - Using the Zimpl library without gmp is now possible.
   make libdbl will generate a Zimpl library that uses
   numbdbl.c instead of numbgmp.c. Be aware that the code
   is not testet and that using doubles has a lot of nasty
   problems, like what happens when you compare two numbers.

 - It is now possible to define function that have a
   boolen value, like
   defbool(a,b) := a != b and (a > 5 or c <= 7);

 - If boolean-expr THEN boolean-expr ELSE boolean-expr END
   is now possible.

 - It is now possible to read all values in a file
   into a set. { read "data.dat" as "<s+>" } will
   real all values one after the other and put them
   into the set. "<n+>" also works.

 - Fixed several bugs that occured when
   reading lines longer than 8192 bytes long.

 - New function "zpl_read_with_args" to allow
   processing of command line defines, -s seed and
   multi file input in embedded apllications.

 - Funktions argmin/argmax implemented:
   argmin(5) <i> in { 1 .. 100 } : abs(50 - i)
   will generate the set containing the indices of the
   five smallest |50-i| evaluations. Be aware that the
   the result is not neseccarily unambiguous since the index
   set i snot ordered. For example
   argmin <i> in { 1 .. 10 } : 5.
   In case of argmin(1) the "(1)" can be omitted.
   argmax is the same the other way around.

 - It is now possible to initialise parameters without giving the
   index tuple explicitly. Writing
   param a[{1..4}*{1..3}] := read "matrix.dat" as "n+" comment "#";
   with for example a file like
      1 2 3 4
      5 6 7 8    # here is a comment
      9 10 11 12
   or with a file like this
      1 2 3 4 5 6 7 8 9 10 11 12
   will result in
   a[1,1] = 1 ... a[4,3] = 12
   Excess elements in the files are ignored.
   If there are not enough elements in the file, the elements in the
   parameter will be undefined, or set to default if present.
   Use "s+" for strings.

 - Check was missing if the parameter from a file is indeed a number.
   Bug fixed regarding the field number given for tuple fields errors.

 - Input from stringfiles is now possible. This
   allows to embed Zimpl programs into other programs
   without using any external files.

 - Small bug in multi iterator validation fixed.

2.04 30. Jan 2006 Release

 - Funktion random(minimum, maximum) implemented, which
   generates (hopefully) uniformly distributed random values
   between minimum and maximum. (not very well tested)

 - A warning 203 is generated in many cases when the
   indexing tuple is completely fixed.

 - Objective function inversion warning for MPS files is
   now only issued once.

 - A constant value in the objective function is now translated
   automatically into a variable __ObjOffset. This works on
   all output formats.

 - powerset() is now also generating the empty set.

 - It is now possible to write:
   UNION <i> in I with i > 5 : A[i];
   INTER <i> in I with i > 5 : A[i];
   to get the union or intersetection of all the involved sets.

 - When initialising an indexed set with a list any "with" clause
   on the set expresion was ignored.

 - Error 195 was the same as 135. It is now all 135.
   Error 195 has a new meaning.

 - It is now possible to read a single value by
   param n := read "huhu.dat" as "4n" skip 4 use 1
   The above would read the fourth value in the fifth
   line of the file huhu.dat.

 - Fixed error in description of -n in -h output and some typos
   in the documentation.

 - Fixed problem when reading DOS format data files.
   The CR at the end of the line is now removed instead of being
   attached to the last field.

 - Fixed bug with IN operator and Rangesets.

 - It is now possible to build sets by indexing an
   expression: { <i> in I with i != 3 : p[i] }; or
   { <i,j> in A with i != 3 : <p[i],j+i,2> };

 - Special Ordered Sets (SOS) implemented. Thanks Daniel.

 - Changed a problem with the -n cf option due to a change in
   the LP file format specification.

 - Tabs are now allowed as separators after keywords (set, param, ...)

 - Control characters (notably CR from DOS files) are now
   ignored (treated as space) on input.

 - Zimpl is now build as a library to simplify incorporation
   into other programs.

2.03 2. Mar 2005 Release

 - If -v=0 ist set, most warnings are now suppressed.

 - Documentation improved.

 - Applying union, minus, intersection, or symmetric
   difference to two sets with tuples that have different component
   types will now result in a useful error message.

 - Fixed a bug that let unknown names evaluate to a member of a set.
   Example: subto c1: forall <i> in I do w[k] <= 1;
   did not result in an error.

 - Fixed a bug that made it possible to put an undefined name in a set.

 - There is now a difference between "to" and "..".
   "to" tries to do exactly what is requested possibly resulting in
   an empty set. ".." does as before its best to produce a range.

 - Fixed Bug in print command appearing in connection with default clause.

 - Fixed Bug in handling of set products.

 - Decreased memory consumption of hash tables.

 - Slightly faster string hashing.

 - Improved error handling for wrong components in sets.

2.02 15. May 2004 Release

 - New function ordinal ord(s,t,c) implemented.
   While there is no specific order, all sets have one.
   That is ord will evaluate to the c-th component of the t-th
   tuple in set s. ord({1..10}*{"a","b"}, 3, 1) is something
   between 1 and 10, possibly 3. But doing
   do forall <i> in {1..card(I)} do print ord(E,i,1);
   will print every element in I if it is one dimensional.

 - Improved detection of incorrect initialization of sets and params.

 - Bug in mod function fixed. Before mod gave the wrong result,
   if the two numbers had factors in common.

 - New -m switch that will write a CPLEX MST file with MIP starting values.

 - Complete new Set implementation.

 - If verbose is >= 3, the local variable
   stack is printed if an error occurs.

 - Makefile changed to support Mac OS-X.

 - New -V flag to show the version number.
   -h now also prints the banner text.

 - man page created

2.01 29. Oct 2003 Release

 - min/max over a indexed set of numbers, will now issue a warning,
   if the index set is empty.

 - Preprocessing is now switched on with the -O (optimize) switch.

 - Fixed a major bug that occured, if two number
   were subtracted from a constraint like in x - 5 + 3 >= 1

 - Documentation update. Many spelling errors removed.
   do print and do check statements documented.

 - vif and vabs implemented. See documentation for details.

 - set implementation changed. Generated powersets
   and subsets do not use a hash table anymore.
   This should reduce memory consumption, but
   might slow things down a little bit.

 - xor implemented.

 - Fixed bug in presolve that resulted in fixed
   variables not removed.

 - Missing linefeed in hum format fixed.

 - Implemented "check" statement.

 - Implemented the "do" statement. This changes the
   syntax for print. It is now "do print".
   Now "do forall <i> in I do print i; " is possible.

 - Error 163 now shows the location of the error.
   (Always start of the line ;-)

 - It is now possible to define non indexed parameters
   on the command line. -Dpeng=12 is equivalent to
   param peng := 12; in the Zimpl file.

 - <,<=,>=,> for strings implemented.

 - Function sqrt() implemented.

 - Functions log(), ln(), exp() reactivated.

 - Some error cases of parameter input
   were not handled correctly.

 - Table input for parameter implemented.

 - if for contstraints and summands implemented.

 - if for set expressions implemented.

 - Self defined functions implemented.

2.00 17. Sep 2003 Release

 - Function sgn(expr) implemented.

 - Fixed a bug in the set range routine. Now ranges with
   negative numbers are allowed.

 - Fixed bugs with MPS format.

 - New output format "hum" for -t parameter generates unmangled human readable,
   maschine unreadble LP format output. This replaces the -m switch.

 - Changed -v switch to -v0..3 and also the outputs that appear by default.

 - It is now possible to omit the .zpl extension on the input files.

 - Changed output routine, so that it should work
   even with with braindead OS like Windoof.
   Also allowed to use a different directory separator.

 - Trailing text on the last line should now draw a message.

 - Bug fixed, that resulted in an unreadable LP file
   if the index set of the variable has negative numbers.

 - Fixed bug, that cut extensions from basenames given by -o .

 - Fixed internal bug with bool not function.

 - We now get an error message instead of an abort()
   if the initialisation list of an parameter is empty.

 - New functions min/max that take a list of expression,
   like min(2, 5, a[4], b[7] / 2); (a and b are parameters)

 - Included zlib. It is now possible to read in .gz transparantly.

 - New function exists() that looks if a set has
   at least one member, e.g. exists( <i> in I with i > 5 )
   should be equivatent to card( { <i> in I with i > 5 }) > 0

 - Better diagnosis if a variable/parameter/set name is used a second time.

 - It is now possible to have contraint/obective names
   that are identical to variable/parameter/set names.

 - Changed gererated numbers for long names to hex. This needs less space.

 - Names are now 8 characters long for MPS output,
   but 16 for LPF. This is accroding to the CPLEX 7.0
   specification. Starting at 8.0 it is possible to
   have 255 character long names, we want to stay
   compatible with the older versions.

 - Changed the syntax for set initialisation.
   if an indexset is assigned it has to be included in
   braces like set A := { <i> in I with i > 5 }

 - It is now possible to write { <a> in A with a > 5 }
   whenever a set is needed. This means also it is now
   possible to nest indexsets, like in
   { <i> in { <k> in C with k > 2 } with i mod 2 == 0 }

 - Ranges are now possible: 7 <= 5x + 6 y <= 99
   (MPS output not yet here)

 - First presolve implemented.
   -p now switches on presolve, -F does what -p did before.

 - Fixed bug that empty constraints were ignored,
   even with a non zero right hand side.

 - Changed everything to rational numbers (GMP)
   (Funktions exp, log, ln, rand are out of order)

 - Fixed that variable which were not part of a constraint,
   were omitted in the Bounds section of the LPF/MPS file.

 - new -m switch to write unmangled lp file.

1.05 23. Mar 2003 Release

 - make check now works.

 - Removed senseless default in non indexed parameter.

 - New Makefile that allows different architectures in parallel.

 - Replaced rbt functions by a hash table. Mainly for portability.

 - Fixed bug in print statement that accured when trying to
   print a indexed set, without giving an index.

 - It is now allowed to use a WITH clause in the initialisation
   of parameters, variables and sets, like
   param x[<i> in I with i > 5] := i * 4;

 - Fixed bug that accured in the following case:
   param x[<"1", i> in A] := i * 4;

 - The number of elements in a set is now estimated and the
   hash table is sized accordingly. This should same some
   memory especially with the powerset function.

 - Fixed bug in param initialisation which set the type
   of the param always to NUMB.

 - Changes param initialsation. STRG values are allowed
   within indexed intialiszations.

 - Changed IF command. It can now handle (in principle) all
   types as return values, but only NUMB, STRG, NAME are
   allowed by the parser.

 - Change the implementation of SUM command. Major speedup.

 - Implemented random(min, max) generates a random number between min and max.
   At the moment rand() is used, but this will change.

 - It is now possible to have a default value for a parameter.
   param p[A] := <1> 1, <2> 2 default 99
   will declare all p[i] with i in A and not 1 or 2 to return 99.

 - Corrected a typo, that resulted in .orf files instead of .ord

 - sym_lookup is now resolved in the scanner (speedup).

 - Added new flag -p "filter" which pipes the output
   through the filter, enabling for example compression.
   (Daniels idea)

 - The output files will be created in the current directory,
   if no -o flag is given. If it is present the name and path
   given will be used.

 - New possible value infinit/-infinity for upper/lower bounds.

 - We might display a warning if writing to a file fails somewhere in the middle.

 - When writing MPS there is a warning if the problem was inverted.

 - Warning about different dimension tuples prints tuples.

 - Tabs are now allowed at the start of a statement.

 - Non integral variable bounds for integral Variables are
   Warned about and fixed.

 - Bug fixed, that would not only set one variable from integer
   to binary, but all that would follow in the set also.

 - New function powerset(N) implemented. This generates all subsets
   of N. Example: set S[] = powerset(N);

 - New statement print started.

 - Function subsets(N, k) implemented. This generates all
   subsets of N with k elements. It is now possible to leave out
   the indexing subset in a set declaration. So
   set S[] := subsets(N, 3);
   is valid. Additional the new function indexset(S) returns the
   index set of S.

 - Indexed Sets implemented.

 - added "!" factorial function.

 - log, ln, exp where missing in the parser and the documentation.

1.04 20. Oct 2002 Release

 - Bug fixed in storage of variable and constraint names.

 - Grammar fixed, since trailing '*' expr of vexpr where not parsed.

 - Only variables that are written to the LP are written to the
   ".tbl" file.

 - Fixed a bug that would discard free variables with non zero costs.

 - Changed the output of the ".tbl" file. Now also the long constraint
   names are enclosed in doublequotes.

 - New options -n cm|cn|cf that control how the constraints in the
   LPF/MPS file are named. "cm" will number them 1..n with a "c"
   in front. "cn" will use the name supplied in the subto statement
   and number them 1..n within the statement. "cf" will use the
   name of the subto, then a 1..n number like in "cm" and then append
   all the local variables from the forall statements.
   (It is open if the "f" in "cf" stands for "full" or for "fuegenschuh".)

 - Grammar changed again, to allow x/3 as shorthand for x * 1/3

 - Changed grammar again, to get rid of conflicts.

 - A union B does no longer warn about dublicate elements.
   This should also speed up oder set operations a bit.

 - The read template syntax is checked more precice.

 - Integer variables with bounds [0,1] are automatically changed
   to binary variables.

 - New function proj(set,tuple) wich projects a set to the elements
   of the tuple given. Example:
   set A := { 1 to 9 } * { 10 to 19 } * { "A","B" };
   set B := proj(A, <3,1>)
   will give: <"A",1>, <"A",2"> ... <"B",9>

 - Bug fixed, dublicate constraint names now give an error message.

 - New functions log(x), ln(x) and exp(x), meaning
   logarithm to base 10, natural logarithm and e^x.

 - It is now possible to have variables on both sides of an
   inequality. "x[1] <= y[1]" is now supported.

 - Changed the parser to (hopefully) correct parse inequalites in
   all possible varietes. This includes nested sums and coefficents
   at all places.

1.03 31. Jul 2002 Release

 - A division by Zero now gives an error message
   (instead of an exception or whatever)

 - It is now possible to assign a qualified set expression
   to a set, like
   set C := <i,j> in A * B with i < j;

 - It is now possible to nest "forall" statements. This
   can vastly reduce the memory needed, because it is no
   longer neccessary to build big cross products to loop
   over them.
   So instead of
      forall <i,j> in I * J with i < j do
   it is possible to write
      forall <i> in I do forall <j> in J with i < j do

 - elems where now reused, this reduces the memory needed.

 - changed to not copy in principle const objects, this should
   have improved speed.

1.02 05. Jul 2002 Release

 - new functions FLOOR(expr) and CEIL(expr) which find the
   next integer down and up.

 - Bug fixed in MPS output that lets zimpl write BOUND lines
   for variables that are not used.

 - new flag -r that write a CPLEX branching order file (.ord).
   Two new attributes for variables:
   "priority expr" sets the branching priority for the variable.
   "startval expr" sets the start values for the variable

 - new function ABS(expr) that returns the absolut value of expr.

 - new function CARD(set) that computes the cardinality of a set.

 - memory leak pugged, that occured when summing over a restricted set.

 - added possiblility to initialise parameter per set element,
   the same way as variables.

 - the row scaling factor is now also printed in the .tbl file.

 - Added "attributes" to the constraints. At the moment the following
   are understood:
   scale : scales the constraint before writing the LP file.
      After scaling the absolut larges coefficient will be one.
   separate : Means "this constraint should be separated".
      At the moment, such constraints are written in an "User constraint"
      section in the LP-File. But CPlex does not recognise this.

 - "sum" is now also valid for expressions without variables.

 - Fixed error in LPF Writing Routine, that would write "Inf"
   instead of "+Inf".

 - Wrong template in read now gives an error message instead of
   an segment violation.

1.01 30. Oct 2001 Bug fix release

 - Added several missing const's to the code.

 - Unterminated string constants where not reported as errors.
   This led to very irritating behavior. Fixed.

 - Since it is possible that string type set members include spaces,
   the "real" name in the .tbl file is now surrounded by doublequotes.
   (I am not totally sure this is a good idea. Maybe I should just,
   change all spaces to underscores.)

 - It is now possible to write -x[3] in a constraint. Before
   it was neccessary to write -1*x[3].

 - Changed the field splitting for the read statement. The FS
   keyword is gone. Read now tries to do the "right" thing.
   Look at the documentation for details.

 - When writing LP-format files, one's as coefficents are
   no longer written. This makes the files somewhat shorter.

 - -d (Debug) Option is no longer be ignored.

 - Default field separators for the read statement are
   now <space>, <;> and <tab> (<tab> is new).

 - Fixed one minor malloc error with the include statement.

 - Removed all uses of alloca() for better AIX compatibility.

 - String valued parameters now work.

1.00 09. Oct 2001 Initial release