@@ -152,8 +152,9 @@ void HighsMipSolver::run() {
152152 }
153153 analysis_.mipTimerStop (kMipClockKnapsack );
154154 }
155- // See whether the presolved problem is suitable for Ines
156- mipdata_->mipIsInes ();
155+ // If the presolved problem is not suitable for Ines, then it's
156+ // recorded as "other"
157+ if (!mipdata_->mipIsInes ()) mipdata_->mipIsOther ();
157158
158159 analysis_.mipTimerStart (kMipClockSolve );
159160
@@ -875,14 +876,13 @@ void HighsMipSolver::cleanupSolve(const bool mip_logging) {
875876 analysis_.mipTimerRead (kMipClockSolve ),
876877 analysis_.mipTimerRead (kMipClockPostsolve ));
877878 highsLogUser (options_mip_->log_options , HighsLogType::kInfo ,
878- " Max sub-MIP depth %d\n "
879879 " Nodes %llu\n "
880880 " Repair LPs %llu (%llu feasible; %llu iterations)\n "
881881 " LP iterations %llu (total)\n "
882882 " %llu (strong br.)\n "
883883 " %llu (separation)\n "
884884 " %llu (heuristics)\n " ,
885- int (max_submip_level), (long long unsigned )mipdata_->num_nodes ,
885+ (long long unsigned )mipdata_->num_nodes ,
886886 (long long unsigned )mipdata_->total_repair_lp ,
887887 (long long unsigned )mipdata_->total_repair_lp_feasible ,
888888 (long long unsigned )mipdata_->total_repair_lp_iterations ,
@@ -923,6 +923,68 @@ void HighsMipSolver::cleanupSolve(const bool mip_logging) {
923923 knapsack_data.sum_capacity , ines_data.num_problem ,
924924 ines_data.sum_col , ines_data.sum_row );
925925
926+ const std::vector<HighsMipProblemData>& mip_problem_data = this ->mipdata_ ->mip_problem_data_ ;
927+ HighsInt num_mip = static_cast <HighsInt>(mip_problem_data.size ());
928+ HighsInt num_knapsack_mip = 0 ;
929+ size_t sum_knapsack_num_col = 0 ;
930+ HighsInt num_ines_mip = 0 ;
931+ size_t sum_ines_num_col = 0 ;
932+ size_t sum_ines_num_row = 0 ;
933+ HighsInt lc_max_submip_level = -1 ;
934+ HighsInt min_submip_num_col = kHighsIInf ;
935+ HighsInt min_submip_num_row = kHighsIInf ;
936+ for (HighsInt iMip = 0 ; iMip < num_mip; iMip++) {
937+ switch (mip_problem_data[iMip].type ) {
938+ case HighsMipProblemType::kKnapsack :
939+ num_knapsack_mip++;
940+ sum_knapsack_num_col += mip_problem_data[iMip].num_binary ;
941+ break ;
942+ case HighsMipProblemType::kInes :
943+ num_ines_mip++;
944+ sum_ines_num_col += mip_problem_data[iMip].num_binary ;
945+ sum_ines_num_row += mip_problem_data[iMip].num_row ;
946+ break ;
947+ case HighsMipProblemType::kOther :
948+ default :
949+ break ;
950+ }
951+ lc_max_submip_level = std::max (mip_problem_data[iMip].submip_level , lc_max_submip_level);
952+ HighsInt submip_num_col =
953+ mip_problem_data[iMip].num_continuous +
954+ mip_problem_data[iMip].num_binary +
955+ mip_problem_data[iMip].num_general_integer +
956+ mip_problem_data[iMip].num_implied_integer ;
957+
958+ min_submip_num_col = std::min (submip_num_col, min_submip_num_col);
959+ min_submip_num_row = std::min (mip_problem_data[iMip].num_row , min_submip_num_row);
960+ }
961+ highsLogUser (options_mip_->log_options , HighsLogType::kInfo ,
962+ " MIPs %d (%d knapsack; %d Ines)\n " ,
963+ int (num_mip),
964+ int (num_knapsack_mip),
965+ int (num_ines_mip));
966+
967+ ss.str (std::string ());
968+ ss << highsFormatToString (" Max sub-MIP depth %d" , int (max_submip_level));
969+ if (max_submip_level > 0 )
970+ ss << highsFormatToString (" min cols/rows = %d/%d\n " );
971+ highsLogUser (options_mip_->log_options , HighsLogType::kInfo , " %s\n " ,
972+ ss.str ().c_str ());
973+
974+ if (num_knapsack_mip > 0 || num_ines_mip > 0 )
975+ highsLogUser (options_mip_->log_options , HighsLogType::kInfo ,
976+ " grep-knapsack-ines,%s,%s,%d,%" PRId64 " %d,%" PRId64 " ,%" PRId64 " \n " ,
977+ model_->model_name_ .c_str (), options_mip_->presolve .c_str (),
978+ num_knapsack_mip, sum_knapsack_num_col,
979+ num_ines_mip, sum_ines_num_col, sum_ines_num_row);
980+
981+ if (max_submip_level > 0 ) {
982+ }
983+
984+
985+
986+
987+
926988 if (!timeless_log) analysis_.reportMipTimer ();
927989
928990 assert (modelstatus_ != HighsModelStatus::kNotset );
0 commit comments