Kaydet (Commit) 899f3a1c authored tarafından Pedro Giffuni's avatar Pedro Giffuni

i124091 - Reinstate the check for nonlinearity but turn it into an option.

We only really support a linear solver at this time so the test for 
non-linearity was actually useful. Make it optional (ON by default)
so that we can now override the check and provide a solution.
üst 48cb20bb
...@@ -58,6 +58,7 @@ using ::rtl::OUString; ...@@ -58,6 +58,7 @@ using ::rtl::OUString;
#define STR_TIMEOUT "Timeout" #define STR_TIMEOUT "Timeout"
#define STR_EPSILONLEVEL "EpsilonLevel" #define STR_EPSILONLEVEL "EpsilonLevel"
#define STR_LIMITBBDEPTH "LimitBBDepth" #define STR_LIMITBBDEPTH "LimitBBDepth"
#define STR_NONLINEARTEST "NonLinearTest"
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Resources from tools are used for translated strings // Resources from tools are used for translated strings
...@@ -82,7 +83,8 @@ namespace ...@@ -82,7 +83,8 @@ namespace
PROP_INTEGER, PROP_INTEGER,
PROP_TIMEOUT, PROP_TIMEOUT,
PROP_EPSILONLEVEL, PROP_EPSILONLEVEL,
PROP_LIMITBBDEPTH PROP_LIMITBBDEPTH,
PROP_NONLINEARTEST
}; };
} }
...@@ -146,6 +148,7 @@ SolverComponent::SolverComponent( const uno::Reference<uno::XComponentContext>& ...@@ -146,6 +148,7 @@ SolverComponent::SolverComponent( const uno::Reference<uno::XComponentContext>&
mnTimeout( 120 ), mnTimeout( 120 ),
mnEpsilonLevel( 0 ), mnEpsilonLevel( 0 ),
mbLimitBBDepth( sal_True ), mbLimitBBDepth( sal_True ),
mbNonLinearTest( sal_True ),
mbSuccess( sal_False ), mbSuccess( sal_False ),
mfResultValue( 0.0 ) mfResultValue( 0.0 )
{ {
...@@ -155,6 +158,7 @@ SolverComponent::SolverComponent( const uno::Reference<uno::XComponentContext>& ...@@ -155,6 +158,7 @@ SolverComponent::SolverComponent( const uno::Reference<uno::XComponentContext>&
registerProperty( C2U(STR_TIMEOUT), PROP_TIMEOUT, 0, &mnTimeout, getCppuType( &mnTimeout ) ); registerProperty( C2U(STR_TIMEOUT), PROP_TIMEOUT, 0, &mnTimeout, getCppuType( &mnTimeout ) );
registerProperty( C2U(STR_EPSILONLEVEL), PROP_EPSILONLEVEL, 0, &mnEpsilonLevel, getCppuType( &mnEpsilonLevel ) ); registerProperty( C2U(STR_EPSILONLEVEL), PROP_EPSILONLEVEL, 0, &mnEpsilonLevel, getCppuType( &mnEpsilonLevel ) );
registerProperty( C2U(STR_LIMITBBDEPTH), PROP_LIMITBBDEPTH, 0, &mbLimitBBDepth, getCppuType( &mbLimitBBDepth ) ); registerProperty( C2U(STR_LIMITBBDEPTH), PROP_LIMITBBDEPTH, 0, &mbLimitBBDepth, getCppuType( &mbLimitBBDepth ) );
registerProperty( C2U(STR_NONLINEARTEST), PROP_NONLINEARTEST, 0, &mbNonLinearTest, getCppuType( &mbNonLinearTest ) );
} }
SolverComponent::~SolverComponent() SolverComponent::~SolverComponent()
...@@ -214,6 +218,9 @@ OUString SAL_CALL SolverComponent::getPropertyDescription( const OUString& rProp ...@@ -214,6 +218,9 @@ OUString SAL_CALL SolverComponent::getPropertyDescription( const OUString& rProp
case PROP_LIMITBBDEPTH: case PROP_LIMITBBDEPTH:
nResId = RID_PROPERTY_LIMITBBDEPTH; nResId = RID_PROPERTY_LIMITBBDEPTH;
break; break;
case PROP_NONLINEARTEST:
nResId = RID_PROPERTY_NONLINEARTEST;
break;
default: default:
{ {
// unknown - leave empty // unknown - leave empty
...@@ -369,6 +376,16 @@ void SAL_CALL SolverComponent::solve() throw(uno::RuntimeException) ...@@ -369,6 +376,16 @@ void SAL_CALL SolverComponent::solve() throw(uno::RuntimeException)
double fInitial = aCellsIter->second.front(); double fInitial = aCellsIter->second.front();
double fCoeff = aCellsIter->second.back(); // last appended: coefficient for this variable double fCoeff = aCellsIter->second.back(); // last appended: coefficient for this variable
double fTwo = lcl_GetValue( mxDoc, aCellsIter->first ); double fTwo = lcl_GetValue( mxDoc, aCellsIter->first );
if ( mbNonLinearTest )
{
bool bLinear ( sal_True );
bLinear = rtl::math::approxEqual( fTwo, fInitial + 2.0 * fCoeff ) ||
rtl::math::approxEqual( fInitial, fTwo - 2.0 * fCoeff );
// second comparison is needed in case fTwo is zero
if ( !bLinear )
maStatus = lcl_GetResourceString( RID_ERROR_NONLINEAR );
}
} }
lcl_SetValue( mxDoc, *aVarIter, 0.0 ); // set back to zero for examining next variable lcl_SetValue( mxDoc, *aVarIter, 0.0 ); // set back to zero for examining next variable
......
...@@ -31,11 +31,12 @@ ...@@ -31,11 +31,12 @@
#define RID_PROPERTY_TIMEOUT (SOLVER_RESOURCE_START + 3) #define RID_PROPERTY_TIMEOUT (SOLVER_RESOURCE_START + 3)
#define RID_PROPERTY_EPSILONLEVEL (SOLVER_RESOURCE_START + 4) #define RID_PROPERTY_EPSILONLEVEL (SOLVER_RESOURCE_START + 4)
#define RID_PROPERTY_LIMITBBDEPTH (SOLVER_RESOURCE_START + 5) #define RID_PROPERTY_LIMITBBDEPTH (SOLVER_RESOURCE_START + 5)
#define RID_ERROR_NONLINEAR (SOLVER_RESOURCE_START + 6) #define RID_PROPERTY_NONLINEARTEST (SOLVER_RESOURCE_START + 6)
#define RID_ERROR_EPSILONLEVEL (SOLVER_RESOURCE_START + 7) #define RID_ERROR_NONLINEAR (SOLVER_RESOURCE_START + 7)
#define RID_ERROR_INFEASIBLE (SOLVER_RESOURCE_START + 8) #define RID_ERROR_EPSILONLEVEL (SOLVER_RESOURCE_START + 8)
#define RID_ERROR_UNBOUNDED (SOLVER_RESOURCE_START + 9) #define RID_ERROR_INFEASIBLE (SOLVER_RESOURCE_START + 9)
#define RID_ERROR_TIMEOUT (SOLVER_RESOURCE_START + 10) #define RID_ERROR_UNBOUNDED (SOLVER_RESOURCE_START + 10)
#define RID_ERROR_TIMEOUT (SOLVER_RESOURCE_START + 11)
#endif #endif
...@@ -56,6 +56,8 @@ class SolverComponent : public comphelper::OMutexAndBroadcastHelper, ...@@ -56,6 +56,8 @@ class SolverComponent : public comphelper::OMutexAndBroadcastHelper,
sal_Int32 mnTimeout; sal_Int32 mnTimeout;
sal_Int32 mnEpsilonLevel; sal_Int32 mnEpsilonLevel;
sal_Bool mbLimitBBDepth; sal_Bool mbLimitBBDepth;
sal_Bool
mbNonLinearTest;
// results // results
sal_Bool mbSuccess; sal_Bool mbSuccess;
double mfResultValue; double mfResultValue;
......
...@@ -48,10 +48,13 @@ String RID_PROPERTY_LIMITBBDEPTH ...@@ -48,10 +48,13 @@ String RID_PROPERTY_LIMITBBDEPTH
{ {
Text [ en-US ] = "Limit branch-and-bound depth"; Text [ en-US ] = "Limit branch-and-bound depth";
}; };
String RID_PROPERTY_NONLINEARTEST
{
Text [ en-US ] = "Run strict linearity checks";
};
String RID_ERROR_NONLINEAR String RID_ERROR_NONLINEAR
{ {
Text [ en-US ] = "The model is not linear."; Text [ en-US ] = "The model seems nonlinear (see options).";
}; };
String RID_ERROR_EPSILONLEVEL String RID_ERROR_EPSILONLEVEL
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment