@@ -215,6 +215,7 @@ SCIP_RETCODE disableConflictingDualReductions(
215215 return SCIP_OKAY ;
216216
217217 SCIP_CALL ( SCIPsetBoolParam (scip , "misc/allowstrongdualreds" , FALSE) );
218+
218219 return SCIP_OKAY ;
219220}
220221
@@ -224,7 +225,7 @@ SCIP_RETCODE setChildSelRule(
224225 SCIP_CONCSOLVER * concsolver /**< the concurrent solver */
225226 )
226227{
227- SCIP_CONCSOLVERDATA * data ;
228+ SCIP_CONCSOLVERDATA * data ;
228229 static const char childsel [] = { 'h' , 'i' , 'p' , 'r' , 'l' , 'd' , 'u' };
229230
230231 assert (concsolver != NULL );
@@ -237,7 +238,7 @@ SCIP_RETCODE setChildSelRule(
237238 return SCIP_OKAY ;
238239}
239240
240- /** initialize the concurrent SCIP solver, i.e. setup the copy of the problem and the
241+ /** initialize the concurrent SCIP solver, i.e., setup the copy of the problem and the
241242 * mapping of the variables */
242243static
243244SCIP_RETCODE initConcsolver (
@@ -275,8 +276,8 @@ SCIP_RETCODE initConcsolver(
275276 SCIP_CALL ( SCIPcreate (& data -> solverscip ) );
276277 SCIPsetMessagehdlrQuiet (data -> solverscip , SCIPmessagehdlrIsQuiet (SCIPgetMessagehdlr (scip )));
277278 SCIP_CALL ( SCIPhashmapCreate (& varmapfw , SCIPblkmem (data -> solverscip ), data -> nvars ) );
278- SCIP_CALL ( SCIPcopy (scip , data -> solverscip , varmapfw , NULL , SCIPconcsolverGetName (concsolver ), TRUE, FALSE, FALSE ,
279- FALSE, & valid ) );
279+ SCIP_CALL ( SCIPcopyConsCompression (scip , data -> solverscip , varmapfw , NULL , SCIPconcsolverGetName (concsolver ),
280+ NULL , NULL , 0 , TRUE, FALSE, FALSE, FALSE, & valid ) );
280281 assert (valid );
281282
282283 /* allocate memory for the arrays to store the variable mapping */
@@ -287,27 +288,59 @@ SCIP_RETCODE initConcsolver(
287288 for ( i = 0 ; i < data -> nvars ; i ++ )
288289 {
289290 SCIP_VAR * var ;
291+ int idx ;
292+
290293 var = (SCIP_VAR * ) SCIPhashmapGetImage (varmapfw , vars [i ]);
291294 assert (var != NULL );
292- varperm [SCIPvarGetIndex (var )] = i ;
295+ idx = SCIPvarGetIndex (var );
296+ assert (0 <= idx && idx < data -> nvars );
297+
298+ /* Note that because some aggregations or fixed variables cannot be resolved by some constraint handlers (in
299+ * particular cons_orbitope_pp), the copied problem may contain more variables than the original problem has
300+ * active variables. These variables will be ignored in the following, since they depend on the other `active'
301+ * varibles. See concurrent.c:SCIPgetConcurrentVaridx(). */
302+ varperm [idx ] = i ;
293303 data -> vars [i ] = var ;
294304 }
295305
306+ /* transfer solutions from original problem to concurent instances */
296307 if ( SCIPgetNSols (scip ) != 0 )
297308 {
298309 SCIP_Bool stored ;
299310 SCIP_Real * solvals ;
300311 SCIP_SOL * sol = SCIPgetBestSol (scip );
301312 SCIP_SOL * solversol ;
313+ int norigvars ;
302314
303315 SCIP_CALL ( SCIPallocBufferArray (data -> solverscip , & solvals , data -> nvars ) );
304316
305317 SCIP_CALL ( SCIPgetSolVals (scip , sol , data -> nvars , vars , solvals ) );
306318 SCIP_CALL ( SCIPcreateSol (data -> solverscip , & solversol , NULL ) );
307319 SCIP_CALL ( SCIPsetSolVals (data -> solverscip , solversol , data -> nvars , data -> vars , solvals ) );
308-
309320 SCIPfreeBufferArray (data -> solverscip , & solvals );
310321
322+ /* handle fixed variables */
323+ norigvars = SCIPgetNOrigVars (data -> solverscip );
324+ if ( norigvars > data -> nvars )
325+ {
326+ SCIP_VAR * * origvars ;
327+ int v ;
328+
329+ origvars = SCIPgetOrigVars (data -> solverscip );
330+ for ( v = 0 ; v < norigvars ; ++ v )
331+ {
332+ SCIP_VAR * var ;
333+ var = origvars [v ];
334+ if ( SCIPisEQ (data -> solverscip , SCIPvarGetLbGlobal (var ), SCIPvarGetUbGlobal (var )) )
335+ {
336+ if ( ! SCIPisZero (data -> solverscip , SCIPvarGetLbGlobal (var )) )
337+ {
338+ SCIP_CALL ( SCIPsetSolVal (data -> solverscip , solversol , var , SCIPvarGetLbGlobal (var )) );
339+ }
340+ }
341+ }
342+ }
343+
311344 SCIP_CALL ( SCIPaddSolFree (data -> solverscip , & solversol , & stored ) );
312345
313346 assert (stored );
@@ -319,7 +352,7 @@ SCIP_RETCODE initConcsolver(
319352 * also fails on check/instances/Symmetry/partorb_1-FullIns_3.cip
320353 * TODO: test if this leads to any problems
321354 */
322- SCIP_CALL ( SCIPcreateConcurrent (data -> solverscip , concsolver , varperm ) );
355+ SCIP_CALL ( SCIPcreateConcurrent (data -> solverscip , concsolver , varperm , data -> nvars ) );
323356 SCIPfreeBufferArray (data -> solverscip , & varperm );
324357
325358 /* free the hashmap */
@@ -404,7 +437,7 @@ SCIP_DECL_CONCSOLVERCREATEINST(concsolverScipCreateInstance)
404437 {
405438 /* print message about missing setting files only in verblevel full */
406439 SCIPverbMessage (scip , SCIP_VERBLEVEL_FULL , NULL , "skipping non existent parameter file <%s> for concurrent solver <%s>\n" ,
407- filename , SCIPconcsolverGetName (concsolver ));
440+ filename , SCIPconcsolverGetName (concsolver ));
408441 }
409442
410443 /* include eventhandler for synchronization */
@@ -495,55 +528,56 @@ static
495528SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA (concsolverGetSolvingData )
496529{
497530 SCIP_CONCSOLVERDATA * data ;
498- SCIP_VAR * * vars ;
499- int nvars ;
500531 int nsols ;
501- SCIP_SOL * * sols ;
502- SCIP_Real * solvals ;
503- SCIP_HEUR * heur ;
504- int i ;
505532
533+ assert (scip != NULL );
506534 assert (concsolver != NULL );
507535
508536 data = SCIPconcsolverGetData (concsolver );
509537 assert (data != NULL );
510538 assert (data -> solverscip != NULL );
511539
512- assert (scip != NULL );
513- vars = SCIPgetVars (scip );
514- nvars = SCIPgetNVars (scip );
515-
516540 nsols = SCIPgetNSols (data -> solverscip );
517- sols = SCIPgetSols (data -> solverscip );
541+ if ( nsols > 0 )
542+ {
543+ SCIP_VAR * * vars ;
544+ SCIP_SOL * * sols ;
545+ SCIP_Real * solvals ;
546+ int nvars ;
547+ int i ;
518548
519- assert (nvars == data -> nvars );
549+ vars = SCIPgetVars (scip );
550+ nvars = SCIPgetNVars (scip );
551+ assert (nvars == data -> nvars );
520552
521- /* allocate buffer array used for translating the solution to the given SCIP */
522- SCIP_CALL ( SCIPallocBufferArray (scip , & solvals , nvars ) );
553+ sols = SCIPgetSols (data -> solverscip );
523554
524- /* add the solutions to the given SCIP */
525- for ( i = 0 ; i < nsols ; ++ i )
526- {
527- SCIP_SOL * sol ;
528- SCIP_Bool stored ;
529- SCIP_CALL ( SCIPgetSolVals (data -> solverscip , sols [i ], nvars , data -> vars , solvals ) );
555+ /* allocate buffer array used for translating the solution to the given SCIP */
556+ SCIP_CALL ( SCIPallocBufferArray (scip , & solvals , nvars ) );
530557
531- heur = SCIPsolGetHeur (sols [i ]);
558+ /* add the solutions to the given SCIP */
559+ for ( i = 0 ; i < nsols ; ++ i )
560+ {
561+ SCIP_SOL * sol ;
562+ SCIP_HEUR * heur ;
563+ SCIP_Bool stored ;
532564
533- if ( heur != NULL )
534- heur = SCIPfindHeur (scip , SCIPheurGetName (heur ));
565+ SCIP_CALL ( SCIPgetSolVals (data -> solverscip , sols [i ], nvars , data -> vars , solvals ) );
535566
536- SCIP_CALL ( SCIPcreateSol (scip , & sol , heur ) );
537- SCIP_CALL ( SCIPsetSolVals (scip , sol , nvars , vars , solvals ) );
567+ heur = SCIPsolGetHeur (sols [i ]);
568+ if ( heur != NULL )
569+ heur = SCIPfindHeur (scip , SCIPheurGetName (heur ));
538570
539- SCIP_CALL ( SCIPcopySolStats (sols [i ], sol ) );
571+ SCIP_CALL ( SCIPcreateSol (scip , & sol , heur ) );
572+ SCIP_CALL ( SCIPsetSolVals (scip , sol , nvars , vars , solvals ) );
573+ SCIP_CALL ( SCIPcopySolStats (sols [i ], sol ) );
574+ SCIP_CALL ( SCIPaddSolFree (scip , & sol , & stored ) );
575+ }
540576
541- SCIP_CALL ( SCIPaddSolFree (scip , & sol , & stored ) );
577+ /* free the buffer array */
578+ SCIPfreeBufferArray (scip , & solvals );
542579 }
543580
544- /* free the buffer array */
545- SCIPfreeBufferArray (scip , & solvals );
546-
547581 /* copy solving statistics and status from the solver SCIP to the given SCIP */
548582 SCIP_CALL ( SCIPcopyConcurrentSolvingStats (data -> solverscip , scip ) );
549583
@@ -662,7 +696,9 @@ SCIP_DECL_CONCSOLVERSYNCWRITE(concsolverScipSyncWrite)
662696 boundstore = SCIPgetConcurrentGlobalBoundChanges (data -> solverscip );
663697
664698 if ( boundstore != NULL )
699+ {
665700 SCIP_CALL ( SCIPsyncdataAddBoundChanges (syncstore , syncdata , boundstore ) );
701+ }
666702
667703 SCIPsyncdataAddMemTotal (syncdata , SCIPgetMemTotal (data -> solverscip ));
668704
@@ -694,6 +730,9 @@ SCIP_DECL_CONCSOLVERSYNCREAD(concsolverScipSyncRead)
694730 for ( i = 0 ; i < nsols ; ++ i )
695731 {
696732 SCIP_SOL * newsol ;
733+ SCIP_VAR * * origvars ;
734+ int norigvars ;
735+ int v ;
697736
698737 /* do not add own solutions */
699738 if ( concsolverids [i ] == concsolverid )
@@ -704,6 +743,26 @@ SCIP_DECL_CONCSOLVERSYNCREAD(concsolverScipSyncRead)
704743 SCIP_CALL ( SCIPcreateOrigSol (data -> solverscip , & newsol , NULL ) );
705744
706745 SCIP_CALL ( SCIPsetSolVals (data -> solverscip , newsol , data -> nvars , data -> vars , solvals [i ]) );
746+
747+ /* treat possible fixed original variables */
748+ norigvars = SCIPgetNOrigVars (data -> solverscip );
749+ if ( norigvars > data -> nvars )
750+ {
751+ origvars = SCIPgetOrigVars (data -> solverscip );
752+ for ( v = 0 ; v < norigvars ; ++ v )
753+ {
754+ SCIP_VAR * var ;
755+ var = origvars [v ];
756+ if ( SCIPisEQ (data -> solverscip , SCIPvarGetLbGlobal (var ), SCIPvarGetUbGlobal (var )) )
757+ {
758+ if ( ! SCIPisZero (data -> solverscip , SCIPvarGetLbGlobal (var )) )
759+ {
760+ SCIP_CALL ( SCIPsetSolVal (data -> solverscip , newsol , var , SCIPvarGetLbGlobal (var )) );
761+ }
762+ }
763+ }
764+ }
765+
707766 SCIPdebugMessage ("adding solution in concurrent solver %s\n" , SCIPconcsolverGetName (concsolver ));
708767 SCIP_CALL ( SCIPaddConcurrentSol (data -> solverscip , newsol ) );
709768 }
@@ -716,11 +775,14 @@ SCIP_DECL_CONCSOLVERSYNCREAD(concsolverScipSyncRead)
716775
717776 for ( i = 0 ; i < nbndchgs ; ++ i )
718777 {
719- SCIP_VAR * var ;
778+ SCIP_VAR * var ;
720779 SCIP_BOUNDTYPE boundtype ;
721780 SCIP_Real newbound ;
781+ int idx ;
722782
723- var = data -> vars [SCIPboundstoreGetChgVaridx (boundstore , i )];
783+ idx = SCIPboundstoreGetChgVaridx (boundstore , i );
784+ assert (0 <= idx && idx < data -> nvars );
785+ var = data -> vars [idx ];
724786 boundtype = SCIPboundstoreGetChgType (boundstore , i );
725787 newbound = SCIPboundstoreGetChgVal (boundstore , i );
726788
@@ -768,57 +830,57 @@ SCIP_RETCODE SCIPincludeConcurrentScipSolvers(
768830 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
769831 data -> loademphasis = FALSE;
770832 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip" , 1.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
771- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
772- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
833+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
834+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
773835
774836 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
775837 data -> loademphasis = TRUE;
776838 data -> emphasis = SCIP_PARAMEMPHASIS_DEFAULT ;
777839 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip-default" , 0.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
778- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
779- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
840+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
841+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
780842
781843 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
782844 data -> loademphasis = TRUE;
783845 data -> emphasis = SCIP_PARAMEMPHASIS_CPSOLVER ;
784846 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip-cpsolver" , 0.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
785- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
786- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
847+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
848+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
787849
788850 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
789851 data -> loademphasis = TRUE;
790852 data -> emphasis = SCIP_PARAMEMPHASIS_EASYCIP ;
791853 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip-easycip" , 0.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
792- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
793- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
854+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
855+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
794856
795857 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
796858 data -> loademphasis = TRUE;
797859 data -> emphasis = SCIP_PARAMEMPHASIS_FEASIBILITY ;
798860 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip-feas" , 0.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
799- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
800- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
861+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
862+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
801863
802864 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
803865 data -> loademphasis = TRUE;
804866 data -> emphasis = SCIP_PARAMEMPHASIS_HARDLP ;
805867 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip-hardlp" , 0.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
806- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
807- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
868+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
869+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
808870
809871 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
810872 data -> loademphasis = TRUE;
811873 data -> emphasis = SCIP_PARAMEMPHASIS_OPTIMALITY ;
812874 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip-opti" , 0.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
813- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
814- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
875+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
876+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
815877
816878 SCIP_CALL ( SCIPallocMemory (scip , & data ) );
817879 data -> loademphasis = TRUE;
818880 data -> emphasis = SCIP_PARAMEMPHASIS_COUNTER ;
819881 SCIP_CALL ( SCIPincludeConcsolverType (scip , "scip-counter" , 0.0 , concsolverScipCreateInstance , concsolverScipDestroyInstance , concsolverScipInitSeeds ,
820- concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
821- concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
882+ concsolverScipExec , concsolverGetSolvingData , concsolverScipStop , concsolverScipSyncWrite ,
883+ concsolverScipSyncRead , concsolverTypeScipFreeData , data ) );
822884
823885 return SCIP_OKAY ;
824886}
0 commit comments