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 objdialog.cpp
17 * @brief C++ wrapper for dialogs
18 * @author Kati Wolter
19 */
20
21 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22
23 #include <cassert>
24
25 #include "objdialog.h"
26
27
28
29
30 /*
31 * Data structures
32 */
33
34 /** dialog data */
35 struct SCIP_DialogData
36 {
37 scip::ObjDialog* objdialog; /**< dialog object */
38 SCIP_Bool deleteobject; /**< should the dialog object be deleted when dialog is freed? */
39 };
40
41
42
43
44 /*
45 * Callback methods of dialog
46 */
47
48 extern "C"
49 {
50
51 /** copy method for dialog plugins (called when SCIP copies plugins) */
52 static
SCIP_DECL_DIALOGCOPY(dialogCopyObj)53 SCIP_DECL_DIALOGCOPY(dialogCopyObj)
54 { /*lint --e{715}*/
55 SCIP_DIALOGDATA* dialogdata;
56
57 assert(scip != 0);
58
59 dialogdata = SCIPdialogGetData(dialog);
60 assert(dialogdata != 0);
61 assert(dialogdata->objdialog != 0);
62 assert(dialogdata->objdialog->scip_ != scip);
63
64 if( dialogdata->objdialog->iscloneable() )
65 {
66 scip::ObjDialog* newobjdialog;
67 newobjdialog = dynamic_cast<scip::ObjDialog*> (dialogdata->objdialog->clone(scip));
68
69 /* call include method of dialog object */
70 SCIP_CALL( SCIPincludeObjDialog(scip, newobjdialog, TRUE) );
71 }
72
73 return SCIP_OKAY;
74 }
75
76 /** destructor of dialog to free user data (called when SCIP is exiting) */
77 static
SCIP_DECL_DIALOGFREE(dialogFreeObj)78 SCIP_DECL_DIALOGFREE(dialogFreeObj)
79 { /*lint --e{715}*/
80 SCIP_DIALOGDATA* dialogdata;
81
82 dialogdata = SCIPdialogGetData(dialog);
83 assert(dialogdata != 0);
84 assert(dialogdata->objdialog != 0);
85 assert(dialogdata->objdialog->scip_ == scip);
86
87 /* call virtual method of dialog object */
88 SCIP_CALL( dialogdata->objdialog->scip_free(scip, dialog) );
89
90 /* free dialog object */
91 if( dialogdata->deleteobject )
92 delete dialogdata->objdialog;
93
94 /* free dialog data */
95 delete dialogdata;
96 SCIPdialogSetData(dialog, 0); /*lint !e64*/
97
98 return SCIP_OKAY;
99 }
100
101
102 /** description output method of dialog */
103 static
SCIP_DECL_DIALOGDESC(dialogDescObj)104 SCIP_DECL_DIALOGDESC(dialogDescObj)
105 { /*lint --e{715}*/
106 SCIP_DIALOGDATA* dialogdata;
107
108 dialogdata = SCIPdialogGetData(dialog);
109 assert(dialogdata != 0);
110 assert(dialogdata->objdialog != 0);
111 assert(dialogdata->objdialog->scip_ == scip);
112
113 /* call virtual method of dialog object */
114 SCIP_CALL( dialogdata->objdialog->scip_desc(scip, dialog) );
115
116 return SCIP_OKAY;
117 }
118
119 /** execution method of dialog */
120 static
SCIP_DECL_DIALOGEXEC(dialogExecObj)121 SCIP_DECL_DIALOGEXEC(dialogExecObj)
122 { /*lint --e{715}*/
123 SCIP_DIALOGDATA* dialogdata;
124
125 dialogdata = SCIPdialogGetData(dialog);
126 assert(dialogdata != 0);
127 assert(dialogdata->objdialog != 0);
128
129 /* call virtual method of dialog object */
130 SCIP_CALL( dialogdata->objdialog->scip_exec(scip, dialog, dialoghdlr, nextdialog) );
131
132 return SCIP_OKAY;
133 }
134 }
135
136
137
138 /*
139 * dialog specific interface methods
140 */
141
142 /** creates the dialog for the given dialog object and includes it in SCIP */
SCIPincludeObjDialog(SCIP * scip,scip::ObjDialog * objdialog,SCIP_Bool deleteobject)143 SCIP_RETCODE SCIPincludeObjDialog(
144 SCIP* scip, /**< SCIP data structure */
145 scip::ObjDialog* objdialog, /**< dialog object */
146 SCIP_Bool deleteobject /**< should the dialog object be deleted when dialog is freed? */
147 )
148 {/*lint --e{429} */
149 SCIP_DIALOG* parentdialog;
150
151 assert(scip != 0);
152 assert(objdialog != 0);
153
154 /* get parent dialog */
155 parentdialog = SCIPgetRootDialog(scip);
156 assert(parentdialog != 0);
157 /* TODO: (optional) change parent dialog from root dialog to another existing dialog (needs to be a menu) */
158
159 /* create, include, and release dialog */
160 if( !SCIPdialogHasEntry(parentdialog, objdialog->scip_name_) )
161 {
162 SCIP_DIALOGDATA* dialogdata; /*lint !e593*/
163 SCIP_DIALOG* dialog;
164 SCIP_RETCODE retcode;
165
166 dialog = 0;
167
168 /* create dialog data */
169 dialogdata = new SCIP_DIALOGDATA;
170 dialogdata->objdialog = objdialog;
171 dialogdata->deleteobject = deleteobject;
172
173 retcode = SCIPincludeDialog(scip, &dialog, dialogCopyObj, dialogExecObj, dialogDescObj, dialogFreeObj,
174 objdialog->scip_name_, objdialog->scip_desc_, objdialog->scip_issubmenu_, dialogdata);
175 if( retcode != SCIP_OKAY )
176 {
177 delete dialogdata;
178 SCIP_CALL( retcode );
179 }
180 SCIP_CALL( SCIPaddDialogEntry(scip, parentdialog, dialog) ); /*lint !e593*/
181 SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); /*lint !e593*/
182 } /*lint !e593*/
183
184 return SCIP_OKAY; /*lint !e593*/
185 }
186