1    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2    	/*                                                                           */
3    	/*                  This file is part of the program and library             */
4    	/*         SCIP --- Solving Constraint Integer Programs                      */
5    	/*                                                                           */
6    	/*  Copyright (c) 2002-2023 Zuse Institute Berlin (ZIB)                      */
7    	/*                                                                           */
8    	/*  Licensed under the Apache License, Version 2.0 (the "License");          */
9    	/*  you may not use this file except in compliance with the License.         */
10   	/*  You may obtain a copy of the License at                                  */
11   	/*                                                                           */
12   	/*      http://www.apache.org/licenses/LICENSE-2.0                           */
13   	/*                                                                           */
14   	/*  Unless required by applicable law or agreed to in writing, software      */
15   	/*  distributed under the License is distributed on an "AS IS" BASIS,        */
16   	/*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17   	/*  See the License for the specific language governing permissions and      */
18   	/*  limitations under the License.                                           */
19   	/*                                                                           */
20   	/*  You should have received a copy of the Apache-2.0 license                */
21   	/*  along with SCIP; see the file LICENSE. If not visit scipopt.org.         */
22   	/*                                                                           */
23   	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24   	
25   	/**@file   nlhdlr_soc.h
26   	 * @ingroup NLHDLRS
27   	 * @brief  soc nonlinear handler
28   	 *
29   	 * @author Benjamin Mueller
30   	 * @author Fabian Wegscheider
31   	 */
32   	
33   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
34   	
35   	#ifndef __SCIP_NLHDLR_SOC_H__
36   	#define __SCIP_NLHDLR_SOC_H__
37   	
38   	#include "scip/scip.h"
39   	
40   	#ifdef __cplusplus
41   	extern "C" {
42   	#endif
43   	
44   	/** includes SOC nonlinear handler in nonlinear constraint handler
45   	 *
46   	 * @ingroup NlhdlrIncludes
47   	 */
48   	SCIP_EXPORT
49   	SCIP_RETCODE SCIPincludeNlhdlrSoc(
50   	   SCIP*                 scip                /**< SCIP data structure */
51   	   );
52   	
53   	/**@addtogroup NLHDLRS
54   	 *
55   	 * @{
56   	 *
57   	 * @name SOC nonlinear handler
58   	 *
59   	 * This nonlinear handler detects second-order cone constraints in the extended formulation and provides specialized separation functionality.
60   	 *
61   	 * @{
62   	 */
63   	
64   	/** checks whether constraint is SOC representable in original variables and returns the SOC representation
65   	 *
66   	 * The SOC representation has the form:
67   	 * \f$\sqrt{\sum_{i=1}^{n} (v_i^T x + \beta_i)^2} - v_{n+1}^T x - \beta_{n+1} \lessgtr 0\f$,
68   	 * where \f$n+1 = \text{nterms}\f$ and the inequality type is given by sidetype (`SCIP_SIDETYPE_RIGHT` if inequality
69   	 * is \f$\leq\f$, `SCIP_SIDETYPE_LEFT` if \f$\geq\f$).
70   	 *
71   	 * For each term (i.e. for each \f$i\f$ in the above notation as well as \f$n+1\f$), the constant \f$\beta_i\f$ is given by the
72   	 * corresponding element `offsets[i-1]` and `termbegins[i-1]` is the starting position of the term in arrays
73   	 * `transcoefs` and `transcoefsidx`. The overall number of nonzeros is `termbegins[nterms]`.
74   	 *
75   	 * Arrays `transcoefs` and `transcoefsidx` have size `termbegins[nterms]` and define the linear expressions \f$v_i^T x\f$
76   	 * for each term. For a term \f$i\f$ in the above notation, the nonzeroes are given by elements
77   	 * `termbegins[i-1]...termbegins[i]` of `transcoefs` and `transcoefsidx`. There may be no nonzeroes for some term (i.e.,
78   	 * constant terms are possible). `transcoefs` contains the coefficients \f$v_i\f$ and `transcoefsidx` contains positions of
79   	 * variables in the `vars` array.
80   	 *
81   	 * The `vars` array has size `nvars` and contains \f$x\f$ variables; each variable is included at most once.
82   	 *
83   	 * The arrays should be freed by calling SCIPfreeSOCArraysNonlinear().
84   	 *
85   	 * This function uses the methods that are used in the detection algorithm of the SOC nonlinear handler.
86   	 */
87   	SCIP_EXPORT
88   	SCIP_RETCODE SCIPisSOCNonlinear(
89   	   SCIP*                 scip,               /**< SCIP data structure */
90   	   SCIP_CONS*            cons,               /**< nonlinear constraint */
91   	   SCIP_Bool             compeigenvalues,    /**< whether eigenvalues should be computed to detect complex cases */
92   	   SCIP_Bool*            success,            /**< pointer to store whether SOC structure has been detected */
93   	   SCIP_SIDETYPE*        sidetype,           /**< pointer to store which side of cons is SOC representable; only
94   	                                               valid when success is TRUE */
95   	   SCIP_VAR***           vars,               /**< variables (x) that appear on both sides; no duplicates are allowed */
96   	   SCIP_Real**           offsets,            /**< offsets of both sides (beta_i) */
97   	   SCIP_Real**           transcoefs,         /**< non-zeros of linear transformation vectors (v_i) */
98   	   int**                 transcoefsidx,      /**< mapping of transformation coefficients to variable indices in vars */
99   	   int**                 termbegins,         /**< starting indices of transcoefs for each term */
100  	   int*                  nvars,              /**< total number of variables appearing (i.e. size of vars) */
101  	   int*                  nterms              /**< number of summands in the SQRT +1 for RHS (n+1) */
102  	   );
103  	
104  	/** frees arrays created by SCIPisSOCNonlinear() */
105  	SCIP_EXPORT
106  	void SCIPfreeSOCArraysNonlinear(
107  	   SCIP*                 scip,               /**< SCIP data structure */
108  	   SCIP_VAR***           vars,               /**< variables that appear on both sides (x) */
109  	   SCIP_Real**           offsets,            /**< offsets of both sides (beta_i) */
110  	   SCIP_Real**           transcoefs,         /**< non-zeros of linear transformation vectors (v_i) */
111  	   int**                 transcoefsidx,      /**< mapping of transformation coefficients to variable indices in vars */
112  	   int**                 termbegins,         /**< starting indices of transcoefs for each term */
113  	   int                   nvars,              /**< total number of variables appearing */
114  	   int                   nterms              /**< number of summands in the SQRT +1 for RHS (n+1) */
115  	   );
116  	
117  	/** @}
118  	  * @}
119  	  */
120  	
121  	#ifdef __cplusplus
122  	}
123  	#endif
124  	
125  	#endif /* __SCIP_NLHDLR_SOC_H__ */
126