Squashed 'third_party/osqp/' content from commit 33454b3e23

Change-Id: I056df0582ca06664e86554c341a94c47ab932001
git-subtree-dir: third_party/osqp
git-subtree-split: 33454b3e236f1f44193bfbbb6b8c8e71f8f04e9a
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/include/util.h b/include/util.h
new file mode 100644
index 0000000..6b2aac3
--- /dev/null
+++ b/include/util.h
@@ -0,0 +1,222 @@
+#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