cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include/OsqpEigen/Data.tpp

106 lines
3.6 KiB
C++

/**
* @file Data.tpp
* @author Giulio Romualdi
* @copyright Released under the terms of the BSD 3-Clause License
* @date 2018
*/
#include <iostream>
#include <OsqpEigen/Debug.hpp>
template <typename Derived>
bool OsqpEigen::Data::setHessianMatrix(const Eigen::SparseCompressedBase<Derived>& hessianMatrix)
{
if (m_isHessianMatrixSet)
{
debugStream() << "[OsqpEigen::Data::setHessianMatrix] The hessian matrix was already set. "
<< "Please use clearHessianMatrix() method to deallocate memory."
<< std::endl;
return false;
}
if (!m_isNumberOfVariablesSet)
{
debugStream() << "[OsqpEigen::Data::setHessianMatrix] Please set the number of variables "
"before add the hessian matrix."
<< std::endl;
return false;
}
// check if the number of row and columns are equal to the number of the optimization variables
if ((hessianMatrix.rows() != m_data->n) || (hessianMatrix.cols() != m_data->n))
{
debugStream() << "[OsqpEigen::Data::setHessianMatrix] The Hessian matrix has to be a n x n "
"size matrix."
<< std::endl;
return false;
}
// set the hessian matrix
// osqp 0.6.0 required only the upper triangular part of the hessian matrix
Derived hessianMatrixUpperTriangular = hessianMatrix.template triangularView<Eigen::Upper>();
if (!OsqpEigen::SparseMatrixHelper::createOsqpSparseMatrix(hessianMatrixUpperTriangular,
m_data->P))
{
debugStream() << "[OsqpEigen::Data::setHessianMatrix] Unable to instantiate the osqp "
"sparse matrix."
<< std::endl;
return false;
}
m_isHessianMatrixSet = true;
return true;
}
template <typename Derived>
bool OsqpEigen::Data::setLinearConstraintsMatrix(
const Eigen::SparseCompressedBase<Derived>& linearConstraintsMatrix)
{
if (m_isLinearConstraintsMatrixSet)
{
debugStream() << "[OsqpEigen::Data::setLinearConstraintsMatrix] The linear constraint "
"matrix was already set. Please use clearLinearConstraintsMatrix() method "
"to deallocate memory."
<< std::endl;
return false;
}
if (!m_isNumberOfConstraintsSet)
{
debugStream() << "[OsqpEigen::Data::setLinearConstraintsMatrix] Please set the number of "
"constraints before add the constraint matrix."
<< std::endl;
return false;
}
if (!m_isNumberOfVariablesSet)
{
debugStream() << "[OsqpEigen::Data::setLinearConstraintsMatrix] Please set the number of "
"variables before add the constraint matrix."
<< std::endl;
return false;
}
if ((linearConstraintsMatrix.rows() != m_data->m)
|| (linearConstraintsMatrix.cols() != m_data->n))
{
debugStream() << "[OsqpEigen::Data::setLinearConstraintsMatrix] The Linear constraints "
"matrix has to be a m x n size matrix."
<< std::endl;
return false;
}
// set the hessian matrix
if (!OsqpEigen::SparseMatrixHelper::createOsqpSparseMatrix(linearConstraintsMatrix, m_data->A))
{
debugStream() << "[OsqpEigen::Data::setLinearConstraintsMatrix] osqp sparse matrix not "
"created."
<< std::endl;
return false;
}
m_isLinearConstraintsMatrixSet = true;
return true;
}