520 glp_erase_prob(lp); |
520 glp_erase_prob(lp); |
521 rows.clear(); |
521 rows.clear(); |
522 cols.clear(); |
522 cols.clear(); |
523 } |
523 } |
524 |
524 |
525 // LpGlpk members |
525 // GlpkLp members |
526 |
526 |
527 LpGlpk::LpGlpk() |
527 GlpkLp::GlpkLp() |
528 : LpBase(), GlpkBase(), LpSolver() { |
528 : LpBase(), GlpkBase(), LpSolver() { |
529 messageLevel(MESSAGE_NO_OUTPUT); |
529 messageLevel(MESSAGE_NO_OUTPUT); |
530 } |
530 } |
531 |
531 |
532 LpGlpk::LpGlpk(const LpGlpk& other) |
532 GlpkLp::GlpkLp(const GlpkLp& other) |
533 : LpBase(other), GlpkBase(other), LpSolver(other) { |
533 : LpBase(other), GlpkBase(other), LpSolver(other) { |
534 messageLevel(MESSAGE_NO_OUTPUT); |
534 messageLevel(MESSAGE_NO_OUTPUT); |
535 } |
535 } |
536 |
536 |
537 LpGlpk* LpGlpk::_newSolver() const { return new LpGlpk; } |
537 GlpkLp* GlpkLp::_newSolver() const { return new GlpkLp; } |
538 LpGlpk* LpGlpk::_cloneSolver() const { return new LpGlpk(*this); } |
538 GlpkLp* GlpkLp::_cloneSolver() const { return new GlpkLp(*this); } |
539 |
539 |
540 const char* LpGlpk::_solverName() const { return "LpGlpk"; } |
540 const char* GlpkLp::_solverName() const { return "GlpkLp"; } |
541 |
541 |
542 void LpGlpk::_clear_temporals() { |
542 void GlpkLp::_clear_temporals() { |
543 _primal_ray.clear(); |
543 _primal_ray.clear(); |
544 _dual_ray.clear(); |
544 _dual_ray.clear(); |
545 } |
545 } |
546 |
546 |
547 LpGlpk::SolveExitStatus LpGlpk::_solve() { |
547 GlpkLp::SolveExitStatus GlpkLp::_solve() { |
548 return solvePrimal(); |
548 return solvePrimal(); |
549 } |
549 } |
550 |
550 |
551 LpGlpk::SolveExitStatus LpGlpk::solvePrimal() { |
551 GlpkLp::SolveExitStatus GlpkLp::solvePrimal() { |
552 _clear_temporals(); |
552 _clear_temporals(); |
553 |
553 |
554 glp_smcp smcp; |
554 glp_smcp smcp; |
555 glp_init_smcp(&smcp); |
555 glp_init_smcp(&smcp); |
556 |
556 |
597 |
597 |
598 if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
598 if (glp_simplex(lp, &smcp) != 0) return UNSOLVED; |
599 return SOLVED; |
599 return SOLVED; |
600 } |
600 } |
601 |
601 |
602 LpGlpk::Value LpGlpk::_getPrimal(int i) const { |
602 GlpkLp::Value GlpkLp::_getPrimal(int i) const { |
603 return glp_get_col_prim(lp, i); |
603 return glp_get_col_prim(lp, i); |
604 } |
604 } |
605 |
605 |
606 LpGlpk::Value LpGlpk::_getDual(int i) const { |
606 GlpkLp::Value GlpkLp::_getDual(int i) const { |
607 return glp_get_row_dual(lp, i); |
607 return glp_get_row_dual(lp, i); |
608 } |
608 } |
609 |
609 |
610 LpGlpk::Value LpGlpk::_getPrimalValue() const { |
610 GlpkLp::Value GlpkLp::_getPrimalValue() const { |
611 return glp_get_obj_val(lp); |
611 return glp_get_obj_val(lp); |
612 } |
612 } |
613 |
613 |
614 LpGlpk::VarStatus LpGlpk::_getColStatus(int i) const { |
614 GlpkLp::VarStatus GlpkLp::_getColStatus(int i) const { |
615 switch (glp_get_col_stat(lp, i)) { |
615 switch (glp_get_col_stat(lp, i)) { |
616 case GLP_BS: |
616 case GLP_BS: |
617 return BASIC; |
617 return BASIC; |
618 case GLP_UP: |
618 case GLP_UP: |
619 return UPPER; |
619 return UPPER; |
623 return FREE; |
623 return FREE; |
624 case GLP_NS: |
624 case GLP_NS: |
625 return FIXED; |
625 return FIXED; |
626 default: |
626 default: |
627 LEMON_ASSERT(false, "Wrong column status"); |
627 LEMON_ASSERT(false, "Wrong column status"); |
628 return LpGlpk::VarStatus(); |
628 return GlpkLp::VarStatus(); |
629 } |
629 } |
630 } |
630 } |
631 |
631 |
632 LpGlpk::VarStatus LpGlpk::_getRowStatus(int i) const { |
632 GlpkLp::VarStatus GlpkLp::_getRowStatus(int i) const { |
633 switch (glp_get_row_stat(lp, i)) { |
633 switch (glp_get_row_stat(lp, i)) { |
634 case GLP_BS: |
634 case GLP_BS: |
635 return BASIC; |
635 return BASIC; |
636 case GLP_UP: |
636 case GLP_UP: |
637 return UPPER; |
637 return UPPER; |
641 return FREE; |
641 return FREE; |
642 case GLP_NS: |
642 case GLP_NS: |
643 return FIXED; |
643 return FIXED; |
644 default: |
644 default: |
645 LEMON_ASSERT(false, "Wrong row status"); |
645 LEMON_ASSERT(false, "Wrong row status"); |
646 return LpGlpk::VarStatus(); |
646 return GlpkLp::VarStatus(); |
647 } |
647 } |
648 } |
648 } |
649 |
649 |
650 LpGlpk::Value LpGlpk::_getPrimalRay(int i) const { |
650 GlpkLp::Value GlpkLp::_getPrimalRay(int i) const { |
651 if (_primal_ray.empty()) { |
651 if (_primal_ray.empty()) { |
652 int row_num = glp_get_num_rows(lp); |
652 int row_num = glp_get_num_rows(lp); |
653 int col_num = glp_get_num_cols(lp); |
653 int col_num = glp_get_num_cols(lp); |
654 |
654 |
655 _primal_ray.resize(col_num + 1, 0.0); |
655 _primal_ray.resize(col_num + 1, 0.0); |
697 } |
697 } |
698 } |
698 } |
699 return _primal_ray[i]; |
699 return _primal_ray[i]; |
700 } |
700 } |
701 |
701 |
702 LpGlpk::Value LpGlpk::_getDualRay(int i) const { |
702 GlpkLp::Value GlpkLp::_getDualRay(int i) const { |
703 if (_dual_ray.empty()) { |
703 if (_dual_ray.empty()) { |
704 int row_num = glp_get_num_rows(lp); |
704 int row_num = glp_get_num_rows(lp); |
705 |
705 |
706 _dual_ray.resize(row_num + 1, 0.0); |
706 _dual_ray.resize(row_num + 1, 0.0); |
707 |
707 |
786 } |
786 } |
787 case GLP_NOFEAS: |
787 case GLP_NOFEAS: |
788 return INFEASIBLE; |
788 return INFEASIBLE; |
789 default: |
789 default: |
790 LEMON_ASSERT(false, "Wrong primal type"); |
790 LEMON_ASSERT(false, "Wrong primal type"); |
791 return LpGlpk::ProblemType(); |
791 return GlpkLp::ProblemType(); |
792 } |
792 } |
793 } |
793 } |
794 |
794 |
795 LpGlpk::ProblemType LpGlpk::_getDualType() const { |
795 GlpkLp::ProblemType GlpkLp::_getDualType() const { |
796 if (glp_get_status(lp) == GLP_OPT) |
796 if (glp_get_status(lp) == GLP_OPT) |
797 return OPTIMAL; |
797 return OPTIMAL; |
798 switch (glp_get_dual_stat(lp)) { |
798 switch (glp_get_dual_stat(lp)) { |
799 case GLP_UNDEF: |
799 case GLP_UNDEF: |
800 return UNDEFINED; |
800 return UNDEFINED; |
807 } |
807 } |
808 case GLP_NOFEAS: |
808 case GLP_NOFEAS: |
809 return INFEASIBLE; |
809 return INFEASIBLE; |
810 default: |
810 default: |
811 LEMON_ASSERT(false, "Wrong primal type"); |
811 LEMON_ASSERT(false, "Wrong primal type"); |
812 return LpGlpk::ProblemType(); |
812 return GlpkLp::ProblemType(); |
813 } |
813 } |
814 } |
814 } |
815 |
815 |
816 void LpGlpk::presolver(bool b) { |
816 void GlpkLp::presolver(bool b) { |
817 lpx_set_int_parm(lp, LPX_K_PRESOL, b ? 1 : 0); |
817 lpx_set_int_parm(lp, LPX_K_PRESOL, b ? 1 : 0); |
818 } |
818 } |
819 |
819 |
820 void LpGlpk::messageLevel(MessageLevel m) { |
820 void GlpkLp::messageLevel(MessageLevel m) { |
821 _message_level = m; |
821 _message_level = m; |
822 } |
822 } |
823 |
823 |
824 // MipGlpk members |
824 // GlpkMip members |
825 |
825 |
826 MipGlpk::MipGlpk() |
826 GlpkMip::GlpkMip() |
827 : LpBase(), GlpkBase(), MipSolver() { |
827 : LpBase(), GlpkBase(), MipSolver() { |
828 messageLevel(MESSAGE_NO_OUTPUT); |
828 messageLevel(MESSAGE_NO_OUTPUT); |
829 } |
829 } |
830 |
830 |
831 MipGlpk::MipGlpk(const MipGlpk& other) |
831 GlpkMip::GlpkMip(const GlpkMip& other) |
832 : LpBase(), GlpkBase(other), MipSolver() { |
832 : LpBase(), GlpkBase(other), MipSolver() { |
833 messageLevel(MESSAGE_NO_OUTPUT); |
833 messageLevel(MESSAGE_NO_OUTPUT); |
834 } |
834 } |
835 |
835 |
836 void MipGlpk::_setColType(int i, MipGlpk::ColTypes col_type) { |
836 void GlpkMip::_setColType(int i, GlpkMip::ColTypes col_type) { |
837 switch (col_type) { |
837 switch (col_type) { |
838 case INTEGER: |
838 case INTEGER: |
839 glp_set_col_kind(lp, i, GLP_IV); |
839 glp_set_col_kind(lp, i, GLP_IV); |
840 break; |
840 break; |
841 case REAL: |
841 case REAL: |
842 glp_set_col_kind(lp, i, GLP_CV); |
842 glp_set_col_kind(lp, i, GLP_CV); |
843 break; |
843 break; |
844 } |
844 } |
845 } |
845 } |
846 |
846 |
847 MipGlpk::ColTypes MipGlpk::_getColType(int i) const { |
847 GlpkMip::ColTypes GlpkMip::_getColType(int i) const { |
848 switch (glp_get_col_kind(lp, i)) { |
848 switch (glp_get_col_kind(lp, i)) { |
849 case GLP_IV: |
849 case GLP_IV: |
850 case GLP_BV: |
850 case GLP_BV: |
851 return INTEGER; |
851 return INTEGER; |
852 default: |
852 default: |
853 return REAL; |
853 return REAL; |
854 } |
854 } |
855 |
855 |
856 } |
856 } |
857 |
857 |
858 MipGlpk::SolveExitStatus MipGlpk::_solve() { |
858 GlpkMip::SolveExitStatus GlpkMip::_solve() { |
859 glp_smcp smcp; |
859 glp_smcp smcp; |
860 glp_init_smcp(&smcp); |
860 glp_init_smcp(&smcp); |
861 |
861 |
862 switch (_message_level) { |
862 switch (_message_level) { |
863 case MESSAGE_NO_OUTPUT: |
863 case MESSAGE_NO_OUTPUT: |
926 } else { |
926 } else { |
927 return UNDEFINED; |
927 return UNDEFINED; |
928 } |
928 } |
929 default: |
929 default: |
930 LEMON_ASSERT(false, "Wrong problem type."); |
930 LEMON_ASSERT(false, "Wrong problem type."); |
931 return MipGlpk::ProblemType(); |
931 return GlpkMip::ProblemType(); |
932 } |
932 } |
933 } |
933 } |
934 |
934 |
935 MipGlpk::Value MipGlpk::_getSol(int i) const { |
935 GlpkMip::Value GlpkMip::_getSol(int i) const { |
936 return glp_mip_col_val(lp, i); |
936 return glp_mip_col_val(lp, i); |
937 } |
937 } |
938 |
938 |
939 MipGlpk::Value MipGlpk::_getSolValue() const { |
939 GlpkMip::Value GlpkMip::_getSolValue() const { |
940 return glp_mip_obj_val(lp); |
940 return glp_mip_obj_val(lp); |
941 } |
941 } |
942 |
942 |
943 MipGlpk* MipGlpk::_newSolver() const { return new MipGlpk; } |
943 GlpkMip* GlpkMip::_newSolver() const { return new GlpkMip; } |
944 MipGlpk* MipGlpk::_cloneSolver() const {return new MipGlpk(*this); } |
944 GlpkMip* GlpkMip::_cloneSolver() const {return new GlpkMip(*this); } |
945 |
945 |
946 const char* MipGlpk::_solverName() const { return "MipGlpk"; } |
946 const char* GlpkMip::_solverName() const { return "GlpkMip"; } |
947 |
947 |
948 void MipGlpk::messageLevel(MessageLevel m) { |
948 void GlpkMip::messageLevel(MessageLevel m) { |
949 _message_level = m; |
949 _message_level = m; |
950 } |
950 } |
951 |
951 |
952 } //END OF NAMESPACE LEMON |
952 } //END OF NAMESPACE LEMON |