From fc6f23d8ad9a63fed08bd4363f35b2918992b59c Mon Sep 17 00:00:00 2001 From: "Pedro F. Giffuni" Date: Sun, 23 Aug 2026 11:35:56 -0500 Subject: [PATCH] calc/solver: Update error reporting for CoinMP The solver component was made originally for lp_solve, which did basically the same as CoinMP, but handled differently some errors, in particular timeouts. Be more in line with CoinMP error reporting. By the way we set up the problem internally it is unlikely some of these will come up but defining them will make easier to understand what could go wrong. --- main/sccomp/source/solver/solver.cxx | 19 +++++++++++++++++-- main/sccomp/source/solver/solver.hrc | 8 ++++++-- main/sccomp/source/solver/solver.src | 21 +++++++++++++++++++-- 3 files changed, 42 insertions(+), 6 deletions(-) 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."; };