mirror of https://github.com/CGAL/cgal
adapted to new OSQP interface
This commit is contained in:
parent
37ae7456c6
commit
deda05c534
|
|
@ -220,22 +220,11 @@ public:
|
||||||
CGAL_assertion(settings);
|
CGAL_assertion(settings);
|
||||||
|
|
||||||
// Structures.
|
// Structures.
|
||||||
OSQPWorkspace *work;
|
OSQPCscMatrix* P = static_cast<OSQPCscMatrix*>(malloc(sizeof(OSQPCscMatrix)));
|
||||||
OSQPData *data = (OSQPData *) malloc(sizeof(OSQPData));
|
OSQPCscMatrix* A = static_cast<OSQPCscMatrix*>(malloc(sizeof(OSQPCscMatrix)));
|
||||||
CGAL_assertion(data);
|
|
||||||
|
|
||||||
// Populate data.
|
csc_set_data(A, m, n, A_nnz, A_x.get(), A_i.get(), A_p.get());
|
||||||
data->n = static_cast<OSQPInt>(n);
|
csc_set_data(P, n, n, P_nnz, P_x.get(), P_i.get(), P_p.get());
|
||||||
data->m = static_cast<OSQPInt>(m);
|
|
||||||
data->P = csc_matrix(data->n, data->n, P_nnz, P_x.get(), P_i.get(), P_p.get());
|
|
||||||
CGAL_assertion(data->P);
|
|
||||||
|
|
||||||
data->q = q_x.get();
|
|
||||||
data->A = csc_matrix(data->m, data->n, A_nnz, A_x.get(), A_i.get(), A_p.get());
|
|
||||||
CGAL_assertion(data->A);
|
|
||||||
|
|
||||||
data->l = l_x.get();
|
|
||||||
data->u = u_x.get();
|
|
||||||
|
|
||||||
// Set solver settings.
|
// Set solver settings.
|
||||||
osqp_set_default_settings(settings);
|
osqp_set_default_settings(settings);
|
||||||
|
|
@ -243,38 +232,33 @@ public:
|
||||||
settings->eps_rel = eps_rel;
|
settings->eps_rel = eps_rel;
|
||||||
settings->verbose = verbose;
|
settings->verbose = verbose;
|
||||||
|
|
||||||
// Set workspace.
|
OSQPSolver* solver = NULL;
|
||||||
osqp_setup(&work, data, settings);
|
OSQPInt exitflag = osqp_setup(&solver, P, q_x.get(), A, l_x.get(), u_x.get(), m, n, settings);
|
||||||
|
|
||||||
// Solve problem.
|
|
||||||
OSQPInt exitflag = -1;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
exitflag = osqp_solve(work);
|
if (!exitflag)
|
||||||
|
exitflag = osqp_solve(solver);
|
||||||
|
|
||||||
|
const OSQPFloat* x = solver->solution->x;
|
||||||
|
for (std::size_t i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
const FT value{ x[i] };
|
||||||
|
*(++solution) = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch(std::exception& e)
|
catch (std::exception& e)
|
||||||
{
|
{
|
||||||
std::cerr << "ERROR: OSQP solver has thrown an exception!" << std::endl;
|
std::cerr << "ERROR: OSQP solver has thrown an exception!" << std::endl;
|
||||||
std::cerr << e.what() << std::endl;
|
std::cerr << e.what() << std::endl;
|
||||||
}
|
}
|
||||||
const bool success = (exitflag == 0);
|
|
||||||
|
|
||||||
// Create solution.
|
osqp_cleanup(solver);
|
||||||
const OSQPFloat *x = work->solution->x;
|
if (A) free(A);
|
||||||
for(std::size_t i=0; i<n; ++i)
|
if (P) free(P);
|
||||||
{
|
if (settings) free(settings);
|
||||||
const FT value{x[i]};
|
|
||||||
*(++solution) = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean workspace.
|
return (exitflag == 0);
|
||||||
osqp_cleanup(work);
|
|
||||||
c_free(data->A);
|
|
||||||
c_free(data->P);
|
|
||||||
c_free(data);
|
|
||||||
c_free(settings);
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
/// \endcond
|
/// \endcond
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue