// Copyright (C) 2007, International Business Machines // Corporation and others. All Rights Reserved. #include "CoinPragma.hpp" #include "CoinHelperFunctions.hpp" #include "CoinIndexedVector.hpp" #include "ClpSimplex.hpp" #include "ClpConstraintQuadratic.hpp" #include "CoinSort.hpp" //############################################################################# // Constructors / Destructor / Assignment //############################################################################# //------------------------------------------------------------------- // Default Constructor //------------------------------------------------------------------- ClpConstraintQuadratic::ClpConstraintQuadratic () : ClpConstraint() { type_=0; start_=NULL; column_=NULL; coefficient_ = NULL; numberColumns_=0; numberCoefficients_=0; numberQuadraticColumns_=0; } //------------------------------------------------------------------- // Useful Constructor //------------------------------------------------------------------- ClpConstraintQuadratic::ClpConstraintQuadratic (int row, int numberQuadraticColumns , int numberColumns, const CoinBigIndex * start, const int * column, const double * coefficient) : ClpConstraint() { type_=0; rowNumber_=row; numberColumns_ = numberColumns; numberQuadraticColumns_ = numberQuadraticColumns; start_ = CoinCopyOfArray(start,numberQuadraticColumns+1); int numberElements = start_[numberQuadraticColumns_]; column_ = CoinCopyOfArray(column,numberElements); coefficient_ = CoinCopyOfArray(coefficient,numberElements); char * mark = new char [numberQuadraticColumns_]; memset(mark,0,numberQuadraticColumns_); int iColumn; for (iColumn=0;iColumn=0) { assert (jColumnrowScale()&&useScaling); if (!scaling) { int iColumn; for (iColumn=0;iColumn=0) { double valueJ = solution[jColumn]; double elementValue = coefficient_[j]; if (iColumn!=jColumn) { offset_ -= valueI*valueJ*elementValue; double gradientI = valueJ*elementValue; double gradientJ = valueI*elementValue; lastGradient_[iColumn] += gradientI; lastGradient_[jColumn] += gradientJ; } else { offset_ -= 0.5*valueI*valueI*elementValue; double gradientI = valueI*elementValue; lastGradient_[iColumn] += gradientI; } } else { // linear part lastGradient_[iColumn] += coefficient_[j]; functionValue_ += valueI*coefficient_[j]; } } } functionValue_ -= offset_; } else { abort(); // do scaling const double * columnScale = model->columnScale(); for (int i=0;ilastColumn); delete [] lastGradient_; lastGradient_ = NULL; numberColumns_ = newNumberColumns; } } // Delete columns in constraint void ClpConstraintQuadratic::deleteSome(int numberToDelete, const int * which) { if (numberToDelete) { abort(); int i ; char * deleted = new char[numberColumns_]; memset(deleted,0,numberColumns_*sizeof(char)); for (i=0;i=0&&j=0) { assert (jColumn=0) { assert (jColumn