Пример #1
0
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);
}
Пример #2
0
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);
}