109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* 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"
 | 
						||
 | 
						||
 | 
						||
#include <vector> //todo: replace by btAlignedObjectArray
 | 
						||
 | 
						||
class btLemkeAlgorithm
 | 
						||
{
 | 
						||
public:
 | 
						||
 
 | 
						||
 | 
						||
  btLemkeAlgorithm(const btMatrixXu& M_, const btVectorXu& q_, const int & DEBUGLEVEL_ = 0) :
 | 
						||
	  DEBUGLEVEL(DEBUGLEVEL_)
 | 
						||
  {
 | 
						||
	setSystem(M_, q_);
 | 
						||
  }
 | 
						||
 | 
						||
  /* GETTER / SETTER */
 | 
						||
  /**
 | 
						||
   * \brief return info of solution process
 | 
						||
   */
 | 
						||
  int getInfo() {
 | 
						||
	return info;
 | 
						||
  }
 | 
						||
 | 
						||
  /**
 | 
						||
   * \brief get the number of steps until the solution was found
 | 
						||
   */
 | 
						||
  int getSteps(void) {
 | 
						||
	return steps;
 | 
						||
  }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
  /**
 | 
						||
   * \brief set system with Matrix M and vector q
 | 
						||
   */
 | 
						||
  void setSystem(const btMatrixXu & M_, const btVectorXu & q_)
 | 
						||
	{
 | 
						||
		m_M = M_;
 | 
						||
		m_q = q_;
 | 
						||
  }
 | 
						||
  /***************************************************/
 | 
						||
 | 
						||
  /**
 | 
						||
   * \brief solve algorithm adapted from : Fast Implementation of Lemke’s Algorithm for Rigid Body Contact Simulation (John E. Lloyd)
 | 
						||
   */
 | 
						||
  btVectorXu solve(unsigned int maxloops = 0);
 | 
						||
 | 
						||
  virtual ~btLemkeAlgorithm() {
 | 
						||
  }
 | 
						||
 | 
						||
protected:
 | 
						||
  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);
 | 
						||
 | 
						||
  btMatrixXu m_M;
 | 
						||
  btVectorXu m_q;
 | 
						||
 | 
						||
  /**
 | 
						||
   * \brief number of steps until the Lemke algorithm found a solution
 | 
						||
   */
 | 
						||
  unsigned int steps;
 | 
						||
 | 
						||
  /**
 | 
						||
   * \brief define level of debug output
 | 
						||
   */
 | 
						||
  int DEBUGLEVEL;
 | 
						||
 | 
						||
  /**
 | 
						||
   * \brief did the algorithm find a solution
 | 
						||
   *
 | 
						||
   * -1 : not successful
 | 
						||
   *  0 : successful
 | 
						||
   */
 | 
						||
  int info;
 | 
						||
};
 | 
						||
 | 
						||
 | 
						||
#endif /* BT_NUMERICS_LEMKE_ALGORITHM_H_ */
 |