Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

ClpQuadraticObjective Class Reference

#include <ClpQuadraticObjective.hpp>

Inheritance diagram for ClpQuadraticObjective:

ClpObjective List of all members.

Public Member Functions

Stuff
virtual double * gradient (const double *solution, double &offset, bool refresh)
virtual void resize (int newNumberColumns)
 Resize objective.

virtual void deleteSome (int numberToDelete, const int *which)
 Delete columns in objective.

Constructors and destructors
 ClpQuadraticObjective ()
 Default Constructor.

 ClpQuadraticObjective (const double *linearObjective, int numberColumns, const CoinBigIndex *start, const int *column, const double *element, int numberExtendedColumns_=-1)
 Constructor from objective.

 ClpQuadraticObjective (const ClpQuadraticObjective &)
 Copy constructor.

 ClpQuadraticObjective (const ClpQuadraticObjective &rhs, int numberColumns, const int *whichColumns)
ClpQuadraticObjectiveoperator= (const ClpQuadraticObjective &rhs)
 Assignment operator.

virtual ~ClpQuadraticObjective ()
 Destructor.

virtual ClpObjectiveclone () const
 Clone.

virtual ClpObjectivesubsetClone (int numberColumns, const int *whichColumns) const
void loadQuadraticObjective (const int numberColumns, const CoinBigIndex *start, const int *column, const double *element, int numberExtendedColumns=-1)
void loadQuadraticObjective (const CoinPackedMatrix &matrix)
void deleteQuadraticObjective ()
 Get rid of quadratic objective.

Gets and sets
CoinPackedMatrix * quadraticObjective () const
 Quadratic objective.

double * linearObjective () const
 Linear objective.

int numberExtendedColumns () const
 Length of linear objective which could be bigger.

int numberColumns () const
 Number of columns in quadratic objective.


Private Attributes

Private member data
Quadratic objective

CoinPackedMatrix * quadraticObjective_
double * objective_
 Objective.

double * gradient_
 Gradient.

int numberColumns_
 Useful to have number of columns about.

int numberExtendedColumns_
 Also length of linear objective which could be bigger.


Detailed Description

Quadratic Objective Class

Definition at line 15 of file ClpQuadraticObjective.hpp.


Constructor & Destructor Documentation

ClpQuadraticObjective::ClpQuadraticObjective const ClpQuadraticObjective rhs,
int  numberColumns,
const int *  whichColumns
 

Subset constructor. Duplicates are allowed and order is as given.

Definition at line 86 of file ClpQuadraticObjective.cpp.

References gradient_, numberColumns_, numberExtendedColumns_, objective_, and quadraticObjective_.

00089 : ClpObjective(rhs)
00090 {
00091   objective_=NULL;
00092   int extra = rhs.numberExtendedColumns_-rhs.numberColumns_;
00093   numberColumns_=0;
00094   if (numberColumns>0) {
00095     // check valid lists
00096     int numberBad=0;
00097     int i;
00098     for (i=0;i<numberColumns;i++)
00099       if (whichColumn[i]<0||whichColumn[i]>=rhs.numberColumns_)
00100         numberBad++;
00101     if (numberBad)
00102       throw CoinError("bad column list", "subset constructor", 
00103                       "ClpQuadraticObjective");
00104     numberColumns_ = numberColumns;
00105     numberExtendedColumns_ = numberColumns+extra;
00106     objective_ = new double[numberExtendedColumns_];
00107     for (i=0;i<numberColumns_;i++) 
00108       objective_[i]=rhs.objective_[whichColumn[i]];
00109     memcpy(objective_+numberColumns_,rhs.objective_+rhs.numberColumns_,
00110            (numberExtendedColumns_-numberColumns_)*sizeof(double));
00111     if (rhs.gradient_) {
00112       gradient_ = new double[numberExtendedColumns_];
00113       for (i=0;i<numberColumns_;i++) 
00114         gradient_[i]=rhs.gradient_[whichColumn[i]];
00115       memcpy(gradient_+numberColumns_,rhs.gradient_+rhs.numberColumns_,
00116              (numberExtendedColumns_-numberColumns_)*sizeof(double));
00117     }
00118   }
00119   if (rhs.quadraticObjective_) {
00120     quadraticObjective_ = new CoinPackedMatrix(*rhs.quadraticObjective_,
00121                                                numberColumns,whichColumn,
00122                                                numberColumns,whichColumn);
00123   } else {
00124     quadraticObjective_=NULL;
00125   }
00126 }


Member Function Documentation

double * ClpQuadraticObjective::gradient const double *  solution,
double &  offset,
bool  refresh
[virtual]
 

Returns gradient. If Quadratic then solution may be NULL, also returns an offset (to be added to current one) If refresh is false then uses last solution

Implements ClpObjective.

Definition at line 174 of file ClpQuadraticObjective.cpp.

References gradient_, numberColumns_, numberExtendedColumns_, and objective_.

00175 {
00176   offset=0.0;
00177   if (!quadraticObjective_||!solution) {
00178     return objective_;
00179   } else {
00180     if (refresh||!gradient_) {
00181       if (!gradient_) 
00182         gradient_ = new double[numberExtendedColumns_];
00183       const int * columnQuadratic = quadraticObjective_->getIndices();
00184       const int * columnQuadraticStart = quadraticObjective_->getVectorStarts();
00185       const int * columnQuadraticLength = quadraticObjective_->getVectorLengths();
00186       const double * quadraticElement = quadraticObjective_->getElements();
00187       double offset=0.0;
00188       memcpy(gradient_,objective_,numberExtendedColumns_*sizeof(double));
00189       int iColumn;
00190       for (iColumn=0;iColumn<numberColumns_;iColumn++) {
00191         double valueI = solution[iColumn];
00192         int j;
00193         for (j=columnQuadraticStart[iColumn];
00194              j<columnQuadraticStart[iColumn]+columnQuadraticLength[iColumn];j++) {
00195           int jColumn = columnQuadratic[j];
00196           double valueJ = solution[jColumn];
00197           double elementValue = quadraticElement[j];
00198           elementValue *= 0.5;
00199           offset += valueI*valueJ*elementValue;
00200           double gradientI = valueJ*elementValue;
00201           double gradientJ = valueI*elementValue;
00202           offset -= gradientI*valueI;
00203           gradient_[iColumn] += gradientI;
00204           offset -= gradientJ*valueJ;
00205           gradient_[jColumn] += gradientJ;
00206         }
00207       }
00208     }
00209     return gradient_;
00210   }
00211 }

void ClpQuadraticObjective::loadQuadraticObjective const int  numberColumns,
const CoinBigIndex *  start,
const int *  column,
const double *  element,
int  numberExtendedColumns = -1
 

Load up quadratic objective. This is stored as a CoinPackedMatrix

Definition at line 342 of file ClpQuadraticObjective.cpp.

References gradient_, numberColumns_, numberExtendedColumns_, and objective_.

00344 {
00345   delete quadraticObjective_;
00346   quadraticObjective_ = new CoinPackedMatrix(true,numberColumns,numberColumns,
00347                                              start[numberColumns],element,column,start,NULL);
00348   numberColumns_=numberColumns;
00349   if (numberExtended>numberExtendedColumns_) {
00350     if (objective_) {
00351       // make correct size
00352       double * newArray = new double[numberExtended];
00353       memcpy(newArray,objective_,numberColumns_*sizeof(double));
00354       delete [] objective_;
00355       objective_ = newArray;
00356       memset(objective_+numberColumns_,0,(numberExtended-numberColumns_)*sizeof(double));
00357     }
00358     if (gradient_) {
00359       // make correct size
00360       double * newArray = new double[numberExtended];
00361       memcpy(newArray,gradient_,numberColumns_*sizeof(double));
00362       delete [] gradient_;
00363       gradient_ = newArray;
00364       memset(gradient_+numberColumns_,0,(numberExtended-numberColumns_)*sizeof(double));
00365     }
00366     numberExtendedColumns_ = numberExtended;
00367   } else {
00368     numberExtendedColumns_ = numberColumns_;
00369   }
00370 }

ClpObjective * ClpQuadraticObjective::subsetClone int  numberColumns,
const int *  whichColumns
const [virtual]
 

Subset clone. Duplicates are allowed and order is as given.

Reimplemented from ClpObjective.

Definition at line 224 of file ClpQuadraticObjective.cpp.

References ClpQuadraticObjective().

00226 {
00227   return new ClpQuadraticObjective(*this, numberColumns, whichColumns);
00228 }


The documentation for this class was generated from the following files:
Generated on Wed Dec 3 14:37:42 2003 for CLP by doxygen 1.3.5