1    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2    	/*                                                                           */
3    	/*                  This file is part of the program and library             */
4    	/*         SCIP --- Solving Constraint Integer Programs                      */
5    	/*                                                                           */
6    	/*    Copyright (C) 2002-2022 Konrad-Zuse-Zentrum                            */
7    	/*                            fuer Informationstechnik Berlin                */
8    	/*                                                                           */
9    	/*  SCIP is distributed under the terms of the ZIB Academic License.         */
10   	/*                                                                           */
11   	/*  You should have received a copy of the ZIB Academic License              */
12   	/*  along with SCIP; see the file COPYING. If not visit scipopt.org.         */
13   	/*                                                                           */
14   	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15   	
16   	/**@file   type_nlpi.h
17   	 * @ingroup TYPEDEFINITIONS
18   	 * @brief  type definitions for NLP solver interfaces
19   	 * @author Stefan Vigerske
20   	 * @author Thorsten Gellermann
21   	 */
22   	
23   	/** @defgroup DEFPLUGINS_NLPI Default NLP solver interfaces
24   	 *  @ingroup DEFPLUGINS
25   	 *  @brief implementation files (.c/.cpp files) of the default NLP solver interfaces of SCIP
26   	 */
27   	
28   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
29   	
30   	#ifndef __SCIP_TYPE_NLPI_H__
31   	#define __SCIP_TYPE_NLPI_H__
32   	
33   	#include "scip/def.h"
34   	#include "scip/type_scip.h"
35   	#include "scip/type_expr.h"
36   	#include "scip/type_nlp.h"
37   	
38   	#ifdef __cplusplus
39   	extern "C" {
40   	#endif
41   	
42   	typedef struct SCIP_Nlpi          SCIP_NLPI;          /**< NLP solver interface */
43   	typedef struct SCIP_NlpiData      SCIP_NLPIDATA;      /**< locally defined NLP solver interface data */
44   	typedef struct SCIP_NlpiProblem   SCIP_NLPIPROBLEM;   /**< locally defined NLP solver interface data for a specific problem instance */
45   	
46   	/** NLP solver fast-fail levels */
47   	enum SCIP_NlpParam_FastFail
48   	{
49   	   SCIP_NLPPARAM_FASTFAIL_OFF          = 0,  /**< never stop if progress is still possible */
50   	   SCIP_NLPPARAM_FASTFAIL_CONSERVATIVE = 1,  /**< stop if it seems unlikely that an improving point can be found */
51   	   SCIP_NLPPARAM_FASTFAIL_AGGRESSIVE   = 2   /**< stop if convergence rate is low */
52   	};
53   	/** NLP solver fast-fail levels */
54   	typedef enum SCIP_NlpParam_FastFail SCIP_NLPPARAM_FASTFAIL;
55   	
56   	/** parameters for NLP solve */
57   	struct SCIP_NlpParam
58   	{
59   	   SCIP_Real             lobjlimit;          /**< lower objective limit (cutoff) */
60   	   SCIP_Real             feastol;            /**< feasibility tolerance (maximal allowed absolute violation of constraints and variable bounds) */
61   	   SCIP_Real             opttol;             /**< optimality tolerance (maximal allowed absolute violation of optimality conditions) */
62   	   SCIP_Real             solvertol;          /**< solver-specific tolerance on accuracy, e.g., maximal violation of feasibility and optimality in scaled problem (0.0: use solver default) */
63   	   SCIP_Real             timelimit;          /**< time limit in seconds: use SCIP_REAL_MAX to use remaining time available for SCIP solve (limits/time - currenttime) */
64   	   int                   iterlimit;          /**< iteration limit */
65   	   unsigned short        verblevel;          /**< verbosity level of output of NLP solver to the screen: 0 off, 1 normal, 2 debug, > 2 more debug */
66   	   SCIP_NLPPARAM_FASTFAIL fastfail;          /**< whether the NLP solver should stop early if convergence is slow */
67   	   SCIP_Bool             expectinfeas;       /**< whether to expect an infeasible problem */
68   	   SCIP_Bool             warmstart;          /**< whether to try to use solution of previous solve as starting point (if available) */
69   	   const char*           caller;             /**< name of file from which NLP is solved (it's fine to set this to NULL) */
70   	};
71   	/** parameters for NLP solve */
72   	typedef struct SCIP_NlpParam SCIP_NLPPARAM;
73   	
74   	/** default verbosity level in NLP parameters */
75   	#if defined(SCIP_DEBUG) || defined(SCIP_MOREDEBUG) || defined(SCIP_EVENMOREDEBUG)
76   	#define SCIP_NLPPARAM_DEFAULT_VERBLEVEL 1
77   	#else
78   	#define SCIP_NLPPARAM_DEFAULT_VERBLEVEL 0
79   	#endif
80   	
81   	#if !defined(_MSC_VER) || _MSC_VER >= 1800
82   	/** default values for parameters
83   	 *
84   	 * Typical use for this define is the initialization of a SCIP_NLPPARAM struct, e.g.,
85   	 *
86   	 *     SCIP_NLPPARAM nlpparam = { SCIP_NLPPARAM_DEFAULT(scip); }   //lint !e446
87   	 *
88   	 * or
89   	 *
90   	 *     SCIP_NLPPARAM nlpparam;
91   	 *     nlpparam = (SCIP_NLPPARAM){ SCIP_NLPPARAM_DEFAULT(scip); }  //lint !e446
92   	 */
93   	#define SCIP_NLPPARAM_DEFAULT_INITS(scip)              \
94   	   .lobjlimit   = SCIP_REAL_MIN,                       \
95   	   .feastol     = SCIPfeastol(scip),                   \
96   	   .opttol      = SCIPdualfeastol(scip),               \
97   	   .solvertol   = 0.0,                                 \
98   	   .timelimit   = SCIP_REAL_MAX,                       \
99   	   .iterlimit   = INT_MAX,                             \
100  	   .verblevel   = SCIP_NLPPARAM_DEFAULT_VERBLEVEL,     \
101  	   .fastfail    = SCIP_NLPPARAM_FASTFAIL_CONSERVATIVE, \
102  	   .expectinfeas= FALSE,                               \
103  	   .warmstart   = FALSE,                               \
104  	   .caller      = __FILE__
105  	
106  	/** default values for parameters
107  	 *
108  	 * Typical use for this define is the initialization of a SCIP_NLPPARAM struct, e.g.,
109  	 *
110  	 *     SCIP_NLPPARAM nlpparam = SCIP_NLPPARAM_DEFAULT(scip);   //lint !e446
111  	 *
112  	 * or
113  	 *
114  	 *     SCIP_NLPPARAM nlpparam;
115  	 *     nlpparam = SCIP_NLPPARAM_DEFAULT(scip);  //lint !e446
116  	 */
117  	#define SCIP_NLPPARAM_DEFAULT(scip) (SCIP_NLPPARAM){ SCIP_NLPPARAM_DEFAULT_INITS(scip) }
118  	
119  	#else
120  	/** default NLP parameters with static initialization; required for SCIPsolveNlpi macro with ancient MSVC */
121  	static const SCIP_NLPPARAM SCIP_NLPPARAM_DEFAULT_STATIC = {
122  	   SCIP_REAL_MIN, SCIP_DEFAULT_FEASTOL, SCIP_DEFAULT_DUALFEASTOL, 0.0, SCIP_REAL_MAX, INT_MAX, SCIP_NLPPARAM_DEFAULT_VERBLEVEL, SCIP_NLPPARAM_FASTFAIL_CONSERVATIVE, FALSE, FALSE, __FILE__
123  	};
124  	#define SCIP_NLPPARAM_DEFAULT(scip) SCIP_NLPPARAM_DEFAULT_STATIC
125  	#endif
126  	
127  	/** macro to help printing values of SCIP_NLPPARAM struct
128  	 *
129  	 * Typical use for this define is something like
130  	 *
131  	 *     SCIPdebugMsg(scip, "calling NLP solver with parameters " SCIP_NLPPARAM_PRINT(param));
132  	 */
133  	#define SCIP_NLPPARAM_PRINT(param) \
134  	  "lobjlimit = %g, "    \
135  	  "feastol = %g, "      \
136  	  "opttol = %g, "       \
137  	  "solvertol = %g, "    \
138  	  "timelimit = %g, "    \
139  	  "iterlimit = %d, "    \
140  	  "verblevel = %hd, "   \
141  	  "fastfail = %d, "     \
142  	  "expectinfeas = %d, " \
143  	  "warmstart = %d, "    \
144  	  "called by %s\n",     \
145  	  (param).lobjlimit, (param).feastol, (param).opttol, (param).solvertol, (param).timelimit, (param).iterlimit, \
146  	  (param).verblevel, (param).fastfail, (param).expectinfeas, (param).warmstart, (param).caller != NULL ? (param).caller : "unknown"
147  	
148  	/** NLP solution status */
149  	enum SCIP_NlpSolStat
150  	{
151  	   SCIP_NLPSOLSTAT_GLOBOPT        = 0,    /**< solved to global optimality */
152  	   SCIP_NLPSOLSTAT_LOCOPT         = 1,    /**< solved to local optimality */
153  	   SCIP_NLPSOLSTAT_FEASIBLE       = 2,    /**< feasible solution found */
154  	   SCIP_NLPSOLSTAT_LOCINFEASIBLE  = 3,    /**< solution found is local infeasible */
155  	   SCIP_NLPSOLSTAT_GLOBINFEASIBLE = 4,    /**< problem is proven infeasible */
156  	   SCIP_NLPSOLSTAT_UNBOUNDED      = 5,    /**< problem is unbounded */
157  	   SCIP_NLPSOLSTAT_UNKNOWN        = 6     /**< unknown solution status (e.g., problem not solved yet) */
158  	};
159  	typedef enum SCIP_NlpSolStat SCIP_NLPSOLSTAT;      /**< NLP solution status */
160  	
161  	/** NLP solver termination status */
162  	enum SCIP_NlpTermStat
163  	{
164  	   SCIP_NLPTERMSTAT_OKAY          = 0,    /**< terminated successfully */
165  	   SCIP_NLPTERMSTAT_TIMELIMIT     = 1,    /**< time limit exceeded */
166  	   SCIP_NLPTERMSTAT_ITERLIMIT     = 2,    /**< iteration limit exceeded */
167  	   SCIP_NLPTERMSTAT_LOBJLIMIT     = 3,    /**< lower objective limit reached */
168  	   SCIP_NLPTERMSTAT_INTERRUPT     = 4,    /**< SCIP has been asked to stop (SCIPinterruptSolve() called) */
169  	   SCIP_NLPTERMSTAT_NUMERICERROR  = 5,    /**< stopped on numerical error */
170  	   SCIP_NLPTERMSTAT_EVALERROR     = 6,    /**< stopped on function evaluation error */
171  	   SCIP_NLPTERMSTAT_OUTOFMEMORY   = 7,    /**< memory exceeded */
172  	   SCIP_NLPTERMSTAT_LICENSEERROR  = 8,    /**< problems with license of NLP solver */
173  	   SCIP_NLPTERMSTAT_OTHER         = 9     /**< other error (= this should never happen) */
174  	#if defined(GCC_VERSION) && GCC_VERSION >= 600 && !defined(__INTEL_COMPILER) /* _attribute__ ((deprecated)) within enums not allowed for older GCCs; ICC ignores attributes */
175  	   ,/* for some backward compatibility */
176  	   SCIP_NLPTERMSTAT_TILIM   SCIP_DEPRECATED = SCIP_NLPTERMSTAT_TIMELIMIT,
177  	   SCIP_NLPTERMSTAT_ITLIM   SCIP_DEPRECATED = SCIP_NLPTERMSTAT_ITERLIMIT,
178  	   SCIP_NLPTERMSTAT_LOBJLIM SCIP_DEPRECATED = SCIP_NLPTERMSTAT_LOBJLIMIT,
179  	   SCIP_NLPTERMSTAT_NUMERR  SCIP_DEPRECATED = SCIP_NLPTERMSTAT_NUMERICERROR,
180  	   SCIP_NLPTERMSTAT_EVALERR SCIP_DEPRECATED = SCIP_NLPTERMSTAT_EVALERROR,
181  	   SCIP_NLPTERMSTAT_MEMERR  SCIP_DEPRECATED = SCIP_NLPTERMSTAT_OUTOFMEMORY,
182  	   SCIP_NLPTERMSTAT_LICERR  SCIP_DEPRECATED = SCIP_NLPTERMSTAT_LICENSEERROR
183  	#endif
184  	};
185  	typedef enum SCIP_NlpTermStat SCIP_NLPTERMSTAT;  /**< NLP solver termination status */
186  	
187  	/** Statistics from an NLP solve */
188  	struct SCIP_NlpStatistics
189  	{
190  	   int                   niterations;        /**< number of iterations the NLP solver spend in the last solve command */
191  	   SCIP_Real             totaltime;          /**< total time in CPU sections the NLP solver spend in the last solve command */
192  	   SCIP_Real             evaltime;           /**< time spend in evaluation of functions and their derivatives (only measured if timing/nlpieval = TRUE) */
193  	
194  	   SCIP_Real             consviol;           /**< maximal absolute constraint violation in current solution, or SCIP_INVALID if not available */
195  	   SCIP_Real             boundviol;          /**< maximal absolute variable bound violation in current solution, or SCIP_INVALID if not available */
196  	};
197  	typedef struct SCIP_NlpStatistics SCIP_NLPSTATISTICS; /**< NLP solve statistics */
198  	
199  	/** copy method of NLP interface (called when SCIP copies plugins)
200  	 *
201  	 * Implementation of this callback is optional.
202  	 *
203  	 * \param[in] scip       target SCIP where to include copy of NLPI
204  	 * \param[in] sourcenlpi the NLP interface to copy
205  	 */
206  	#define SCIP_DECL_NLPICOPY(x) SCIP_RETCODE x (\
207  	   SCIP*      scip, \
208  	   SCIP_NLPI* sourcenlpi)
209  	
210  	/** frees the data of the NLP interface
211  	 *
212  	 *  \param[in] scip     SCIP data structure
213  	 *  \param[in] nlpi     datastructure for solver interface
214  	 *  \param[in] nlpidata NLPI data to free
215  	 */
216  	#define SCIP_DECL_NLPIFREE(x) SCIP_RETCODE x (\
217  	   SCIP*           scip, \
218  	   SCIP_NLPI*      nlpi, \
219  	   SCIP_NLPIDATA** nlpidata)
220  	
221  	/** gets pointer to solver-internal NLP solver
222  	 *
223  	 * Implementation of this callback is optional.
224  	 *
225  	 * Depending on the solver interface, a solver pointer may exist for every NLP problem instance.
226  	 * For this case, a nlpiproblem can be passed in as well.
227  	 *
228  	 * \param[in] scip    SCIP data structure
229  	 * \param[in] nlpi    datastructure for solver interface
230  	 * \param[in] problem datastructure for problem instance, or NULL
231  	 *
232  	 * \return void pointer to solver
233  	 */
234  	#define SCIP_DECL_NLPIGETSOLVERPOINTER(x) void* x (\
235  	   SCIP*      scip, \
236  	   SCIP_NLPI* nlpi, \
237  	   SCIP_NLPIPROBLEM* problem)
238  	
239  	/** creates a problem instance
240  	 *
241  	 * \param[in] scip     SCIP data structure
242  	 * \param[in] nlpi     datastructure for solver interface
243  	 * \param[out] problem pointer to store the problem data
244  	 * \param[in] name     name of problem, can be NULL
245  	 */
246  	#define SCIP_DECL_NLPICREATEPROBLEM(x) SCIP_RETCODE x (\
247  	   SCIP*              scip, \
248  	   SCIP_NLPI*         nlpi, \
249  	   SCIP_NLPIPROBLEM** problem, \
250  	   const char*        name)
251  	
252  	/** free a problem instance
253  	 *
254  	 * \param[in] scip    SCIP data structure
255  	 * \param[in] nlpi    datastructure for solver interface
256  	 * \param[in] problem pointer where problem data is stored
257  	 */
258  	#define SCIP_DECL_NLPIFREEPROBLEM(x) SCIP_RETCODE x (\
259  	   SCIP*              scip, \
260  	   SCIP_NLPI*         nlpi, \
261  	   SCIP_NLPIPROBLEM** problem)
262  	
263  	/** gets pointer to solver-internal problem instance
264  	 *
265  	 * Implementation of this callback is optional.
266  	 *
267  	 * \param[in] scip    SCIP data structure
268  	 * \param[in] nlpi    datastructure for solver interface
269  	 * \param[in] problem datastructure for problem instance
270  	 *
271  	 * \return void pointer to problem instance
272  	 */
273  	#define SCIP_DECL_NLPIGETPROBLEMPOINTER(x) void* x (\
274  	   SCIP*             scip, \
275  	   SCIP_NLPI*        nlpi, \
276  	   SCIP_NLPIPROBLEM* problem)
277  	
278  	/** adds variables
279  	 *
280  	 * \param[in] scip     SCIP data structure
281  	 * \param[in] nlpi     datastructure for solver interface
282  	 * \param[in] problem  datastructure for problem instance
283  	 * \param[in] nvars    number of variables
284  	 * \param[in] lbs      lower bounds of variables, can be NULL if -infinity
285  	 * \param[in] ubs      upper bounds of variables, can be NULL if +infinity
286  	 * \param[in] varnames names of variables, can be NULL
287  	 */
288  	#define SCIP_DECL_NLPIADDVARS(x) SCIP_RETCODE x (\
289  	   SCIP*             scip,    \
290  	   SCIP_NLPI*        nlpi,    \
291  	   SCIP_NLPIPROBLEM* problem, \
292  	   int               nvars,   \
293  	   const SCIP_Real*  lbs,     \
294  	   const SCIP_Real*  ubs,     \
295  	   const char**      varnames)
296  	
297  	/** add constraints
298  	 *
299  	 * \param[in] scip     SCIP data structure
300  	 * \param[in] nlpi     datastructure for solver interface
301  	 * \param[in] problem  datastructure for problem instance
302  	 * \param[in] ncons    number of added constraints
303  	 * \param[in] lhss     left hand sides of constraints, can be NULL if -infinity
304  	 * \param[in] rhss     right hand sides of constraints, can be NULL if +infinity
305  	 * \param[in] nlininds number of linear coefficients for each constraint; may be NULL in case of no linear part
306  	 * \param[in] lininds  indices of variables for linear coefficients for each constraint; may be NULL in case of no linear part
307  	 * \param[in] linvals  values of linear coefficient for each constraint; may be NULL in case of no linear part
308  	 * \param[in] exprs    expressions for nonlinear part of constraints; may be NULL or entries may be NULL when no nonlinear parts
309  	 * \param[in] names    names of constraints; may be NULL or entries may be NULL
310  	 */
311  	#define SCIP_DECL_NLPIADDCONSTRAINTS(x) SCIP_RETCODE x (\
312  	   SCIP*             scip,     \
313  	   SCIP_NLPI*        nlpi,     \
314  	   SCIP_NLPIPROBLEM* problem,  \
315  	   int               nconss,   \
316  	   const SCIP_Real*  lhss,     \
317  	   const SCIP_Real*  rhss,     \
318  	   const int*        nlininds, \
319  	   int* const*       lininds,  \
320  	   SCIP_Real* const* linvals,  \
321  	   SCIP_EXPR**       exprs,    \
322  	   const char**      names)
323  	
324  	/** sets or overwrites objective, a minimization problem is expected
325  	 *
326  	 * \param[in] scip     SCIP data structure
327  	 * \param[in] nlpi     datastructure for solver interface
328  	 * \param[in] problem  datastructure for problem instance
329  	 * \param[in] nlins    number of linear variables
330  	 * \param[in] lininds  variable indices; may be NULL in case of no linear part
331  	 * \param[in] linvals  coefficient values; may be NULL in case of no linear part
332  	 * \param[in] expr     expression for nonlinear part of objective function; may be NULL in case of no nonlinear part
333  	 * \param[in] constant objective value offset
334  	 */
335  	#define SCIP_DECL_NLPISETOBJECTIVE(x) SCIP_RETCODE x (\
336  	   SCIP*             scip,    \
337  	   SCIP_NLPI*        nlpi,    \
338  	   SCIP_NLPIPROBLEM* problem, \
339  	   int               nlins,   \
340  	   const int*        lininds, \
341  	   const SCIP_Real*  linvals, \
342  	   SCIP_EXPR*        expr,    \
343  	   const SCIP_Real   constant)
344  	
345  	/** change variable bounds
346  	 *
347  	 * \param[in] scip    SCIP data structure
348  	 * \param[in] nlpi    datastructure for solver interface
349  	 * \param[in] problem datastructure for problem instance
350  	 * \param[in] nvars   number of variables to change bounds
351  	 * \param[in] indices indices of variables to change bounds
352  	 * \param[in] lbs     new lower bounds
353  	 * \param[in] ubs     new upper bounds
354  	 */
355  	#define SCIP_DECL_NLPICHGVARBOUNDS(x) SCIP_RETCODE x (\
356  	   SCIP*             scip,    \
357  	   SCIP_NLPI*        nlpi,    \
358  	   SCIP_NLPIPROBLEM* problem, \
359  	   const int         nvars,   \
360  	   const int*        indices, \
361  	   const SCIP_Real*  lbs,     \
362  	   const SCIP_Real*  ubs)
363  	
364  	/** change constraint sides
365  	 *
366  	 * \param[in] scip    SCIP data structure
367  	 * \param[in] nlpi    datastructure for solver interface
368  	 * \param[in] problem datastructure for problem instance
369  	 * \param[in] nconss  number of constraints to change sides
370  	 * \param[in] indices indices of constraints to change sides
371  	 * \param[in] lhss    new left hand sides
372  	 * \param[in] rhss    new right hand sides
373  	 */
374  	#define SCIP_DECL_NLPICHGCONSSIDES(x) SCIP_RETCODE x (\
375  	   SCIP*             scip,    \
376  	   SCIP_NLPI*        nlpi,    \
377  	   SCIP_NLPIPROBLEM* problem, \
378  	   int               nconss,  \
379  	   const int*        indices, \
380  	   const SCIP_Real*  lhss,    \
381  	   const SCIP_Real*  rhss)
382  	
383  	/** delete a set of variables
384  	 *
385  	 * \param[in] scip       SCIP data structure
386  	 * \param[in] nlpi       datastructure for solver interface
387  	 * \param[in] problem    datastructure for problem instance
388  	 * \param[in,out] dstats deletion status of vars on input (1 if var should be deleted, 0 if not); new position of var on output, -1 if var was deleted
389  	 * \param[in] dstatssize size of the dstats array
390  	 */
391  	#define SCIP_DECL_NLPIDELVARSET(x) SCIP_RETCODE x (\
392  	   SCIP*             scip,    \
393  	   SCIP_NLPI*        nlpi,    \
394  	   SCIP_NLPIPROBLEM* problem, \
395  	   int*              dstats,  \
396  	   int               dstatssize)
397  	
398  	/** delete a set of constraints
399  	 *
400  	 * \param[in] scip       SCIP data structure
401  	 * \param[in] nlpi       datastructure for solver interface
402  	 * \param[in] problem    datastructure for problem instance
403  	 * \param[in,out] dstats deletion status of constraints on input (1 if constraint should be deleted, 0 if not); new position of constraint on output, -1 if constraint was deleted
404  	 * \param[in] dstatssize size of the dstats array
405  	 */
406  	#define SCIP_DECL_NLPIDELCONSSET(x) SCIP_RETCODE x (\
407  	   SCIP*             scip,    \
408  	   SCIP_NLPI*        nlpi,    \
409  	   SCIP_NLPIPROBLEM* problem, \
410  	   int*              dstats,  \
411  	   int               dstatssize)
412  	
413  	/** changes (or adds) linear coefficients in a constraint or objective
414  	 *
415  	 * \param[in] scip    SCIP data structure
416  	 * \param[in] nlpi    datastructure for solver interface
417  	 * \param[in] problem datastructure for problem instance
418  	 * \param[in] idx     index of constraint or -1 for objective
419  	 * \param[in] nvals   number of values in linear constraint to change
420  	 * \param[in] varidxs indices of variables which coefficient to change
421  	 * \param[in] vals    new values for coefficients
422  	 */
423  	#define SCIP_DECL_NLPICHGLINEARCOEFS(x) SCIP_RETCODE x (\
424  	   SCIP*             scip,    \
425  	   SCIP_NLPI*        nlpi,    \
426  	   SCIP_NLPIPROBLEM* problem, \
427  	   int               idx,     \
428  	   int               nvals,   \
429  	   const int*        varidxs, \
430  	   const SCIP_Real*  vals)
431  	
432  	/** replaces the expression of a constraint or objective
433  	 *
434  	 * \param[in] scip    SCIP data structure
435  	 * \param[in] nlpi    datastructure for solver interface
436  	 * \param[in] problem datastructure for problem instance
437  	 * \param[in] idxcons index of constraint or -1 for objective
438  	 * \param[in] expr    new expression for constraint or objective, or NULL to only remove previous tree
439  	 */
440  	#define SCIP_DECL_NLPICHGEXPR(x) SCIP_RETCODE x (\
441  	   SCIP*             scip,    \
442  	   SCIP_NLPI*        nlpi,    \
443  	   SCIP_NLPIPROBLEM* problem, \
444  	   int               idxcons, \
445  	   SCIP_EXPR*        expr)
446  	
447  	/** changes the constant offset in the objective
448  	 *
449  	 * \param[in] scip        SCIP data structure
450  	 * \param[in] nlpi        datastructure for solver interface
451  	 * \param[in] problem     datastructure for problem instance
452  	 * \param[in] objconstant new value for objective constant
453  	 */
454  	#define SCIP_DECL_NLPICHGOBJCONSTANT(x) SCIP_RETCODE x (\
455  	   SCIP*             scip,    \
456  	   SCIP_NLPI*        nlpi,    \
457  	   SCIP_NLPIPROBLEM* problem, \
458  	   SCIP_Real         objconstant)
459  	
460  	/** sets initial guess
461  	 *
462  	 * Implementation of this callback is optional.
463  	 *
464  	 * \param[in] scip            SCIP data structure
465  	 * \param[in] nlpi            datastructure for solver interface
466  	 * \param[in] problem         datastructure for problem instance
467  	 * \param[in] primalvalues    initial primal values for variables, or NULL to clear previous values
468  	 * \param[in] consdualvalues  initial dual values for constraints, or NULL to clear previous values
469  	 * \param[in] varlbdualvalues initial dual values for variable lower bounds, or NULL to clear previous values
470  	 * \param[in] varubdualvalues initial dual values for variable upper bounds, or NULL to clear previous values
471  	 */
472  	#define SCIP_DECL_NLPISETINITIALGUESS(x) SCIP_RETCODE x (\
473  	   SCIP*             scip,            \
474  	   SCIP_NLPI*        nlpi,            \
475  	   SCIP_NLPIPROBLEM* problem,         \
476  	   SCIP_Real*        primalvalues,    \
477  	   SCIP_Real*        consdualvalues,  \
478  	   SCIP_Real*        varlbdualvalues, \
479  	   SCIP_Real*        varubdualvalues)
480  	
481  	/** tries to solve NLP
482  	 *
483  	 * \param[in] scip    SCIP data structure
484  	 * \param[in] nlpi    datastructure for solver interface
485  	 * \param[in] problem datastructure for problem instance
486  	 * \param[in] param   parameters (e.g., working limits) to use
487  	 */
488  	#define SCIP_DECL_NLPISOLVE(x) SCIP_RETCODE x (\
489  	   SCIP*             scip, \
490  	   SCIP_NLPI*        nlpi, \
491  	   SCIP_NLPIPROBLEM* problem, \
492  	   SCIP_NLPPARAM     param)
493  	
494  	/** gives solution status
495  	 *
496  	 * \param[in] scip    SCIP data structure
497  	 * \param[in] nlpi    datastructure for solver interface
498  	 * \param[in] problem datastructure for problem instance
499  	 *
500  	 * \return Solution Status
501  	 */
502  	#define SCIP_DECL_NLPIGETSOLSTAT(x) SCIP_NLPSOLSTAT x (\
503  	   SCIP*             scip, \
504  	   SCIP_NLPI*        nlpi, \
505  	   SCIP_NLPIPROBLEM* problem)
506  	
507  	/** gives termination reason
508  	 *
509  	 * \param[in] scip    SCIP data structure
510  	 * \param[in] nlpi    datastructure for solver interface
511  	 * \param[in] problem datastructure for problem instance
512  	 *
513  	 * \return Termination Status
514  	 */
515  	#define SCIP_DECL_NLPIGETTERMSTAT(x) SCIP_NLPTERMSTAT x (\
516  	   SCIP*             scip, \
517  	   SCIP_NLPI*        nlpi, \
518  	   SCIP_NLPIPROBLEM* problem)
519  	
520  	/** gives primal and dual solution values
521  	 *
522  	 * Solver can return NULL in dual values if not available,
523  	 * but if solver provides dual values for one side of variable bounds, then it must also provide those for the other side.
524  	 *
525  	 * For a ranged constraint, the dual variable is positive if the right hand side is active and negative if the left hand side is active.
526  	 *
527  	 * \param[in] scip             SCIP data structure
528  	 * \param[in] nlpi             datastructure for solver interface
529  	 * \param[in] problem          datastructure for problem instance
530  	 * \param[out] primalvalues    buffer to store pointer to array to primal values, or NULL if not needed
531  	 * \param[out] consdualvalues  buffer to store pointer to array to dual values of constraints, or NULL if not needed
532  	 * \param[out] varlbdualvalues buffer to store pointer to array to dual values of variable lower bounds, or NULL if not needed
533  	 * \param[out] varubdualvalues buffer to store pointer to array to dual values of variable lower bounds, or NULL if not needed
534  	 * \param[out] objval          pointer to store the objective value, or NULL if not needed
535  	 */
536  	#define SCIP_DECL_NLPIGETSOLUTION(x) SCIP_RETCODE x (\
537  	   SCIP*             scip,            \
538  	   SCIP_NLPI*        nlpi,            \
539  	   SCIP_NLPIPROBLEM* problem,         \
540  	   SCIP_Real**       primalvalues,    \
541  	   SCIP_Real**       consdualvalues,  \
542  	   SCIP_Real**       varlbdualvalues, \
543  	   SCIP_Real**       varubdualvalues, \
544  	   SCIP_Real*        objval)
545  	
546  	/** gives solve statistics
547  	 *
548  	 * \param[in] scip        SCIP data structure
549  	 * \param[in] nlpi        datastructure for solver interface
550  	 * \param[in] problem     datastructure for problem instance
551  	 * \param[out] statistics buffer where to store statistics
552  	 */
553  	#define SCIP_DECL_NLPIGETSTATISTICS(x) SCIP_RETCODE x (\
554  	   SCIP*               scip,    \
555  	   SCIP_NLPI*          nlpi,    \
556  	   SCIP_NLPIPROBLEM*   problem, \
557  	   SCIP_NLPSTATISTICS* statistics)
558  	
559  	#ifdef __cplusplus
560  	}
561  	#endif
562  	
563  	#endif /*__SCIP_TYPE_NLPI_H__ */
564