Ticket #10785 (closed enhancement: fixed)
Setting solver-specific options
| Reported by: | ncohen | Owned by: | ncohen |
|---|---|---|---|
| Priority: | major | Milestone: | sage-5.0 |
| Component: | linear programming | Keywords: | |
| Cc: | Work issues: | ||
| Report Upstream: | N/A | Reviewers: | Johannes Klaus Fichte |
| Authors: | Nathann Cohen | Merged in: | sage-5.0.beta0 |
| Dependencies: | Stopgaps: |
Description
With this patch, it is now possible to set solver-specific options, like a time limit or a ratio of approximation (if you do not want to compute the optimal value, but something 10% away from it)
Nathann
Attachments
Change History
comment:1 Changed 2 years ago by ncohen
- Status changed from new to needs_review
- Type changed from PLEASE CHANGE to enhancement
comment:2 Changed 18 months ago by fichtejo
- Status changed from needs_review to needs_info
Seems good so far. But in my sage version (4.7.1) the constructor of MixedIntegerLinearProgram? does not use it when given as a backend, since get_solver in the Generic Backend requires a String or None. So we should change to something like
__init__ ....
if isinstance(solver,GenericBackend):
...
else:
...
or even better change GenericBackend?.get_solver
if solver is None:
...
elif isinstance(solver,GenericBackend):
...
elif solver=="Coin":
...
But I may have overlooked something.
comment:3 Changed 18 months ago by ncohen
- Status changed from needs_info to needs_review
I am sorry but I do not understand what you mean O_o. Could you give me an example ? This being said, when reviewing a ticket, the sage version you should use is the latest developper's version, that is sage-4.8.alpha3 at this instant (see the sage-release google group)
Nathann
comment:4 Changed 18 months ago by fichtejo
Sry. My mistake. I'll check it with the latest snapshot first ;-)
comment:5 Changed 17 months ago by fichtejo
The lastest developper's version does not work for me. I have an build issue on ubuntu, so we have to postpone that one.
A short (hopefully better) description of the problem above:
The code online linked in trac is the latest developper's code, is't it?
When we create a new instance of a MixedIntegerLinearProgram? (see http://trac.sagemath.org/sage_trac/browser/sage/numerical/mip.pyx#L200) like
p = MixedIntegerLinearProgram(maximization=True)
, we call
get_solver(solver=solver, constraint_generation=constraint_generation)
Then get_solver(...) checks for a solver (e.g. CPLEX see http://trac.sagemath.org/sage_trac/browser/sage/numerical/backends/generic_backend.pyx#L90), but the solver is required to be a string, not an instance of a solver.
Since MixedIntegerLinearProgram? uses get_solver to obtain a solver, get_solver requires a string in the input, and the backend is hidden in the MixedIntegerLinearProgram, we will never be able to use the solver with special parameters in an instance of MixedIntegerLinearProgramm?, e.g:
my_solver = get_solver(solver = "CPLEX")
my_solver.solver_parameter("timelimit", 60)
p = MixedIntegerLinearProgram(solver=my_solver)
will fail. I do not see this addressed in the patch.
But I may be mistaken?
comment:6 Changed 17 months ago by ncohen
Well, you can use the solver_parameter method of MixedIntegerLinearProgram?, which is made for this very purpose. It is the part of the patch that modifies mip.pyx.
This being said, your remark also comes from the fact that the example given in this function directly calls get_solver instead of MixedIntegerLinearProgram?. I just updated the patch so that it is clearer.
Nathann
comment:7 Changed 17 months ago by fichtejo
I have overlooked that method. I am almost fine.
Some minor points in the documentation:
In mip.pyx:1357 you write
"The solver parameters are by essence solver-specific, which means their meaning heavily depends on the solver used (it is GLPK by default)."
The priority is CPLEX, Coin, GLPK. I guess sage is released with GLPK. Thus it is still right, but we should clarify it or remove the statement about the default solver.
The import of example mip.pyx:1396 uses
from sage.numerical.backends.generic_backend import get_solver
p = MixedIntegerLinearProgram()
p.solver_parameter("timelimit", 60)
I think it has to be
from sage.numerical.mip import MixedIntegerLinearProgram p = MixedIntegerLinearProgram()
comment:8 Changed 17 months ago by ncohen
Patch updated ! I modified the sentence about the default solver, but the meaning is the same : "in case of doubt, you are using GLPK" :-)
And the MixedIntegerLinearProgram? does not need to be imported first, it is always present when working in a Sage terminal.
Nathann
comment:9 Changed 17 months ago by fichtejo
- Status changed from needs_review to positive_review
:-)
Cool. I updated the status.
comment:10 Changed 17 months ago by jdemeyer
- Status changed from positive_review to needs_info
fichtejo: add your real name as Reviewer and also add yourself to http://trac.sagemath.org/sage_trac/#AccountNamesMappedtoRealNames please.
comment:11 Changed 17 months ago by fichtejo
- Status changed from needs_info to needs_review
- Reviewers set to Johannes Klaus Fichte
Done.
comment:13 Changed 17 months ago by jdemeyer
- Status changed from positive_review to needs_work
I get a doctest failure:
sage -t -force_lib devel/sage/sage/numerical/mip.pyx
Writing problem data to `/scratch/jdemeyer/merger/sage-4.8.alpha5/home/.sage//temp/sage.math.washington.edu/18491//lp_problem.mps'...
17 records were written
Writing problem data to `/scratch/jdemeyer/merger/sage-4.8.alpha5/home/.sage//temp/sage.math.washington.edu/18491//lp_problem.lp'...
9 lines were written
**********************************************************************
File "/mnt/usb1/scratch/jdemeyer/merger/sage-4.8.alpha5/devel/sage-main/sage/numerical/mip.pyx", line 1393:
sage: p.solver_parameter("CPX_PARAM_TILIM", 60)
Exception raised:
Traceback (most recent call last):
File "/mnt/usb1/scratch/jdemeyer/merger/sage-4.8.alpha5/local/bin/ncadoctest.py", line 1231, in run_one_test
self.run_one_example(test, example, filename, compileflags)
File "/mnt/usb1/scratch/jdemeyer/merger/sage-4.8.alpha5/local/bin/sagedoctest.py", line 38, in run_one_example
OrigDocTestRunner.run_one_example(self, test, example, filename, compileflags)
File "/mnt/usb1/scratch/jdemeyer/merger/sage-4.8.alpha5/local/bin/ncadoctest.py", line 1172, in run_one_example
compileflags, 1) in test.globs
File "<doctest __main__.example_27[4]>", line 1, in <module>
p.solver_parameter("CPX_PARAM_TILIM", Integer(60))###line 1393:
sage: p.solver_parameter("CPX_PARAM_TILIM", 60)
File "mip.pyx", line 1414, in sage.numerical.mip.MixedIntegerLinearProgram.solver_parameter (sage/numerical/mip.c:7302)
self._backend.solver_parameter(name, value)
File "glpk_backend.pyx", line 1101, in sage.numerical.backends.glpk_backend.GLPKBackend.solver_parameter (sage/numerical/backends/glpk_backend.cpp:7916)
ValueError: This parameter is not available.
**********************************************************************
1 items had failures:
1 of 9 in __main__.example_27
***Test Failed*** 1 failures.
For whitespace errors, see the file /scratch/jdemeyer/merger/sage-4.8.alpha5/home/.sage/tmp/sage.math.washington.edu-11856/mip_18486.py
[3.2 s]
comment:14 Changed 17 months ago by ncohen
Oopppps............ Yep, clearly a "#optional - CPLEX" would be in order there.
Nathann
comment:17 Changed 16 months ago by jdemeyer
- Status changed from positive_review to closed
- Resolution set to fixed
- Merged in set to sage-5.0.beta0


I had forgotten to click on "needs_review" T_T
Nathann