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   lpi.h
17   	 * @ingroup LPIS
18   	 * @brief  interface methods for specific LP solvers
19   	 * @author Tobias Achterberg
20   	 * @author Marc Pfetsch
21   	 *
22   	 */
23   	
24   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
25   	
26   	#ifndef __SCIP_LPI_H__
27   	#define __SCIP_LPI_H__
28   	
29   	#include "blockmemshell/memory.h"
30   	#include "lpi/type_lpi.h"
31   	#include "scip/def.h"
32   	#include "scip/type_message.h"
33   	#include "scip/type_retcode.h"
34   	
35   	#ifdef __cplusplus
36   	extern "C" {
37   	#endif
38   	
39   	/**@addtogroup LPIS
40   	 *
41   	 * This file specifies a generic LP solver interface used by SCIP to create, modify, and solve linear programs of the
42   	 * form
43   	 *
44   	 *   min/max   obj * x
45   	 *      lhs <=   A * x  <= rhs
46   	 *      lb  <=       x  <= ub
47   	 *
48   	 * and query information about the solution. Although it includes a few SCIP header files, e.g., because it uses SCIP's
49   	 * return codes, it can be used independently of any SCIP instance.
50   	 *
51   	 * The basis status for (column) variables are as follows:
52   	 * - If x_j = lb, then j is at its lower bound (SCIP_BASESTAT_LOWER).
53   	 * - If x_j = ub, then j is at its lower bound (SCIP_BASESTAT_UPPER).
54   	 * - If x_j is in the basis, it has SCIP_BASESTAT_BASIC status.
55   	 * - If x_j is free and non-basic, it has SCIP_BASESTAT_ZERO status.
56   	 *
57   	 * The basis status for (row) slack variables are:
58   	 * - If (A * x)_i = lhs, then i is at its lower bound (SCIP_BASESTAT_LOWER).
59   	 * - If (A * x)_i = rhs, then i is at its upper bound (SCIP_BASESTAT_UPPER).
60   	 * - If the slack variable for row i is basic, it has SCIP_BASESTAT_BASIC status.
61   	 *
62   	 * If the solvers use their status differently, those status codes have to be corrected.
63   	 *
64   	 * In the methods accessing information about the (inverse of the) basis matrix, the interface assumes the following
65   	 * column-oriented format: slack variables of rows have coefficient +1 and the basis matrix is a regular m times m
66   	 * submatrix of (A,I), where m is the number of rows and I is the identity matrix. This means that if, internally, the
67   	 * LP solver uses coefficients -1 for some of the slack variables, then every row associated with a slack variable whose
68   	 * coefficient is -1 should be negated in order to return the result in terms of the LP interface definition.
69   	 *
70   	 * The creation of a new LP should always be done in the following ways: Either one can use SCIPlpiLoadColLP() or one
71   	 * first adds empty columns or rows. Then the matrix entries can be added by adding columns and rows, respectively.
72   	 * Adding matrix entries for a row or column that have not been added before will result in an error.
73   	 *
74   	 * The handling of the objective limit is as follows, if supported by the LP-solver: If the objective is larger than the
75   	 * objective limit for minimization problems or smaller than the objective limit for maximization problems, the solution
76   	 * process can be stopped. This naturally occurs in a branch-and-bound process, where the objective limit is set to the
77   	 * value of the best solution found so far. If the problem is a minimization problem and we use the dual simplex, the
78   	 * dual feasible solutions are maximized. If their value are larger than the objective limit, the process can be
79   	 * stopped. In this case, no feasible integer solution can be found in the corresponding branch.
80   	 *
81   	 * Some LP-solvers also support the opposite setting, but this can easily be checked after the solution process (i.e.,
82   	 * for a minimization problem a check whether the optimal value is smaller than the limit). Note that this check can
83   	 * only be determined at the end of the optimization. Thus, we do not support this.
84   	 *
85   	 * @{
86   	 */
87   	
88   	/*
89   	 * Miscellaneous Methods
90   	 */
91   	
92   	/**@name Miscellaneous Methods */
93   	/**@{ */
94   	
95   	/** gets name and version of LP solver */
96   	SCIP_EXPORT
97   	const char* SCIPlpiGetSolverName(
98   	   void
99   	   );
100  	
101  	/** gets description of LP solver (developer, webpage, ...) */
102  	SCIP_EXPORT
103  	const char* SCIPlpiGetSolverDesc(
104  	   void
105  	   );
106  	
107  	/** gets pointer for LP solver - use only with great care
108  	 *
109  	 *  The behavior of this function depends on the solver and its use is
110  	 *  therefore only recommended if you really know what you are
111  	 *  doing. In general, it returns a pointer to the LP solver object.
112  	 */
113  	SCIP_EXPORT
114  	void* SCIPlpiGetSolverPointer(
115  	   SCIP_LPI*             lpi                 /**< pointer to an LP interface structure */
116  	   );
117  	
118  	/** pass integrality information about variables to the solver */
119  	SCIP_EXPORT
120  	SCIP_RETCODE SCIPlpiSetIntegralityInformation(
121  	   SCIP_LPI*             lpi,                /**< pointer to an LP interface structure */
122  	   int                   ncols,              /**< length of integrality array */
123  	   int*                  intInfo             /**< integrality array (0: continuous, 1: integer). May be NULL iff ncols is 0.  */
124  	   );
125  	
126  	/** informs about availability of a primal simplex solving method */
127  	SCIP_EXPORT
128  	SCIP_Bool SCIPlpiHasPrimalSolve(
129  	   void
130  	   );
131  	
132  	/** informs about availability of a dual simplex solving method */
133  	SCIP_EXPORT
134  	SCIP_Bool SCIPlpiHasDualSolve(
135  	   void
136  	   );
137  	
138  	/** informs about availability of a barrier solving method */
139  	SCIP_EXPORT
140  	SCIP_Bool SCIPlpiHasBarrierSolve(
141  	   void
142  	   );
143  	
144  	/**@} */
145  	
146  	
147  	
148  	
149  	/*
150  	 * LPI Creation and Destruction Methods
151  	 */
152  	
153  	/**@name LPI Creation and Destruction Methods */
154  	/**@{ */
155  	
156  	/** creates an LP problem object */
157  	SCIP_EXPORT
158  	SCIP_RETCODE SCIPlpiCreate(
159  	   SCIP_LPI**            lpi,                /**< pointer to an LP interface structure */
160  	   SCIP_MESSAGEHDLR*     messagehdlr,        /**< message handler to use for printing messages, or NULL */
161  	   const char*           name,               /**< problem name */
162  	   SCIP_OBJSEN           objsen              /**< objective sense */
163  	   );
164  	
165  	/** deletes an LP problem object */
166  	SCIP_EXPORT
167  	SCIP_RETCODE SCIPlpiFree(
168  	   SCIP_LPI**            lpi                 /**< pointer to an LP interface structure */
169  	   );
170  	
171  	/**@} */
172  	
173  	
174  	
175  	
176  	/*
177  	 * Modification Methods
178  	 */
179  	
180  	/**@name Modification Methods */
181  	/**@{ */
182  	
183  	/** copies LP data with column matrix into LP solver */
184  	SCIP_EXPORT
185  	SCIP_RETCODE SCIPlpiLoadColLP(
186  	   SCIP_LPI*             lpi,                /**< LP interface structure */
187  	   SCIP_OBJSEN           objsen,             /**< objective sense */
188  	   int                   ncols,              /**< number of columns */
189  	   const SCIP_Real*      obj,                /**< objective function values of columns */
190  	   const SCIP_Real*      lb,                 /**< lower bounds of columns */
191  	   const SCIP_Real*      ub,                 /**< upper bounds of columns */
192  	   char**                colnames,           /**< column names, or NULL */
193  	   int                   nrows,              /**< number of rows */
194  	   const SCIP_Real*      lhs,                /**< left hand sides of rows */
195  	   const SCIP_Real*      rhs,                /**< right hand sides of rows */
196  	   char**                rownames,           /**< row names, or NULL */
197  	   int                   nnonz,              /**< number of nonzero elements in the constraint matrix */
198  	   const int*            beg,                /**< start index of each column in ind- and val-array */
199  	   const int*            ind,                /**< row indices of constraint matrix entries */
200  	   const SCIP_Real*      val                 /**< values of constraint matrix entries */
201  	   );
202  	
203  	/** adds columns to the LP
204  	 *
205  	 *  @note ind array is not checked for duplicates, problems may appear if indices are added more than once
206  	 */
207  	SCIP_EXPORT
208  	SCIP_RETCODE SCIPlpiAddCols(
209  	   SCIP_LPI*             lpi,                /**< LP interface structure */
210  	   int                   ncols,              /**< number of columns to be added */
211  	   const SCIP_Real*      obj,                /**< objective function values of new columns */
212  	   const SCIP_Real*      lb,                 /**< lower bounds of new columns */
213  	   const SCIP_Real*      ub,                 /**< upper bounds of new columns */
214  	   char**                colnames,           /**< column names, or NULL */
215  	   int                   nnonz,              /**< number of nonzero elements to be added to the constraint matrix */
216  	   const int*            beg,                /**< start index of each column in ind- and val-array, or NULL if nnonz == 0 */
217  	   const int*            ind,                /**< row indices of constraint matrix entries, or NULL if nnonz == 0 */
218  	   const SCIP_Real*      val                 /**< values of constraint matrix entries, or NULL if nnonz == 0 */
219  	   );
220  	
221  	/** deletes all columns in the given range from LP */
222  	SCIP_EXPORT
223  	SCIP_RETCODE SCIPlpiDelCols(
224  	   SCIP_LPI*             lpi,                /**< LP interface structure */
225  	   int                   firstcol,           /**< first column to be deleted */
226  	   int                   lastcol             /**< last column to be deleted */
227  	   );
228  	
229  	/** deletes columns from SCIP_LPI; the new position of a column must not be greater that its old position */
230  	SCIP_EXPORT
231  	SCIP_RETCODE SCIPlpiDelColset(
232  	   SCIP_LPI*             lpi,                /**< LP interface structure */
233  	   int*                  dstat               /**< deletion status of columns
234  	                                              *   input:  1 if column should be deleted, 0 if not
235  	                                              *   output: new position of column, -1 if column was deleted */
236  	   );
237  	
238  	/** adds rows to the LP
239  	 *
240  	 *  @note ind array is not checked for duplicates, problems may appear if indices are added more than once
241  	 */
242  	SCIP_EXPORT
243  	SCIP_RETCODE SCIPlpiAddRows(
244  	   SCIP_LPI*             lpi,                /**< LP interface structure */
245  	   int                   nrows,              /**< number of rows to be added */
246  	   const SCIP_Real*      lhs,                /**< left hand sides of new rows */
247  	   const SCIP_Real*      rhs,                /**< right hand sides of new rows */
248  	   char**                rownames,           /**< row names, or NULL */
249  	   int                   nnonz,              /**< number of nonzero elements to be added to the constraint matrix */
250  	   const int*            beg,                /**< start index of each row in ind- and val-array, or NULL if nnonz == 0 */
251  	   const int*            ind,                /**< column indices of constraint matrix entries, or NULL if nnonz == 0 */
252  	   const SCIP_Real*      val                 /**< values of constraint matrix entries, or NULL if nnonz == 0 */
253  	   );
254  	
255  	/** deletes all rows in the given range from LP */
256  	SCIP_EXPORT
257  	SCIP_RETCODE SCIPlpiDelRows(
258  	   SCIP_LPI*             lpi,                /**< LP interface structure */
259  	   int                   firstrow,           /**< first row to be deleted */
260  	   int                   lastrow             /**< last row to be deleted */
261  	   );
262  	
263  	/** deletes rows from SCIP_LPI; the new position of a row must not be greater that its old position */
264  	SCIP_EXPORT
265  	SCIP_RETCODE SCIPlpiDelRowset(
266  	   SCIP_LPI*             lpi,                /**< LP interface structure */
267  	   int*                  dstat               /**< deletion status of rows
268  	                                              *   input:  1 if row should be deleted, 0 if not
269  	                                              *   output: new position of row, -1 if row was deleted */
270  	   );
271  	
272  	/** clears the whole LP */
273  	SCIP_EXPORT
274  	SCIP_RETCODE SCIPlpiClear(
275  	   SCIP_LPI*             lpi                 /**< LP interface structure */
276  	   );
277  	
278  	/** changes lower and upper bounds of columns */
279  	SCIP_EXPORT
280  	SCIP_RETCODE SCIPlpiChgBounds(
281  	   SCIP_LPI*             lpi,                /**< LP interface structure */
282  	   int                   ncols,              /**< number of columns to change bounds for */
283  	   const int*            ind,                /**< column indices or NULL if ncols is zero */
284  	   const SCIP_Real*      lb,                 /**< values for the new lower bounds or NULL if ncols is zero */
285  	   const SCIP_Real*      ub                  /**< values for the new upper bounds or NULL if ncols is zero */
286  	   );
287  	
288  	/** changes left and right hand sides of rows */
289  	SCIP_EXPORT
290  	SCIP_RETCODE SCIPlpiChgSides(
291  	   SCIP_LPI*             lpi,                /**< LP interface structure */
292  	   int                   nrows,              /**< number of rows to change sides for */
293  	   const int*            ind,                /**< row indices */
294  	   const SCIP_Real*      lhs,                /**< new values for left hand sides */
295  	   const SCIP_Real*      rhs                 /**< new values for right hand sides */
296  	   );
297  	
298  	/** changes a single coefficient */
299  	SCIP_EXPORT
300  	SCIP_RETCODE SCIPlpiChgCoef(
301  	   SCIP_LPI*             lpi,                /**< LP interface structure */
302  	   int                   row,                /**< row number of coefficient to change */
303  	   int                   col,                /**< column number of coefficient to change */
304  	   SCIP_Real             newval              /**< new value of coefficient */
305  	   );
306  	
307  	/** changes the objective sense */
308  	SCIP_EXPORT
309  	SCIP_RETCODE SCIPlpiChgObjsen(
310  	   SCIP_LPI*             lpi,                /**< LP interface structure */
311  	   SCIP_OBJSEN           objsen              /**< new objective sense */
312  	   );
313  	
314  	/** changes objective values of columns in the LP */
315  	SCIP_EXPORT
316  	SCIP_RETCODE SCIPlpiChgObj(
317  	   SCIP_LPI*             lpi,                /**< LP interface structure */
318  	   int                   ncols,              /**< number of columns to change objective value for */
319  	   const int*            ind,                /**< column indices to change objective value for */
320  	   const SCIP_Real*      obj                 /**< new objective values for columns */
321  	   );
322  	
323  	/** multiplies a row with a non-zero scalar; for negative scalars, the row's sense is switched accordingly */
324  	SCIP_EXPORT
325  	SCIP_RETCODE SCIPlpiScaleRow(
326  	   SCIP_LPI*             lpi,                /**< LP interface structure */
327  	   int                   row,                /**< row number to scale */
328  	   SCIP_Real             scaleval            /**< scaling multiplier */
329  	   );
330  	
331  	/** multiplies a column with a non-zero scalar; the objective value is multiplied with the scalar, and the bounds
332  	 *  are divided by the scalar; for negative scalars, the column's bounds are switched
333  	 */
334  	SCIP_EXPORT
335  	SCIP_RETCODE SCIPlpiScaleCol(
336  	   SCIP_LPI*             lpi,                /**< LP interface structure */
337  	   int                   col,                /**< column number to scale */
338  	   SCIP_Real             scaleval            /**< scaling multiplier */
339  	   );
340  	
341  	/**@} */
342  	
343  	
344  	
345  	
346  	/*
347  	 * Data Accessing Methods
348  	 */
349  	
350  	/**@name Data Accessing Methods */
351  	/**@{ */
352  	
353  	/** gets the number of rows in the LP */
354  	SCIP_EXPORT
355  	SCIP_RETCODE SCIPlpiGetNRows(
356  	   SCIP_LPI*             lpi,                /**< LP interface structure */
357  	   int*                  nrows               /**< pointer to store the number of rows */
358  	   );
359  	
360  	/** gets the number of columns in the LP */
361  	SCIP_EXPORT
362  	SCIP_RETCODE SCIPlpiGetNCols(
363  	   SCIP_LPI*             lpi,                /**< LP interface structure */
364  	   int*                  ncols               /**< pointer to store the number of cols */
365  	   );
366  	
367  	/** gets the objective sense of the LP */
368  	SCIP_EXPORT
369  	SCIP_RETCODE SCIPlpiGetObjsen(
370  	   SCIP_LPI*             lpi,                /**< LP interface structure */
371  	   SCIP_OBJSEN*          objsen              /**< pointer to store objective sense */
372  	   );
373  	
374  	/** gets the number of nonzero elements in the LP constraint matrix */
375  	SCIP_EXPORT
376  	SCIP_RETCODE SCIPlpiGetNNonz(
377  	   SCIP_LPI*             lpi,                /**< LP interface structure */
378  	   int*                  nnonz               /**< pointer to store the number of nonzeros */
379  	   );
380  	
381  	/** gets columns from LP problem object; the arrays have to be large enough to store all values;
382  	 *  Either both, lb and ub, have to be NULL, or both have to be non-NULL,
383  	 *  either nnonz, beg, ind, and val have to be NULL, or all of them have to be non-NULL.
384  	 */
385  	SCIP_EXPORT
386  	SCIP_RETCODE SCIPlpiGetCols(
387  	   SCIP_LPI*             lpi,                /**< LP interface structure */
388  	   int                   firstcol,           /**< first column to get from LP */
389  	   int                   lastcol,            /**< last column to get from LP */
390  	   SCIP_Real*            lb,                 /**< buffer to store the lower bound vector, or NULL */
391  	   SCIP_Real*            ub,                 /**< buffer to store the upper bound vector, or NULL */
392  	   int*                  nnonz,              /**< pointer to store the number of nonzero elements returned, or NULL */
393  	   int*                  beg,                /**< buffer to store start index of each column in ind- and val-array, or NULL */
394  	   int*                  ind,                /**< buffer to store row indices of constraint matrix entries, or NULL */
395  	   SCIP_Real*            val                 /**< buffer to store values of constraint matrix entries, or NULL */
396  	   );
397  	
398  	/** gets rows from LP problem object; the arrays have to be large enough to store all values.
399  	 *  Either both, lhs and rhs, have to be NULL, or both have to be non-NULL,
400  	 *  either nnonz, beg, ind, and val have to be NULL, or all of them have to be non-NULL.
401  	 */
402  	SCIP_EXPORT
403  	SCIP_RETCODE SCIPlpiGetRows(
404  	   SCIP_LPI*             lpi,                /**< LP interface structure */
405  	   int                   firstrow,           /**< first row to get from LP */
406  	   int                   lastrow,            /**< last row to get from LP */
407  	   SCIP_Real*            lhs,                /**< buffer to store left hand side vector, or NULL */
408  	   SCIP_Real*            rhs,                /**< buffer to store right hand side vector, or NULL */
409  	   int*                  nnonz,              /**< pointer to store the number of nonzero elements returned, or NULL */
410  	   int*                  beg,                /**< buffer to store start index of each row in ind- and val-array, or NULL */
411  	   int*                  ind,                /**< buffer to store column indices of constraint matrix entries, or NULL */
412  	   SCIP_Real*            val                 /**< buffer to store values of constraint matrix entries, or NULL */
413  	   );
414  	
415  	/** gets column names */
416  	SCIP_EXPORT
417  	SCIP_RETCODE SCIPlpiGetColNames(
418  	   SCIP_LPI*             lpi,                /**< LP interface structure */
419  	   int                   firstcol,           /**< first column to get name from LP */
420  	   int                   lastcol,            /**< last column to get name from LP */
421  	   char**                colnames,           /**< pointers to column names (of size at least lastcol-firstcol+1) or NULL if namestoragesize is zero */
422  	   char*                 namestorage,        /**< storage for col names or NULL if namestoragesize is zero */
423  	   int                   namestoragesize,    /**< size of namestorage (if 0, -storageleft returns the storage needed) */
424  	   int*                  storageleft         /**< amount of storage left (if < 0 the namestorage was not big enough) or NULL if namestoragesize is zero */
425  	   );
426  	
427  	/** gets row names */
428  	SCIP_EXPORT
429  	SCIP_RETCODE SCIPlpiGetRowNames(
430  	   SCIP_LPI*             lpi,                /**< LP interface structure */
431  	   int                   firstrow,           /**< first row to get name from LP */
432  	   int                   lastrow,            /**< last row to get name from LP */
433  	   char**                rownames,           /**< pointers to row names (of size at least lastrow-firstrow+1) or NULL if namestoragesize is zero */
434  	   char*                 namestorage,        /**< storage for row names or NULL if namestoragesize is zero */
435  	   int                   namestoragesize,    /**< size of namestorage (if 0, -storageleft returns the storage needed) */
436  	   int*                  storageleft         /**< amount of storage left (if < 0 the namestorage was not big enough) or NULL if namestoragesize is zero */
437  	   );
438  	
439  	/** gets objective coefficients from LP problem object */
440  	SCIP_EXPORT
441  	SCIP_RETCODE SCIPlpiGetObj(
442  	   SCIP_LPI*             lpi,                /**< LP interface structure */
443  	   int                   firstcol,           /**< first column to get objective coefficient for */
444  	   int                   lastcol,            /**< last column to get objective coefficient for */
445  	   SCIP_Real*            vals                /**< array to store objective coefficients */
446  	   );
447  	
448  	/** gets current bounds from LP problem object */
449  	SCIP_EXPORT
450  	SCIP_RETCODE SCIPlpiGetBounds(
451  	   SCIP_LPI*             lpi,                /**< LP interface structure */
452  	   int                   firstcol,           /**< first column to get bounds for */
453  	   int                   lastcol,            /**< last column to get bounds for */
454  	   SCIP_Real*            lbs,                /**< array to store lower bound values, or NULL */
455  	   SCIP_Real*            ubs                 /**< array to store upper bound values, or NULL */
456  	   );
457  	
458  	/** gets current row sides from LP problem object */
459  	SCIP_EXPORT
460  	SCIP_RETCODE SCIPlpiGetSides(
461  	   SCIP_LPI*             lpi,                /**< LP interface structure */
462  	   int                   firstrow,           /**< first row to get sides for */
463  	   int                   lastrow,            /**< last row to get sides for */
464  	   SCIP_Real*            lhss,               /**< array to store left hand side values, or NULL */
465  	   SCIP_Real*            rhss                /**< array to store right hand side values, or NULL */
466  	   );
467  	
468  	/** gets a single coefficient */
469  	SCIP_EXPORT
470  	SCIP_RETCODE SCIPlpiGetCoef(
471  	   SCIP_LPI*             lpi,                /**< LP interface structure */
472  	   int                   row,                /**< row number of coefficient */
473  	   int                   col,                /**< column number of coefficient */
474  	   SCIP_Real*            val                 /**< pointer to store the value of the coefficient */
475  	   );
476  	
477  	/**@} */
478  	
479  	
480  	
481  	
482  	/*
483  	 * Solving Methods
484  	 */
485  	
486  	/**@name Solving Methods */
487  	/**@{ */
488  	
489  	/** calls primal simplex to solve the LP */
490  	SCIP_EXPORT
491  	SCIP_RETCODE SCIPlpiSolvePrimal(
492  	   SCIP_LPI*             lpi                 /**< LP interface structure */
493  	   );
494  	
495  	/** calls dual simplex to solve the LP */
496  	SCIP_EXPORT
497  	SCIP_RETCODE SCIPlpiSolveDual(
498  	   SCIP_LPI*             lpi                 /**< LP interface structure */
499  	   );
500  	
501  	/** calls barrier or interior point algorithm to solve the LP with crossover to simplex basis */
502  	SCIP_EXPORT
503  	SCIP_RETCODE SCIPlpiSolveBarrier(
504  	   SCIP_LPI*             lpi,                /**< LP interface structure */
505  	   SCIP_Bool             crossover           /**< perform crossover */
506  	   );
507  	
508  	/** start strong branching - call before any strong branching */
509  	SCIP_EXPORT
510  	SCIP_RETCODE SCIPlpiStartStrongbranch(
511  	   SCIP_LPI*             lpi                 /**< LP interface structure */
512  	   );
513  	
514  	/** end strong branching - call after any strong branching */
515  	SCIP_EXPORT
516  	SCIP_RETCODE SCIPlpiEndStrongbranch(
517  	   SCIP_LPI*             lpi                 /**< LP interface structure */
518  	   );
519  	
520  	/** performs strong branching iterations on one @b fractional candidate */
521  	SCIP_EXPORT
522  	SCIP_RETCODE SCIPlpiStrongbranchFrac(
523  	   SCIP_LPI*             lpi,                /**< LP interface structure */
524  	   int                   col,                /**< column to apply strong branching on */
525  	   SCIP_Real             psol,               /**< fractional current primal solution value of column */
526  	   int                   itlim,              /**< iteration limit for strong branchings */
527  	   SCIP_Real*            down,               /**< stores dual bound after branching column down */
528  	   SCIP_Real*            up,                 /**< stores dual bound after branching column up */
529  	   SCIP_Bool*            downvalid,          /**< stores whether the returned down value is a valid dual bound;
530  	                                              *   otherwise, it can only be used as an estimate value */
531  	   SCIP_Bool*            upvalid,            /**< stores whether the returned up value is a valid dual bound;
532  	                                              *   otherwise, it can only be used as an estimate value */
533  	   int*                  iter                /**< stores total number of strong branching iterations, or -1; may be NULL */
534  	   );
535  	
536  	/** performs strong branching iterations on given @b fractional candidates */
537  	SCIP_EXPORT
538  	SCIP_RETCODE SCIPlpiStrongbranchesFrac(
539  	   SCIP_LPI*             lpi,                /**< LP interface structure */
540  	   int*                  cols,               /**< columns to apply strong branching on */
541  	   int                   ncols,              /**< number of columns */
542  	   SCIP_Real*            psols,              /**< fractional current primal solution values of columns */
543  	   int                   itlim,              /**< iteration limit for strong branchings */
544  	   SCIP_Real*            down,               /**< stores dual bounds after branching columns down */
545  	   SCIP_Real*            up,                 /**< stores dual bounds after branching columns up */
546  	   SCIP_Bool*            downvalid,          /**< stores whether the returned down values are valid dual bounds;
547  	                                              *   otherwise, they can only be used as an estimate values */
548  	   SCIP_Bool*            upvalid,            /**< stores whether the returned up values are a valid dual bounds;
549  	                                              *   otherwise, they can only be used as an estimate values */
550  	   int*                  iter                /**< stores total number of strong branching iterations, or -1; may be NULL */
551  	   );
552  	
553  	/** performs strong branching iterations on one candidate with @b integral value */
554  	SCIP_EXPORT
555  	SCIP_RETCODE SCIPlpiStrongbranchInt(
556  	   SCIP_LPI*             lpi,                /**< LP interface structure */
557  	   int                   col,                /**< column to apply strong branching on */
558  	   SCIP_Real             psol,               /**< current integral primal solution value of column */
559  	   int                   itlim,              /**< iteration limit for strong branchings */
560  	   SCIP_Real*            down,               /**< stores dual bound after branching column down */
561  	   SCIP_Real*            up,                 /**< stores dual bound after branching column up */
562  	   SCIP_Bool*            downvalid,          /**< stores whether the returned down value is a valid dual bound;
563  	                                              *   otherwise, it can only be used as an estimate value */
564  	   SCIP_Bool*            upvalid,            /**< stores whether the returned up value is a valid dual bound;
565  	                                              *   otherwise, it can only be used as an estimate value */
566  	   int*                  iter                /**< stores total number of strong branching iterations, or -1; may be NULL */
567  	   );
568  	
569  	/** performs strong branching iterations on given candidates with @b integral values */
570  	SCIP_EXPORT
571  	SCIP_RETCODE SCIPlpiStrongbranchesInt(
572  	   SCIP_LPI*             lpi,                /**< LP interface structure */
573  	   int*                  cols,               /**< columns to apply strong branching on */
574  	   int                   ncols,              /**< number of columns */
575  	   SCIP_Real*            psols,              /**< current integral primal solution values of columns */
576  	   int                   itlim,              /**< iteration limit for strong branchings */
577  	   SCIP_Real*            down,               /**< stores dual bounds after branching columns down */
578  	   SCIP_Real*            up,                 /**< stores dual bounds after branching columns up */
579  	   SCIP_Bool*            downvalid,          /**< stores whether the returned down values are valid dual bounds;
580  	                                              *   otherwise, they can only be used as an estimate values */
581  	   SCIP_Bool*            upvalid,            /**< stores whether the returned up values are a valid dual bounds;
582  	                                              *   otherwise, they can only be used as an estimate values */
583  	   int*                  iter                /**< stores total number of strong branching iterations, or -1; may be NULL */
584  	   );
585  	/**@} */
586  	
587  	
588  	
589  	
590  	/*
591  	 * Solution Information Methods
592  	 */
593  	
594  	/**@name Solution Information Methods */
595  	/**@{ */
596  	
597  	/** returns whether a solve method was called after the last modification of the LP */
598  	SCIP_EXPORT
599  	SCIP_Bool SCIPlpiWasSolved(
600  	   SCIP_LPI*             lpi                 /**< LP interface structure */
601  	   );
602  	
603  	/** gets information about primal and dual feasibility of the current LP solution
604  	 *
605  	 *  The feasibility information is with respect to the last solving call and it is only relevant if SCIPlpiWasSolved()
606  	 *  returns true. If the LP is changed, this information might be invalidated.
607  	 *
608  	 *  Note that @p primalfeasible and @p dualfeasible should only return true if the solver has proved the respective LP to
609  	 *  be feasible. Thus, the return values should be equal to the values of SCIPlpiIsPrimalFeasible() and
610  	 *  SCIPlpiIsDualFeasible(), respectively. Note that if feasibility cannot be proved, they should return false (even if
611  	 *  the problem might actually be feasible).
612  	 */
613  	SCIP_EXPORT
614  	SCIP_RETCODE SCIPlpiGetSolFeasibility(
615  	   SCIP_LPI*             lpi,                /**< LP interface structure */
616  	   SCIP_Bool*            primalfeasible,     /**< pointer to store primal feasibility status */
617  	   SCIP_Bool*            dualfeasible        /**< pointer to store dual feasibility status */
618  	   );
619  	
620  	/** returns TRUE iff LP is proven to have a primal unbounded ray (but not necessary a primal feasible point);
621  	 *  this does not necessarily mean, that the solver knows and can return the primal ray
622  	 */
623  	SCIP_EXPORT
624  	SCIP_Bool SCIPlpiExistsPrimalRay(
625  	   SCIP_LPI*             lpi                 /**< LP interface structure */
626  	   );
627  	
628  	/** returns TRUE iff LP is proven to have a primal unbounded ray (but not necessary a primal feasible point),
629  	 *  and the solver knows and can return the primal ray
630  	 */
631  	SCIP_EXPORT
632  	SCIP_Bool SCIPlpiHasPrimalRay(
633  	   SCIP_LPI*             lpi                 /**< LP interface structure */
634  	   );
635  	
636  	/** returns TRUE iff LP is proven to be primal unbounded */
637  	SCIP_EXPORT
638  	SCIP_Bool SCIPlpiIsPrimalUnbounded(
639  	   SCIP_LPI*             lpi                 /**< LP interface structure */
640  	   );
641  	
642  	/** returns TRUE iff LP is proven to be primal infeasible */
643  	SCIP_EXPORT
644  	SCIP_Bool SCIPlpiIsPrimalInfeasible(
645  	   SCIP_LPI*             lpi                 /**< LP interface structure */
646  	   );
647  	
648  	/** returns TRUE iff LP is proven to be primal feasible */
649  	SCIP_EXPORT
650  	SCIP_Bool SCIPlpiIsPrimalFeasible(
651  	   SCIP_LPI*             lpi                 /**< LP interface structure */
652  	   );
653  	
654  	/** returns TRUE iff LP is proven to have a dual unbounded ray (but not necessary a dual feasible point);
655  	 *  this does not necessarily mean, that the solver knows and can return the dual ray
656  	 */
657  	SCIP_EXPORT
658  	SCIP_Bool SCIPlpiExistsDualRay(
659  	   SCIP_LPI*             lpi                 /**< LP interface structure */
660  	   );
661  	
662  	/** returns TRUE iff LP is proven to have a dual unbounded ray (but not necessary a dual feasible point),
663  	 *  and the solver knows and can return the dual ray
664  	 */
665  	SCIP_EXPORT
666  	SCIP_Bool SCIPlpiHasDualRay(
667  	   SCIP_LPI*             lpi                 /**< LP interface structure */
668  	   );
669  	
670  	/** returns TRUE iff LP is proven to be dual unbounded */
671  	SCIP_EXPORT
672  	SCIP_Bool SCIPlpiIsDualUnbounded(
673  	   SCIP_LPI*             lpi                 /**< LP interface structure */
674  	   );
675  	
676  	/** returns TRUE iff LP is proven to be dual infeasible */
677  	SCIP_EXPORT
678  	SCIP_Bool SCIPlpiIsDualInfeasible(
679  	   SCIP_LPI*             lpi                 /**< LP interface structure */
680  	   );
681  	
682  	/** returns TRUE iff LP is proven to be dual feasible */
683  	SCIP_EXPORT
684  	SCIP_Bool SCIPlpiIsDualFeasible(
685  	   SCIP_LPI*             lpi                 /**< LP interface structure */
686  	   );
687  	
688  	/** returns TRUE iff LP was solved to optimality */
689  	SCIP_EXPORT
690  	SCIP_Bool SCIPlpiIsOptimal(
691  	   SCIP_LPI*             lpi                 /**< LP interface structure */
692  	   );
693  	
694  	/** returns TRUE iff current LP solution is stable
695  	 *
696  	 *  This function should return true if the solution is reliable, i.e., feasible and optimal (or proven
697  	 *  infeasible/unbounded) with respect to the original problem. The optimality status might be with respect to a scaled
698  	 *  version of the problem, but the solution might not be feasible to the unscaled original problem; in this case,
699  	 *  SCIPlpiIsStable() should return false.
700  	 */
701  	SCIP_EXPORT
702  	SCIP_Bool SCIPlpiIsStable(
703  	   SCIP_LPI*             lpi                 /**< LP interface structure */
704  	   );
705  	
706  	/** returns TRUE iff the objective limit was reached */
707  	SCIP_EXPORT
708  	SCIP_Bool SCIPlpiIsObjlimExc(
709  	   SCIP_LPI*             lpi                 /**< LP interface structure */
710  	   );
711  	
712  	/** returns TRUE iff the iteration limit was reached */
713  	SCIP_EXPORT
714  	SCIP_Bool SCIPlpiIsIterlimExc(
715  	   SCIP_LPI*             lpi                 /**< LP interface structure */
716  	   );
717  	
718  	/** returns TRUE iff the time limit was reached */
719  	SCIP_EXPORT
720  	SCIP_Bool SCIPlpiIsTimelimExc(
721  	   SCIP_LPI*             lpi                 /**< LP interface structure */
722  	   );
723  	
724  	/** returns the internal solution status of the solver */
725  	SCIP_EXPORT
726  	int SCIPlpiGetInternalStatus(
727  	   SCIP_LPI*             lpi                 /**< LP interface structure */
728  	   );
729  	
730  	/** tries to reset the internal status of the LP solver in order to ignore an instability of the last solving call */
731  	SCIP_EXPORT
732  	SCIP_RETCODE SCIPlpiIgnoreInstability(
733  	   SCIP_LPI*             lpi,                /**< LP interface structure */
734  	   SCIP_Bool*            success             /**< pointer to store, whether the instability could be ignored */
735  	   );
736  	
737  	/** gets objective value of solution */
738  	SCIP_EXPORT
739  	SCIP_RETCODE SCIPlpiGetObjval(
740  	   SCIP_LPI*             lpi,                /**< LP interface structure */
741  	   SCIP_Real*            objval              /**< stores the objective value */
742  	   );
743  	
744  	/** gets primal and dual solution vectors for feasible LPs
745  	 *
746  	 *  Before calling this function, the caller must ensure that the LP has been solved to optimality, i.e., that
747  	 *  SCIPlpiIsOptimal() returns true.
748  	 */
749  	SCIP_EXPORT
750  	SCIP_RETCODE SCIPlpiGetSol(
751  	   SCIP_LPI*             lpi,                /**< LP interface structure */
752  	   SCIP_Real*            objval,             /**< stores the objective value, may be NULL if not needed */
753  	   SCIP_Real*            primsol,            /**< primal solution vector, may be NULL if not needed */
754  	   SCIP_Real*            dualsol,            /**< dual solution vector, may be NULL if not needed */
755  	   SCIP_Real*            activity,           /**< row activity vector, may be NULL if not needed */
756  	   SCIP_Real*            redcost             /**< reduced cost vector, may be NULL if not needed */
757  	   );
758  	
759  	/** gets primal ray for unbounded LPs */
760  	SCIP_EXPORT
761  	SCIP_RETCODE SCIPlpiGetPrimalRay(
762  	   SCIP_LPI*             lpi,                /**< LP interface structure */
763  	   SCIP_Real*            ray                 /**< primal ray */
764  	   );
765  	
766  	/** gets dual Farkas proof for infeasibility */
767  	SCIP_EXPORT
768  	SCIP_RETCODE SCIPlpiGetDualfarkas(
769  	   SCIP_LPI*             lpi,                /**< LP interface structure */
770  	   SCIP_Real*            dualfarkas          /**< dual Farkas row multipliers */
771  	   );
772  	
773  	/** gets the number of LP iterations of the last solve call */
774  	SCIP_EXPORT
775  	SCIP_RETCODE SCIPlpiGetIterations(
776  	   SCIP_LPI*             lpi,                /**< LP interface structure */
777  	   int*                  iterations          /**< pointer to store the number of iterations of the last solve call */
778  	   );
779  	
780  	/** gets information about the quality of an LP solution
781  	 *
782  	 *  Such information is usually only available, if also a (maybe not optimal) solution is available.
783  	 *  The LPI should return SCIP_INVALID for @p quality, if the requested quantity is not available.
784  	 */
785  	SCIP_EXPORT
786  	SCIP_RETCODE SCIPlpiGetRealSolQuality(
787  	   SCIP_LPI*             lpi,                /**< LP interface structure */
788  	   SCIP_LPSOLQUALITY     qualityindicator,   /**< indicates which quality should be returned */
789  	   SCIP_Real*            quality             /**< pointer to store quality number */
790  	   );
791  	
792  	/**@} */
793  	
794  	
795  	
796  	
797  	/*
798  	 * LP Basis Methods
799  	 */
800  	
801  	/**@name LP Basis Methods */
802  	/**@{ */
803  	
804  	/** gets current basis status for columns and rows; arrays must be large enough to store the basis status */
805  	SCIP_EXPORT
806  	SCIP_RETCODE SCIPlpiGetBase(
807  	   SCIP_LPI*             lpi,                /**< LP interface structure */
808  	   int*                  cstat,              /**< array to store column basis status, or NULL */
809  	   int*                  rstat               /**< array to store row basis status, or NULL */
810  	   );
811  	
812  	/** sets current basis status for columns and rows */
813  	SCIP_EXPORT
814  	SCIP_RETCODE SCIPlpiSetBase(
815  	   SCIP_LPI*             lpi,                /**< LP interface structure */
816  	   const int*            cstat,              /**< array with column basis status */
817  	   const int*            rstat               /**< array with row basis status */
818  	   );
819  	
820  	/** returns the indices of the basic columns and rows; basic column n gives value n, basic row m gives value -1-m */
821  	SCIP_EXPORT
822  	SCIP_RETCODE SCIPlpiGetBasisInd(
823  	   SCIP_LPI*             lpi,                /**< LP interface structure */
824  	   int*                  bind                /**< pointer to store basis indices ready to keep number of rows entries */
825  	   );
826  	
827  	/** get row of inverse basis matrix B^-1
828  	 *
829  	 *  @note The LP interface defines slack variables to have coefficient +1. This means that if, internally, the LP solver
830  	 *        uses a -1 coefficient, then rows associated with slacks variables whose coefficient is -1, should be negated;
831  	 *        see also the explanation in lpi.h.
832  	 */
833  	SCIP_EXPORT
834  	SCIP_RETCODE SCIPlpiGetBInvRow(
835  	   SCIP_LPI*             lpi,                /**< LP interface structure */
836  	   int                   r,                  /**< row number */
837  	   SCIP_Real*            coef,               /**< pointer to store the coefficients of the row */
838  	   int*                  inds,               /**< array to store the non-zero indices, or NULL */
839  	   int*                  ninds               /**< pointer to store the number of non-zero indices, or NULL
840  	                                              *   (-1: if we do not store sparsity information) */
841  	   );
842  	
843  	/** get column of inverse basis matrix B^-1
844  	 *
845  	 *  @note The LP interface defines slack variables to have coefficient +1. This means that if, internally, the LP solver
846  	 *        uses a -1 coefficient, then rows associated with slacks variables whose coefficient is -1, should be negated;
847  	 *        see also the explanation in lpi.h.
848  	 */
849  	SCIP_EXPORT
850  	SCIP_RETCODE SCIPlpiGetBInvCol(
851  	   SCIP_LPI*             lpi,                /**< LP interface structure */
852  	   int                   c,                  /**< column number of B^-1; this is NOT the number of the column in the LP;
853  	                                              *   you have to call SCIPlpiGetBasisInd() to get the array which links the
854  	                                              *   B^-1 column numbers to the row and column numbers of the LP!
855  	                                              *   c must be between 0 and nrows-1, since the basis has the size
856  	                                              *   nrows * nrows */
857  	   SCIP_Real*            coef,               /**< pointer to store the coefficients of the column */
858  	   int*                  inds,               /**< array to store the non-zero indices, or NULL */
859  	   int*                  ninds               /**< pointer to store the number of non-zero indices, or NULL
860  	                                              *   (-1: if we do not store sparsity information) */
861  	   );
862  	
863  	/** get row of inverse basis matrix times constraint matrix B^-1 * A
864  	 *
865  	 *  @note The LP interface defines slack variables to have coefficient +1. This means that if, internally, the LP solver
866  	 *        uses a -1 coefficient, then rows associated with slacks variables whose coefficient is -1, should be negated;
867  	 *        see also the explanation in lpi.h.
868  	 */
869  	SCIP_EXPORT
870  	SCIP_RETCODE SCIPlpiGetBInvARow(
871  	   SCIP_LPI*             lpi,                /**< LP interface structure */
872  	   int                   r,                  /**< row number */
873  	   const SCIP_Real*      binvrow,            /**< row in (A_B)^-1 from prior call to SCIPlpiGetBInvRow(), or NULL */
874  	   SCIP_Real*            coef,               /**< vector to return coefficients of the row */
875  	   int*                  inds,               /**< array to store the non-zero indices, or NULL */
876  	   int*                  ninds               /**< pointer to store the number of non-zero indices, or NULL
877  	                                              *   (-1: if we do not store sparsity information) */
878  	   );
879  	
880  	/** get column of inverse basis matrix times constraint matrix B^-1 * A
881  	 *
882  	 *  @note The LP interface defines slack variables to have coefficient +1. This means that if, internally, the LP solver
883  	 *        uses a -1 coefficient, then rows associated with slacks variables whose coefficient is -1, should be negated;
884  	 *        see also the explanation in lpi.h.
885  	 */
886  	SCIP_EXPORT
887  	SCIP_RETCODE SCIPlpiGetBInvACol(
888  	   SCIP_LPI*             lpi,                /**< LP interface structure */
889  	   int                   c,                  /**< column number */
890  	   SCIP_Real*            coef,               /**< vector to return coefficients of the column */
891  	   int*                  inds,               /**< array to store the non-zero indices, or NULL */
892  	   int*                  ninds               /**< pointer to store the number of non-zero indices, or NULL
893  	                                              *   (-1: if we do not store sparsity information) */
894  	   );
895  	
896  	/**@} */
897  	
898  	
899  	
900  	
901  	/*
902  	 * LPi State Methods
903  	 */
904  	
905  	/**@name LPi State Methods */
906  	/**@{ */
907  	
908  	/** stores LPi state (like basis information) into lpistate object */
909  	SCIP_EXPORT
910  	SCIP_RETCODE SCIPlpiGetState(
911  	   SCIP_LPI*             lpi,                /**< LP interface structure */
912  	   BMS_BLKMEM*           blkmem,             /**< block memory */
913  	   SCIP_LPISTATE**       lpistate            /**< pointer to LPi state information (like basis information) */
914  	   );
915  	
916  	/** loads LPi state (like basis information) into solver; note that the LP might have been extended with additional
917  	 *  columns and rows since the state was stored with SCIPlpiGetState()
918  	 */
919  	SCIP_EXPORT
920  	SCIP_RETCODE SCIPlpiSetState(
921  	   SCIP_LPI*             lpi,                /**< LP interface structure */
922  	   BMS_BLKMEM*           blkmem,             /**< block memory */
923  	   const SCIP_LPISTATE*  lpistate            /**< LPi state information (like basis information), or NULL */
924  	   );
925  	
926  	/** clears current LPi state (like basis information) of the solver */
927  	SCIP_EXPORT
928  	SCIP_RETCODE SCIPlpiClearState(
929  	   SCIP_LPI*             lpi                 /**< LP interface structure */
930  	   );
931  	
932  	/** frees LPi state information */
933  	SCIP_EXPORT
934  	SCIP_RETCODE SCIPlpiFreeState(
935  	   SCIP_LPI*             lpi,                /**< LP interface structure */
936  	   BMS_BLKMEM*           blkmem,             /**< block memory */
937  	   SCIP_LPISTATE**       lpistate            /**< pointer to LPi state information (like basis information) */
938  	   );
939  	
940  	/** checks, whether the given LPi state contains simplex basis information */
941  	SCIP_EXPORT
942  	SCIP_Bool SCIPlpiHasStateBasis(
943  	   SCIP_LPI*             lpi,                /**< LP interface structure */
944  	   SCIP_LPISTATE*        lpistate            /**< LPi state information (like basis information) */
945  	   );
946  	
947  	/** reads LPi state (like basis information from a file */
948  	SCIP_EXPORT
949  	SCIP_RETCODE SCIPlpiReadState(
950  	   SCIP_LPI*             lpi,                /**< LP interface structure */
951  	   const char*           fname               /**< file name */
952  	   );
953  	
954  	/** writes LPi state (i.e. basis information) to a file */
955  	SCIP_EXPORT
956  	SCIP_RETCODE SCIPlpiWriteState(
957  	   SCIP_LPI*             lpi,                /**< LP interface structure */
958  	   const char*           fname               /**< file name */
959  	   );
960  	
961  	/**@} */
962  	
963  	
964  	/*
965  	 * LPi Pricing Norms Methods
966  	 */
967  	
968  	/**@name LPi Pricing Norms Methods */
969  	/**@{ */
970  	
971  	/** stores LPi pricing norms into lpinorms object */
972  	SCIP_RETCODE SCIPlpiGetNorms(
973  	   SCIP_LPI*             lpi,                /**< LP interface structure */
974  	   BMS_BLKMEM*           blkmem,             /**< block memory */
975  	   SCIP_LPINORMS**       lpinorms            /**< pointer to LPi pricing norms information */
976  	   );
977  	
978  	/** loads LPi pricing norms into solver; note that the LP might have been extended with additional
979  	 *  columns and rows since the norms were stored with SCIPlpiGetNorms()
980  	 */
981  	SCIP_RETCODE SCIPlpiSetNorms(
982  	   SCIP_LPI*             lpi,                /**< LP interface structure */
983  	   BMS_BLKMEM*           blkmem,             /**< block memory */
984  	   const SCIP_LPINORMS*  lpinorms            /**< LPi pricing norms information, or NULL */
985  	   );
986  	
987  	/** frees LPi pricing norms information */
988  	SCIP_RETCODE SCIPlpiFreeNorms(
989  	   SCIP_LPI*             lpi,                /**< LP interface structure */
990  	   BMS_BLKMEM*           blkmem,             /**< block memory */
991  	   SCIP_LPINORMS**       lpinorms            /**< pointer to LPi pricing norms information, or NULL */
992  	   );
993  	
994  	
995  	/**@} */
996  	
997  	
998  	
999  	
1000 	/*
1001 	 * Parameter Methods
1002 	 */
1003 	
1004 	/**@name Parameter Methods */
1005 	/**@{ */
1006 	
1007 	/** gets integer parameter of LP */
1008 	SCIP_EXPORT
1009 	SCIP_RETCODE SCIPlpiGetIntpar(
1010 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1011 	   SCIP_LPPARAM          type,               /**< parameter number */
1012 	   int*                  ival                /**< buffer to store the parameter value */
1013 	   );
1014 	
1015 	/** sets integer parameter of LP */
1016 	SCIP_EXPORT
1017 	SCIP_RETCODE SCIPlpiSetIntpar(
1018 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1019 	   SCIP_LPPARAM          type,               /**< parameter number */
1020 	   int                   ival                /**< parameter value */
1021 	   );
1022 	
1023 	/** gets floating point parameter of LP */
1024 	SCIP_EXPORT
1025 	SCIP_RETCODE SCIPlpiGetRealpar(
1026 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1027 	   SCIP_LPPARAM          type,               /**< parameter number */
1028 	   SCIP_Real*            dval                /**< buffer to store the parameter value */
1029 	   );
1030 	
1031 	/** sets floating point parameter of LP */
1032 	SCIP_EXPORT
1033 	SCIP_RETCODE SCIPlpiSetRealpar(
1034 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1035 	   SCIP_LPPARAM          type,               /**< parameter number */
1036 	   SCIP_Real             dval                /**< parameter value */
1037 	   );
1038 	
1039 	/** interrupts the currently ongoing lp solve or disables the interrupt */
1040 	SCIP_EXPORT
1041 	SCIP_RETCODE SCIPlpiInterrupt(
1042 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1043 	   SCIP_Bool             interrupt           /**< TRUE if interrupt should be set, FALSE if it should be disabled */
1044 	   );
1045 	
1046 	/**@} */
1047 	
1048 	
1049 	
1050 	
1051 	/*
1052 	 * Numerical Methods
1053 	 */
1054 	
1055 	/**@name Numerical Methods */
1056 	/**@{ */
1057 	
1058 	/** returns value treated as infinity in the LP solver */
1059 	SCIP_EXPORT
1060 	SCIP_Real SCIPlpiInfinity(
1061 	   SCIP_LPI*             lpi                 /**< LP interface structure */
1062 	   );
1063 	
1064 	/** checks if given value is treated as infinity in the LP solver */
1065 	SCIP_EXPORT
1066 	SCIP_Bool SCIPlpiIsInfinity(
1067 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1068 	   SCIP_Real             val                 /**< value to be checked for infinity */
1069 	   );
1070 	
1071 	/**@} */
1072 	
1073 	
1074 	
1075 	
1076 	/*
1077 	 * File Interface Methods
1078 	 */
1079 	
1080 	/**@name File Interface Methods */
1081 	/**@{ */
1082 	
1083 	/** reads LP from a file */
1084 	SCIP_EXPORT
1085 	SCIP_RETCODE SCIPlpiReadLP(
1086 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1087 	   const char*           fname               /**< file name */
1088 	   );
1089 	
1090 	/** writes LP to a file */
1091 	SCIP_EXPORT
1092 	SCIP_RETCODE SCIPlpiWriteLP(
1093 	   SCIP_LPI*             lpi,                /**< LP interface structure */
1094 	   const char*           fname               /**< file name */
1095 	   );
1096 	
1097 	/**@} */
1098 	
1099 	/**@} */
1100 	
1101 	
1102 	#ifdef __cplusplus
1103 	}
1104 	#endif
1105 	
1106 	#endif
1107