/* $Id: ClpDualRowDantzig.hpp 1458 2009-11-05 12:34:07Z forrest $ */
// Copyright (C) 2002, International Business Machines
// Corporation and others.  All Rights Reserved.
#ifndef ClpDualRowDantzig_H
#define ClpDualRowDantzig_H

#include "ClpDualRowPivot.hpp"

//#############################################################################

/** Dual Row Pivot Dantzig Algorithm Class

This is simplest choice - choose largest infeasibility

*/

class ClpDualRowDantzig : public ClpDualRowPivot {
  
public:
  
  ///@name Algorithmic methods 
  //@{
  
  /// Returns pivot row, -1 if none
  virtual int pivotRow();
  
  /** Updates weights and returns pivot alpha.
      Also does FT update */
  virtual double updateWeights(CoinIndexedVector * input,
			     CoinIndexedVector * spare,
			     CoinIndexedVector * spare2,
			     CoinIndexedVector * updatedColumn);
  /** Updates primal solution (and maybe list of candidates)
      Uses input vector which it deletes
      Computes change in objective function
  */
  virtual void updatePrimalSolution(CoinIndexedVector * input,
				    double theta,
				    double & changeInObjective);
  //@}
  
  
  ///@name Constructors and destructors
  //@{
  /// Default Constructor
  ClpDualRowDantzig(); 
  
  /// Copy constructor 
  ClpDualRowDantzig(const ClpDualRowDantzig &);
  
  /// Assignment operator 
  ClpDualRowDantzig & operator=(const ClpDualRowDantzig& rhs);
  
  /// Destructor 
  virtual ~ClpDualRowDantzig ();

  /// Clone
  virtual ClpDualRowPivot * clone(bool copyData = true) const;
 
  //@}

  //---------------------------------------------------------------------------
  
private:
  ///@name Private member data 
  //@}
};

#endif
