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