diff --git a/CMakeLists.txt b/CMakeLists.txt index ad8dd60..bc5abe7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,3 +10,4 @@ add_subdirectory(worhp) add_subdirectory(hsl) add_subdirectory(snopt) add_subdirectory(bqpd) +add_subdirectory(madnlp) diff --git a/madnlp/CMakeLists.txt b/madnlp/CMakeLists.txt new file mode 100644 index 0000000..db06b23 --- /dev/null +++ b/madnlp/CMakeLists.txt @@ -0,0 +1,74 @@ +cmake_minimum_required(VERSION 3.10) + +project(madnlp + LANGUAGES CXX) + +set(INSTALL_PREFIX "") + +get_directory_property(hasParent PARENT_DIRECTORY) +if(hasParent) + set(INSTALL_PREFIX "${PROJECT_NAME}/") +endif() + +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + +add_library(madnlp SHARED src/madnlp.cpp include/madnlp.h) + +if(WIN32) + set_target_properties(madnlp PROPERTIES PREFIX "" IMPORT_PREFIX "") +endif() + +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(NBITS_TWO "32") +elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(NBITS_TWO "64") +endif() + +set(ARCHIVE_DIR lib) +set(RUNTIME_DIR bin) + +if(${CMAKE_GENERATOR} MATCHES "Visual Studio*") + set(ARCHIVE_DIR extern/lib/win${NBITS_TWO}/microsoft) + set(RUNTIME_DIR bin/win${NBITS_TWO}) +elseif(${CMAKE_GENERATOR} MATCHES "MSYS Makefiles") + set(ARCHIVE_DIR extern/lib/win${NBITS_TWO}/mingw${NBITS_TWO}) + set(RUNTIME_DIR bin/win${NBITS_TWO}) +endif() + + +install(TARGETS madnlp EXPORT madnlpTargets + LIBRARY DESTINATION ${INSTALL_PREFIX}lib + ARCHIVE DESTINATION ${INSTALL_PREFIX}lib + RUNTIME DESTINATION ${INSTALL_PREFIX}bin + INCLUDES DESTINATION ${INSTALL_PREFIX}include) + +target_include_directories(madnlp PUBLIC + $ + $ +) + +install(DIRECTORY include/ DESTINATION ${INSTALL_PREFIX}include) + +install(EXPORT madnlpTargets + FILE madnlpTargets.cmake + NAMESPACE madnlp:: + DESTINATION cmake +) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/madnlpConfigVersion.cmake + VERSION 13.1 + COMPATIBILITY SameMajorVersion +) + +configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake.in" + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" + INSTALL_DESTINATION + cmake) + + + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/madnlpConfigVersion.cmake" + DESTINATION cmake +) diff --git a/madnlp/cmake/madnlp-config.cmake.in b/madnlp/cmake/madnlp-config.cmake.in new file mode 100644 index 0000000..9c15f36 --- /dev/null +++ b/madnlp/cmake/madnlp-config.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +check_required_components("@PROJECT_NAME@") diff --git a/madnlp/include/madnlp.h b/madnlp/include/madnlp.h new file mode 100644 index 0000000..0631783 --- /dev/null +++ b/madnlp/include/madnlp.h @@ -0,0 +1,107 @@ +#ifndef _MADNLPCINTERFACE_H +#define _MADNLPCINTERFACE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Symbol visibility in DLLs */ +#ifndef MADNLP_SYMBOL_EXPORT +#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +#if defined(STATIC_LINKED) +#define MADNLP_SYMBOL_EXPORT +#else +#define MADNLP_SYMBOL_EXPORT __declspec(dllexport) +#endif +#elif defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +#define MADNLP_SYMBOL_EXPORT __attribute__((visibility("default"))) +#else +#define MADNLP_SYMBOL_EXPORT +#endif +#endif + + +#define madnlp_int int +#define madnlp_real double + +// structs +struct MadnlpCSolver; +struct MadnlpCStats; +struct MadnlpCDims; +struct MadnlpCInterface; + +// function pointer types +typedef madnlp_int (*MadnlpCGetDim)(void* user_data); +typedef madnlp_int (*MadnlpCGetDouble)(double*, void* user_data); + +typedef madnlp_int (*MadnlpCFullEvalObj)(const double*, double *, void*); +typedef madnlp_int (*MadnlpCFullEvalConstr)(const double*, double *, void*); +typedef madnlp_int (*MadnlpCFullEvalObjGrad)(const double*, double*, void*); +typedef madnlp_int (*MadnlpCFullEvalConstrJac)(const double*, double*, void*); +typedef madnlp_int (*MadnlpCFullEvalLagHess)(double, const double*, const double*, double*, void*); + + +struct MadnlpCDims { + size_t nw; + size_t nc; +}; + +struct MadnlpCStats { + double compute_sd_time; + double duinf_time; + double eval_hess_time; + double eval_jac_time; + double eval_cv_time; + double eval_grad_time; + double eval_obj_time; + double initialization_time; + double time_total; + int eval_hess_count; + int eval_jac_count; + int eval_cv_count; + int eval_grad_count; + int eval_obj_count; + int iterations_count; + int return_flag; +}; + +struct MadnlpCInterface { + /// @brief number of variables + MadnlpCGetDim get_nw; + /// @brief number of equality constraints + MadnlpCGetDim get_nc; + + MadnlpCFullEvalLagHess full_eval_lag_hess; + MadnlpCFullEvalConstrJac full_eval_constr_jac; + MadnlpCFullEvalConstr full_eval_constr; + MadnlpCFullEvalObjGrad full_eval_obj_grad; + MadnlpCFullEvalObj full_eval_obj; + + void* user_data; +}; + +MADNLP_SYMBOL_EXPORT void madnlp_c_startup(int, char**); +MADNLP_SYMBOL_EXPORT struct MadnlpCSolver* madnlp_c_create(struct MadnlpCInterface* nlp_interface); +MADNLP_SYMBOL_EXPORT void madnlp_c_init(struct MadnlpCSolver* s); +MADNLP_SYMBOL_EXPORT void madnlp_c_update_cco_indexes(struct MadnlpCSolver* s); +MADNLP_SYMBOL_EXPORT madnlp_int madnlp_c_solve(struct MadnlpCSolver*); + +/* -1 for not found, 0 for double, 1 for int, 2 for bool, 3 for string */ +MADNLP_SYMBOL_EXPORT int madnlp_c_option_type(const char* name); +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_double(struct MadnlpCSolver* s, const char* name, double val); +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_bool(struct MadnlpCSolver* s, const char* name, int val); +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_int(struct MadnlpCSolver* s, const char* name, int val); +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_string(struct MadnlpCSolver* s, const char* name, const char* val); + +MADNLP_SYMBOL_EXPORT const struct MadnlpCDims* madnlp_c_get_dims(struct MadnlpCSolver* s); +MADNLP_SYMBOL_EXPORT const struct MadnlpCStats* madnlp_c_get_stats(struct MadnlpCSolver* s); +MADNLP_SYMBOL_EXPORT void madnlp_c_destroy(struct MadnlpCSolver*); +MADNLP_SYMBOL_EXPORT void madnlp_c_shutdown(void); + +#ifdef __cplusplus +} +#endif + +#endif // _MADNLPCINTERFACE_H diff --git a/madnlp/src/madnlp.cpp b/madnlp/src/madnlp.cpp new file mode 100644 index 0000000..4bb412e --- /dev/null +++ b/madnlp/src/madnlp.cpp @@ -0,0 +1,19 @@ +#include "madnlp.h" + +MADNLP_SYMBOL_EXPORT void madnlp_c_startup(int, char**) { } +MADNLP_SYMBOL_EXPORT struct MadnlpCSolver* madnlp_c_create(struct MadnlpCInterface* nlp_interface) { return 0; } +MADNLP_SYMBOL_EXPORT void madnlp_c_init(struct MadnlpCSolver* s) { } +MADNLP_SYMBOL_EXPORT void madnlp_c_update_cco_indexes(struct MadnlpCSolver* s) { } +MADNLP_SYMBOL_EXPORT madnlp_int madnlp_c_solve(struct MadnlpCSolver*) { return 0; } + +/* -1 for not found, 0 for double, 1 for int, 2 for bool, 3 for string */ +MADNLP_SYMBOL_EXPORT int madnlp_c_option_type(const char* name) { return 0; } +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_double(struct MadnlpCSolver* s, const char* name, double val) { return 0; } +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_bool(struct MadnlpCSolver* s, const char* name, int val) { return 0; } +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_int(struct MadnlpCSolver* s, const char* name, int val) { return 0; } +MADNLP_SYMBOL_EXPORT int madnlp_c_set_option_string(struct MadnlpCSolver* s, const char* name, const char* val) { return 0; } + +MADNLP_SYMBOL_EXPORT const struct MadnlpCDims* madnlp_c_get_dims(struct MadnlpCSolver* s) { return 0; } +MADNLP_SYMBOL_EXPORT const struct MadnlpCStats* madnlp_c_get_stats(struct MadnlpCSolver* s) { return 0; } +MADNLP_SYMBOL_EXPORT void madnlp_c_destroy(struct MadnlpCSolver*) { } +MADNLP_SYMBOL_EXPORT void madnlp_c_shutdown(void) { }