@@ -4153,29 +4153,36 @@ SCIP_RETCODE SCIPlpiGetObjval(
41534153{
41544154 int ret ;
41554155
4156- #ifndef NDEBUG
4157- double oval = GRB_INFINITY ;
4158- double obnd = - GRB_INFINITY ;
4159- #endif
4160-
41614156 assert (lpi != NULL );
41624157 assert (lpi -> grbmodel != NULL );
41634158 assert (objval != NULL );
41644159
41654160 SCIPdebugMessage ("getting solution's objective value\n" );
41664161
4167- #ifndef NDEBUG
4168- (void )GRBgetdblattr (lpi -> grbmodel , GRB_DBL_ATTR_OBJVAL , & oval );
4169- (void )GRBgetdblattr (lpi -> grbmodel , GRB_DBL_ATTR_OBJBOUND , & obnd );
4170-
4171- assert (lpi -> solstat != GRB_OPTIMAL || oval == obnd ); /*lint !e777*/
4172- #endif
4173-
41744162 /* obtain objective value */
41754163 ret = GRBgetdblattr (lpi -> grbmodel , GRB_DBL_ATTR_OBJVAL , objval );
41764164 assert ( ret == 0 || ret == GRB_ERROR_DATA_NOT_AVAILABLE );
41774165 SCIP_UNUSED (ret );
41784166
4167+ #ifndef NDEBUG
4168+ {
4169+ /* in older version the barrier method does not seem to return valid objective bounds */
4170+ #if GRB_VERSION_MAJOR < 12
4171+ double obnd = - GRB_INFINITY ;
4172+ int algo ;
4173+ (void )GRBgetdblattr (lpi -> grbmodel , GRB_DBL_ATTR_OBJBOUND , & obnd );
4174+ (void )GRBgetintparam (lpi -> grbenv , GRB_INT_PAR_METHOD , & algo );
4175+ assert (algo == GRB_METHOD_BARRIER || lpi -> solstat != GRB_OPTIMAL || * objval == obnd ); /*lint !e777*/
4176+ #else
4177+ double obnd ;
4178+ double eps ;
4179+ (void )GRBgetdblattr (lpi -> grbmodel , GRB_DBL_ATTR_OBJBOUND , & obnd );
4180+ (void )GRBgetdblparam (lpi -> grbenv , GRB_DBL_PAR_FEASIBILITYTOL , & eps );
4181+ assert (lpi -> solstat != GRB_OPTIMAL || fabs (* objval - obnd ) <= eps ); /*lint !e777*/
4182+ #endif
4183+ }
4184+ #endif
4185+
41794186 /* return minus infinity if value not available and we reached the iteration limit (see lpi_cpx) */
41804187 if ( lpi -> solstat == GRB_ITERATION_LIMIT )
41814188 {
0 commit comments