1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /*                                                                           */
3 /*                  This file is part of the program and library             */
4 /*         SCIP --- Solving Constraint Integer Programs                      */
5 /*                                                                           */
6 /*    Copyright (C) 2002-2021 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   struct_syncstore.h
17  * @ingroup PARALLEL
18  * @brief  the struct definitions for the synchronization store
19  * @author Stephen J. Maher
20  * @author Leona Gottwald
21  */
22 
23 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
24 
25 #ifndef __STRUCT_SYNCSTORE_H__
26 #define __STRUCT_SYNCSTORE_H__
27 
28 #include "scip/type_syncstore.h"
29 #include "tpi/type_tpi.h"
30 #include "scip/def.h"
31 #include "scip/type_scip.h"
32 #include "scip/type_stat.h"
33 #include "scip/type_lp.h"
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 struct SCIP_SyncStore
40 {
41    int                   nuses;              /**< number of uses of the synchronization store */
42    SCIP_PARALLELMODE     mode;               /**< the mode for the parallel solving */
43    SCIP_Bool             initialized;        /**< flag to indicate whether the syncstore has been initialized */
44    int                   ninitvars;          /**< number of variables it has been initialized for */
45    SCIP_SYNCDATA*        syncdata;           /**< array of size nsyncdata, containing the synchronization data
46                                               *   for each active synchroization */
47    SCIP_SYNCDATA*        lastsync;           /**< pointer to the last synchronization data that has been synchronized
48                                               *   by all threads */
49 
50    SCIP*                 mainscip;           /**< the SCIP instance that was used for initializing the syncstore */
51    SCIP_Bool             stopped;            /**< flag to indicate if the solving is stopped */
52    SCIP_LOCK             lock;               /**< lock to protect the syncstore data structure from data races */
53 
54    /* SPI settings */
55    int                   nsyncdata;          /**< the size of the synchronization data array */
56    SCIP_Real             minsyncdelay;       /**< the minimum delay before a synchronization data may be read */
57    int                   maxnsyncdelay;      /**< maximum number of synchronizations before the reading of the next
58                                               *   synchronization data is enforced regardless of the minimal synchroization
59                                               *   delay */
60    SCIP_Real             syncfreqinit;       /**< the initial synchronization frequency which is read from the settings
61                                               *   of the main SCIP when the syncstore is initialized */
62    SCIP_Real             syncfreqmax;        /**< the maximum synchronization frequency */
63    int                   maxnsols;           /**< maximum number of solutions that can be shared in one synchronization */
64    int                   nsolvers;           /**< number of solvers synchronizing with this syncstore */
65 };
66 
67 
68 struct SCIP_SyncData
69 {
70    SCIP_Real*            solobj;             /**< array with the objective value of all stored solutions */
71    SCIP_Real**           sols;               /**< array with the solution values of each variable for all stored solutions */
72    int*                  solsource;          /**< the solverid of the solution came from */
73    int                   nsols;              /**< number of solutions currently stored in the synchronization data */
74    SCIP_Real             bestlowerbound;     /**< largest lower bound on the objective value that was stored in this
75                                               *   synchroization data */
76    SCIP_Real             bestupperbound;     /**< smalles upper bound on the objective value that was stored in this
77                                               *   synchroization data */
78    SCIP_Longint          syncnum;            /**< the synchronization number of this synchronization data */
79    int                   winner;             /**< the solverid of the solver with the best status */
80    SCIP_STATUS           status;             /**< the best status that was stored in this synchronization data */
81    SCIP_LOCK             lock;               /**< a lock to protect this synchronization data */
82    int                   syncedcount;        /**< a counter of how many solvers have finished writing to this synchronization data */
83    SCIP_CONDITION        allsynced;          /**< a condition variable to signal when the last solver has finished writing to this
84                                               *   synchronization data */
85    SCIP_BOUNDSTORE*      boundstore;         /**< a boundstore for storing all the bound changes that were added to this
86                                               *   synchronization data */
87    SCIP_Real             syncfreq;           /**< the synchroization frequency that was set in this synchronization data */
88    SCIP_Longint          memtotal;           /**< the total amount of memory used by all solvers including the main SCIP */
89 };
90 
91 /** struct for storing the position of avariables lower and upper bound in the boundstore */
92 typedef struct
93 {
94    int                   pos[2];             /**< stores at pos[SCIP_BOUNDTYPE_LOWER] the position of the lowerbound and
95                                               *   at pos[SCIP_BOUNDTYPE_UPPER] the position of the upperbound */
96 } BoundPos;
97 
98 /** struct for storing a single boundchange in the boundstore */
99 typedef struct
100 {
101    int                   varidx;             /**< the variables position in the variable array of the main scip */
102    SCIP_Real             newbound;           /**< the variables new bound */
103    SCIP_BOUNDTYPE        boundtype;          /**< the type of the variables new bound */
104 } BoundChg;
105 
106 struct SCIP_BoundStore
107 {
108    int                   nvars;              /**< the number of variables to store bounds for */
109    BoundPos*             bndpos;             /**< array of size nvars to store the positions for all the bound changes
110                                               *   stored in this boundstore */
111    BoundChg*             bndchg;             /**< array of boundchanges */
112    int                   nbndchg;            /**< the number of boundchanges stored in this bound store */
113    int                   bndchgsize;         /**< the size of the bound change array */
114 };
115 
116 #ifdef __cplusplus
117 }
118 #endif
119 
120 #endif
121