[pymprog] arbitrary precision support?
An easy and flexible mathematical programming environment for Python.
Brought to you by:
lanyjie
|
From: Edd B. <ve...@gm...> - 2012-06-23 17:16:38
|
Hi,
I was wondering if pymprog can support arbitrary precision solving of MILP
programs? I notice that we lose precision when working with large numbers, for
example:
---8<---
import pymprog
import sys
bits = 64
# large values
offset = 5
l_val = 2**bits - offset
u_val = 2**bits - 1
print("offset = %d" % offset)
print("l = %d" % (l_val))
print("u = %d" % (u_val))
pymprog.beginModel()
pymprog.solvopt(msg_lev=pymprog.LPX.MSG_ERR)
# make vars
l = pymprog.var(name="l", bounds=(0, 2**bits-1), kind=float)
u = pymprog.var(name="u", bounds=(0, 2**bits-1), kind=float)
# objective
o = l + u
pymprog.minimize(o, "objective")
# l = l_val
pymprog.st(l <= l_val)
pymprog.st(l >= l_val)
# u = u_val
pymprog.st(u <= u_val)
pymprog.st(u >= u_val)
pymprog.solve()
print("solve was " + pymprog.status())
print("%s: %d" % ("l", l.primal))
print("%s: %d" % ("u", u.primal))
print("We expected l = %d" % (l_val))
print("We expected u = %d" % (u_val))
if l.primal != l_val or u.primal != u_val:
raise Exception("Oh no!")
else:
print("OK")
---8<---
Gives:
---8<---
% python pmp.py
offset = 5
l = 18446744073709551611
u = 18446744073709551615
solve was opt
l: 18446744073709551616
u: 18446744073709551616
We expected l = 18446744073709551611
We expected u = 18446744073709551615
Traceback (most recent call last):
File "pmp.py", line 44, in <module>
raise Exception("Oh no!")
Exception: Oh no!
---8<---
Cheers
--
Best Regards
Edd Barrett
http://www.theunixzoo.co.uk
|