Ignore:
Timestamp:
Dec 4, 2006 1:21:16 PM (13 years ago)
Author:
forrest
Message:

nonlinear

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/devel/Cbc/src/CbcLinked.cpp

    r494 r496  
    431431          }
    432432        }
    433         if (numberContinuous) {
     433        if (numberContinuous&&0) {
    434434          // iterate to get solution and fathom node
    435435          int numberColumns2 = coinModel_.numberColumns();
     
    450450                  double xybar[4];
    451451                  obj->getCoefficients(this,xB,yB,xybar);
    452                   double xyTrue = obj->xyCoefficient(solution);
     452                  //double xyTrue = obj->xyCoefficient(solution);
    453453                  double xyLambda=0.0;
    454454                  int firstLambda = obj->firstLambda();
     
    456456                    xyLambda += solution[firstLambda+j]*xybar[j];
    457457                  }
    458                   printf ("x %d, y %d - true %g lambda %g\n",obj->xColumn(),obj->yColumn(),
    459                           xyTrue,xyLambda);
     458                  //printf ("x %d, y %d - true %g lambda %g\n",obj->xColumn(),obj->yColumn(),
     459                  //  xyTrue,xyLambda);
    460460                  int xColumn = obj->xColumn();
    461461                  double gapX = upper[xColumn]-lower[xColumn];
     
    478478                    yB[2]=solution[yColumn];
    479479                    xybar[0]=xB[0]*yB[0];
    480                     xybar[0]=xB[0]*yB[1];
    481                     xybar[0]=xB[1]*yB[0];
    482                     xybar[0]=xB[1]*yB[1];
     480                    xybar[1]=xB[0]*yB[1];
     481                    xybar[2]=xB[1]*yB[0];
     482                    xybar[3]=xB[1]*yB[1];
    483483                    double infeasibility=obj->computeLambdas(xB,yB,xybar,lambda);
    484484                    assert (infeasibility<1.0e-9);
     
    502502                    yB[1]=newUpper;
    503503                    xybar[0]=xB[0]*yB[0];
    504                     xybar[0]=xB[0]*yB[1];
    505                     xybar[0]=xB[1]*yB[0];
    506                     xybar[0]=xB[1]*yB[1];
     504                    xybar[1]=xB[0]*yB[1];
     505                    xybar[2]=xB[1]*yB[0];
     506                    xybar[3]=xB[1]*yB[1];
    507507                    double infeasibility=obj->computeLambdas(xB,yB,xybar,lambda);
    508508                    assert (infeasibility<1.0e-9);
     
    542542              int numberColumns = quadraticModel_->numberColumns();
    543543              double * gradient = new double [numberColumns+1];
     544              // for testing do gradient from bilinear
     545              if (false) {
     546                int i;
     547                double offset=0.0;
     548                CoinZeroN(gradient,numberColumns+1);
     549                const double * objective = modelPtr_->objective();
     550                int numberColumns2 = coinModel_.numberColumns();
     551                for ( i=0;i<numberColumns2;i++)
     552                  gradient[i] = objective[i];
     553                for ( i =0;i<numberObjects_;i++) {
     554                  OsiBiLinear * obj = dynamic_cast<OsiBiLinear *> (object_[i]);
     555                  if (obj) {
     556                    int xColumn = obj->xColumn();
     557                    int yColumn = obj->yColumn();
     558                    double coefficient = obj->coefficient();
     559                    assert (obj->xyRow()<0); // objective
     560                    gradient[xColumn] += coefficient*solution[yColumn];
     561                    gradient[yColumn] += coefficient*solution[xColumn];
     562                    offset += coefficient*solution[xColumn]*solution[yColumn];
     563                  }
     564                }
     565                printf("what about offset %g\n",offset);
     566              }
    544567              memcpy(gradient,quadraticModel_->objectiveAsObject()->gradient(quadraticModel_,solution,offset,true,2),
    545568                     numberColumns*sizeof(double));
     
    33483371  int j;
    33493372  double multiplier = (boundType_==0) ? 1.0/coefficient_ : 1.0;
    3350   for (j=0;j<4;j++) {
    3351     int iColumn = firstLambda_+j;
    3352     int iStart = columnStart[iColumn];
    3353     int iEnd = iStart + columnLength[iColumn];
    3354     int k=iStart;
    3355     double x=0.0;
    3356     double y=0.0;
    3357     xybar[j]=0.0;
    3358     for (;k<iEnd;k++) {
    3359       if (xRow_==row[k])
    3360         x = element[k];
    3361       if (yRow_==row[k])
    3362         y = element[k];
    3363       if (xyRow_==row[k])
    3364         xybar[j] = element[k]*multiplier;
    3365     }
    3366     if (yRow_<0)
    3367       y=x;
    3368     if (xyRow_<0)
    3369       xybar[j] = objective[iColumn]*multiplier;
    3370     assert (fabs(xybar[j]-x*y)<1.0e-4);
    3371     if (j==0)
    3372       xB[0]=x;
    3373     else if (j==1)
    3374       yB[1]=y;
    3375     else if (j==2)
    3376       yB[0]=y;
    3377     else if (j==3)
    3378       xB[1]=x;
     3373  if (yRow_>=0) {
     3374    for (j=0;j<4;j++) {
     3375      int iColumn = firstLambda_+j;
     3376      int iStart = columnStart[iColumn];
     3377      int iEnd = iStart + columnLength[iColumn];
     3378      int k=iStart;
     3379      double x=0.0;
     3380      double y=0.0;
     3381      xybar[j]=0.0;
     3382      for (;k<iEnd;k++) {
     3383        if (xRow_==row[k])
     3384          x = element[k];
     3385        if (yRow_==row[k])
     3386          y = element[k];
     3387        if (xyRow_==row[k])
     3388          xybar[j] = element[k]*multiplier;
     3389      }
     3390      if (xyRow_<0)
     3391        xybar[j] = objective[iColumn]*multiplier;
     3392      if (j==0)
     3393        xB[0]=x;
     3394      else if (j==1)
     3395        yB[1]=y;
     3396      else if (j==2)
     3397        yB[0]=y;
     3398      else if (j==3)
     3399        xB[1]=x;
     3400      assert (fabs(xybar[j]-x*y)<1.0e-4);
     3401    }
     3402  } else {
     3403    // x==y
     3404    for (j=0;j<4;j++) {
     3405      int iColumn = firstLambda_+j;
     3406      int iStart = columnStart[iColumn];
     3407      int iEnd = iStart + columnLength[iColumn];
     3408      int k=iStart;
     3409      double x=0.0;
     3410      xybar[j]=0.0;
     3411      for (;k<iEnd;k++) {
     3412        if (xRow_==row[k])
     3413          x = element[k];
     3414        if (xyRow_==row[k])
     3415          xybar[j] = element[k]*multiplier;
     3416      }
     3417      if (xyRow_<0)
     3418        xybar[j] = objective[iColumn]*multiplier;
     3419      if (j==0) {
     3420        xB[0]=x;
     3421        yB[0]=x;
     3422      } else if (j==2) {
     3423        xB[1]=x;
     3424        yB[1]=x;
     3425      }
     3426    }
     3427    assert (fabs(xybar[0]-xB[0]*yB[0])<1.0e-4);
     3428    assert (fabs(xybar[1]-xB[0]*yB[1])<1.0e-4);
     3429    assert (fabs(xybar[2]-xB[1]*yB[0])<1.0e-4);
     3430    assert (fabs(xybar[3]-xB[1]*yB[1])<1.0e-4);
    33793431  }
    33803432}
Note: See TracChangeset for help on using the changeset viewer.