// 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 "ClpConstraintLinear.hpp" #include "CoinSort.hpp" //############################################################################# // Constructors / Destructor / Assignment //############################################################################# //------------------------------------------------------------------- // Default Constructor //------------------------------------------------------------------- ClpConstraintLinear::ClpConstraintLinear () : ClpConstraint() { type_=0; column_=NULL; coefficient_ = NULL; numberColumns_=0; numberCoefficients_=0; } //------------------------------------------------------------------- // Useful Constructor //------------------------------------------------------------------- ClpConstraintLinear::ClpConstraintLinear (int row, int numberCoefficents , int numberColumns, const int * column, const double * coefficient) : ClpConstraint() { type_=0; rowNumber_=row; numberColumns_ = numberColumns; numberCoefficients_=numberCoefficents; column_ = CoinCopyOfArray(column,numberCoefficients_); coefficient_ = CoinCopyOfArray(coefficient,numberCoefficients_); CoinSort_2(column_,column_+numberCoefficients_,coefficient_); } //------------------------------------------------------------------- // Copy constructor //------------------------------------------------------------------- ClpConstraintLinear::ClpConstraintLinear (const ClpConstraintLinear & rhs) : ClpConstraint(rhs) { numberColumns_=rhs.numberColumns_; numberCoefficients_=rhs.numberCoefficients_; column_ = CoinCopyOfArray(rhs.column_,numberCoefficients_); coefficient_ = CoinCopyOfArray(rhs.coefficient_,numberCoefficients_); } //------------------------------------------------------------------- // Destructor //------------------------------------------------------------------- ClpConstraintLinear::~ClpConstraintLinear () { delete [] column_; delete [] coefficient_; } //---------------------------------------------------------------- // Assignment operator //------------------------------------------------------------------- ClpConstraintLinear & ClpConstraintLinear::operator=(const ClpConstraintLinear& rhs) { if (this != &rhs) { delete [] column_; delete [] coefficient_; numberColumns_=rhs.numberColumns_; numberCoefficients_=rhs.numberCoefficients_; column_ = CoinCopyOfArray(rhs.column_,numberCoefficients_); coefficient_ = CoinCopyOfArray(rhs.coefficient_,numberCoefficients_); } return *this; } //------------------------------------------------------------------- // Clone //------------------------------------------------------------------- ClpConstraint * ClpConstraintLinear::clone() const { return new ClpConstraintLinear(*this); } // Returns gradient int ClpConstraintLinear::gradient(const ClpSimplex * model, const double * solution, double * gradient, double & functionValue, double & offset, bool useScaling, bool refresh) const { if (refresh||!lastGradient_) { functionValue_=0.0; if (!lastGradient_) lastGradient_ = new double[numberColumns_]; CoinZeroN(lastGradient_,numberColumns_); bool scaling=(model&&model->rowScale()&&useScaling); if (!scaling) { for (int i=0;icolumnScale(); for (int i=0;ilastColumn); delete [] lastGradient_; lastGradient_ = NULL; numberColumns_ = newNumberColumns; } } // Delete columns in constraint void ClpConstraintLinear::deleteSome(int numberToDelete, const int * which) { if (numberToDelete) { int i ; char * deleted = new char[numberColumns_]; memset(deleted,0,numberColumns_*sizeof(char)); for (i=0;i=0&&j