On Mon, Jun 25, 2012 at 05:42:23PM +0400, Andrew Makhorin wrote:
> > I guess my question is, can I model these large numbers with GLPK and if
> > so, can glpsol print the unrounded outcomes of variables? Is my approach
> > just fundamentally flawed altogether?
> 
> All glpk routines use 64-bit floating-point arithmetic. (The only
> exception is the exact simplex solver, which converts input data from
> the floating-point format to rational numbers, solves the lp instance in
> rationals, and then converts the solution from rationals back to the
> floating-point format.) Thus, it is impossible to use exact arithmetic
> in MathProg models as well as to obtain solutions in that format.

Thanks for the clarification. So I figure I should be fine to analyse 32-bit
numbers; plenty of precision.

However, I am seeing some strange results when using large numbers in
[-2^32, 2^32]. If I am interpreting the glpsol output correctly, I think
we may have a bug on our hands (or maybe I have misunderstood). Let me try to
explain:

I am looking at this constraint (in GNU mathprog syntax):

s.t. c13: -4294967296 * dcsn_lte_0 + 1 * u_EAX_4008e0 <= 4;

The idea here is that dcsn_lte_0 must equal 1 to satisfy this constraint
if u_EAX_4008e0 is strictly greater than 4. The types of these variables
are as follows:

var dcsn_lte_0, binary;
var u_EAX_4008e0, >=0, <= 4294967295;

The latter variable is representing a unsigned 32-bit integer.

When this is solved (with --exact --noscale), glpsol tells me "INTEGER
OPTIMAL SOLUTION FOUND" and the variable assignments in the solution are
as follows:

No.    Column name       Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
18 dcsn_lte_0   *              0             0             1
35 u_EAX_4008e0                9             0   4.29497e+09

and the row solution:

No.    Row name        Activity      Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
15     c13                   9                           4

If we plug the assignment into the original constraint, then we get:

-4294967296 * 0 + 1 * 9 <= 4
therefore: 9 <= 4

Which is false, so under this assignment the system in infeasible. The solver
should have either tried a different assignment of either variables, or if it
could not, then it should have reported the problem infeasible? Right?

This only seems to happen with 32-bit numbers. If I analyse 16-bit numbers, all
is well, so I wonder if it is precision based in some way.

Is this a bug, a misuse of glpk or a misunderstanding?

My environment:
OpenBSD-current/amd64 with glpk-4.47 (same result from glpk-4.44).

Also tried (with similar results) on:
Ubuntu-11.10/i686 with glpk-4.43

I am attaching my .mod file and .sol file. I apologise that the mod file is
not very readable; it was auto-generated.

I hope that is enough information. Cheers

-- 
Best Regards
Edd Barrett

http://www.theunixzoo.co.uk
var u_EBX_4008e5_blk_ex, >=0, <= 4294967295;
var u_EAX_4008e0_blk_ex_T, >=0, <= 4294967295;
var u_EBX_4008e7_blk_ex, >=0, <= 4294967295;
var l_EAX_4008e0, >=0, <= 4294967295;
var l_EAX_4008e3, >=0, <= 4294967295;
var l_EAX_4008e5, >=0, <= 4294967295;
var l_EAX_4008e7, >=0, <= 4294967295;
var l_EAX_4008e6, >=0, <= 4294967295;
var u_EAX_4008e0_blk_ex_F, >=0, <= 4294967295;
var rch_blk_4008e0_ent, binary;
var u_EAX_4008e5_blk_ex, >=0, <= 4294967295;
var u_EBX_4008e0_blk_ex_F, >=0, <= 4294967295;
var l_EAX_4008e0_blk_ex_T, >=0, <= 4294967295;
var l_EAX_4008e7_blk_ex, >=0, <= 4294967295;
var dcsn_lte_3, binary;
var dcsn_lte_2, binary;
var dcsn_lte_1, binary;
var dcsn_lte_0, binary;
var l_EAX_4008e0_blk_ex_F, >=0, <= 4294967295;
var u_EBX_4008e0_blk_ex_T, >=0, <= 4294967295;
var l_EBX_4008e5_blk_ex, >=0, <= 4294967295;
var rch_blk_4008e0_ex_F, binary;
var u_EBX_4008e0, >=0, <= 4294967295;
var u_EBX_4008e3, >=0, <= 4294967295;
var u_EBX_4008e5, >=0, <= 4294967295;
var u_EBX_4008e7, >=0, <= 4294967295;
var u_EBX_4008e6, >=0, <= 4294967295;
var rch_blk_4008e0_ex_T, binary;
var u_EAX_4008e5, >=0, <= 4294967295;
var rch_blk_4008e0_pred_T, binary;
var l_EBX_4008e7_blk_ex, >=0, <= 4294967295;
var rch_blk_4008e5_ex, binary;
var rch_blk_4008e5_ent, binary;
var u_EAX_4008e3, >=0, <= 4294967295;
var u_EAX_4008e0, >=0, <= 4294967295;
var u_EAX_4008e6, >=0, <= 4294967295;
var u_EAX_4008e7, >=0, <= 4294967295;
var rch_blk_4008e0_pred_F, binary;
var l_EAX_4008e5_blk_ex, >=0, <= 4294967295;
var rch_blk_4008e7_ex, binary;
var l_EBX_4008e0_blk_ex_F, >=0, <= 4294967295;
var l_EBX_4008e3, >=0, <= 4294967295;
var l_EBX_4008e0, >=0, <= 4294967295;
var l_EBX_4008e6, >=0, <= 4294967295;
var l_EBX_4008e7, >=0, <= 4294967295;
var rch_blk_4008e7_ent, binary;
var l_EBX_4008e5, >=0, <= 4294967295;
var u_EAX_4008e7_blk_ex, >=0, <= 4294967295;
var dcsn_and_5, binary;
var dcsn_and_4, binary;
var l_EBX_4008e0_blk_ex_T, >=0, <= 4294967295;
minimize obj_fn: + 1 * u_EAX_4008e0 -1 * l_EAX_4008e0 + 1 * u_EBX_4008e0 -1 * 
l_EBX_4008e0 + 1 * u_EAX_4008e3 -1 * l_EAX_4008e3 + 1 * u_EBX_4008e3 -1 * 
l_EBX_4008e3 + 1 * u_EAX_4008e0_blk_ex_T -1 * l_EAX_4008e0_blk_ex_T + 1 * 
u_EBX_4008e0_blk_ex_T -1 * l_EBX_4008e0_blk_ex_T + 1 * u_EAX_4008e0_blk_ex_F -1 
* l_EAX_4008e0_blk_ex_F + 1 * u_EBX_4008e0_blk_ex_F -1 * l_EBX_4008e0_blk_ex_F 
+ 1 * u_EAX_4008e7 -1 * l_EAX_4008e7 + 1 * u_EBX_4008e7 -1 * l_EBX_4008e7 + 1 * 
u_EAX_4008e7_blk_ex -1 * l_EAX_4008e7_blk_ex + 1 * u_EBX_4008e7_blk_ex -1 * 
l_EBX_4008e7_blk_ex + 1 * u_EAX_4008e5 -1 * l_EAX_4008e5 + 1 * u_EBX_4008e5 -1 
* l_EBX_4008e5 + 1 * u_EAX_4008e6 -1 * l_EAX_4008e6 + 1 * u_EBX_4008e6 -1 * 
l_EBX_4008e6 + 1 * u_EAX_4008e5_blk_ex -1 * l_EAX_4008e5_blk_ex + 1 * 
u_EBX_4008e5_blk_ex -1 * l_EBX_4008e5_blk_ex ;

s.t. c0: + 1 * l_EAX_4008e0 -1 * u_EAX_4008e0 <= 0;
s.t. c1: + 1 * l_EBX_4008e0 -1 * u_EBX_4008e0 <= 0;
s.t. c2: + 1 * l_EAX_4008e3 -1 * u_EAX_4008e3 <= 0;
s.t. c3: + 1 * l_EBX_4008e3 -1 * u_EBX_4008e3 <= 0;
s.t. c4: + 1 * l_EAX_4008e3 -1 * l_EAX_4008e0 = 0;
s.t. c5: + 1 * u_EAX_4008e3 -1 * u_EAX_4008e0 = 0;
s.t. c6: + 1 * l_EBX_4008e3 -1 * l_EBX_4008e0 = 0;
s.t. c7: + 1 * u_EBX_4008e3 -1 * u_EBX_4008e0 = 0;
s.t. c8: + 1 * l_EAX_4008e0_blk_ex_T -1 * u_EAX_4008e0_blk_ex_T <= 0;
s.t. c9: + 1 * l_EBX_4008e0_blk_ex_T -1 * u_EBX_4008e0_blk_ex_T <= 0;
s.t. c10: + 1 * l_EAX_4008e0_blk_ex_F -1 * u_EAX_4008e0_blk_ex_F <= 0;
s.t. c11: + 1 * l_EBX_4008e0_blk_ex_F -1 * u_EBX_4008e0_blk_ex_F <= 0;
s.t. c12: + 4294967296 * dcsn_lte_0 -1 * u_EAX_4008e0 <= 4294967291;
s.t. c13: -4294967296 * dcsn_lte_0 + 1 * u_EAX_4008e0 <= 4;
s.t. c14: + 1 * rch_blk_4008e0_pred_T -1 * dcsn_lte_0 = 0;
s.t. c15: -1 * u_EAX_4008e0 + 1 * u_EAX_4008e0_blk_ex_T = 0;
s.t. c16: -1 * l_EAX_4008e0 + 4294967296 * dcsn_lte_1 <= 4294967291;
s.t. c17: + 1 * l_EAX_4008e0 -4294967296 * dcsn_lte_1 <= 4;
s.t. c18: + 1 * l_EAX_4008e0_blk_ex_T -1 * l_EAX_4008e0 + 4294967296 * 
dcsn_lte_1 <= 4294967296;
s.t. c19: + 1 * l_EAX_4008e0_blk_ex_T -4294967296 * dcsn_lte_1 <= 5;
s.t. c20: + 4294967296 * dcsn_lte_2 + 1 * l_EAX_4008e0 <= 4294967300;
s.t. c21: -4294967296 * dcsn_lte_2 -1 * l_EAX_4008e0 <= -5;
s.t. c22: + 1 * rch_blk_4008e0_pred_F -1 * dcsn_lte_2 = 0;
s.t. c23: -1 * l_EAX_4008e0 + 1 * l_EAX_4008e0_blk_ex_F = 0;
s.t. c24: + 4294967296 * dcsn_lte_3 + 1 * u_EAX_4008e0 <= 4294967300;
s.t. c25: -4294967296 * dcsn_lte_3 -1 * u_EAX_4008e0 <= -5;
s.t. c26: + 4294967296 * dcsn_lte_3 -1 * u_EAX_4008e0_blk_ex_F + 1 * 
u_EAX_4008e0 <= 4294967296;
s.t. c27: -4294967296 * dcsn_lte_3 -1 * u_EAX_4008e0_blk_ex_F <= -4;
s.t. c28: + 1 * l_EBX_4008e0_blk_ex_T -1 * l_EBX_4008e3 = 0;
s.t. c29: + 1 * u_EBX_4008e0_blk_ex_T -1 * u_EBX_4008e3 = 0;
s.t. c30: + 1 * l_EBX_4008e0_blk_ex_F -1 * l_EBX_4008e3 = 0;
s.t. c31: + 1 * u_EBX_4008e0_blk_ex_F -1 * u_EBX_4008e3 = 0;
s.t. c32: -2 * dcsn_and_4 + 1 * rch_blk_4008e0_ent + 1 * rch_blk_4008e0_pred_T 
<= 1;
s.t. c33: + 2 * dcsn_and_4 -1 * rch_blk_4008e0_ent -1 * rch_blk_4008e0_pred_T 
<= 0;
s.t. c34: + 1 * rch_blk_4008e0_ex_T -1 * dcsn_and_4 = 0;
s.t. c35: + 1 * rch_blk_4008e0_pred_F + 1 * rch_blk_4008e0_ent -2 * dcsn_and_5 
<= 1;
s.t. c36: -1 * rch_blk_4008e0_pred_F -1 * rch_blk_4008e0_ent + 2 * dcsn_and_5 
<= 0;
s.t. c37: + 1 * rch_blk_4008e0_ex_F -1 * dcsn_and_5 = 0;
s.t. c38: + 1 * l_EAX_4008e7 -1 * u_EAX_4008e7 <= 0;
s.t. c39: + 1 * l_EBX_4008e7 -1 * u_EBX_4008e7 <= 0;
s.t. c40: + 1 * l_EAX_4008e7_blk_ex -1 * u_EAX_4008e7_blk_ex <= 0;
s.t. c41: + 1 * l_EBX_4008e7_blk_ex -1 * u_EBX_4008e7_blk_ex <= 0;
s.t. c42: + 1 * l_EAX_4008e7_blk_ex -1 * l_EAX_4008e7 = 0;
s.t. c43: + 1 * u_EAX_4008e7_blk_ex -1 * u_EAX_4008e7 = 0;
s.t. c44: + 1 * l_EBX_4008e7_blk_ex -1 * l_EBX_4008e7 = 0;
s.t. c45: + 1 * u_EBX_4008e7_blk_ex -1 * u_EBX_4008e7 = 0;
s.t. c46: + 1 * rch_blk_4008e7_ex -1 * rch_blk_4008e7_ent = 0;
s.t. c47: + 1 * l_EAX_4008e5 -1 * u_EAX_4008e5 <= 0;
s.t. c48: + 1 * l_EBX_4008e5 -1 * u_EBX_4008e5 <= 0;
s.t. c49: + 1 * l_EAX_4008e6 -1 * u_EAX_4008e6 <= 0;
s.t. c50: + 1 * l_EBX_4008e6 -1 * u_EBX_4008e6 <= 0;
s.t. c51: + 1 * l_EAX_4008e6 -1 * l_EAX_4008e5 = 0;
s.t. c52: + 1 * u_EAX_4008e6 -1 * u_EAX_4008e5 = 0;
s.t. c53: + 1 * l_EBX_4008e6 -1 * l_EBX_4008e5 = 0;
s.t. c54: + 1 * u_EBX_4008e6 -1 * u_EBX_4008e5 = 0;
s.t. c55: + 1 * l_EAX_4008e5_blk_ex -1 * u_EAX_4008e5_blk_ex <= 0;
s.t. c56: + 1 * l_EBX_4008e5_blk_ex -1 * u_EBX_4008e5_blk_ex <= 0;
s.t. c57: + 1 * l_EAX_4008e5_blk_ex -1 * l_EAX_4008e6 = 0;
s.t. c58: + 1 * u_EAX_4008e5_blk_ex -1 * u_EAX_4008e6 = 0;
s.t. c59: + 1 * l_EBX_4008e5_blk_ex -1 * l_EBX_4008e6 = 0;
s.t. c60: + 1 * u_EBX_4008e5_blk_ex -1 * u_EBX_4008e6 = 0;
s.t. c61: + 1 * rch_blk_4008e5_ex -1 * rch_blk_4008e5_ent = 0;
s.t. c62: + 1 * l_EAX_4008e0 = 8;
s.t. c63: + 1 * u_EAX_4008e0 = 9;
s.t. c64: + 1 * l_EBX_4008e0 = 0;
s.t. c65: + 1 * u_EBX_4008e0 = 4294967295;
s.t. c66: + 1 * rch_blk_4008e0_ent = 1;
s.t. c67: + 1 * rch_blk_4008e7_ent -1 * rch_blk_4008e0_ex_T = 0;
s.t. c68: -1 * l_EAX_4008e0_blk_ex_T + 1 * l_EAX_4008e7 + 4294967296 * 
rch_blk_4008e7_ent <= 4294967296;
s.t. c69: + 4294967296 * rch_blk_4008e7_ent + 1 * u_EAX_4008e0_blk_ex_T -1 * 
u_EAX_4008e7 <= 4294967296;
s.t. c70: + 4294967296 * rch_blk_4008e7_ent -1 * l_EBX_4008e0_blk_ex_T + 1 * 
l_EBX_4008e7 <= 4294967296;
s.t. c71: + 1 * u_EBX_4008e0_blk_ex_T + 4294967296 * rch_blk_4008e7_ent -1 * 
u_EBX_4008e7 <= 4294967296;
s.t. c72: + 1 * rch_blk_4008e5_ent -1 * rch_blk_4008e0_ex_F = 0;
s.t. c73: + 1 * l_EAX_4008e5 + 4294967296 * rch_blk_4008e5_ent -1 * 
l_EAX_4008e0_blk_ex_F <= 4294967296;
s.t. c74: -1 * u_EAX_4008e5 + 4294967296 * rch_blk_4008e5_ent + 1 * 
u_EAX_4008e0_blk_ex_F <= 4294967296;
s.t. c75: + 1 * l_EBX_4008e5 + 4294967296 * rch_blk_4008e5_ent -1 * 
l_EBX_4008e0_blk_ex_F <= 4294967296;
s.t. c76: -1 * u_EBX_4008e5 + 4294967296 * rch_blk_4008e5_ent + 1 * 
u_EBX_4008e0_blk_ex_F <= 4294967296;
Problem:    glpsol
Rows:       78
Columns:    51 (15 integer, 15 binary)
Non-zeros:  199
Status:     INTEGER OPTIMAL
Objective:  obj_fn = 1.717986918e+10 (MINimum)

   No.   Row name        Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 obj_fn            1.71799e+10                             
     2 c0                         -1                          -0 
     3 c1               -4.29497e+09                          -0 
     4 c2                         -1                          -0 
     5 c3               -4.29497e+09                          -0 
     6 c4                          0            -0             = 
     7 c5                          0            -0             = 
     8 c6                          0            -0             = 
     9 c7                          0            -0             = 
    10 c8                         -1                          -0 
    11 c9               -4.29497e+09                          -0 
    12 c10                         0                          -0 
    13 c11              -4.29497e+09                          -0 
    14 c12                        -9                 4.29497e+09 
    15 c13                         9                           4 
    16 c14                         0            -0             = 
    17 c15                         0            -0             = 
    18 c16               4.29497e+09                 4.29497e+09 
    19 c17              -4.29497e+09                           4 
    20 c18               4.29497e+09                 4.29497e+09 
    21 c19              -4.29497e+09                           5 
    22 c20                         8                 4.29497e+09 
    23 c21                        -8                          -5 
    24 c22                         0            -0             = 
    25 c23                         0            -0             = 
    26 c24                         9                 4.29497e+09 
    27 c25                        -9                          -5 
    28 c26                         1                 4.29497e+09 
    29 c27                        -8                          -4 
    30 c28                         0            -0             = 
    31 c29                         0            -0             = 
    32 c30                         0            -0             = 
    33 c31                         0            -0             = 
    34 c32                         1                           1 
    35 c33                        -1                          -0 
    36 c34                         0            -0             = 
    37 c35                         1                           1 
    38 c36                        -1                          -0 
    39 c37                         0            -0             = 
    40 c38                         0                          -0 
    41 c39                         0                          -0 
    42 c40                         0                          -0 
    43 c41                         0                          -0 
    44 c42                         0            -0             = 
    45 c43                         0            -0             = 
    46 c44                         0            -0             = 
    47 c45                         0            -0             = 
    48 c46                         0            -0             = 
    49 c47                         0                          -0 
    50 c48                         0                          -0 
    51 c49                         0                          -0 
    52 c50                         0                          -0 
    53 c51                         0            -0             = 
    54 c52                         0            -0             = 
    55 c53                         0            -0             = 
    56 c54                         0            -0             = 
    57 c55                         0                          -0 
    58 c56                         0                          -0 
    59 c57                         0            -0             = 
    60 c58                         0            -0             = 
    61 c59                         0            -0             = 
    62 c60                         0            -0             = 
    63 c61                         0            -0             = 
    64 c62                         8             8             = 
    65 c63                         9             9             = 
    66 c64                         0            -0             = 
    67 c65               4.29497e+09   4.29497e+09             = 
    68 c66                         1             1             = 
    69 c67                         0            -0             = 
    70 c68                        -8                 4.29497e+09 
    71 c69                         9                 4.29497e+09 
    72 c70                         0                 4.29497e+09 
    73 c71               4.29497e+09                 4.29497e+09 
    74 c72                         0            -0             = 
    75 c73                        -8                 4.29497e+09 
    76 c74                         8                 4.29497e+09 
    77 c75                         0                 4.29497e+09 
    78 c76               4.29497e+09                 4.29497e+09 

   No. Column name       Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 u_EBX_4008e5_blk_ex
                                   0             0   4.29497e+09 
     2 u_EAX_4008e0_blk_ex_T
                                   9             0   4.29497e+09 
     3 u_EBX_4008e7_blk_ex
                                   0             0   4.29497e+09 
     4 l_EAX_4008e0                8             0   4.29497e+09 
     5 l_EAX_4008e3                8             0   4.29497e+09 
     6 l_EAX_4008e5                0             0   4.29497e+09 
     7 l_EAX_4008e7                0             0   4.29497e+09 
     8 l_EAX_4008e6                0             0   4.29497e+09 
     9 u_EAX_4008e0_blk_ex_F
                                   8             0   4.29497e+09 
    10 rch_blk_4008e0_ent
                    *              1             0             1 
    11 u_EAX_4008e5_blk_ex
                                   0             0   4.29497e+09 
    12 u_EBX_4008e0_blk_ex_F
                         4.29497e+09             0   4.29497e+09 
    13 l_EAX_4008e0_blk_ex_T
                                   8             0   4.29497e+09 
    14 l_EAX_4008e7_blk_ex
                                   0             0   4.29497e+09 
    15 dcsn_lte_3   *              0             0             1 
    16 dcsn_lte_2   *              0             0             1 
    17 dcsn_lte_1   *              1             0             1 
    18 dcsn_lte_0   *              0             0             1 
    19 l_EAX_4008e0_blk_ex_F
                                   8             0   4.29497e+09 
    20 u_EBX_4008e0_blk_ex_T
                         4.29497e+09             0   4.29497e+09 
    21 l_EBX_4008e5_blk_ex
                                   0             0   4.29497e+09 
    22 rch_blk_4008e0_ex_F
                    *              0             0             1 
    23 u_EBX_4008e0      4.29497e+09             0   4.29497e+09 
    24 u_EBX_4008e3      4.29497e+09             0   4.29497e+09 
    25 u_EBX_4008e5                0             0   4.29497e+09 
    26 u_EBX_4008e7                0             0   4.29497e+09 
    27 u_EBX_4008e6                0             0   4.29497e+09 
    28 rch_blk_4008e0_ex_T
                    *              0             0             1 
    29 u_EAX_4008e5                0             0   4.29497e+09 
    30 rch_blk_4008e0_pred_T
                    *              0             0             1 
    31 l_EBX_4008e7_blk_ex
                                   0             0   4.29497e+09 
    32 rch_blk_4008e5_ex
                    *              0             0             1 
    33 rch_blk_4008e5_ent
                    *              0             0             1 
    34 u_EAX_4008e3                9             0   4.29497e+09 
    35 u_EAX_4008e0                9             0   4.29497e+09 
    36 u_EAX_4008e6                0             0   4.29497e+09 
    37 u_EAX_4008e7                0             0   4.29497e+09 
    38 rch_blk_4008e0_pred_F
                    *              0             0             1 
    39 l_EAX_4008e5_blk_ex
                                   0             0   4.29497e+09 
    40 rch_blk_4008e7_ex
                    *              0             0             1 
    41 l_EBX_4008e0_blk_ex_F
                                   0             0   4.29497e+09 
    42 l_EBX_4008e3                0             0   4.29497e+09 
    43 l_EBX_4008e0                0             0   4.29497e+09 
    44 l_EBX_4008e6                0             0   4.29497e+09 
    45 l_EBX_4008e7                0             0   4.29497e+09 
    46 rch_blk_4008e7_ent
                    *              0             0             1 
    47 l_EBX_4008e5                0             0   4.29497e+09 
    48 u_EAX_4008e7_blk_ex
                                   0             0   4.29497e+09 
    49 dcsn_and_5   *              0             0             1 
    50 dcsn_and_4   *              0             0             1 
    51 l_EBX_4008e0_blk_ex_T
                                   0             0   4.29497e+09 

Integer feasibility conditions:

KKT.PE: max.abs.err = 0.00e+00 on row 0
        max.rel.err = 0.00e+00 on row 0
        High quality

KKT.PB: max.abs.err = 5.00e+00 on row 15
        max.rel.err = 1.00e+00 on row 15
        SOLUTION IS INFEASIBLE

End of output
_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk

Reply via email to