openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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

// 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] = &sol;
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