Skip to content

Commit 860e6b2

Browse files
committed
Initial proof-of-concept for dynamic HiPO loading in highspy
1 parent 861efe2 commit 860e6b2

File tree

16 files changed

+1120
-57
lines changed

16 files changed

+1120
-57
lines changed

CMakeLists.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,15 @@ if (PYTHON_BUILD_SETUP)
9393
set(BUILD_TESTING OFF)
9494
endif()
9595

96+
option(HIPO "Build HIPO" OFF)
97+
option(HIPO_PYTHON_BUILD "Build HiPO Python shared library" OFF)
98+
message(STATUS "Build HiPO Python: ${HIPO_PYTHON_BUILD}")
99+
if (HIPO_PYTHON_BUILD)
100+
set(BUILD_CXX OFF)
101+
set(BUILD_TESTING OFF)
102+
set(HIPO ON)
103+
endif()
104+
96105
include(CMakeDependentOption)
97106

98107
CMAKE_DEPENDENT_OPTION(ALL_TESTS "Build all tests" OFF "BUILD_TESTING;BUILD_CXX" OFF)
@@ -146,7 +155,7 @@ endif()
146155
# message(STATUS "CUPLDP with Nvidia is only supported on Linux at the moment. Using CPU version.")
147156
# endif()
148157

149-
option(HIPO "Build HIPO" OFF)
158+
150159
message(STATUS "Build HIPO: ${HIPO}")
151160
option(BUILD_OPENBLAS "Build OpenBLAS" OFF)
152161
message(STATUS "Build OpenBLAS: ${BUILD_OPENBLAS}")
@@ -850,6 +859,7 @@ else(FAST_BUILD)
850859
endif()
851860

852861
include(python-highs)
862+
include(hipo-python)
853863

854864
option(USE_DOTNET_STD_21 "Use .Net Standard 2.1 support" ON)
855865
message(STATUS ".Net: Use .Net Framework 2.1 support: ${USE_DOTNET_STD_21}")

cmake/hipo-python.cmake

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# HiPO Python build module
2+
# Similar to python-highs.cmake but builds the HiPO shared library
3+
4+
if (NOT HIPO_PYTHON_BUILD)
5+
return()
6+
endif()
7+
8+
include(sources-python)
9+
10+
# could use subset of sources, but this is easier to maintain
11+
set(sources_python ${highs_sources_python}
12+
${cupdlp_sources_python}
13+
${ipx_sources_python}
14+
${basiclu_sources_python})
15+
16+
set(headers_python ${highs_headers_python}
17+
${cupdlp_headers_python}
18+
${ipx_headers_python}
19+
${basiclu_headers_python})
20+
21+
# Create shared library
22+
add_library(highs_hipo SHARED
23+
${sources_python}
24+
${hipo_sources}
25+
${factor_highs_sources}
26+
${hipo_util_sources}
27+
${hipo_orderings_sources}
28+
29+
${headers_python}
30+
${hipo_headers}
31+
${factor_highs_headers}
32+
${hipo_util_headers}
33+
${hipo_orderings_headers}
34+
)
35+
36+
target_include_directories(highs_hipo PRIVATE
37+
${include_dirs_python}
38+
)
39+
40+
target_compile_definitions(highs_hipo PRIVATE HIPO_LIBRARY_BUILD)
41+
42+
# Dependencies
43+
find_package(ZLIB)
44+
if(ZLIB_FOUND)
45+
target_link_libraries(highs_hipo PRIVATE ZLIB::ZLIB)
46+
endif()
47+
48+
49+
if (NOT USE_CMAKE_FIND_BLAS)
50+
if(APPLE)
51+
target_link_libraries(highs_hipo PRIVATE "-framework Accelerate")
52+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_APPLE_BLAS)
53+
elseif(WIN32)
54+
if(TARGET OpenBLAS::OpenBLAS)
55+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
56+
target_link_libraries(highs_hipo PRIVATE OpenBLAS::OpenBLAS)
57+
elseif(OPENBLAS_LIB)
58+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
59+
message(STATUS "Linking against OpenBLAS via raw library: ${OPENBLAS_LIB}")
60+
target_link_libraries(highs_hipo PRIVATE ${OPENBLAS_LIB})
61+
target_include_directories(highs_hipo PRIVATE ${OPENBLAS_INCLUDE_DIR})
62+
elseif(BUILD_OPENBLAS)
63+
target_link_libraries(highs_hipo PRIVATE openblas)
64+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
65+
else()
66+
message(FATAL_ERROR "OpenBLAS not found on Windows.")
67+
endif()
68+
69+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
70+
else()
71+
# LINUX
72+
if(BLAS_LIB)
73+
target_link_libraries(highs_hipo PRIVATE "${BLAS_LIB}" cblas)
74+
elseif(OPENBLAS_LIB)
75+
target_link_libraries(highs_hipo PRIVATE "${OPENBLAS_LIB}")
76+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
77+
elseif(BUILD_OPENBLAS)
78+
target_link_libraries(highs_hipo PRIVATE openblas)
79+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
80+
else()
81+
message(FATAL_ERROR "No BLAS library available")
82+
endif(BLAS_LIB)
83+
endif(APPLE)
84+
else()
85+
86+
if (WIN32 AND TARGET OpenBLAS::OpenBLAS)
87+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
88+
target_link_libraries(highs_hipo PRIVATE OpenBLAS::OpenBLAS)
89+
else()
90+
target_link_libraries(highs_hipo PRIVATE BLAS::BLAS)
91+
92+
string(TOLOWER "${BLAS_LIBRARIES}" blas_lower)
93+
if(blas_lower MATCHES "openblas")
94+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_OPENBLAS)
95+
elseif(blas_lower MATCHES "accelerate")
96+
target_compile_definitions(highs_hipo PRIVATE HIPO_USES_APPLE_BLAS)
97+
endif()
98+
endif()
99+
endif()
100+
101+
if(MSVC)
102+
target_compile_options(highs_hipo PRIVATE "/bigobj")
103+
endif()
104+
105+
if (NOT MSVC)
106+
target_compile_options(highs_hipo PRIVATE "-ftemplate-depth=2048")
107+
endif()
108+
109+
110+
# Set library properties
111+
set_target_properties(highs_hipo PROPERTIES
112+
OUTPUT_NAME "highs_hipo"
113+
POSITION_INDEPENDENT_CODE ON
114+
CXX_VISIBILITY_PRESET hidden
115+
C_VISIBILITY_PRESET hidden
116+
VISIBILITY_INLINES_HIDDEN ON
117+
)
118+
119+
if(WIN32)
120+
set_target_properties(highs_hipo PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS OFF)
121+
elseif(APPLE)
122+
set_target_properties(highs_hipo PROPERTIES INSTALL_RPATH "@loader_path")
123+
else()
124+
set_target_properties(highs_hipo PROPERTIES INSTALL_RPATH "$ORIGIN")
125+
endif()
126+
127+
# Install to Python package directory
128+
install(TARGETS highs_hipo
129+
LIBRARY DESTINATION highspy_hipo
130+
RUNTIME DESTINATION highspy_hipo
131+
ARCHIVE DESTINATION highspy_hipo
132+
)

cmake/sources-python.cmake

Lines changed: 155 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,8 @@ set(highs_sources_python
283283
highs/util/HighsUtils.cpp
284284
highs/util/HSet.cpp
285285
highs/util/HVectorBase.cpp
286-
highs/util/stringutil.cpp)
286+
highs/util/stringutil.cpp
287+
highs/lp_data/DynamicHipoLoader.cpp)
287288

288289
set(highs_headers_python
289290
extern/pdqsort/pdqsort.h
@@ -321,6 +322,7 @@ set(highs_headers_python
321322
highs/lp_data/HighsSolve.h
322323
highs/lp_data/HighsStatus.h
323324
highs/lp_data/HStruct.h
325+
highs/lp_data/DynamicHipoLoader.h
324326
highs/mip/feasibilityjump.hh
325327
highs/mip/HighsCliqueTable.h
326328
highs/mip/HighsConflictPool.h
@@ -444,4 +446,155 @@ set(highs_headers_python
444446
highs/util/HVectorBase.h
445447
highs/util/stringutil.h
446448
highs/Highs.h
447-
)
449+
)
450+
451+
452+
set(hipo_sources
453+
highs/ipm/hipo/ipm/CurtisReidScaling.cpp
454+
highs/ipm/hipo/ipm/IpmData.cpp
455+
highs/ipm/hipo/ipm/FactorHiGHSSolver.cpp
456+
highs/ipm/hipo/ipm/Control.cpp
457+
highs/ipm/hipo/ipm/Iterate.cpp
458+
highs/ipm/hipo/ipm/LogHighs.cpp
459+
highs/ipm/hipo/ipm/Model.cpp
460+
highs/ipm/hipo/ipm/Refine.cpp
461+
highs/ipm/hipo/ipm/Solver.cpp
462+
highs/ipm/hipo/HipoCApi.cpp)
463+
464+
set(hipo_headers
465+
highs/ipm/hipo/ipm/CurtisReidScaling.h
466+
highs/ipm/hipo/ipm/IpmData.h
467+
highs/ipm/hipo/ipm/FactorHiGHSSolver.h
468+
highs/ipm/hipo/ipm/Parameters.h
469+
highs/ipm/hipo/ipm/Control.h
470+
highs/ipm/hipo/ipm/Info.h
471+
highs/ipm/hipo/ipm/Iterate.h
472+
highs/ipm/hipo/ipm/LinearSolver.h
473+
highs/ipm/hipo/ipm/LogHighs.h
474+
highs/ipm/hipo/ipm/Model.h
475+
highs/ipm/hipo/ipm/Options.h
476+
highs/ipm/hipo/ipm/Solver.h
477+
highs/ipm/hipo/ipm/Status.h
478+
highs/ipm/hipo/HipoCApi.h)
479+
480+
set(factor_highs_sources
481+
highs/ipm/hipo/factorhighs/Analyse.cpp
482+
highs/ipm/hipo/factorhighs/CallAndTimeBlas.cpp
483+
highs/ipm/hipo/factorhighs/CliqueStack.cpp
484+
highs/ipm/hipo/factorhighs/DataCollector.cpp
485+
highs/ipm/hipo/factorhighs/DenseFactHybrid.cpp
486+
highs/ipm/hipo/factorhighs/DenseFactKernel.cpp
487+
highs/ipm/hipo/factorhighs/DgemmParallel.cpp
488+
highs/ipm/hipo/factorhighs/FactorHiGHS.cpp
489+
highs/ipm/hipo/factorhighs/Factorise.cpp
490+
highs/ipm/hipo/factorhighs/FormatHandler.cpp
491+
highs/ipm/hipo/factorhighs/HybridHybridFormatHandler.cpp
492+
highs/ipm/hipo/factorhighs/HybridSolveHandler.cpp
493+
highs/ipm/hipo/factorhighs/KrylovMethodsIpm.cpp
494+
highs/ipm/hipo/factorhighs/Numeric.cpp
495+
highs/ipm/hipo/factorhighs/SolveHandler.cpp
496+
highs/ipm/hipo/factorhighs/Swaps.cpp
497+
highs/ipm/hipo/factorhighs/Symbolic.cpp)
498+
499+
set(factor_highs_headers
500+
highs/ipm/hipo/factorhighs/Analyse.h
501+
highs/ipm/hipo/factorhighs/CallAndTimeBlas.h
502+
highs/ipm/hipo/factorhighs/CliqueStack.h
503+
highs/ipm/hipo/factorhighs/DataCollector.h
504+
highs/ipm/hipo/factorhighs/DenseFact.h
505+
highs/ipm/hipo/factorhighs/DgemmParallel.h
506+
highs/ipm/hipo/factorhighs/FactorHiGHS.h
507+
highs/ipm/hipo/factorhighs/FactorHiGHSSettings.h
508+
highs/ipm/hipo/factorhighs/Factorise.h
509+
highs/ipm/hipo/factorhighs/FormatHandler.h
510+
highs/ipm/hipo/factorhighs/HybridHybridFormatHandler.h
511+
highs/ipm/hipo/factorhighs/HybridSolveHandler.h
512+
highs/ipm/hipo/factorhighs/KrylovMethodsIpm.h
513+
highs/ipm/hipo/factorhighs/Numeric.h
514+
highs/ipm/hipo/factorhighs/ReturnValues.h
515+
highs/ipm/hipo/factorhighs/SolveHandler.h
516+
highs/ipm/hipo/factorhighs/Swaps.h
517+
highs/ipm/hipo/factorhighs/Symbolic.h
518+
highs/ipm/hipo/factorhighs/Timing.h)
519+
520+
set(hipo_util_sources
521+
highs/ipm/hipo/auxiliary/Auxiliary.cpp
522+
highs/ipm/hipo/auxiliary/KrylovMethods.cpp
523+
highs/ipm/hipo/auxiliary/Log.cpp
524+
highs/ipm/hipo/auxiliary/VectorOperations.cpp)
525+
526+
set(hipo_util_headers
527+
highs/ipm/hipo/auxiliary/Auxiliary.h
528+
highs/ipm/hipo/auxiliary/IntConfig.h
529+
highs/ipm/hipo/auxiliary/KrylovMethods.h
530+
highs/ipm/hipo/auxiliary/Log.h
531+
highs/ipm/hipo/auxiliary/mycblas.h
532+
highs/ipm/hipo/auxiliary/VectorOperations.h)
533+
534+
set(hipo_orderings_sources
535+
extern/amd/amd_1.c
536+
extern/amd/amd_2.c
537+
extern/amd/amd_aat.c
538+
extern/amd/amd_control.c
539+
extern/amd/amd_defaults.c
540+
extern/amd/amd_info.c
541+
extern/amd/amd_order.c
542+
extern/amd/amd_post_tree.c
543+
extern/amd/amd_postorder.c
544+
extern/amd/amd_preprocess.c
545+
extern/amd/amd_valid.c
546+
extern/amd/SuiteSparse_config.c
547+
extern/metis/GKlib/error.c
548+
extern/metis/GKlib/mcore.c
549+
extern/metis/GKlib/memory.c
550+
extern/metis/GKlib/random.c
551+
extern/metis/libmetis/auxapi.c
552+
extern/metis/libmetis/balance.c
553+
extern/metis/libmetis/bucketsort.c
554+
extern/metis/libmetis/coarsen.c
555+
extern/metis/libmetis/compress.c
556+
extern/metis/libmetis/contig.c
557+
extern/metis/libmetis/fm.c
558+
extern/metis/libmetis/gklib.c
559+
extern/metis/libmetis/graph.c
560+
extern/metis/libmetis/initpart.c
561+
extern/metis/libmetis/mcutil.c
562+
extern/metis/libmetis/mmd.c
563+
extern/metis/libmetis/ometis.c
564+
extern/metis/libmetis/options.c
565+
extern/metis/libmetis/refine.c
566+
extern/metis/libmetis/separator.c
567+
extern/metis/libmetis/sfm.c
568+
extern/metis/libmetis/srefine.c
569+
extern/metis/libmetis/util.c
570+
extern/metis/libmetis/wspace.c
571+
extern/rcm/rcm.cpp)
572+
573+
set(hipo_orderings_headers
574+
extern/amd/amd_internal.h
575+
extern/amd/amd.h
576+
extern/amd/SuiteSparse_config.h
577+
extern/metis/GKlib/gk_arch.h
578+
extern/metis/GKlib/gk_defs.h
579+
extern/metis/GKlib/gk_macros.h
580+
extern/metis/GKlib/gk_mkblas.h
581+
extern/metis/GKlib/gk_mkmemory.h
582+
extern/metis/GKlib/gk_mkpqueue.h
583+
extern/metis/GKlib/gk_mkrandom.h
584+
extern/metis/GKlib/gk_mksort.h
585+
extern/metis/GKlib/gk_ms_inttypes.h
586+
extern/metis/GKlib/gk_ms_stat.h
587+
extern/metis/GKlib/gk_ms_stdint.h
588+
extern/metis/GKlib/gk_proto.h
589+
extern/metis/GKlib/gk_struct.h
590+
extern/metis/GKlib/gk_types.h
591+
extern/metis/GKlib/GKlib.h
592+
extern/metis/libmetis/defs.h
593+
extern/metis/libmetis/gklib_defs.h
594+
extern/metis/libmetis/macros.h
595+
extern/metis/libmetis/metislib.h
596+
extern/metis/libmetis/proto.h
597+
extern/metis/libmetis/stdheaders.h
598+
extern/metis/libmetis/struct.h
599+
extern/metis/metis.h
600+
extern/rcm/rcm.h)

cmake/sources.cmake

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ set(hipo_sources
185185
ipm/hipo/ipm/LogHighs.cpp
186186
ipm/hipo/ipm/Model.cpp
187187
ipm/hipo/ipm/Refine.cpp
188-
ipm/hipo/ipm/Solver.cpp)
188+
ipm/hipo/ipm/Solver.cpp
189+
ipm/hipo/HipoCApi.cpp)
189190

190191
set(hipo_headers
191192
ipm/hipo/ipm/CurtisReidScaling.h
@@ -200,7 +201,8 @@ set(hipo_headers
200201
ipm/hipo/ipm/Model.h
201202
ipm/hipo/ipm/Options.h
202203
ipm/hipo/ipm/Solver.h
203-
ipm/hipo/ipm/Status.h)
204+
ipm/hipo/ipm/Status.h
205+
ipm/hipo/HipoCApi.h)
204206

205207
set(factor_highs_sources
206208
ipm/hipo/factorhighs/Analyse.cpp
@@ -436,7 +438,8 @@ set(highs_sources
436438
util/HighsUtils.cpp
437439
util/HSet.cpp
438440
util/HVectorBase.cpp
439-
util/stringutil.cpp)
441+
util/stringutil.cpp
442+
lp_data/DynamicHipoLoader.cpp)
440443

441444
# add catch header?
442445
set(highs_headers
@@ -477,6 +480,7 @@ set(highs_headers
477480
lp_data/HighsSolve.h
478481
lp_data/HighsStatus.h
479482
lp_data/HStruct.h
483+
lp_data/DynamicHipoLoader.h
480484
mip/feasibilityjump.hh
481485
mip/HighsCliqueTable.h
482486
mip/HighsConflictPool.h

0 commit comments

Comments
 (0)