Scippy

SCIP

Solving Constraint Integer Programs

scip_concurrent.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 scip_concurrent.c
26 * @ingroup OTHER_CFILES
27 * @brief public methods for concurrent solving mode
28 * @author Tobias Achterberg
29 * @author Timo Berthold
30 * @author Gerald Gamrath
31 * @author Leona Gottwald
32 * @author Stefan Heinz
33 * @author Gregor Hendel
34 * @author Thorsten Koch
35 * @author Alexander Martin
36 * @author Marc Pfetsch
37 * @author Michael Winkler
38 * @author Kati Wolter
39 *
40 * @todo check all SCIP_STAGE_* switches, and include the new stages TRANSFORMED and INITSOLVE
41 */
42
43/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
44
45#include "scip/concsolver.h"
46#include "scip/debug.h"
47#include "scip/pub_message.h"
49#include "scip/set.h"
50#include "scip/struct_mem.h"
51#include "scip/struct_scip.h"
52#include "scip/struct_set.h"
53#include "scip/syncstore.h"
54
55/** creates a concurrent solver type and includes it in SCIP.
56 *
57 * @return \ref SCIP_OKAY is returned if everything worked. otherwise a suitable error code is passed. see \ref
58 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
59 *
60 * @pre This method can be called if @p scip is in one of the following stages:
61 * - \ref SCIP_STAGE_INIT
62 * - \ref SCIP_STAGE_PROBLEM
63 */
65 SCIP* scip, /**< SCIP data structure */
66 const char* name, /**< name of concurrent_solver */
67 SCIP_Real prefpriodefault, /**< the default preferred priority of this concurrent solver type */
68 SCIP_DECL_CONCSOLVERCREATEINST ((*concsolvercreateinst)), /**< data copy method of concurrent solver */
69 SCIP_DECL_CONCSOLVERDESTROYINST ((*concsolverdestroyinst)), /**< data copy method of concurrent solver */
70 SCIP_DECL_CONCSOLVERINITSEEDS ((*concsolverinitseeds)), /**< initialize random seeds of concurrent solver */
71 SCIP_DECL_CONCSOLVEREXEC ((*concsolverexec)), /**< execution method of concurrent solver */
72 SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA ((*concsolvercopysolvdata)),/**< method to copy solving data */
73 SCIP_DECL_CONCSOLVERSTOP ((*concsolverstop)), /**< terminate solving in concurrent solver */
74 SCIP_DECL_CONCSOLVERSYNCWRITE ((*concsolversyncwrite)), /**< synchronization method of concurrent solver */
75 SCIP_DECL_CONCSOLVERSYNCREAD ((*concsolversyncread)), /**< synchronization method of concurrent solver */
76 SCIP_DECL_CONCSOLVERTYPEFREEDATA ((*concsolvertypefreedata)),/**< method to free data of concurrent solver type */
77 SCIP_CONCSOLVERTYPEDATA* data /**< the concurent solver type's data */
78 )
79{
80 SCIP_CONCSOLVERTYPE* concsolvertype;
81
82 SCIP_CALL( SCIPcheckStage(scip, "SCIPincludeConcsolverType", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
83
84 /* check whether concurrent solver type is already present */
85 if( SCIPfindConcsolverType(scip, name) != NULL )
86 {
87 SCIPerrorMessage("concurrent solver type <%s> already included.\n", name);
88 return SCIP_INVALIDDATA;
89 }
90
91 SCIP_CALL( SCIPconcsolverTypeCreate(&concsolvertype, scip->set, scip->messagehdlr, scip->mem->setmem,
92 name, prefpriodefault, concsolvercreateinst, concsolverdestroyinst,
93 concsolverinitseeds, concsolverexec, concsolvercopysolvdata,
94 concsolverstop, concsolversyncwrite, concsolversyncread,
95 concsolvertypefreedata, data) );
96
97 SCIP_CALL( SCIPsetIncludeConcsolverType(scip->set, concsolvertype) );
98
99 return SCIP_OKAY;
100}
101
102/** returns the concurrent solver type with the given name, or NULL if not existing */
104 SCIP* scip, /**< SCIP data structure */
105 const char* name /**< name of concurrent_solver */
106 )
107{
108 assert(scip != NULL);
109 assert(scip->set != NULL);
110 assert(name != NULL);
111
112 return SCIPsetFindConcsolverType(scip->set, name);
113}
114
115/** returns the array of included concurrent solver types */
117 SCIP* scip /**< SCIP data structure */
118 )
119{
120 assert(scip != NULL);
121 assert(scip->set != NULL);
122
123 return scip->set->concsolvertypes;
124}
125
126/** returns the number of included concurrent solver types */
128 SCIP* scip /**< SCIP data structure */
129 )
130{
131 assert(scip != NULL);
132 assert(scip->set != NULL);
133
134 return scip->set->nconcsolvertypes;
135}
136
137/** Constructs the parallel interface to execute processes concurrently.
138 *
139 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
140 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
141 *
142 * @pre This method can be called if @p scip is in one of the following stages:
143 * - \ref SCIP_STAGE_PROBLEM
144 * - \ref SCIP_STAGE_TRANSFORMING
145 * - \ref SCIP_STAGE_TRANSFORMED
146 * - \ref SCIP_STAGE_INITPRESOLVE
147 * - \ref SCIP_STAGE_PRESOLVING
148 * - \ref SCIP_STAGE_EXITPRESOLVE
149 * - \ref SCIP_STAGE_PRESOLVED
150 * - \ref SCIP_STAGE_INITSOLVE
151 * - \ref SCIP_STAGE_SOLVING
152 * - \ref SCIP_STAGE_SOLVED
153 * - \ref SCIP_STAGE_EXITSOLVE
154 * - \ref SCIP_STAGE_FREETRANS
155 *
156 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
157 */
159 SCIP* scip /**< SCIP data structure */
160 )
161{
162 SCIP_CALL( SCIPcheckStage(scip, "SCIPconstructSyncstore", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
163
164 SCIP_CALL( SCIPsyncstoreCreate(&scip->syncstore) );
165
166 return SCIP_OKAY;
167}
168
169/** releases the current parallel interface
170 *
171 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
172 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
173 *
174 * @pre This method can be called if @p scip is in one of the following stages:
175 * - \ref SCIP_STAGE_PROBLEM
176 * - \ref SCIP_STAGE_TRANSFORMING
177 * - \ref SCIP_STAGE_TRANSFORMED
178 * - \ref SCIP_STAGE_INITPRESOLVE
179 * - \ref SCIP_STAGE_PRESOLVING
180 * - \ref SCIP_STAGE_EXITPRESOLVE
181 * - \ref SCIP_STAGE_PRESOLVED
182 * - \ref SCIP_STAGE_INITSOLVE
183 * - \ref SCIP_STAGE_SOLVING
184 * - \ref SCIP_STAGE_SOLVED
185 * - \ref SCIP_STAGE_EXITSOLVE
186 * - \ref SCIP_STAGE_FREETRANS
187 * - \ref SCIP_STAGE_FREE
188 *
189 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
190 */
192 SCIP* scip /**< SCIP data structure */
193 )
194{
195 SCIP_CALL( SCIPcheckStage(scip, "SCIPfreeSyncstore", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) );
196
197 SCIP_CALL( SCIPsyncstoreRelease(&(scip->syncstore)) );
198
199 return SCIP_OKAY;
200}
201
202/** Gets the parallel interface to execute processes concurrently.
203 *
204 * @return the \ref SCIP_SYNCSTORE parallel interface pointer to submit jobs for concurrent processing.
205 *
206 * @pre This method can be called if @p scip is in one of the following stages:
207 * - \ref SCIP_STAGE_INIT
208 * - \ref SCIP_STAGE_PROBLEM
209 * - \ref SCIP_STAGE_TRANSFORMING
210 * - \ref SCIP_STAGE_TRANSFORMED
211 * - \ref SCIP_STAGE_INITPRESOLVE
212 * - \ref SCIP_STAGE_PRESOLVING
213 * - \ref SCIP_STAGE_EXITPRESOLVE
214 * - \ref SCIP_STAGE_PRESOLVED
215 * - \ref SCIP_STAGE_INITSOLVE
216 * - \ref SCIP_STAGE_SOLVING
217 * - \ref SCIP_STAGE_SOLVED
218 * - \ref SCIP_STAGE_EXITSOLVE
219 * - \ref SCIP_STAGE_FREETRANS
220 *
221 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
222 */
224 SCIP* scip /**< SCIP data structure */
225 )
226{
227 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetSyncstore", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
228
229 return scip->syncstore;
230}
SCIP_RETCODE SCIPconcsolverTypeCreate(SCIP_CONCSOLVERTYPE **concsolvertype, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, SCIP_Real prefpriodefault, SCIP_DECL_CONCSOLVERCREATEINST((*concsolvercreateinst)), SCIP_DECL_CONCSOLVERDESTROYINST((*concsolverdestroyinst)), SCIP_DECL_CONCSOLVERINITSEEDS((*concsolverinitseeds)), SCIP_DECL_CONCSOLVEREXEC((*concsolverexec)), SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA((*concsolvercopysolvdata)), SCIP_DECL_CONCSOLVERSTOP((*concsolverstop)), SCIP_DECL_CONCSOLVERSYNCWRITE((*concsolversyncwrite)), SCIP_DECL_CONCSOLVERSYNCREAD((*concsolversyncread)), SCIP_DECL_CONCSOLVERTYPEFREEDATA((*concsolvertypefreedata)), SCIP_CONCSOLVERTYPEDATA *data)
Definition: concsolver.c:113
datastructures for concurrent solvers
SCIP_RETCODE SCIPcheckStage(SCIP *scip, const char *method, SCIP_Bool init, SCIP_Bool problem, SCIP_Bool transforming, SCIP_Bool transformed, SCIP_Bool initpresolve, SCIP_Bool presolving, SCIP_Bool exitpresolve, SCIP_Bool presolved, SCIP_Bool initsolve, SCIP_Bool solving, SCIP_Bool solved, SCIP_Bool exitsolve, SCIP_Bool freetrans, SCIP_Bool freescip)
Definition: debug.c:2208
methods for debugging
#define NULL
Definition: def.h:266
#define SCIP_Real
Definition: def.h:172
#define TRUE
Definition: def.h:93
#define FALSE
Definition: def.h:94
#define SCIP_CALL_ABORT(x)
Definition: def.h:352
#define SCIP_CALL(x)
Definition: def.h:373
SCIP_CONCSOLVERTYPE ** SCIPgetConcsolverTypes(SCIP *scip)
SCIP_RETCODE SCIPincludeConcsolverType(SCIP *scip, const char *name, SCIP_Real prefpriodefault, SCIP_DECL_CONCSOLVERCREATEINST((*concsolvercreateinst)), SCIP_DECL_CONCSOLVERDESTROYINST((*concsolverdestroyinst)), SCIP_DECL_CONCSOLVERINITSEEDS((*concsolverinitseeds)), SCIP_DECL_CONCSOLVEREXEC((*concsolverexec)), SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA((*concsolvercopysolvdata)), SCIP_DECL_CONCSOLVERSTOP((*concsolverstop)), SCIP_DECL_CONCSOLVERSYNCWRITE((*concsolversyncwrite)), SCIP_DECL_CONCSOLVERSYNCREAD((*concsolversyncread)), SCIP_DECL_CONCSOLVERTYPEFREEDATA((*concsolvertypefreedata)), SCIP_CONCSOLVERTYPEDATA *data)
SCIP_CONCSOLVERTYPE * SCIPfindConcsolverType(SCIP *scip, const char *name)
int SCIPgetNConcsolverTypes(SCIP *scip)
SCIP_SYNCSTORE * SCIPgetSyncstore(SCIP *scip)
SCIP_RETCODE SCIPfreeSyncstore(SCIP *scip)
SCIP_RETCODE SCIPconstructSyncstore(SCIP *scip)
public methods for message output
#define SCIPerrorMessage
Definition: pub_message.h:64
public methods for concurrent solving mode
SCIP_RETCODE SCIPsetIncludeConcsolverType(SCIP_SET *set, SCIP_CONCSOLVERTYPE *concsolvertype)
Definition: set.c:4493
SCIP_CONCSOLVERTYPE * SCIPsetFindConcsolverType(SCIP_SET *set, const char *name)
Definition: set.c:4515
internal methods for global SCIP settings
datastructures for block memory pools and memory buffers
SCIP main data structure.
datastructures for global SCIP settings
SCIP_RETCODE SCIPsyncstoreRelease(SCIP_SYNCSTORE **syncstore)
Definition: syncstore.c:89
SCIP_RETCODE SCIPsyncstoreCreate(SCIP_SYNCSTORE **syncstore)
Definition: syncstore.c:67
the function declarations for the synchronization store
#define SCIP_DECL_CONCSOLVERSTOP(x)
#define SCIP_DECL_CONCSOLVERINITSEEDS(x)
#define SCIP_DECL_CONCSOLVERTYPEFREEDATA(x)
#define SCIP_DECL_CONCSOLVERSYNCWRITE(x)
#define SCIP_DECL_CONCSOLVERDESTROYINST(x)
#define SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA(x)
struct SCIP_ConcSolverTypeData SCIP_CONCSOLVERTYPEDATA
#define SCIP_DECL_CONCSOLVEREXEC(x)
#define SCIP_DECL_CONCSOLVERCREATEINST(x)
#define SCIP_DECL_CONCSOLVERSYNCREAD(x)
@ SCIP_INVALIDDATA
Definition: type_retcode.h:52
@ SCIP_OKAY
Definition: type_retcode.h:42
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63