@@ -1750,10 +1750,7 @@ HighsStatus HighsPrimalHeuristics::solveMipKnapsackReturn(
17501750 const HighsStatus& return_status) {
17511751 const HighsLp& lp = *(mipsolver.model_ );
17521752 std::stringstream ss;
1753- if (!mipsolver.submip ) {
1754- ss.str (std::string ());
1755- ss << " MIP is a knapsack problem: " ;
1756- }
1753+ if (!mipsolver.submip ) ss.str (std::string ());
17571754 if (mipsolver.modelstatus_ == HighsModelStatus::kOptimal ) {
17581755 // mipsolver.solution_objective_ is the objective value for the
17591756 // original problem - using the offset and ignoring the
@@ -1771,12 +1768,12 @@ HighsStatus HighsPrimalHeuristics::solveMipKnapsackReturn(
17711768 mipsolver.gap_ = 0 ;
17721769 if (!mipsolver.submip )
17731770 ss << highsFormatToString (
1774- " optimal objective by dynamic programming is %g" ,
1771+ " Optimal objective by dynamic programming is %g" ,
17751772 mipsolver.solution_objective_ );
17761773 } else {
17771774 if (!mipsolver.submip )
17781775 ss << highsFormatToString (
1779- " model status is %s" ,
1776+ " Model status is %s" ,
17801777 utilModelStatusToString (mipsolver.modelstatus_ ).c_str ());
17811778 mipsolver.solution_ .clear ();
17821779 }
@@ -1789,16 +1786,13 @@ HighsStatus HighsPrimalHeuristics::solveMipKnapsackReturn(
17891786HighsStatus HighsPrimalHeuristics::solveMipKnapsack () {
17901787 const HighsLp& lp = *(mipsolver.model_ );
17911788 const HighsLogOptions& log_options = mipsolver.options_mip_ ->log_options ;
1792- HighsInt capacity_;
1793- assert (mipsolver.mipdata_ ->mipIsKnapsack (capacity_));
1789+ assert (mipsolver.mipdata_ ->mipIsKnapsack (false ));
17941790
17951791 const bool upper = lp.row_upper_ [0 ] < kHighsInf ;
17961792 const HighsInt constraint_sign = upper ? 1 : -1 ;
1797- double double_capacity =
1798- upper ? lp.row_upper_ [0 ] : constraint_sign * lp.row_lower_ [0 ];
1799- const double capacity_margin = 1e-6 ;
1800- const HighsInt capacity = std::floor (double_capacity + capacity_margin);
1801-
1793+ const HighsInt integral_scale = mipsolver.mipdata_ ->knapsack_integral_scale_ ;
1794+ assert (integral_scale > 0 );
1795+ const HighsInt capacity = mipsolver.mipdata_ ->knapsack_capacity_ ;
18021796 if (capacity < 0 ) {
18031797 mipsolver.modelstatus_ = HighsModelStatus::kInfeasible ;
18041798 return solveMipKnapsackReturn (HighsStatus::kOk );
@@ -1816,7 +1810,8 @@ HighsStatus HighsPrimalHeuristics::solveMipKnapsack() {
18161810 for (HighsInt iCol = 0 ; iCol < lp.num_col_ ; iCol++) {
18171811 for (HighsInt iEl = lp.a_matrix_ .start_ [iCol];
18181812 iEl < lp.a_matrix_ .start_ [iCol + 1 ]; iEl++)
1819- weight[iCol] = HighsInt (constraint_sign * lp.a_matrix_ .value_ [iEl]);
1813+ weight[iCol] = HighsInt (integral_scale *
1814+ (constraint_sign * lp.a_matrix_ .value_ [iEl]));
18201815 }
18211816 HighsInt sense = HighsInt (lp.sense_ );
18221817 // Set up the values for the knapsack solver. Since it solves a
0 commit comments