Scippy

SCIP

Solving Constraint Integer Programs

boundstore.c
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program and library */
4/* SCIP --- Solving Constraint Integer Programs */
5/* */
6/* Copyright (c) 2002-2024 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 boundstore.c
26 * @ingroup PARALLEL
27 * @brief the implementation of the bound store datastructure
28 * @author Leona Gottwald
29 */
30
31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
32
33#include "scip/boundstore.h"
36#include "scip/scip.h"
37
38/** create bound store data structure */
40 SCIP* scip, /**< scip main datastructure */
41 SCIP_BOUNDSTORE** boundstore, /**< pointer to store the bound store datastructure */
42 int nvars /**< number of variables for which bounds may be stored */
43 )
44{
45 assert(scip != NULL);
46 assert(boundstore != NULL);
47
48 SCIP_CALL( SCIPallocMemory(scip, boundstore) );
49
50 (*boundstore)->bndchg = NULL;
51 (*boundstore)->bndchgsize = 0;
52 (*boundstore)->nbndchg = 0;
53 (*boundstore)->nvars = nvars;
54 SCIP_CALL( SCIPallocClearBlockMemoryArray(scip, &(*boundstore)->bndpos, nvars) );
55
56 return SCIP_OKAY;
57}
58
59/** free bound store data structure */
61 SCIP* scip, /**< scip main datastructure */
62 SCIP_BOUNDSTORE** boundstore /**< pointer to the bound store datastructure */
63 )
64{
65 assert(scip != NULL);
66 assert(boundstore != NULL);
67 assert((*boundstore) != NULL);
68
69 SCIPfreeBlockMemoryArray(scip, &(*boundstore)->bndpos, (*boundstore)->nvars);
70 SCIPfreeBlockMemoryArrayNull(scip, &(*boundstore)->bndchg, (*boundstore)->bndchgsize);
71 SCIPfreeMemory(scip, boundstore);
72}
73
74/** add bound change to bound store data structure */
76 SCIP* scip, /**< scip main datastructure */
77 SCIP_BOUNDSTORE* boundstore, /**< the bound store datastructure */
78 int varidx, /**< variable index of bound change, must be smaller than the
79 * number of variables given during creation of bound store */
80 SCIP_Real newbound, /**< bound value of variable */
81 SCIP_BOUNDTYPE boundtype /**< type of new bound */
82 )
83{
84 /* check if already stored a bound of same type for this variable */
85 int pos;
86
87 assert(scip != NULL);
88 assert(boundstore != NULL);
89
90 pos = boundstore->bndpos[varidx].pos[boundtype];
91
92 if( pos == 0 )
93 {
94 /* variable has no bound stored yet so store this bound */
95 int i;
96 i = boundstore->nbndchg++;
97 SCIP_CALL( SCIPensureBlockMemoryArray(scip, &boundstore->bndchg, &boundstore->bndchgsize, boundstore->nbndchg) );
98 boundstore->bndchg[i].varidx = varidx;
99 boundstore->bndchg[i].newbound = newbound;
100 boundstore->bndchg[i].boundtype = boundtype;
101 boundstore->bndpos[varidx].pos[boundtype] = boundstore->nbndchg;
102 }
103 else
104 {
105 /* since pos == 0 is reserved if no bound is stored
106 * the index is pos-1
107 */
108 --pos;
109 assert(boundstore->bndchg[pos].boundtype == boundtype);
110 assert(boundstore->bndchg[pos].varidx == varidx);
111
112 /* if the bound is better overwrite the old one */
113 if( (boundtype == SCIP_BOUNDTYPE_LOWER && newbound > boundstore->bndchg[pos].newbound) ||
114 (boundtype == SCIP_BOUNDTYPE_UPPER && newbound < boundstore->bndchg[pos].newbound) )
115 {
116 boundstore->bndchg[pos].newbound = newbound;
117 }
118 }
119
120 return SCIP_OKAY;
121}
122
123/** add all bound changes of source to target */
125 SCIP* scip, /**< scip main datastructure for target boundstore */
126 SCIP_BOUNDSTORE* target, /**< the bound store datastructure where the bounds get merged in */
127 SCIP_BOUNDSTORE* source /**< the bound store datastructure from which the bounds get merged in */
128 )
129{
130 int i;
131
132 assert(scip != NULL);
133 assert(source != NULL);
134 assert(target != NULL);
135
136 /* just iterate over the boundchanges in the source and add them to the target */
137 for( i = 0; i < source->nbndchg; ++i )
138 {
139 SCIP_CALL( SCIPboundstoreAdd(scip, target, source->bndchg[i].varidx, source->bndchg[i].newbound, source->bndchg[i].boundtype) );
140 }
141
142 return SCIP_OKAY;
143}
144
145/** remove all boundchanges from bound store */
147 SCIP_BOUNDSTORE* boundstore /**< the bound store datastructure */
148 )
149{
150 assert(boundstore != NULL);
151
152 /* clearing the positions is enough */
153 if( boundstore->nbndchg > 0 )
154 {
155 BMSclearMemoryArray(boundstore->bndpos, boundstore->nvars);
156 boundstore->nbndchg = 0;
157 }
158}
159
160/** gets variable index of the i'th stored boundchange */
162 SCIP_BOUNDSTORE* boundstore, /**< the bound store datastructure */
163 int i /**< the index of the bound change */
164 )
165{
166 assert(boundstore != NULL);
167 assert(i < boundstore->nbndchg);
168
169 return boundstore->bndchg[i].varidx;
170}
171
172/** gets the type of the i'th stored boundchange */
174 SCIP_BOUNDSTORE* boundstore, /**< the bound store datastructure */
175 int i /**< the index of the bound change */
176 )
177{
178 assert(boundstore != NULL);
179 assert(i < boundstore->nbndchg);
180
181 return boundstore->bndchg[i].boundtype;
182}
183
184/** gets the bound value of the i'th stored boundchange */
186 SCIP_BOUNDSTORE* boundstore, /**< the bound store datastructure */
187 int i /**< the index of the bound change */
188 )
189{
190 assert(boundstore != NULL);
191 assert(i < boundstore->nbndchg);
192
193 return boundstore->bndchg[i].newbound;
194}
195
196/** gets the number of stored bound changes */
198 SCIP_BOUNDSTORE* boundstore /**< the bound store datastructure */
199 )
200{
201 assert(boundstore != NULL);
202
203 return boundstore->nbndchg;
204}
SCIP_Real SCIPboundstoreGetChgVal(SCIP_BOUNDSTORE *boundstore, int i)
Definition: boundstore.c:185
SCIP_BOUNDTYPE SCIPboundstoreGetChgType(SCIP_BOUNDSTORE *boundstore, int i)
Definition: boundstore.c:173
SCIP_RETCODE SCIPboundstoreMerge(SCIP *scip, SCIP_BOUNDSTORE *target, SCIP_BOUNDSTORE *source)
Definition: boundstore.c:124
SCIP_RETCODE SCIPboundstoreAdd(SCIP *scip, SCIP_BOUNDSTORE *boundstore, int varidx, SCIP_Real newbound, SCIP_BOUNDTYPE boundtype)
Definition: boundstore.c:75
int SCIPboundstoreGetChgVaridx(SCIP_BOUNDSTORE *boundstore, int i)
Definition: boundstore.c:161
void SCIPboundstoreFree(SCIP *scip, SCIP_BOUNDSTORE **boundstore)
Definition: boundstore.c:60
SCIP_RETCODE SCIPboundstoreCreate(SCIP *scip, SCIP_BOUNDSTORE **boundstore, int nvars)
Definition: boundstore.c:39
void SCIPboundstoreClear(SCIP_BOUNDSTORE *boundstore)
Definition: boundstore.c:146
int SCIPboundstoreGetNChgs(SCIP_BOUNDSTORE *boundstore)
Definition: boundstore.c:197
the interface of the boundstore structure
#define NULL
Definition: def.h:266
#define SCIP_Real
Definition: def.h:172
#define SCIP_CALL(x)
Definition: def.h:373
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
Definition: scip_mem.h:110
#define SCIPensureBlockMemoryArray(scip, ptr, arraysizeptr, minsize)
Definition: scip_mem.h:107
#define SCIPallocClearBlockMemoryArray(scip, ptr, num)
Definition: scip_mem.h:97
#define SCIPallocMemory(scip, ptr)
Definition: scip_mem.h:60
#define SCIPfreeMemory(scip, ptr)
Definition: scip_mem.h:78
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
Definition: scip_mem.h:111
memory allocation routines
#define BMSclearMemoryArray(ptr, num)
Definition: memory.h:130
SCIP callable library.
SCIP_Real newbound
SCIP_BOUNDTYPE boundtype
the struct definitions for the synchronization store
@ SCIP_BOUNDTYPE_UPPER
Definition: type_lp.h:57
@ SCIP_BOUNDTYPE_LOWER
Definition: type_lp.h:56
enum SCIP_BoundType SCIP_BOUNDTYPE
Definition: type_lp.h:59
@ SCIP_OKAY
Definition: type_retcode.h:42
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63