/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* This file is part of the program and library */ /* SCIP --- Solving Constraint Integer Programs */ /* */ /* Copyright (C) 2002-2020 Konrad-Zuse-Zentrum */ /* fuer Informationstechnik Berlin */ /* */ /* SCIP is distributed under the terms of the ZIB Academic License. */ /* */ /* You should have received a copy of the ZIB Academic License */ /* along with SCIP; see the file COPYING. If not visit scipopt.org. */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /**@file scip_nlp.h * @ingroup PUBLICCOREAPI * @brief public methods for nonlinear relaxations * @author Tobias Achterberg * @author Timo Berthold * @author Thorsten Koch * @author Alexander Martin * @author Marc Pfetsch * @author Kati Wolter * @author Gregor Hendel * @author Leona Gottwald */ /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/ #ifndef __SCIP_SCIP_NLP_H__ #define __SCIP_SCIP_NLP_H__ #include "nlpi/type_expr.h" #include "nlpi/type_nlpi.h" #include "scip/def.h" #include "scip/type_lp.h" #include "scip/type_nlp.h" #include "scip/type_retcode.h" #include "scip/type_scip.h" #include "scip/type_sol.h" #include "scip/type_var.h" #ifdef __cplusplus extern "C" { #endif /**@addtogroup PublicNLPInterfaceMethods * * @{ */ /** includes an NLPI in SCIP */ SCIP_EXPORT SCIP_RETCODE SCIPincludeNlpi( SCIP* scip, /**< SCIP data structure */ SCIP_NLPI* nlpi /**< NLPI data structure */ ); /** returns the NLPI of the given name, or NULL if not existing */ SCIP_EXPORT SCIP_NLPI* SCIPfindNlpi( SCIP* scip, /**< SCIP data structure */ const char* name /**< name of NLPI */ ); /** returns the array of currently available NLPIs (sorted by priority) */ SCIP_EXPORT SCIP_NLPI** SCIPgetNlpis( SCIP* scip /**< SCIP data structure */ ); /** returns the number of currently available NLPIs */ SCIP_EXPORT int SCIPgetNNlpis( SCIP* scip /**< SCIP data structure */ ); /** sets the priority of an NLPI */ SCIP_EXPORT SCIP_RETCODE SCIPsetNlpiPriority( SCIP* scip, /**< SCIP data structure */ SCIP_NLPI* nlpi, /**< NLPI */ int priority /**< new priority of the NLPI */ ); /** @} */ /**@addtogroup PublicNLPMethods * * @{ */ /** returns whether the NLP relaxation has been enabled * * If the NLP relaxation is enabled, then SCIP will construct the NLP relaxation when the solving process is about to begin. * To check whether an NLP is existing, use SCIPisNLPConstructed(). * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITPRESOLVE * - \ref SCIP_STAGE_PRESOLVING * - \ref SCIP_STAGE_EXITPRESOLVE * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING * * @see SCIPenableNLP */ SCIP_EXPORT SCIP_Bool SCIPisNLPEnabled( SCIP* scip /**< SCIP data structure */ ); /** marks that there are constraints that are representable by nonlinear rows * * This method should be called by a constraint handler if it has constraints that have a representation as nonlinear rows. * * The function should be called before the branch-and-bound process is initialized, e.g., when presolve is exiting. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITPRESOLVE * - \ref SCIP_STAGE_PRESOLVING * - \ref SCIP_STAGE_EXITPRESOLVE * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT void SCIPenableNLP( SCIP* scip /**< SCIP data structure */ ); /** returns, whether an NLP has been constructed * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_Bool SCIPisNLPConstructed( SCIP* scip /**< SCIP data structure */ ); /** returns whether the NLP has a continuous variable in a nonlinear term * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_Bool SCIPhasNLPContinuousNonlinearity( SCIP* scip /**< SCIP data structure */ ); /** gets current NLP variables along with the current number of NLP variables * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPVarsData( SCIP* scip, /**< SCIP data structure */ SCIP_VAR*** vars, /**< pointer to store the array of NLP variables, or NULL */ int* nvars /**< pointer to store the number of NLP variables, or NULL */ ); /** gets array with variables of the NLP * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_VAR** SCIPgetNLPVars( SCIP* scip /**< SCIP data structure */ ); /** gets current number of variables in NLP * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT int SCIPgetNNLPVars( SCIP* scip /**< SCIP data structure */ ); /** computes for each variables the number of NLP rows in which the variable appears in a nonlinear var * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPVarsNonlinearity( SCIP* scip, /**< SCIP data structure */ int* nlcount /**< an array of length at least SCIPnlpGetNVars() to store nonlinearity counts of variables */ ); /** returns dual solution values associated with lower bounds of NLP variables * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_Real* SCIPgetNLPVarsLbDualsol( SCIP* scip /**< SCIP data structure */ ); /** returns dual solution values associated with upper bounds of NLP variables * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_Real* SCIPgetNLPVarsUbDualsol( SCIP* scip /**< SCIP data structure */ ); /** gets current NLP nonlinear rows along with the current number of NLP nonlinear rows * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPNlRowsData( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW*** nlrows, /**< pointer to store the array of NLP nonlinear rows, or NULL */ int* nnlrows /**< pointer to store the number of NLP nonlinear rows, or NULL */ ); /** gets array with nonlinear rows of the NLP * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_NLROW** SCIPgetNLPNlRows( SCIP* scip /**< SCIP data structure */ ); /** gets current number of nonlinear rows in NLP * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT int SCIPgetNNLPNlRows( SCIP* scip /**< SCIP data structure */ ); /** adds a nonlinear row to the NLP. This row is captured by the NLP. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPaddNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow /**< nonlinear row to add to NLP */ ); /** removes a nonlinear row from the NLP. This row is released in the NLP. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING * - \ref SCIP_STAGE_SOLVED * - \ref SCIP_STAGE_EXITSOLVE */ SCIP_EXPORT SCIP_RETCODE SCIPdelNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow /**< nonlinear row to add to NLP */ ); /** makes sure that the NLP of the current node is flushed * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPflushNLP( SCIP* scip /**< SCIP data structure */ ); /** sets or clears initial primal guess for NLP solution (start point for NLP solver) * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNLPInitialGuess( SCIP* scip, /**< SCIP data structure */ SCIP_Real* initialguess /**< values of initial guess (corresponding to variables from SCIPgetNLPVarsData), or NULL to use no start point */ ); /** sets initial primal guess for NLP solution (start point for NLP solver) * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNLPInitialGuessSol( SCIP* scip, /**< SCIP data structure */ SCIP_SOL* sol /**< solution which values should be taken as initial guess, or NULL for LP solution */ ); /** solves the current NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsolveNLP( SCIP* scip /**< SCIP data structure */ ); /** gets solution status of current NLP * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_NLPSOLSTAT SCIPgetNLPSolstat( SCIP* scip /**< SCIP data structure */ ); /** gets termination status of last NLP solve * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_NLPTERMSTAT SCIPgetNLPTermstat( SCIP* scip /**< SCIP data structure */ ); /** gives statistics (number of iterations, solving time, ...) of last NLP solve * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPStatistics( SCIP* scip, /**< SCIP data structure */ SCIP_NLPSTATISTICS* statistics /**< pointer to store statistics */ ); /** gets objective value of current NLP * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_Real SCIPgetNLPObjval( SCIP* scip /**< SCIP data structure */ ); /** indicates whether a feasible solution for the current NLP is available * thus, returns whether the solution status <= feasible * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_Bool SCIPhasNLPSolution( SCIP* scip /**< SCIP data structure */ ); /** gets fractional variables of last NLP solution along with solution values and fractionalities * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPFracVars( SCIP* scip, /**< SCIP data structure */ SCIP_VAR*** fracvars, /**< pointer to store the array of NLP fractional variables, or NULL */ SCIP_Real** fracvarssol, /**< pointer to store the array of NLP fractional variables solution values, or NULL */ SCIP_Real** fracvarsfrac, /**< pointer to store the array of NLP fractional variables fractionalities, or NULL */ int* nfracvars, /**< pointer to store the number of NLP fractional variables , or NULL */ int* npriofracvars /**< pointer to store the number of NLP fractional variables with maximal branching priority, or NULL */ ); /** gets integer parameter of NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPIntPar( SCIP* scip, /**< SCIP data structure */ SCIP_NLPPARAM type, /**< parameter number */ int* ival /**< pointer to store the parameter value */ ); /** sets integer parameter of NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNLPIntPar( SCIP* scip, /**< SCIP data structure */ SCIP_NLPPARAM type, /**< parameter number */ int ival /**< parameter value */ ); /** gets floating point parameter of NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPRealPar( SCIP* scip, /**< SCIP data structure */ SCIP_NLPPARAM type, /**< parameter number */ SCIP_Real* dval /**< pointer to store the parameter value */ ); /** sets floating point parameter of NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNLPRealPar( SCIP* scip, /**< SCIP data structure */ SCIP_NLPPARAM type, /**< parameter number */ SCIP_Real dval /**< parameter value */ ); /** gets string parameter of NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPStringPar( SCIP* scip, /**< SCIP data structure */ SCIP_NLPPARAM type, /**< parameter number */ const char** sval /**< pointer to store the parameter value */ ); /** sets string parameter of NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNLPStringPar( SCIP* scip, /**< SCIP data structure */ SCIP_NLPPARAM type, /**< parameter number */ const char* sval /**< parameter value */ ); /** writes current NLP to a file * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPwriteNLP( SCIP* scip, /**< SCIP data structure */ const char* filename /**< file name */ ); /** gets the NLP interface and problem used by the SCIP NLP; * with the NLPI and its problem you can use all of the methods defined in nlpi/nlpi.h; * * @warning You have to make sure, that the full internal state of the NLPI does not change or is recovered completely * after the end of the method that uses the NLPI. In particular, if you manipulate the NLP or its solution * (e.g. by calling one of the SCIPnlpiAdd...() or the SCIPnlpiSolve() method), you have to check in advance * whether the NLP is currently solved. If this is the case, you have to make sure, the internal solution * status is recovered completely at the end of your method. Additionally you have to resolve the NLP with * SCIPnlpiSolve() in order to reinstall the internal solution status. * * @warning Make also sure, that all parameter values that you have changed are set back to their original values. * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNLPI( SCIP* scip, /**< SCIP data structure */ SCIP_NLPI** nlpi, /**< pointer to store the NLP solver interface */ SCIP_NLPIPROBLEM** nlpiproblem /**< pointer to store the NLP solver interface problem */ ); /**@} */ /**@addtogroup PublicNLPDiveMethods * * @{ */ /** initiates NLP diving making methods SCIPchgVarObjDiveNLP(), SCIPchgVarBoundsDiveNLP(), SCIPchgVarsBoundsDiveNLP(), and SCIPsolveDiveNLP() available * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPstartDiveNLP( SCIP* scip /**< SCIP data structure */ ); /** ends NLP diving * * Resets changes made by SCIPchgVarObjDiveNLP(), SCIPchgVarBoundsDiveNLP(), and SCIPchgVarsBoundsDiveNLP(). * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPendDiveNLP( SCIP* scip /**< SCIP data structure */ ); /** changes linear objective coefficient of a variable in diving NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgVarObjDiveNLP( SCIP* scip, /**< SCIP data structure */ SCIP_VAR* var, /**< variable which coefficient to change */ SCIP_Real coef /**< new value for coefficient */ ); /** changes bounds of a variable in diving NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgVarBoundsDiveNLP( SCIP* scip, /**< SCIP data structure */ SCIP_VAR* var, /**< variable which bounds to change */ SCIP_Real lb, /**< new lower bound */ SCIP_Real ub /**< new upper bound */ ); /** changes bounds of a set of variables in diving NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgVarsBoundsDiveNLP( SCIP* scip, /**< SCIP data structure */ int nvars, /**< number of variables which bounds to changes */ SCIP_VAR** vars, /**< variables which bounds to change */ SCIP_Real* lbs, /**< new lower bounds */ SCIP_Real* ubs /**< new upper bounds */ ); /** solves diving NLP * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsolveDiveNLP( SCIP* scip /**< SCIP data structure */ ); /**@} */ /**@addtogroup PublicNLRowMethods * * @{ */ /** creates and captures an NLP row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPcreateNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW** nlrow, /**< buffer to store pointer to nonlinear row */ const char* name, /**< name of nonlinear row */ SCIP_Real constant, /**< constant */ int nlinvars, /**< number of linear variables */ SCIP_VAR** linvars, /**< linear variables, or NULL if nlinvars == 0 */ SCIP_Real* lincoefs, /**< linear coefficients, or NULL if nlinvars == 0 */ int nquadvars, /**< number of variables in quadratic term */ SCIP_VAR** quadvars, /**< variables in quadratic terms, or NULL if nquadvars == 0 */ int nquadelems, /**< number of elements in quadratic term */ SCIP_QUADELEM* quadelems, /**< elements (i.e., monomials) in quadratic term, or NULL if nquadelems == 0 */ SCIP_EXPRTREE* expression, /**< nonlinear expression, or NULL */ SCIP_Real lhs, /**< left hand side */ SCIP_Real rhs, /**< right hand side */ SCIP_EXPRCURV curvature /**< curvature of the nonlinear row */ ); /** creates and captures an NLP nonlinear row without any coefficients * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPcreateEmptyNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW** nlrow, /**< pointer to nonlinear row */ const char* name, /**< name of nonlinear row */ SCIP_Real lhs, /**< left hand side */ SCIP_Real rhs /**< right hand side */ ); /** creates and captures an NLP row from a linear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPcreateNlRowFromRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW** nlrow, /**< pointer to nonlinear row */ SCIP_ROW* row /**< the linear row to copy */ ); /** increases usage counter of NLP nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPcaptureNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow /**< nonlinear row to capture */ ); /** decreases usage counter of NLP nonlinear row, and frees memory if necessary * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING * - \ref SCIP_STAGE_EXITSOLVE */ SCIP_EXPORT SCIP_RETCODE SCIPreleaseNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW** nlrow /**< pointer to nonlinear row */ ); /** changes left hand side of NLP nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgNlRowLhs( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real lhs /**< new left hand side */ ); /** changes right hand side of NLP nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgNlRowRhs( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real rhs /**< new right hand side */ ); /** changes constant of NLP nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgNlRowConstant( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_Real constant /**< new value for constant */ ); /** adds variable with a linear coefficient to the nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPaddLinearCoefToNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_VAR* var, /**< problem variable */ SCIP_Real val /**< value of coefficient in linear part of row */ ); /** adds variables with linear coefficients to the row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPaddLinearCoefsToNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ int nvars, /**< number of variables to add to the row */ SCIP_VAR** vars, /**< problem variables to add */ SCIP_Real* vals /**< values of coefficients in linear part of row */ ); /** changes linear coefficient of a variables in a row * * Setting the coefficient to 0.0 means that it is removed from the row * the variable does not need to exists before. * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgNlRowLinearCoef( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_VAR* var, /**< variable */ SCIP_Real coef /**< new value of coefficient */ ); /** adds quadratic variable to the nonlinear row * * After adding a quadratic variable, it can be used to add quadratic elements. * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPaddQuadVarToNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_VAR* var /**< problem variable */ ); /** adds quadratic variables to the nonlinear row * * After adding quadratic variables, they can be used to add quadratic elements. * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPaddQuadVarsToNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ int nvars, /**< number of problem variables */ SCIP_VAR** vars /**< problem variables */ ); /** add a quadratic element to the nonlinear row * * Variable indices of the quadratic element need to be relative to quadratic variables array of row. * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPaddQuadElementToNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_QUADELEM quadelem /**< quadratic element */ ); /** adds quadratic elements to the nonlinear row * * Variable indices of the quadratic elements need to be relative to quadratic variables array of row. * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPaddQuadElementsToNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ int nquadelems, /**< number of quadratic elements */ SCIP_QUADELEM* quadelems /**< quadratic elements */ ); /** changes coefficient in quadratic part of a row * * Setting the coefficient in the quadelement to 0.0 means that it is removed from the row * the element does not need to exists before. * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPchgNlRowQuadElement( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_QUADELEM quadelement /**< new quadratic element, or update for existing one */ ); /** sets or deletes expression tree in the nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNlRowExprtree( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_EXPRTREE* exprtree /**< expression tree, or NULL */ ); /** sets a parameter of expression tree in the nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNlRowExprtreeParam( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ int paramidx, /**< index of parameter in expression tree */ SCIP_Real paramval /**< new value of parameter in expression tree */ ); /** sets parameters of expression tree in the nonlinear row * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPsetNlRowExprtreeParams( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_Real* paramvals /**< new values of parameter in expression tree */ ); /** recalculates the activity of a nonlinear row in the last NLP solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPrecalcNlRowNLPActivity( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow /**< NLP nonlinear row */ ); /** returns the activity of a nonlinear row in the last NLP solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowNLPActivity( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real* activity /**< pointer to store activity value */ ); /** gives the feasibility of a nonlinear row in the last NLP solution: negative value means infeasibility * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowNLPFeasibility( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real* feasibility /**< pointer to store feasibility value */ ); /** recalculates the activity of a nonlinear row for the current pseudo solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPrecalcNlRowPseudoActivity( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow /**< NLP nonlinear row */ ); /** gives the activity of a nonlinear row for the current pseudo solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowPseudoActivity( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real* pseudoactivity /**< pointer to store pseudo activity value */ ); /** gives the feasibility of a nonlinear row for the current pseudo solution: negative value means infeasibility * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowPseudoFeasibility( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real* pseudofeasibility /**< pointer to store pseudo feasibility value */ ); /** recalculates the activity of a nonlinear row in the last NLP or pseudo solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPrecalcNlRowActivity( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow /**< NLP nonlinear row */ ); /** gives the activity of a nonlinear row in the last NLP or pseudo solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowActivity( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real* activity /**< pointer to store activity value */ ); /** gives the feasibility of a nonlinear row in the last NLP or pseudo solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowFeasibility( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_Real* feasibility /**< pointer to store feasibility value */ ); /** gives the activity of a nonlinear row for the given primal solution or NLP solution or pseudo solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowSolActivity( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_SOL* sol, /**< primal CIP solution, or NULL for NLP solution of pseudo solution */ SCIP_Real* activity /**< pointer to store activity value */ ); /** gives the feasibility of a nonlinear row for the given primal solution * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowSolFeasibility( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP nonlinear row */ SCIP_SOL* sol, /**< primal CIP solution */ SCIP_Real* feasibility /**< pointer to store feasibility value */ ); /** gives the minimal and maximal activity of a nonlinear row w.r.t. the variable's bounds * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPgetNlRowActivityBounds( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ SCIP_Real* minactivity, /**< buffer to store minimal activity, or NULL */ SCIP_Real* maxactivity /**< buffer to store maximal activity, or NULL */ ); /** output nonlinear row to file stream * * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. * * @pre This method can be called if SCIP is in one of the following stages: * - \ref SCIP_STAGE_PRESOLVED * - \ref SCIP_STAGE_INITSOLVE * - \ref SCIP_STAGE_SOLVING */ SCIP_EXPORT SCIP_RETCODE SCIPprintNlRow( SCIP* scip, /**< SCIP data structure */ SCIP_NLROW* nlrow, /**< NLP row */ FILE* file /**< output file (or NULL for standard output) */ ); /**@} */ #ifdef __cplusplus } #endif #endif