19 | | * * * * |
20 | | |
21 | | To be put on separate tickets: |
22 | | |
23 | | Clean up MILP backend interface: |
24 | | |
25 | | While implementing `InteractiveLPBackend` for #20296, I noticed several deficiencies in the design of the MILP backend interface. |
26 | | |
27 | | - `add_col` and `add_variable` both add a variable to the problem; but `add_col` only allows to add a column with no name; whereas `add_variable` only allows to add a column with no coefficients. There should be one function (`add_variable`, probably - see #20296 for a possible interface) that can do both; should then deprecate `add_col`. Note that `add_col` is not used by `MixedIntegerLinearProgram`; it is only used in doctests of the backends. (Also compare with `add_linear_constraint`, which takes a zipped index/coefficient list, whereas `add_col` takes two parallel lists.) |
28 | | |
29 | | - `add_variables` and `add_linear_constraints` should have a default implementation in `GenericBackend`, like `add_linear_constraint_vector`. |
30 | | |
31 | | - The doctest of `add_linear_constraint_vector` from generic_backend.pyx (which is never run for any real backend!), when applied to COIN or GLPK leads to segfaults: |
32 | | {{{ |
33 | | sage: sage: coeffs = ([0, vector([1, 2])], [1, vector([2, 3])]) |
34 | | sage: sage: upper = vector([5, 5]) |
35 | | sage: sage: lower = vector([0, 0]) |
36 | | sage: sage: from sage.numerical.backends.generic_backend import get_solver |
37 | | sage: sage: p = get_solver(solver = "Coin") # optional - cbc |
38 | | sage: p.add_linear_constraint_vector(2, coeffs, lower, upper, 'foo') |
39 | | ------------------------------------------------------------------------ |
40 | | 0 signals.so 0x0000000109df05c5 print_backtrace + 37 |
41 | | ------------------------------------------------------------------------ |
42 | | Unhandled SIGSEGV: A segmentation fault occurred. |
43 | | This probably occurred because a *compiled* module has a bug |
44 | | in it and is not properly wrapped with sig_on(), sig_off(). |
45 | | Python will now terminate. |
46 | | ------------------------------------------------------------------------ |
47 | | Segmentation fault: 11 |
48 | | $ sage |
49 | | SageMath Version 7.2.beta0, Release Date: 2016-03-24 |
50 | | sage: sage: sage: coeffs = ([0, vector([1, 2])], [1, vector([2, 3])]) |
51 | | sage: sage: sage: upper = vector([5, 5]) |
52 | | sage: sage: sage: lower = vector([0, 0]) |
53 | | sage: sage: sage: from sage.numerical.backends.generic_backend import get_solver |
54 | | sage: sage: sage: p = get_solver(solver = "Coin") # optional - cbc |
55 | | sage: p.add_linear_constraint_vector(2, coeffs, lower, upper) |
56 | | ------------------------------------------------------------------------ |
57 | | 0 signals.so 0x0000000109c8a5c5 print_backtrace + 37 |
58 | | ------------------------------------------------------------------------ |
59 | | Unhandled SIGSEGV: A segmentation fault occurred. |
60 | | }}} |
61 | | |
62 | | Also, I think the backends should be tested using a common `TestSuite`. Right now each backend uses its own doctests, which have slightly diverged from each other, so there is nothing (other than the fact that they were the result of copy-paste from each other) that ensures consistency. (#20296 fixes several wrong doctests in `GenericBackend`, from which I tried to copy-paste, for example.) |