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
|
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
|