int display_solution_u(sym_environment *env, int thread_num) { int user_res, i; lp_sol sol; sol.xlength = 0; #if defined(COMPILE_IN_TM) && defined(COMPILE_IN_LP) if (env->tm && env->tm->lpp[thread_num]){ sol = env->tm->lpp[thread_num]->best_sol; if (env->par.multi_criteria){ env->obj[0] = env->tm->lpp[thread_num]->obj[0]; env->obj[1] = env->tm->lpp[thread_num]->obj[1]; } } #else sol = env->best_sol; #endif if (!sol.has_sol){ printf("\nNo Solution Found\n\n"); return(FUNCTION_TERMINATED_NORMALLY); } if (env->par.verbosity >= 0){ printf("\nSolution Found: Node %i, Level %i\n", sol.xindex, sol.xlevel); if (env->par.multi_criteria){ printf("First Objective: %.3f\n", env->tm->lpp[thread_num]->obj[0]); printf("Second Objective: %.3f\n", env->tm->lpp[thread_num]->obj[1]); }else{ printf("Solution Cost: %.3f\n", env->mip->obj_sense == SYM_MINIMIZE ? sol.objval + env->mip->obj_offset : -sol.objval + env->mip->obj_offset); } } qsortucb_id(sol.xind, sol.xval, sol.xlength); #ifdef USE_SYM_APPLICATION user_res = user_display_solution(env->user, sol.lpetol, sol.xlength, sol.xind, sol.xval, sol.objval); #else user_res = USER_DEFAULT; #endif switch(user_res){ case USER_SUCCESS: return(FUNCTION_TERMINATED_NORMALLY); case USER_DEFAULT: if(env->par.verbosity >= 0){ if (sol.xlength){ if (env->mip->colname){ printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("Column names and values of nonzeros in the solution\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); for (i = 0; i < sol.xlength; i++){ if (sol.xind[i] == env->mip->n){ continue; } printf("%8s %10.3f\n", env->mip->colname[sol.xind[i]], sol.xval[i]); } printf("\n"); }else{ printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("User indices and values of nonzeros in the solution\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); for (i = 0; i < sol.xlength; i++){ if (sol.xind[i] == env->mip->n){ continue; } printf("%7d %10.3f\n", sol.xind[i], sol.xval[i]); } printf("\n"); } return(FUNCTION_TERMINATED_NORMALLY); }else{ printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("All columns are zero in the solution!\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); return(FUNCTION_TERMINATED_NORMALLY); } } case USER_ERROR: return(FUNCTION_TERMINATED_NORMALLY); default: return(FUNCTION_TERMINATED_NORMALLY); } return(FUNCTION_TERMINATED_NORMALLY); }
int display_solution_u(sym_environment *env, int thread_num) { int user_res, i, n; lp_sol sol; char **colname; memset(&sol, 0, sizeof(lp_sol)); sol.xlength = 0; if (env->orig_mip) { colname = env->orig_mip->colname; n = env->orig_mip->n; } else { colname = env->mip->colname; n = env->mip->n; } if (env->par.verbosity < -1){ return(FUNCTION_TERMINATED_NORMALLY); } #if defined(COMPILE_IN_TM) && defined(COMPILE_IN_LP) if (env->tm && env->tm->lpp[thread_num]){ sol = env->tm->lpp[thread_num]->best_sol; if (env->par.multi_criteria){ env->obj[0] = env->tm->lpp[thread_num]->obj[0]; env->obj[1] = env->tm->lpp[thread_num]->obj[1]; } } #else sol = env->best_sol; #endif if (!sol.has_sol){ switch(env->termcode){ case TM_UNBOUNDED: printf("\nThe problem is unbounded!\n\n"); return(FUNCTION_TERMINATED_NORMALLY); case TM_NO_SOLUTION: printf("\nThe problem is infeasible!"); break; default: break; } printf("\nNo Solution Found\n\n"); return(FUNCTION_TERMINATED_NORMALLY); } printf("\nSolution Found: Node %i, Level %i\n", sol.xindex, sol.xlevel); if (env->par.multi_criteria){ printf("First Objective: %.10f\n", env->obj[0]); printf("Second Objective: %.10f\n", env->obj[1]); }else{ printf("Solution Cost: %.10f\n", env->mip->obj_sense == SYM_MINIMIZE ? sol.objval + env->mip->obj_offset : -sol.objval + env->mip->obj_offset); } qsort_id(sol.xind, sol.xval, sol.xlength); #ifdef USE_SYM_APPLICATION user_res = user_display_solution(env->user, sol.lpetol, sol.xlength, sol.xind, sol.xval, sol.objval); #else user_res = USER_DEFAULT; #endif if (env->par.verbosity > -1){ switch(user_res){ case USER_SUCCESS: return(FUNCTION_TERMINATED_NORMALLY); case USER_DEFAULT: if (sol.xlength){ if (env->mip->colname){ printf("+++++++++++++++++++++++++++++++++++++++++++++++++++"); printf("\n"); printf("Column names and values of nonzeros in the solution"); printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++"); printf("\n"); for (i = 0; i < sol.xlength; i++){ if (sol.xind[i] >= n){ continue; } printf("%-50s %10.10f\n", colname[sol.xind[i]], sol.xval[i]); } printf("\n"); }else{ printf("+++++++++++++++++++++++++++++++++++++++++++++++++++"); printf("\n"); printf("User indices and values of nonzeros in the solution"); printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++"); printf("\n"); for (i = 0; i < sol.xlength; i++){ if (sol.xind[i] >= n){ continue; } printf("%7d %10.10f\n", sol.xind[i], sol.xval[i]); } printf("\n"); } return(FUNCTION_TERMINATED_NORMALLY); }else{ printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("All columns are zero in the solution!\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); return(FUNCTION_TERMINATED_NORMALLY); } case USER_ERROR: return(FUNCTION_TERMINATED_NORMALLY); default: return(FUNCTION_TERMINATED_NORMALLY); } } return(FUNCTION_TERMINATED_NORMALLY); }