-
andreadelprete authoredandreadelprete authored
solver_LP_abstract.cpp 3.39 KiB
/*
* Copyright 2015, LAAS-CNRS
* Author: Andrea Del Prete
*/
#include <robust-equilibrium-lib/solver_LP_abstract.hh>
#include <robust-equilibrium-lib/solver_LP_qpoases.hh>
#include <robust-equilibrium-lib/logger.hh>
#include <iostream>
#ifdef CLP_FOUND
#include <robust-equilibrium-lib/solver_LP_clp.hh>
#endif
using namespace std;
namespace robust_equilibrium
{
Solver_LP_abstract* Solver_LP_abstract::getNewSolver(SolverLP solverType)
{
if(solverType==SOLVER_LP_QPOASES)
return new Solver_LP_qpoases();
#ifdef CLP_FOUND
if(solverType==SOLVER_LP_CLP)
return new Solver_LP_clp();
#endif
SEND_ERROR_MSG("Specified solver type not recognized: "+toString(solverType));
return NULL;
}
bool Solver_LP_abstract::writeLpToFile(const std::string& filename,
Cref_vectorX c, Cref_vectorX lb, Cref_vectorX ub,
Cref_matrixXX A, Cref_vectorX Alb, Cref_vectorX Aub)
{
MatrixXX::Index n=c.size(), m=A.rows();
assert(lb.size()==n);
assert(ub.size()==n);
assert(A.cols()==n);
assert(Alb.size()==m);
assert(Aub.size()==m);
std::ofstream out(filename.c_str(), std::ios::out | std::ios::binary | std::ios::trunc);
out.write((char*) (&n), sizeof(typename MatrixXX::Index));
out.write((char*) (&m), sizeof(typename MatrixXX::Index));
out.write((char*) c.data(), n*sizeof(typename MatrixXX::Scalar) );
out.write((char*) lb.data(), n*sizeof(typename MatrixXX::Scalar) );
out.write((char*) ub.data(), n*sizeof(typename MatrixXX::Scalar) );
out.write((char*) A.data(), m*n*sizeof(typename MatrixXX::Scalar) );
out.write((char*) Alb.data(), m*sizeof(typename MatrixXX::Scalar) );
out.write((char*) Aub.data(), m*sizeof(typename MatrixXX::Scalar) );
out.close();
return true;
}
bool Solver_LP_abstract::readLpFromFile(const std::string& filename,
VectorX &c, VectorX &lb, VectorX &ub,
MatrixXX &A, VectorX &Alb, VectorX &Aub)
{
std::ifstream in(filename.c_str(), std::ios::in | std::ios::binary);
typename MatrixXX::Index n=0, m=0;
in.read((char*) (&n),sizeof(typename MatrixXX::Index));
in.read((char*) (&m),sizeof(typename MatrixXX::Index));
c.resize(n);
lb.resize(n);
ub.resize(n);
A.resize(m,n);
Alb.resize(m);
Aub.resize(m);
in.read( (char *) c.data() , n*sizeof(typename MatrixXX::Scalar) );
in.read( (char *) lb.data() , n*sizeof(typename MatrixXX::Scalar) );
in.read( (char *) ub.data() , n*sizeof(typename MatrixXX::Scalar) );
in.read( (char *) A.data() , m*n*sizeof(typename MatrixXX::Scalar) );
in.read( (char *) Alb.data() , m*sizeof(typename MatrixXX::Scalar) );
in.read( (char *) Aub.data() , m*sizeof(typename MatrixXX::Scalar) );
in.close();
return true;
}
LP_status Solver_LP_abstract::solve(const std::string& filename, Ref_vectorX sol)
{
VectorX c, lb, ub, Alb, Aub;
MatrixXX A;
if(!readLpFromFile(filename, c, lb, ub, A, Alb, Aub))
{
SEND_ERROR_MSG("Error while reading LP from file "+string(filename));
return LP_STATUS_ERROR;
}
return solve(c, lb, ub, A, Alb, Aub, sol);
}
bool Solver_LP_abstract::setMaximumIterations(unsigned int maxIter)
{
if(maxIter==0)
return false;
m_maxIter = maxIter;
return true;
}
bool Solver_LP_abstract::setMaximumTime(double seconds)
{
if(seconds<=0.0)
return false;
m_maxTime = seconds;
return true;
}
} // end namespace robust_equilibrium