Changeset 82


Ignore:
Timestamp:
Mar 16, 2005 4:55:18 PM (16 years ago)
Author:
forrest
Message:

correct for pseudocosts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CbcModel.cpp

    r78 r82  
    36103610  if (numberIntegers_>numberObjects_)
    36113611    findIntegers(true);
    3612   int newNumberObjects= numberObjects+numberObjects_;
     3612  /* But if incoming objects inherit from simple integer we just want
     3613     to replace */
     3614  int numberColumns = solver_->getNumCols();
     3615  /** mark is -1 if not integer, >=0 if using existing simple integer and
     3616      >=numberColumns if using new integer */
     3617  int * mark = new int[numberColumns];
     3618  int i;
     3619  for (i=0;i<numberColumns;i++)
     3620    mark[i]=-1;
     3621  int newNumberObjects = numberObjects;
     3622  int newIntegers=0;
     3623  for (i=0;i<numberObjects;i++) {
     3624    CbcSimpleInteger * obj =
     3625      dynamic_cast <CbcSimpleInteger *>(objects[i]) ;
     3626    if (obj) {
     3627      int iColumn = obj->columnNumber();
     3628      mark[iColumn]=i+numberColumns;
     3629      newIntegers++;
     3630    }
     3631  }
     3632  // and existing
     3633  for (i=0;i<numberObjects_;i++) {
     3634    CbcSimpleInteger * obj =
     3635      dynamic_cast <CbcSimpleInteger *>(object_[i]) ;
     3636    if (obj) {
     3637      int iColumn = obj->columnNumber();
     3638      if (mark[iColumn]<0) {
     3639        newIntegers++;
     3640        newNumberObjects++;
     3641        mark[iColumn]=i;
     3642      }
     3643    }
     3644  }
     3645  delete [] integerVariable_;
     3646  integerVariable_=NULL;
     3647  if (newIntegers!=numberIntegers_)
     3648    printf("changing number of integers from %d to %d\n",
     3649           numberIntegers_,newIntegers);
     3650  numberIntegers_ = newIntegers;
     3651  integerVariable_ = new int [numberIntegers_];
    36133652  CbcObject ** temp  = new CbcObject * [newNumberObjects];
    3614   int i;
    3615   for (i=0;i<numberObjects_;i++)
    3616     temp[i]=object_[i];
    3617   for (;i<newNumberObjects;i++) {
    3618     temp[i]=objects[i-numberObjects_]->clone();
    3619     temp[i]->setModel(this);
    3620   }
     3653  // Put integers first
     3654  newIntegers=0;
     3655  numberIntegers_=0;
     3656  for (i=0;i<numberColumns;i++) {
     3657    int which = mark[i];
     3658    if (which>=0) {
     3659      if (!isInteger(i)) {
     3660        newIntegers++;
     3661        solver_->setInteger(i);
     3662      }
     3663      if (which<numberColumns) {
     3664        temp[numberIntegers_]=object_[which];
     3665        object_[which]=NULL;
     3666      } else {
     3667        temp[numberIntegers_]=objects[which-numberColumns]->clone();
     3668        temp[numberIntegers_]->setModel(this);
     3669      }
     3670      integerVariable_[numberIntegers_++]=i;
     3671    }
     3672  }
     3673  if (newIntegers)
     3674    printf("%d variables were declared integer\n",newIntegers);
     3675  int n=numberIntegers_;
     3676  // Now rest of old
     3677  for (i=0;i<numberObjects_;i++) {
     3678    if (object_[i]) {
     3679      CbcSimpleInteger * obj =
     3680        dynamic_cast <CbcSimpleInteger *>(object_[i]) ;
     3681      if (obj) {
     3682        delete object_[i];
     3683      } else {
     3684        temp[n++]=object_[i];
     3685      }
     3686    }
     3687  }
     3688  // and rest of new
     3689  for (i=0;i<numberObjects;i++) {
     3690    CbcSimpleInteger * obj =
     3691      dynamic_cast <CbcSimpleInteger *>(objects[i]) ;
     3692    if (!obj) {
     3693      temp[n]=objects[i]->clone();
     3694      temp[n++]->setModel(this);
     3695    }
     3696  }
     3697  delete [] mark;
    36213698  delete [] object_;
    36223699  object_ = temp;
     3700  assert (n==newNumberObjects);
    36233701  numberObjects_ = newNumberObjects;
    36243702}
Note: See TracChangeset for help on using the changeset viewer.