2017-08-01 12:30:58 +00:00
|
|
|
|
/* Copyright (C) 2004-2013 MBSim Development Team
|
|
|
|
|
|
|
|
|
|
Code was converted for the Bullet Continuous Collision Detection and Physics Library
|
|
|
|
|
|
|
|
|
|
This software is provided 'as-is', without any express or implied warranty.
|
|
|
|
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
|
including commercial applications, and to alter it and redistribute it freely,
|
|
|
|
|
subject to the following restrictions:
|
|
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
//The original version is here
|
|
|
|
|
//https://code.google.com/p/mbsim-env/source/browse/trunk/kernel/mbsim/numerics/linear_complementarity_problem/lemke_algorithm.cc
|
|
|
|
|
//This file is re-distributed under the ZLib license, with permission of the original author (Kilian Grundl)
|
|
|
|
|
//Math library was replaced from fmatvec to a the file src/LinearMath/btMatrixX.h
|
|
|
|
|
//STL/std::vector replaced by btAlignedObjectArray
|
|
|
|
|
|
|
|
|
|
#ifndef BT_NUMERICS_LEMKE_ALGORITHM_H_
|
|
|
|
|
#define BT_NUMERICS_LEMKE_ALGORITHM_H_
|
|
|
|
|
|
|
|
|
|
#include "LinearMath/btMatrixX.h"
|
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
#include <vector> //todo: replace by btAlignedObjectArray
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
|
|
|
|
class btLemkeAlgorithm
|
|
|
|
|
{
|
|
|
|
|
public:
|
2019-01-03 13:26:51 +00:00
|
|
|
|
btLemkeAlgorithm(const btMatrixXu& M_, const btVectorXu& q_, const int& DEBUGLEVEL_ = 0) : DEBUGLEVEL(DEBUGLEVEL_)
|
|
|
|
|
{
|
|
|
|
|
setSystem(M_, q_);
|
|
|
|
|
}
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
/* GETTER / SETTER */
|
|
|
|
|
/**
|
2017-08-01 12:30:58 +00:00
|
|
|
|
* \brief return info of solution process
|
|
|
|
|
*/
|
2019-01-03 13:26:51 +00:00
|
|
|
|
int getInfo()
|
|
|
|
|
{
|
|
|
|
|
return info;
|
|
|
|
|
}
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
/**
|
2017-08-01 12:30:58 +00:00
|
|
|
|
* \brief get the number of steps until the solution was found
|
|
|
|
|
*/
|
2019-01-03 13:26:51 +00:00
|
|
|
|
int getSteps(void)
|
|
|
|
|
{
|
|
|
|
|
return steps;
|
|
|
|
|
}
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
/**
|
2017-08-01 12:30:58 +00:00
|
|
|
|
* \brief set system with Matrix M and vector q
|
|
|
|
|
*/
|
2019-01-03 13:26:51 +00:00
|
|
|
|
void setSystem(const btMatrixXu& M_, const btVectorXu& q_)
|
2017-08-01 12:30:58 +00:00
|
|
|
|
{
|
|
|
|
|
m_M = M_;
|
|
|
|
|
m_q = q_;
|
2019-01-03 13:26:51 +00:00
|
|
|
|
}
|
|
|
|
|
/***************************************************/
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
/**
|
2017-08-01 12:30:58 +00:00
|
|
|
|
* \brief solve algorithm adapted from : Fast Implementation of Lemke’s Algorithm for Rigid Body Contact Simulation (John E. Lloyd)
|
|
|
|
|
*/
|
2019-01-03 13:26:51 +00:00
|
|
|
|
btVectorXu solve(unsigned int maxloops = 0);
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
virtual ~btLemkeAlgorithm()
|
|
|
|
|
{
|
|
|
|
|
}
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
|
|
|
|
protected:
|
2019-01-03 13:26:51 +00:00
|
|
|
|
int findLexicographicMinimum(const btMatrixXu& A, const int& pivotColIndex);
|
|
|
|
|
bool LexicographicPositive(const btVectorXu& v);
|
|
|
|
|
void GaussJordanEliminationStep(btMatrixXu& A, int pivotRowIndex, int pivotColumnIndex, const btAlignedObjectArray<int>& basis);
|
|
|
|
|
bool greaterZero(const btVectorXu& vector);
|
|
|
|
|
bool validBasis(const btAlignedObjectArray<int>& basis);
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
btMatrixXu m_M;
|
|
|
|
|
btVectorXu m_q;
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
/**
|
2017-08-01 12:30:58 +00:00
|
|
|
|
* \brief number of steps until the Lemke algorithm found a solution
|
|
|
|
|
*/
|
2019-01-03 13:26:51 +00:00
|
|
|
|
unsigned int steps;
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
/**
|
2017-08-01 12:30:58 +00:00
|
|
|
|
* \brief define level of debug output
|
|
|
|
|
*/
|
2019-01-03 13:26:51 +00:00
|
|
|
|
int DEBUGLEVEL;
|
2017-08-01 12:30:58 +00:00
|
|
|
|
|
2019-01-03 13:26:51 +00:00
|
|
|
|
/**
|
2017-08-01 12:30:58 +00:00
|
|
|
|
* \brief did the algorithm find a solution
|
|
|
|
|
*
|
|
|
|
|
* -1 : not successful
|
|
|
|
|
* 0 : successful
|
|
|
|
|
*/
|
2019-01-03 13:26:51 +00:00
|
|
|
|
int info;
|
2017-08-01 12:30:58 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif /* BT_NUMERICS_LEMKE_ALGORITHM_H_ */
|