#ifndef AUXIL_H # define AUXIL_H # ifdef __cplusplus extern "C" { # endif // ifdef __cplusplus # include "types.h" /*********************************************************** * Auxiliary functions needed to compute ADMM iterations * * ***********************************************************/ # if EMBEDDED != 1 /** * Compute rho estimate from residuals * @param work Workspace * @return rho estimate */ c_float compute_rho_estimate(OSQPWorkspace *work); /** * Adapt rho value based on current unscaled primal/dual residuals * @param work Workspace * @return Exitflag */ c_int adapt_rho(OSQPWorkspace *work); /** * Set values of rho vector based on constraint types * @param work Workspace */ void set_rho_vec(OSQPWorkspace *work); /** * Update values of rho vector based on updated constraints. * If the constraints change, update the linear systems solver. * * @param work Workspace * @return Exitflag */ c_int update_rho_vec(OSQPWorkspace *work); # endif // EMBEDDED /** * Swap c_float vector pointers * @param a first vector * @param b second vector */ void swap_vectors(c_float **a, c_float **b); /** * Cold start workspace variables xz and y * @param work Workspace */ void cold_start(OSQPWorkspace *work); /** * Update x_tilde and z_tilde variable (first ADMM step) * @param work [description] */ void update_xz_tilde(OSQPWorkspace *work); /** * Update x (second ADMM step) * Update also delta_x (For for dual infeasibility) * @param work Workspace */ void update_x(OSQPWorkspace *work); /** * Update z (third ADMM step) * @param work Workspace */ void update_z(OSQPWorkspace *work); /** * Update y variable (fourth ADMM step) * Update also delta_y to check for primal infeasibility * @param work Workspace */ void update_y(OSQPWorkspace *work); /** * Compute objective function from data at value x * @param work OSQPWorkspace structure * @param x Value x * @return Objective function value */ c_float compute_obj_val(OSQPWorkspace *work, c_float *x); /** * Check whether QP has solution * @param info OSQPInfo */ c_int has_solution(OSQPInfo *info); /** * Store the QP solution * @param work Workspace */ void store_solution(OSQPWorkspace *work); /** * Update solver information * @param work Workspace * @param iter Iteration number * @param compute_objective Boolean (if compute the objective or not) * @param polish Boolean (if called from polish) */ void update_info(OSQPWorkspace *work, c_int iter, c_int compute_objective, c_int polish); /** * Reset solver information (after problem updates) * @param info Information structure */ void reset_info(OSQPInfo *info); /** * Update solver status (value and string) * @param info OSQPInfo * @param status_val new status value */ void update_status(OSQPInfo *info, c_int status_val); /** * Check if termination conditions are satisfied * If the boolean flag is ON, it checks for approximate conditions (10 x larger * tolerances than the ones set) * * @param work Workspace * @param approximate Boolean * @return Residuals check */ c_int check_termination(OSQPWorkspace *work, c_int approximate); # ifndef EMBEDDED /** * Validate problem data * @param data OSQPData to be validated * @return Exitflag to check */ c_int validate_data(const OSQPData *data); /** * Validate problem settings * @param settings OSQPSettings to be validated * @return Exitflag to check */ c_int validate_settings(const OSQPSettings *settings); # endif // #ifndef EMBEDDED # ifdef __cplusplus } # endif // ifdef __cplusplus #endif // ifndef AUXIL_H