Changeset 2334


Ignore:
Timestamp:
Jun 1, 2017 6:49:03 AM (11 months ago)
Author:
stefan
Message:

merge r2332, r2333 from trunk: fix for SOS2

Location:
stable/2.9/Cbc
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • stable/2.9/Cbc

  • stable/2.9/Cbc/src

  • stable/2.9/Cbc/src/CbcModel.cpp

    r2329 r2334  
    1202112021                mark[iColumn] = i;
    1202212022            }
     12023        } else {
     12024            newNumberObjects++;
    1202312025        }
    1202412026    }
  • stable/2.9/Cbc/src/CbcSolver.cpp

    r2315 r2334  
    34043404                            int truncateColumns=COIN_INT_MAX;
    34053405                            int truncateRows=-1;
     3406                            bool redoSOS=false;
    34063407                            double * truncatedRhsLower=NULL;
    34073408                            double * truncatedRhsUpper=NULL;
     
    41794180                                          osiclp->getModelPtr()->setMoreSpecialOptions(saveOptions|262144);
    41804181                                        }
     4182                                        redoSOS=true;
    41814183                                        solver2 = process.preProcessNonDefault(*saveSolver, translate[preProcess], numberPasses,
    41824184                                                                               tunePreProcess);
     
    41894191#elif CBC_OTHER_SOLVER==1
    41904192                                    cbcPreProcessPointer = & process;
     4193                                    redoSOS=true;
    41914194                                    solver2 = process.preProcessNonDefault(*saveSolver, translate[preProcess], numberPasses,
    41924195                                                                           tunePreProcess);
     
    42784281                                        }
    42794282                                    }
     4283                                    // redo existing SOS
     4284                                    if (osiclp->numberSOS()) {
     4285                                      redoSOS=false;
     4286                                      int * back = new int[numberOriginalColumns];
     4287                                      for (int i = 0; i < numberOriginalColumns; i++)
     4288                                        back[i]=-1;
     4289                                      for (int i = 0; i < numberColumns; i++) {
     4290                                        int iColumn = originalColumns[i];
     4291                                        back[iColumn]=i;
     4292                                      }
     4293                                      int numberSOSOld=osiclp->numberSOS();
     4294                                      int numberSOS=osiclp2->numberSOS();
     4295                                      assert (numberSOS==numberSOSOld);
     4296                                      CoinSet * setInfo = const_cast<CoinSet *>(osiclp2->setInfo());
     4297                                      for (int i = 0; i < numberSOS; i++) {
     4298                                        //int type = setInfo[i].setType();
     4299                                        int n = setInfo[i].numberEntries();
     4300                                        int * which = const_cast<int *>(setInfo[i].which());
     4301                                        for (int j=0;j<n;j++) {
     4302                                          int iColumn = which[j];
     4303                                          iColumn=back[iColumn];
     4304                                          assert(iColumn>=0);
     4305                                          which[j]=iColumn;
     4306                                        }
     4307                                      }
     4308                                      delete [] back;
     4309                                    }
    42804310                                }
    42814311                                // we have to keep solver2 so pass clone
     
    56135643                                            int iColumn = oldObjects[iObj]->columnNumber();
    56145644                                            if (iColumn < 0 || iColumn >= numberOriginalColumns) {
     5645                                              if (redoSOS) { // now done earlier??
    56155646                                                CbcSOS * obj =
    56165647                                                    dynamic_cast <CbcSOS *>(oldObjects[iObj]) ;
     
    56325663                                                    obj->setNumberMembers(nn);
    56335664                                                }
    5634                                                 continue;
     5665                                              }
     5666                                              continue;
    56355667                                            }
    56365668                                            if (originalColumns)
Note: See TracChangeset for help on using the changeset viewer.