You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							130 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							130 lines
						
					
					
						
							4.6 KiB
						
					
					
				// Copyright (C) 2004, 2006 International Business Machines and others.
 | 
						|
// All Rights Reserved.
 | 
						|
// This code is published under the Eclipse Public License.
 | 
						|
//
 | 
						|
// $Id: IpSymLinearSolver.hpp 2322 2013-06-12 17:45:57Z stefan $
 | 
						|
//
 | 
						|
// Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13
 | 
						|
 | 
						|
#ifndef __IPSYMLINEARSOLVER_HPP__
 | 
						|
#define __IPSYMLINEARSOLVER_HPP__
 | 
						|
 | 
						|
#include "IpUtils.hpp"
 | 
						|
#include "IpSymMatrix.hpp"
 | 
						|
#include "IpAlgStrategy.hpp"
 | 
						|
#include <vector>
 | 
						|
 | 
						|
namespace Ipopt
 | 
						|
{
 | 
						|
 | 
						|
  /** Enum to report outcome of a linear solve */
 | 
						|
  enum ESymSolverStatus {
 | 
						|
    /** Successful solve */
 | 
						|
    SYMSOLVER_SUCCESS,
 | 
						|
    /** Matrix seems to be singular; solve was aborted */
 | 
						|
    SYMSOLVER_SINGULAR,
 | 
						|
    /** The number of negative eigenvalues is not correct */
 | 
						|
    SYMSOLVER_WRONG_INERTIA,
 | 
						|
    /** Call the solver interface again after the matrix values have
 | 
						|
     *  been restored */
 | 
						|
    SYMSOLVER_CALL_AGAIN,
 | 
						|
    /** Unrecoverable error in linear solver occurred.  The
 | 
						|
     *  optimization will be aborted. */
 | 
						|
    SYMSOLVER_FATAL_ERROR
 | 
						|
  };
 | 
						|
 | 
						|
  /** Base class for all derived symmetric linear
 | 
						|
   *  solvers.  In the full space version of Ipopt a large linear
 | 
						|
   *  system has to be solved for the augmented system.  This case is
 | 
						|
   *  meant to be the base class for all derived linear solvers for
 | 
						|
   *  symmetric matrices (of type SymMatrix).
 | 
						|
   *
 | 
						|
   *  A linear solver can be used repeatedly for matrices with
 | 
						|
   *  identical structure of nonzero elements.  The nonzero structure
 | 
						|
   *  of those matrices must not be changed between calls.
 | 
						|
   *
 | 
						|
   *  The called might ask the solver to only solve the linear system
 | 
						|
   *  if the system is nonsingular, and if the number of negative
 | 
						|
   *  eigenvalues matches a given number.
 | 
						|
   */
 | 
						|
  class SymLinearSolver: public AlgorithmStrategyObject
 | 
						|
  {
 | 
						|
  public:
 | 
						|
    /** @name Constructor/Destructor */
 | 
						|
    //@{
 | 
						|
    SymLinearSolver()
 | 
						|
    {}
 | 
						|
 | 
						|
    virtual ~SymLinearSolver()
 | 
						|
    {}
 | 
						|
    //@}
 | 
						|
 | 
						|
    /** overloaded from AlgorithmStrategyObject */
 | 
						|
    virtual bool InitializeImpl(const OptionsList& options,
 | 
						|
                                const std::string& prefix) = 0;
 | 
						|
 | 
						|
    /** @name Methods for requesting solution of the linear system. */
 | 
						|
    //@{
 | 
						|
    /** Solve operation for multiple right hand sides.  Solves the
 | 
						|
     *  linear system A * Sol = Rhs with multiple right hand sides.  If
 | 
						|
     *  necessary, A is factorized.  Correct solutions are only
 | 
						|
     *  guaranteed if the return values is SYMSOLVER_SUCCESS.  The
 | 
						|
     *  solver will return SYMSOLVER_SINGULAR if the linear system is
 | 
						|
     *  singular, and it will return SYMSOLVER_WRONG_INERTIA if
 | 
						|
     *  check_NegEVals is true and the number of negative eigenvalues
 | 
						|
     *  in the matrix does not match numberOfNegEVals.
 | 
						|
     *
 | 
						|
     *  check_NegEVals cannot be chosen true, if ProvidesInertia()
 | 
						|
     *  returns false.
 | 
						|
     */
 | 
						|
    virtual ESymSolverStatus MultiSolve(const SymMatrix &A,
 | 
						|
                                        std::vector<SmartPtr<const Vector> >& rhsV,
 | 
						|
                                        std::vector<SmartPtr<Vector> >& solV,
 | 
						|
                                        bool check_NegEVals,
 | 
						|
                                        Index numberOfNegEVals)=0;
 | 
						|
 | 
						|
    /** Solve operation for a single right hand side. Solves the
 | 
						|
     *  linear system A * Sol = Rhs.  See MultiSolve for more
 | 
						|
     *  details. */
 | 
						|
    ESymSolverStatus Solve(const SymMatrix &A,
 | 
						|
                           const Vector& rhs, Vector& sol,
 | 
						|
                           bool check_NegEVals,
 | 
						|
                           Index numberOfNegEVals)
 | 
						|
    {
 | 
						|
      std::vector<SmartPtr<const Vector> > rhsV(1);
 | 
						|
      rhsV[0] = &rhs;
 | 
						|
      std::vector<SmartPtr<Vector> > solV(1);
 | 
						|
      solV[0] = /
 | 
						|
      return MultiSolve(A, rhsV, solV, check_NegEVals,
 | 
						|
                        numberOfNegEVals);
 | 
						|
    }
 | 
						|
 | 
						|
    /** Number of negative eigenvalues detected during last
 | 
						|
     *  factorization.  Returns the number of negative eigenvalues of
 | 
						|
     *  the most recent factorized matrix.  This must not be called if
 | 
						|
     *  the linear solver does not compute this quantities (see
 | 
						|
     *  ProvidesInertia).
 | 
						|
     */
 | 
						|
    virtual Index NumberOfNegEVals() const =0;
 | 
						|
    //@}
 | 
						|
 | 
						|
    //* @name Options of Linear solver */
 | 
						|
    //@{
 | 
						|
    /** Request to increase quality of solution for next solve.
 | 
						|
     * Ask linear solver to increase quality of solution for the next
 | 
						|
     * solve (e.g. increase pivot tolerance).  Returns false, if this
 | 
						|
     * is not possible (e.g. maximal pivot tolerance already used.)
 | 
						|
     */
 | 
						|
    virtual bool IncreaseQuality() =0;
 | 
						|
 | 
						|
    /** Query whether inertia is computed by linear solver.
 | 
						|
     * Returns true, if linear solver provides inertia.
 | 
						|
     */
 | 
						|
    virtual bool ProvidesInertia() const =0;
 | 
						|
    //@}
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
} // namespace Ipopt
 | 
						|
 | 
						|
#endif
 | 
						|
 |