1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* This file is part of the program and library */
/* SCIP --- Solving Constraint Integer Programs */
/* */
/* Copyright 2002-2022 Zuse Institute Berlin */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
/* See the License for the specific language governing permissions and */
/* limitations under the License. */
/* */
/* You should have received a copy of the Apache-2.0 license */
/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**@file struct_nlp.h
* @ingroup INTERNALAPI
* @brief datastructures for NLP management
* @author Thorsten Gellermann
* @author Stefan Vigerske
*
* In SCIP, the NLP relaxation is defined as follows:
* <pre>
* min const + obj * x
* lhs <= const + A * x + f(x) <= rhs
* lb <= x <= ub
* </pre>
*
* The main datastructures for storing an NLP are the nonlinear rows.
* A nonlinear row can live on its own (if it was created by a separator),
* or as relaxation of a constraint. Thus, it has a nuses-counter and is
* deleted if not used any more.
* In difference to columns of an LP, nonlinear rows are defined
* with respect SCIP variables.
*/
/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
#ifndef __SCIP_STRUCT_NLP_H__
#define __SCIP_STRUCT_NLP_H__
#include "scip/def.h"
#include "scip/type_nlp.h"
#include "scip/type_var.h"
#include "scip/type_misc.h"
#include "scip/type_event.h"
#include "scip/type_nlpi.h"
#include "scip/type_expr.h"
#ifdef __cplusplus
extern "C" {
#endif
/** NLP row */
struct SCIP_NlRow
{
/* sides */
SCIP_Real lhs; /**< left hand side */
SCIP_Real rhs; /**< right hand side */
/* constant part */
SCIP_Real constant; /**< constant value */
/* linear part */
int nlinvars; /**< number of linear variables */
int linvarssize; /**< size of arrays storing linear part of row */
SCIP_VAR** linvars; /**< linear variables */
double* lincoefs; /**< coefficients of linear variables */
SCIP_Bool linvarssorted; /**< are the linear coefficients sorted (by variable indices?) */
/* nonlinear part */
SCIP_EXPR* expr; /**< expression representing nonlinear part */
/* miscellaneous */
char* name; /**< name */
int nuses; /**< number of times, this row is referenced */
SCIP_Real activity; /**< row activity value in NLP, or SCIP_INVALID if not yet calculated */
SCIP_Longint validactivitynlp; /**< NLP number for which activity value is valid */
SCIP_Real pseudoactivity; /**< row activity value in pseudo solution, or SCIP_INVALID if not yet calculated */
SCIP_Longint validpsactivitydomchg; /**< domain change number for which pseudo activity value is valid */
SCIP_Real minactivity; /**< minimal activity value w.r.t. the variables' bounds, or SCIP_INVALID */
SCIP_Real maxactivity; /**< maximal activity value w.r.t. the variables' bounds, or SCIP_INVALID */
SCIP_Longint validactivitybdsdomchg; /**< domain change number for which activity bound values are valid */
int nlpindex; /**< index of this row in NLP, or -1 if not added */
int nlpiindex; /**< index of this row in NLPI problem, or -1 if not in there */
SCIP_Real dualsol; /**< dual value associated with row in last NLP solve */
SCIP_EXPRCURV curvature; /**< curvature of the nonlinear row */
};
/** current NLP data */
struct SCIP_Nlp
{
/* NLP solver */
SCIP_NLPI* solver; /**< interface to NLP solver, or NULL if no NLP solvers are available */
SCIP_NLPIPROBLEM* problem; /**< problem in NLP solver */
/* status */
int nunflushedvaradd; /**< number of variable additions not flushed to NLPI problem yet */
int nunflushedvardel; /**< number of variable deletions not flushed to NLPI problem yet */
int nunflushednlrowadd; /**< number of nonlinear row additions not flushed to NLPI problem yet */
int nunflushednlrowdel; /**< number of nonlinear row deletions not flushed to NLPI problem yet */
SCIP_Bool indiving; /**< are we currently in diving mode? */
/* variables in problem */
int nvars; /**< number of variables */
int sizevars; /**< allocated space for variables */
SCIP_VAR** vars; /**< variables */
SCIP_HASHMAP* varhash; /**< variable hash: map SCIP_VAR* to index of variable in NLP */
/* variables in NLPI problem */
int nvars_solver; /**< number of variables in NLPI problem */
int sizevars_solver; /**< allocated space for variables in NLPI problem */
int* varmap_nlp2nlpi; /**< index of variables in NLPI problem, or -1 if variable has not been added to NLPI problem yet */
int* varmap_nlpi2nlp; /**< index of a NLPI problem variable in NLP (`varmap_nlp2nlpi[varmap_nlpi2nlp[i]] == i` for `i = 0..nvars_solver-1`), or -1 if variable has been deleted from NLP */
/* nonlinear rows in problem */
int nnlrows; /**< number of nonlinear rows */
int sizenlrows; /**< allocated space for nonlinear rows */
SCIP_NLROW** nlrows; /**< nonlinear rows */
/* nonlinear rows in NLPI problem */
int nnlrows_solver; /**< number of nonlinear rows in solver */
int sizenlrows_solver; /**< allocated space for nonlinear rows in solver */
int* nlrowmap_nlpi2nlp; /**< index of a NLPI row in NLP (`nlrows[nlrowmap_nlpi2nlp[i]]->nlpiidx == i` for `i = 0..nnlrows_solver-1`), or -1 if row has been deleted from NLP */
/* objective function */
SCIP_Bool objflushed; /**< is the objective in the NLPI up to date? */
SCIP_NLROW* divingobj; /**< objective function during diving */
/* initial guess */
SCIP_Bool haveinitguess; /**< is an initial guess available? */
SCIP_Real* initialguess; /**< initial guess of primal values to use in next NLP solve, if available */
/* solution of NLP */
SCIP_Real primalsolobjval; /**< objective function value of primal solution */
SCIP_NLPSOLSTAT solstat; /**< status of NLP solution (feasible, optimal, unknown...) */
SCIP_NLPTERMSTAT termstat; /**< termination status of NLP (normal, some limit reached, ...) */
SCIP_Real* varlbdualvals; /**< dual values associated with variable lower bounds */
SCIP_Real* varubdualvals; /**< dual values associated with variable upper bounds */
/* event handling */
SCIP_EVENTHDLR* eventhdlr; /**< event handler for bound change events */
int globalfilterpos; /**< position of event handler in event handler filter */
/* fractional variables in last NLP solution */
SCIP_VAR** fracvars; /**< fractional variables */
SCIP_Real* fracvarssol; /**< values of the fractional variables */
SCIP_Real* fracvarsfrac; /**< fractionality of the fractional variables */
int nfracvars; /**< number of fractional variables */
int npriofracvars; /**< number of fractional variables with highest branching priority */
int fracvarssize; /**< size of fracvars arrays */
SCIP_Longint validfracvars; /**< the NLP solve for which the fractional variables are valid, or -1 if never setup */
/* miscellaneous */
char* name; /**< problem name */
};
#ifdef __cplusplus
}
#endif
#endif /* __SCIP_STRUCT_NLP_H__ */