[Cgl] (bug) CoinMpsIO / CglMixedIntegerRounding / arbitrary
constants
fmargot at andrew.cmu.edu
fmargot at andrew.cmu.edu
Thu May 31 13:23:06 EDT 2007
On Wed, 30 May 2007, Ted Ralphs wrote:
> Lou Hafer wrote:
>
>> Francois asked me to have a look at why dylp failed to pass the
>> CglMixedIntegerRounding unit test. After a bit of poking, here's the problem:
>>
>> * CoinMpsIO imposes an arbitrary upper bound of 1e30 on general integer
>> variables.
>>
>> * CglMixedIntegerRounding fails to recognise this as infinity, becomes
>> confused, and generates invalid cuts.
>>
>> If I patch OsiDylp to override 1e30 with the current infinity things work just
>> fine.
>>
>> If it's left to me to fix, I'll remove the arbitrary constant from CoinMpsIO.
>> This might break other pieces of code. Arguably, code that depends on this
>> arbitrary constant should force it as part of its own setup.
>
> I'm guessing this is part of the MPS standard, so we should find that
> out first. If it is part of the standard, then the question is whether
> we should ignore the standard or come up with a better solution. If you
> change the standard notion of infinity, then you may end up creating MPS
> using this class that cannot be read back in by a reader that adheres to
> the standard. In this case, it seems like the onus is on the person
> reading the MPS file to adhere to the standard.
The failure occur on the file Cgl/trunk/test/CglTestData.capPlan1.mps.
All numbers in the MPS file are smaller than 1e5, but some variables
have no specified upper bound, i.e. they are implicitly +infinity.
I doubt that the MPS standard mandates that an implicit +infinity
upper bound be set to 1e30.
>
> In any case, I'm not sure how you "get rid of the arbitrary upper
> bound," since you need some notion of infinity to create a problem
> description. How else do you define infinity in the absence of external
> input besides pulling an arbitrary large number out of the air? If the
> default value doesn't suffice for your purposes, you can always override
> it with the setDefaultBound() function. The only problem with this is
> that the function won't accept a bound bigger than 1.0e30, which does
> seem a little strange. But then again, the max integer that may be
> defined may also be in the standard. Besides eliminating this
> restriction, I don't see what else to do.
>
There should be a COIN_INFINITY defined somewhere and used everywhere,
if COIN_DBL_MAX is not appropriate. Any number larger than COIN_INFINITY
in the input of a code should be treated as infinity by the code.
Right now, CoinPresolveMatrix uses COIN_DBL_MAX as infinity, CoinLpIO
uses DBL_MAX, Clp uses 1e25 or 1e30 (with sometimes weird things happening
when bounds are in between), Bcp uses 1e100, and these are only the ones I
remember. Uniformity might be helpful.
> I guess this discussion should be taking place on the CoinUtils mailing
> list, since this is not a Cgl issue. I've cc'd this message on that list.
>
A Cgl fix of the problem would be to make inifinity a parameter of the
CglMixedInteger generator. Maybe time to kick the CglParam discussion again ...
Francois
More information about the Cgl
mailing list