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
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* 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_syncstore.h
* @ingroup PARALLEL
* @brief the struct definitions for the synchronization store
* @author Stephen J. Maher
* @author Leona Gottwald
*/
/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
#ifndef __STRUCT_SYNCSTORE_H__
#define __STRUCT_SYNCSTORE_H__
#include "scip/type_syncstore.h"
#include "tpi/type_tpi.h"
#include "scip/def.h"
#include "scip/type_scip.h"
#include "scip/type_stat.h"
#include "scip/type_lp.h"
#ifdef __cplusplus
extern "C" {
#endif
struct SCIP_SyncStore
{
int nuses; /**< number of uses of the synchronization store */
SCIP_PARALLELMODE mode; /**< the mode for the parallel solving */
SCIP_Bool initialized; /**< flag to indicate whether the syncstore has been initialized */
int ninitvars; /**< number of variables it has been initialized for */
SCIP_SYNCDATA* syncdata; /**< array of size nsyncdata, containing the synchronization data
* for each active synchroization */
SCIP_SYNCDATA* lastsync; /**< pointer to the last synchronization data that has been synchronized
* by all threads */
SCIP* mainscip; /**< the SCIP instance that was used for initializing the syncstore */
SCIP_Bool stopped; /**< flag to indicate if the solving is stopped */
SCIP_LOCK lock; /**< lock to protect the syncstore data structure from data races */
/* SPI settings */
int nsyncdata; /**< the size of the synchronization data array */
SCIP_Real minsyncdelay; /**< the minimum delay before a synchronization data may be read */
int maxnsyncdelay; /**< maximum number of synchronizations before the reading of the next
* synchronization data is enforced regardless of the minimal synchroization
* delay */
SCIP_Real syncfreqinit; /**< the initial synchronization frequency which is read from the settings
* of the main SCIP when the syncstore is initialized */
SCIP_Real syncfreqmax; /**< the maximum synchronization frequency */
int maxnsols; /**< maximum number of solutions that can be shared in one synchronization */
int nsolvers; /**< number of solvers synchronizing with this syncstore */
};
struct SCIP_SyncData
{
SCIP_Real* solobj; /**< array with the objective value of all stored solutions */
SCIP_Real** sols; /**< array with the solution values of each variable for all stored solutions */
int* solsource; /**< the solverid of the solution came from */
int nsols; /**< number of solutions currently stored in the synchronization data */
SCIP_Real bestlowerbound; /**< largest lower bound on the objective value that was stored in this
* synchroization data */
SCIP_Real bestupperbound; /**< smalles upper bound on the objective value that was stored in this
* synchroization data */
SCIP_Longint syncnum; /**< the synchronization number of this synchronization data */
int winner; /**< the solverid of the solver with the best status */
SCIP_STATUS status; /**< the best status that was stored in this synchronization data */
SCIP_LOCK lock; /**< a lock to protect this synchronization data */
int syncedcount; /**< a counter of how many solvers have finished writing to this synchronization data */
SCIP_CONDITION allsynced; /**< a condition variable to signal when the last solver has finished writing to this
* synchronization data */
SCIP_BOUNDSTORE* boundstore; /**< a boundstore for storing all the bound changes that were added to this
* synchronization data */
SCIP_Real syncfreq; /**< the synchroization frequency that was set in this synchronization data */
SCIP_Longint memtotal; /**< the total amount of memory used by all solvers including the main SCIP */
};
/** struct for storing the position of avariables lower and upper bound in the boundstore */
typedef struct
{
int pos[2]; /**< stores at pos[SCIP_BOUNDTYPE_LOWER] the position of the lowerbound and
* at pos[SCIP_BOUNDTYPE_UPPER] the position of the upperbound */
} BoundPos;
/** struct for storing a single boundchange in the boundstore */
typedef struct
{
int varidx; /**< the variables position in the variable array of the main scip */
SCIP_Real newbound; /**< the variables new bound */
SCIP_BOUNDTYPE boundtype; /**< the type of the variables new bound */
} BoundChg;
struct SCIP_BoundStore
{
int nvars; /**< the number of variables to store bounds for */
BoundPos* bndpos; /**< array of size nvars to store the positions for all the bound changes
* stored in this boundstore */
BoundChg* bndchg; /**< array of boundchanges */
int nbndchg; /**< the number of boundchanges stored in this bound store */
int bndchgsize; /**< the size of the bound change array */
};
#ifdef __cplusplus
}
#endif
#endif