Opened 8 years ago

Closed 7 years ago

#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: Merged in: sage-5.0.beta0
Authors: Nathann Cohen Reviewers: Johannes Klaus Fichte
Report Upstream: N/A Work issues:
Branch: Commit:
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 (1)

trac_10785.patch (15.9 KB) - added by ncohen 7 years ago.

Download all attachments as: .zip

Change History (18)

comment:1 Changed 8 years ago by ncohen

  • Status changed from new to needs_review
  • Type changed from PLEASE CHANGE to enhancement

I had forgotten to click on "needs_review" T_T

Nathann

comment:2 Changed 7 years 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 7 years 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 7 years ago by fichtejo

Sry. My mistake. I'll check it with the latest snapshot first ;-)

comment:5 Changed 7 years 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 7 years 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 7 years 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 7 years 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 7 years ago by fichtejo

  • Status changed from needs_review to positive_review

:-)

Cool. I updated the status.

comment:10 Changed 7 years 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 7 years ago by fichtejo

  • Reviewers set to Johannes Klaus Fichte
  • Status changed from needs_info to needs_review

Done.

comment:12 Changed 7 years ago by fichtejo

  • Status changed from needs_review to positive_review

comment:13 Changed 7 years 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 7 years ago by ncohen

Oopppps............ Yep, clearly a "#optional - CPLEX" would be in order there.

Nathann

Changed 7 years ago by ncohen

comment:15 Changed 7 years ago by ncohen

  • Status changed from needs_work to positive_review

comment:16 Changed 7 years ago by jdemeyer

  • Milestone changed from sage-4.8 to sage-5.0

comment:17 Changed 7 years ago by jdemeyer

  • Merged in set to sage-5.0.beta0
  • Resolution set to fixed
  • Status changed from positive_review to closed
Note: See TracTickets for help on using tickets.