/** creates the xyz dialog and includes it in SCIP */ SCIP_RETCODE SCIPincludeDialogXyz( SCIP* scip /**< SCIP data structure */ ) { SCIP_DIALOGDATA* dialogdata; SCIP_DIALOG* dialog; SCIP_DIALOG* parentdialog; /* create xyz dialog data */ dialogdata = NULL; /* TODO: (optional) create dialog specific data here */ /* get parent dialog */ parentdialog = SCIPgetRootDialog(scip); assert(parentdialog != NULL); /* TODO: (optional) change parent dialog from root dialog to another existing dialog (needs to be a menu) */ /* create, include, and release dialog */ if( !SCIPdialogHasEntry(parentdialog, DIALOG_NAME) ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, dialogCopyXyz, dialogExecXyz, dialogDescXyz, dialogFreeXyz, DIALOG_NAME, DIALOG_DESC, DIALOG_ISSUBMENU, dialogdata) ); SCIP_CALL( SCIPaddDialogEntry(scip, parentdialog, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } return SCIP_OKAY; }
/** creates a root dialog */ SCIP_RETCODE GCGcreateRootDialog( SCIP* scip, /**< SCIP data structure */ SCIP_DIALOG** root /**< pointer to store the root dialog */ ) { SCIP_CALL( SCIPincludeDialog(scip, root, NULL, SCIPdialogExecMenuLazy, NULL, NULL, "GCG", "GCG's main menu", TRUE, NULL) ); SCIP_CALL( SCIPsetRootDialog(scip, *root) ); SCIP_CALL( SCIPreleaseDialog(scip, root) ); *root = SCIPgetRootDialog(scip); return SCIP_OKAY; }
/** includes or updates the GCG dialog menus in SCIP */ SCIP_RETCODE SCIPincludeDialogGcg( SCIP* scip /**< SCIP data structure */ ) { SCIP_DIALOG* root; SCIP_DIALOG* submenu; SCIP_DIALOG* dialog; /* root menu */ root = SCIPgetRootDialog(scip); if( root == NULL ) { SCIP_CALL( GCGcreateRootDialog(scip, &root) ); } /* display */ if( !SCIPdialogHasEntry(root, "display") ) { SCIP_CALL( SCIPincludeDialog(scip, &submenu, NULL, SCIPdialogExecMenu, NULL, NULL, "display", "display information", TRUE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, root, submenu) ); SCIP_CALL( SCIPreleaseDialog(scip, &submenu) ); } if( SCIPdialogFindEntry(root, "display", &submenu) != 1 ) { SCIPerrorMessage("display sub menu not found\n"); return SCIP_PLUGINNOTFOUND; } /* display statistics */ if( !SCIPdialogHasEntry(submenu, "statistics") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecDisplayStatistics, NULL, NULL, "statistics", "display problem and optimization statistics", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, submenu, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* display decomposition */ if( !SCIPdialogHasEntry(submenu, "decomposition") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecDisplayDecomposition, NULL, NULL, "decomposition", "display decomposition", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, submenu, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* display additionalstatistics */ if( !SCIPdialogHasEntry(submenu, "additionalstatistics") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecDisplayAdditionalStatistics, NULL, NULL, "additionalstatistics", "display additional solving statistics", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, submenu, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* display detectors */ if( !SCIPdialogHasEntry(submenu, "detectors") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecDisplayDetectors, NULL, NULL, "detectors", "display available detectors", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, submenu, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* display solvers */ if( !SCIPdialogHasEntry(submenu, "solvers") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecDisplaySolvers, NULL, NULL, "solvers", "display available pricing problem solvers", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, submenu, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* master */ if( !SCIPdialogHasEntry(root, "master") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecSetMaster, NULL, NULL, "master", "switch to the interactive shell of the master problem", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, root, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* optimize */ if( !SCIPdialogHasEntry(root, "optimize") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecOptimize, NULL, NULL, "optimize", "solve the problem", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, root, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* detect */ if( !SCIPdialogHasEntry(root, "detect") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecDetect, NULL, NULL, "detect", "Detect structure", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, root, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* quit */ if( !SCIPdialogHasEntry(root, "quit") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, SCIPdialogExecQuit, NULL, NULL, "quit", "leave GCG", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, root, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } /* write */ if( !SCIPdialogHasEntry(root, "write") ) { SCIP_CALL( SCIPincludeDialog(scip, &submenu, NULL, SCIPdialogExecMenu, NULL, NULL, "write", "write information to file", TRUE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, root, submenu) ); SCIP_CALL( SCIPreleaseDialog(scip, &submenu) ); } if( SCIPdialogFindEntry(root, "write", &submenu) != 1 ) { SCIPerrorMessage("write sub menu not found\n"); return SCIP_PLUGINNOTFOUND; } /* write alldecompositions */ if( !SCIPdialogHasEntry(submenu, "alldecompositions") ) { SCIP_CALL( SCIPincludeDialog(scip, &dialog, NULL, GCGdialogExecWriteAllDecompositions, NULL, NULL, "alldecompositions", "write all known decompostions to file (format is given by file extension, e.g., {dec,blk,ref})", FALSE, NULL) ); SCIP_CALL( SCIPaddDialogEntry(scip, submenu, dialog) ); SCIP_CALL( SCIPreleaseDialog(scip, &dialog) ); } return SCIP_OKAY; }