// Copyright (C) 2004, 2006 International Business Machines and others.
// All Rights Reserved.
// This code is published under the Eclipse Public License.
//
// Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13

#ifndef __IPMUUPDATE_HPP__
#define __IPMUUPDATE_HPP__

#include "IpAlgStrategy.hpp"

namespace Ipopt
{

/** Abstract Base Class for classes that implement methods for computing
 *  the barrier and fraction-to-the-boundary rule parameter for the
 *  current iteration.
 */
class IPOPTLIB_EXPORT MuUpdate: public AlgorithmStrategyObject
{
public:
   /**@name Constructors / Destructor */
   ///@{
   /** Default Constructor */
   MuUpdate()
   { }

   /** Destructor */
   virtual ~MuUpdate()
   { }
   ///@}

   virtual bool InitializeImpl(
      const OptionsList& options,
      const std::string& prefix
   ) = 0;

   /** Method for determining the barrier parameter for the next
    *  iteration.
    *
    *  A LineSearch object is passed, so that this method
    *  can call the Reset method in the LineSearch object, for
    *  example when then barrier parameter is changed. This method is
    *  also responsible for setting the fraction-to-the-boundary
    *  parameter tau.  This method returns false if the update could
    *  not be performed and the algorithm should revert to an
    *  emergency fallback mechanism.
    */
   virtual bool UpdateBarrierParameter() = 0;

private:
   /**@name Default Compiler Generated Methods
    * (Hidden to avoid implicit creation/calling).
    *
    * These methods are not implemented and
    * we do not want the compiler to implement
    * them for us, so we declare them private
    * and do not define them. This ensures that
    * they will not be implicitly created/called.
    */
   ///@{
   /** Copy Constructor */
   MuUpdate(
      const MuUpdate&
   );

   /** Default Assignment Operator */
   void operator=(
      const MuUpdate&
   );
   ///@}

};

} // namespace Ipopt

#endif
