# HG changeset patch
# User Balazs Dezso <deba@inf.elte.hu>
# Date 1238619240 -7200
# Node ID fc9e366e6759193639870b0673b5f8b618899185
# Parent 538b3dd9a2c0022e2fe412748bab16f73f8c284b
Fixing presolver and basis handling
diff -r 538b3dd9a2c0 -r fc9e366e6759 lemon/glpk.cc
a
|
b
|
|
533 | 533 | GlpkLp::GlpkLp() |
534 | 534 | : LpBase(), LpSolver(), GlpkBase() { |
535 | 535 | messageLevel(MESSAGE_NO_OUTPUT); |
| 536 | presolver(false); |
536 | 537 | } |
537 | 538 | |
538 | 539 | GlpkLp::GlpkLp(const GlpkLp& other) |
539 | 540 | : LpBase(other), LpSolver(other), GlpkBase(other) { |
540 | 541 | messageLevel(MESSAGE_NO_OUTPUT); |
| 542 | presolver(false); |
541 | 543 | } |
542 | 544 | |
543 | 545 | GlpkLp* GlpkLp::newSolver() const { return new GlpkLp; } |
… |
… |
|
574 | 576 | smcp.msg_lev = GLP_MSG_ALL; |
575 | 577 | break; |
576 | 578 | } |
| 579 | smcp.presolve = _presolve; |
577 | 580 | |
578 | | if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
| 581 | // If the basis is not valid we get an error return value. |
| 582 | // In this case we can try to create a new basis. |
| 583 | switch (glp_simplex(lp, &smcp)) { |
| 584 | case 0: |
| 585 | break; |
| 586 | case GLP_EBADB: |
| 587 | case GLP_ESING: |
| 588 | case GLP_ECOND: |
| 589 | lpx_set_int_parm(lp, LPX_K_MSGLEV, smcp.msg_lev); |
| 590 | glp_adv_basis(lp, 0); |
| 591 | if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
| 592 | break; |
| 593 | default: |
| 594 | return UNSOLVED; |
| 595 | } |
| 596 | |
579 | 597 | return SOLVED; |
580 | 598 | } |
581 | 599 | |
… |
… |
|
600 | 618 | break; |
601 | 619 | } |
602 | 620 | smcp.meth = GLP_DUAL; |
| 621 | smcp.presolve = _presolve; |
603 | 622 | |
604 | | if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
| 623 | // If the basis is not valid we get an error return value. |
| 624 | // In this case we can try to create a new basis. |
| 625 | switch (glp_simplex(lp, &smcp)) { |
| 626 | case 0: |
| 627 | break; |
| 628 | case GLP_EBADB: |
| 629 | case GLP_ESING: |
| 630 | case GLP_ECOND: |
| 631 | lpx_set_int_parm(lp, LPX_K_MSGLEV, smcp.msg_lev); |
| 632 | glp_adv_basis(lp, 0); |
| 633 | if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
| 634 | break; |
| 635 | default: |
| 636 | return UNSOLVED; |
| 637 | } |
605 | 638 | return SOLVED; |
606 | 639 | } |
607 | 640 | |
… |
… |
|
819 | 852 | } |
820 | 853 | } |
821 | 854 | |
822 | | void GlpkLp::presolver(bool b) { |
823 | | lpx_set_int_parm(lp, LPX_K_PRESOL, b ? 1 : 0); |
| 855 | void GlpkLp::presolver(bool presolve) { |
| 856 | _presolve = presolve; |
824 | 857 | } |
825 | 858 | |
826 | 859 | void GlpkLp::messageLevel(MessageLevel m) { |
… |
… |
|
881 | 914 | } |
882 | 915 | smcp.meth = GLP_DUAL; |
883 | 916 | |
884 | | if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
| 917 | // If the basis is not valid we get an error return value. |
| 918 | // In this case we can try to create a new basis. |
| 919 | switch (glp_simplex(lp, &smcp)) { |
| 920 | case 0: |
| 921 | break; |
| 922 | case GLP_EBADB: |
| 923 | case GLP_ESING: |
| 924 | case GLP_ECOND: |
| 925 | lpx_set_int_parm(lp, LPX_K_MSGLEV, smcp.msg_lev); |
| 926 | glp_adv_basis(lp, 0); |
| 927 | if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
| 928 | break; |
| 929 | default: |
| 930 | return UNSOLVED; |
| 931 | } |
| 932 | |
885 | 933 | if (glp_get_status(lp) != GLP_OPT) return SOLVED; |
886 | 934 | |
887 | 935 | glp_iocp iocp; |
diff -r 538b3dd9a2c0 -r fc9e366e6759 lemon/glpk.h
a
|
b
|
|
178 | 178 | ///Solve with dual simplex |
179 | 179 | SolveExitStatus solveDual(); |
180 | 180 | |
| 181 | private: |
| 182 | |
| 183 | bool _presolve; |
| 184 | |
| 185 | public: |
| 186 | |
181 | 187 | ///Turns on or off the presolver |
182 | 188 | |
183 | 189 | ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver |
184 | 190 | /// |
185 | 191 | ///The presolver is off by default. |
186 | | void presolver(bool b); |
| 192 | void presolver(bool presolve); |
187 | 193 | |
188 | 194 | ///Enum for \c messageLevel() parameter |
189 | 195 | enum MessageLevel { |