223 lines
4.0 KiB
C
223 lines
4.0 KiB
C
#ifndef UTIL_H
|
|
# define UTIL_H
|
|
|
|
# ifdef __cplusplus
|
|
extern "C" {
|
|
# endif // ifdef __cplusplus
|
|
|
|
# include "types.h"
|
|
# include "constants.h"
|
|
|
|
/******************
|
|
* Versioning *
|
|
******************/
|
|
|
|
/**
|
|
* Return OSQP version
|
|
* @return OSQP version
|
|
*/
|
|
const char* osqp_version(void);
|
|
|
|
|
|
/**********************
|
|
* Utility Functions *
|
|
**********************/
|
|
|
|
# ifndef EMBEDDED
|
|
|
|
/**
|
|
* Copy settings creating a new settings structure (uses MALLOC)
|
|
* @param settings Settings to be copied
|
|
* @return New settings structure
|
|
*/
|
|
OSQPSettings* copy_settings(const OSQPSettings *settings);
|
|
|
|
# endif // #ifndef EMBEDDED
|
|
|
|
/**
|
|
* Custom string copy to avoid string.h library
|
|
* @param dest destination string
|
|
* @param source source string
|
|
*/
|
|
void c_strcpy(char dest[],
|
|
const char source[]);
|
|
|
|
|
|
# ifdef PRINTING
|
|
|
|
/**
|
|
* Print Header before running the algorithm
|
|
* @param work osqp workspace
|
|
*/
|
|
void print_setup_header(const OSQPWorkspace *work);
|
|
|
|
/**
|
|
* Print header with data to be displayed per iteration
|
|
*/
|
|
void print_header(void);
|
|
|
|
/**
|
|
* Print iteration summary
|
|
* @param work current workspace
|
|
*/
|
|
void print_summary(OSQPWorkspace *work);
|
|
|
|
/**
|
|
* Print information after polish
|
|
* @param work current workspace
|
|
*/
|
|
void print_polish(OSQPWorkspace *work);
|
|
|
|
/**
|
|
* Print footer when algorithm terminates
|
|
* @param info info structure
|
|
* @param polish is polish enabled?
|
|
*/
|
|
void print_footer(OSQPInfo *info,
|
|
c_int polish);
|
|
|
|
|
|
# endif // ifdef PRINTING
|
|
|
|
|
|
/*********************************
|
|
* Timer Structs and Functions * *
|
|
*********************************/
|
|
|
|
/*! \cond PRIVATE */
|
|
|
|
# ifdef PROFILING
|
|
|
|
// Windows
|
|
# ifdef IS_WINDOWS
|
|
|
|
// Some R packages clash with elements
|
|
// of the windows.h header, so use a
|
|
// slimmer version for conflict avoidance
|
|
# ifdef R_LANG
|
|
#define NOGDI
|
|
# endif
|
|
|
|
# include <windows.h>
|
|
|
|
struct OSQP_TIMER {
|
|
LARGE_INTEGER tic;
|
|
LARGE_INTEGER toc;
|
|
LARGE_INTEGER freq;
|
|
};
|
|
|
|
// Mac
|
|
# elif defined IS_MAC
|
|
|
|
# include <mach/mach_time.h>
|
|
|
|
/* Use MAC OSX mach_time for timing */
|
|
struct OSQP_TIMER {
|
|
uint64_t tic;
|
|
uint64_t toc;
|
|
mach_timebase_info_data_t tinfo;
|
|
};
|
|
|
|
// Linux
|
|
# else // ifdef IS_WINDOWS
|
|
|
|
/* Use POSIX clock_gettime() for timing on non-Windows machines */
|
|
# include <time.h>
|
|
# include <sys/time.h>
|
|
|
|
|
|
struct OSQP_TIMER {
|
|
struct timespec tic;
|
|
struct timespec toc;
|
|
};
|
|
|
|
# endif // ifdef IS_WINDOWS
|
|
|
|
/*! \endcond */
|
|
|
|
/**
|
|
* Timer Methods
|
|
*/
|
|
|
|
/**
|
|
* Start timer
|
|
* @param t Timer object
|
|
*/
|
|
void osqp_tic(OSQPTimer *t);
|
|
|
|
/**
|
|
* Report time
|
|
* @param t Timer object
|
|
* @return Reported time
|
|
*/
|
|
c_float osqp_toc(OSQPTimer *t);
|
|
|
|
# endif /* END #ifdef PROFILING */
|
|
|
|
|
|
/* ================================= DEBUG FUNCTIONS ======================= */
|
|
|
|
/*! \cond PRIVATE */
|
|
|
|
|
|
# ifndef EMBEDDED
|
|
|
|
/* Compare CSC matrices */
|
|
c_int is_eq_csc(csc *A,
|
|
csc *B,
|
|
c_float tol);
|
|
|
|
/* Convert sparse CSC to dense */
|
|
c_float* csc_to_dns(csc *M);
|
|
|
|
# endif // #ifndef EMBEDDED
|
|
|
|
|
|
# ifdef PRINTING
|
|
# include <stdio.h>
|
|
|
|
|
|
/* Print a csc sparse matrix */
|
|
void print_csc_matrix(csc *M,
|
|
const char *name);
|
|
|
|
/* Dump csc sparse matrix to file */
|
|
void dump_csc_matrix(csc *M,
|
|
const char *file_name);
|
|
|
|
/* Print a triplet format sparse matrix */
|
|
void print_trip_matrix(csc *M,
|
|
const char *name);
|
|
|
|
/* Print a dense matrix */
|
|
void print_dns_matrix(c_float *M,
|
|
c_int m,
|
|
c_int n,
|
|
const char *name);
|
|
|
|
/* Print vector */
|
|
void print_vec(c_float *v,
|
|
c_int n,
|
|
const char *name);
|
|
|
|
/* Dump vector to file */
|
|
void dump_vec(c_float *v,
|
|
c_int len,
|
|
const char *file_name);
|
|
|
|
// Print int array
|
|
void print_vec_int(c_int *x,
|
|
c_int n,
|
|
const char *name);
|
|
|
|
# endif // ifdef PRINTING
|
|
|
|
/*! \endcond */
|
|
|
|
|
|
# ifdef __cplusplus
|
|
}
|
|
# endif // ifdef __cplusplus
|
|
|
|
#endif // ifndef UTIL_H
|