Looking through the code and changing it as shown bellow I'm now getting
the same result as AMPL/GAMS.
====
-------------------------------- src/mpl/mpl3.c
--------------------------------
index 91380e8..93ac77b 100644
@@ -121,7 +121,9 @@ double fp_idiv(MPL *mpl, double x, double y)
--
-- This routine computes the remainder of exact division x mod y.
--
--- NOTE: By definition x mod y = x - y * floor(x / y). */
+-- NOTE: By definition x mod y = x - y * floor(x / y).
+--
+-- DAD NOTE: modified to match the result from AMPL/GAMS */
double fp_mod(MPL *mpl, double x, double y)
{ double r;
@@ -131,11 +133,13 @@ double fp_mod(MPL *mpl, double x, double y)
else if (y == 0.0)
r = x;
else
- { r = fmod(fabs(x), fabs(y));
- if (r != 0.0)
+ { r = fmod(x, y);
+ /*
+ r = fmod(fabs(x), fabs(y));
+ if (r != 0.0)
{ if (x < 0.0) r = - r;
if (x > 0.0 && y < 0.0 || x < 0.0 && y > 0.0) r += y;
- }
+ }*/
}
return r;
}
====
Cheers !
On 15/8/21 21:06, Domingo Alvarez Duarte wrote:
Definitely the way GMPL/GLPK calculates the modulo of a negative
number is wrong:
====
param a := 4;
param b := 3;
param c := a mod b;
param d := a - c;
param a2 := -4;
param b2 := 3;
param c2 := a2 mod b2;
param d2 := a2 - c2;
display a, b, c, d, a2, b2, c2, d2;
====
AMPL output:
====
ampl test4.ampl
a = 4
b = 3
c = 1
d = 3
a2 = -4
b2 = 3
c2 = -1
d2 = -3
====
GMPL/GLPK/GLPSOL output:
====
glpsol -m test4.ampl
GLPSOL: GLPK LP/MIP Solver, v4.65-ex, glp_double size 8
Parameter(s) specified in the command line:
-m test4.ampl
Reading model section from test4.ampl...
test4.ampl:12: warning: unexpected end of file; missing end statement
inserted
12 lines were read
Display statement at line 12
a = 4
b = 3
c = 1
d = 3
a2 = -4
b2 = 3
c2 = 2
d2 = -6
...
====
Cheers !
On 15/8/21 16:50, Heinrich Schuchardt wrote:
On 8/15/21 4:06 PM, Domingo Alvarez Duarte wrote:
Comparing how AMPL and GMPL calculate random expressions I found
some of
then where they differ or GMPL can't manage see bellow, also one of
then
that references itself makes glpsol segfault but ampl gives an error
I can't see a segfault with GLPK 5.0.
Please, use gdb to identify in which line of code it occurs:
gdb --args glpk -m test.od
message explaining the problem:
====
param a0 := (((((((788)*(8.46))))+8342*1.803-1))*4186.4*(15));
printf "%f\n", a0;
param a1 := (((22 mod 284/((7530/((2)*(((((25))-421))))))*597 mod
2663)+7283.8-9.60+167 mod ((3))))+(8871);
printf "%f\n", a1;
#param a2 := a1 * a2; #glpsol segfault
param a2 := a0 * a1;
printf "%f\n", a2;
param a = (((((((788)*(8.46))))+8342*1.803-1))*4186.4*(15))*(((22 mod
Your syntax is wrong. This should be:
param a :=
With correct syntax:
glpsol -m /tmp/test.mod
GLPSOL: GLPK LP/MIP Solver, v4.65
Parameter(s) specified in the command line:
-m /tmp/test.mod
Reading model section from /tmp/test.mod...
28 lines were read
1363056632.376000
17428.775299
23756407765226.851562
11664732388290.359375
11665910614443.386719
8259816920615.111328
8259816920615.111328
Model has been successfully generated
Best regards
Heinrich
284/((7530/((2)*(((((25))-421))))))*597 mod 2663)+7283.8-9.60+167 mod
((3))))+(8871);
#param a := 3+2;
printf "%f\n", a;
param b = (((((((788)*(8.46))))+8342*1.803-1))*4186.4*(15))*(((22 mod
284/((7530/((2)*(((((25))-421))))))*597 mod 2663)+7283.8-9.60+167.8644
mod ((3))))+(8871);
#param a := 3+2;
printf "%f\n", b;
param c =
(((((((788)*(8.46))))+8342*1.803-1))*4186.4*(15))*(((22/((7530/((2)*(((((25))-421))))))*597)+7283.8-9.60+167))+(8871);
#param a := 3+2;
printf "%f\n", c;
param d =
(((((((788.0)*(8.46))))+8342.0*1.803-1.0))*4186.4*(15.0))*(((22.0/((7530.0/((2.0)*(((((25.0))-421))))))*597.0)+7283.8-9.60+167.0))+(8871.0);
#param a := 3+2;
printf "%f\n", d;
====
AMPL output:
====
ampl test.ampl
1363056632.376000
14765.775299
20126587953209.562500
8034912576273.071289
8036090802426.097656
8259816920615.111328
8259816920615.111328
====
GLPSOL output:
====
glpsol -m test.ampl
GLPSOL: GLPK LP/MIP Solver, v4.65
Parameter(s) specified in the command line:
-m test.ampl
Reading model section from test.ampl...
test.ampl:25: warning: unexpected end of file; missing end statement
inserted
25 lines were read
1363056632.376000
17428.775299
23756407765226.851562
test.ampl:13: no value for a
MathProg model processing error
====
With a incorrect expression:
====
param a2 := a1 * a2; #glpsol segfault
#param a2 := a0 * a1;
====
AMPL output:
====
ampl test.ampl
1363056632.376000
14765.775299
test.ampl, line 7 (offset 228):
a2 is not defined
context: param a2 := a1 * >>> a2; <<< #glpsol segfault
====
GLPSOL output:
====
glpsol -m test.ampl
GLPSOL: GLPK LP/MIP Solver, v4.65
Parameter(s) specified in the command line:
-m test.ampl
Reading model section from test.ampl...
test.ampl:25: warning: unexpected end of file; missing end statement
inserted
25 lines were read
1363056632.376000
17428.775299
Segmentation fault (core dumped)
====
Cheers !