diff --git a/main/sccomp/source/solver/solver.cxx b/main/sccomp/source/solver/solver.cxx index 3e3d7f0f11b..985caf49370 100644 --- a/main/sccomp/source/solver/solver.cxx +++ b/main/sccomp/source/solver/solver.cxx @@ -568,6 +568,14 @@ void SAL_CALL SolverComponent::solve() throw(uno::RuntimeException) // solve model nResult = CoinCheckProblem( hProb ); + if (nResult != SOLV_CALL_SUCCESS) + { + // report invalid model + + maStatus = lcl_GetResourceString( RID_ERROR_INVALIDMODEL ); + CoinUnloadProblem(hProb); + return; + } nResult = CoinOptimizeProblem( hProb, 0 ); mbSuccess = ( nResult == SOLV_CALL_SUCCESS ); @@ -586,8 +594,15 @@ void SAL_CALL SolverComponent::solve() throw(uno::RuntimeException) maStatus = lcl_GetResourceString( RID_ERROR_INFEASIBLE ); else if ( nSolutionStatus == 2 ) maStatus = lcl_GetResourceString( RID_ERROR_UNBOUNDED ); - // TODO: detect timeout condition and report as RID_ERROR_TIMEOUT - // (currently reported as infeasible) + else if ( nSolutionStatus == 3 ) + maStatus = lcl_GetResourceString( RID_ERROR_ITERATIONLIMIT ); + else if ( nSolutionStatus == 4 ) + maStatus = lcl_GetResourceString( RID_ERROR_SOLVERERROR ); + else if ( nSolutionStatus == 5 ) + maStatus = lcl_GetResourceString( RID_ERROR_USERSTOP ); + else if ( nSolutionStatus >= 6 ) + maStatus = lcl_GetResourceString( RID_ERROR_UNKNOWN ); + } CoinUnloadProblem( hProb ); diff --git a/main/sccomp/source/solver/solver.hrc b/main/sccomp/source/solver/solver.hrc index 2a6965848cd..84d9169ff4c 100644 --- a/main/sccomp/source/solver/solver.hrc +++ b/main/sccomp/source/solver/solver.hrc @@ -35,7 +35,11 @@ #define RID_ERROR_NONLINEAR (SOLVER_RESOURCE_START + 7) #define RID_ERROR_EPSILONLEVEL (SOLVER_RESOURCE_START + 8) #define RID_ERROR_INFEASIBLE (SOLVER_RESOURCE_START + 9) -#define RID_ERROR_UNBOUNDED (SOLVER_RESOURCE_START + 10) -#define RID_ERROR_TIMEOUT (SOLVER_RESOURCE_START + 11) +#define RID_ERROR_UNBOUNDED (SOLVER_RESOURCE_START + 11) +#define RID_ERROR_ITERATIONLIMIT (SOLVER_RESOURCE_START + 12) +#define RID_ERROR_SOLVERERROR (SOLVER_RESOURCE_START + 13) +#define RID_ERROR_USERSTOP (SOLVER_RESOURCE_START + 14) +#define RID_ERROR_UNKNOWN (SOLVER_RESOURCE_START + 15) +#define RID_ERROR_INVALIDMODEL (SOLVER_RESOURCE_START + 16) #endif diff --git a/main/sccomp/source/solver/solver.src b/main/sccomp/source/solver/solver.src index f6cab594c15..03200029dc5 100644 --- a/main/sccomp/source/solver/solver.src +++ b/main/sccomp/source/solver/solver.src @@ -52,6 +52,7 @@ String RID_PROPERTY_NONLINEARTEST { Text [ en-US ] = "Run strict linearity checks"; }; + String RID_ERROR_NONLINEAR { Text [ en-US ] = "The model seems nonlinear (see options)."; @@ -68,7 +69,23 @@ String RID_ERROR_UNBOUNDED { Text [ en-US ] = "The model is unbounded."; }; -String RID_ERROR_TIMEOUT +String RID_ERROR_ITERATIONLIMIT +{ + Text [ en-US ] = "Iteration limit reached."; +}; +String RID_ERROR_SOLVERERROR +{ + Text [ en-US ] = "Numerical solver error."; +}; +String RID_ERROR_USERSTOP +{ + Text [ en-US ] = "User/callback cancellation."; +}; +String RID_ERROR_UNKNOWN +{ + Text [ en-US ] = "Unrecognized status."; +}; +String RID_ERROR_INVALIDMODEL { - Text [ en-US ] = "The time limit was reached."; + Text [ en-US ] = "Invalid internal generated model."; };