/* $Id: ClpConstraint.hpp 1370 2009-06-04 09:37:13Z forrest $ */
// Copyright (C) 2007, International Business Machines
// Corporation and others.  All Rights Reserved.
#ifndef ClpConstraint_H
#define ClpConstraint_H


//#############################################################################
class ClpSimplex;
class ClpModel;

/** Constraint Abstract Base Class

Abstract Base Class for describing a constraint or objective function

*/
class ClpConstraint  {
  
public:
  
  ///@name Stuff
  //@{
  
  /** Fills gradient.  If Linear then solution may be NULL,
      also returns true value of function and offset so we can use x not deltaX in constraint
      If refresh is false then uses last solution
      Uses model for scaling
      Returns non-zero if gradient undefined at current solution
  */
  virtual int gradient(const ClpSimplex * model,
		       const double * solution,
		       double * gradient,
		       double & functionValue ,
		       double & offset,
		       bool useScaling=false,
		       bool refresh=true) const =0;
  /// Constraint function value
  virtual double functionValue (const ClpSimplex * model,
			const double * solution,
			bool useScaling=false,
			bool refresh=true) const ;
  /// Resize constraint
  virtual void resize(int newNumberColumns) = 0; 
  /// Delete columns in  constraint
  virtual void deleteSome(int numberToDelete, const int * which) = 0; 
  /// Scale constraint 
  virtual void reallyScale(const double * columnScale) =0;
  /** Given a zeroed array sets nonlinear columns to 1.
      Returns number of nonlinear columns
   */
  virtual int markNonlinear(char * which) const = 0;
  /** Given a zeroed array sets possible nonzero coefficients to 1.
      Returns number of nonzeros
   */
  virtual int markNonzero(char * which) const = 0;
  //@}
  
  
  ///@name Constructors and destructors
  //@{
  /// Default Constructor
  ClpConstraint(); 
  
  /// Copy constructor 
  ClpConstraint(const ClpConstraint &);
  
  /// Assignment operator 
  ClpConstraint & operator=(const ClpConstraint& rhs);
  
  /// Destructor 
  virtual ~ClpConstraint ();

  /// Clone
  virtual ClpConstraint * clone() const = 0;
 
  //@}

  ///@name Other
  //@{
  /// Returns type, 0 linear, 1 nonlinear
  inline int type()
  { return type_;}
  /// Row number (-1 is objective)
  inline int rowNumber() const
  {return rowNumber_;}
  
  /// Number of possible coefficients in gradient
  virtual int numberCoefficients() const = 0;
  
  /// Stored constraint function value
  inline double functionValue () const
  { return functionValue_;}

  /// Constraint offset
  inline double offset () const
  { return offset_;}
  /// Say we have new primal solution - so may need to recompute
  virtual void newXValues() {}
  //@}

  //---------------------------------------------------------------------------
  
protected:
  ///@name Protected member data 
  //@{
  /// Gradient at last evaluation
  mutable double * lastGradient_;
  /// Value of non-linear part of constraint
  mutable double functionValue_;
  /// Value of offset for constraint
  mutable double offset_;
  /// Type of constraint - linear is 1
  int type_;
  /// Row number (-1 is objective)
  int rowNumber_;
  //@}
};

#endif
