lpsolver 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1165) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/README.md +70 -26
  4. data/ext/lpsolver/Makefile +273 -0
  5. data/ext/lpsolver/ext.c +353 -0
  6. data/ext/lpsolver/ext.o +0 -0
  7. data/ext/lpsolver/extconf.rb +79 -0
  8. data/ext/lpsolver/native.so +0 -0
  9. data/ext/lpsolver-highs/AUTHORS +7 -0
  10. data/ext/lpsolver-highs/BUILD.bazel +243 -0
  11. data/ext/lpsolver-highs/CITATION.cff +29 -0
  12. data/ext/lpsolver-highs/CMakeCache.txt +406 -0
  13. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CMakeCCompiler.cmake +81 -0
  14. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CMakeCXXCompiler.cmake +101 -0
  15. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CMakeDetermineCompilerABI_C.bin +0 -0
  16. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CMakeDetermineCompilerABI_CXX.bin +0 -0
  17. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CMakeSystem.cmake +15 -0
  18. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CompilerIdC/CMakeCCompilerId.c +904 -0
  19. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CompilerIdC/a.out +0 -0
  20. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CompilerIdCXX/CMakeCXXCompilerId.cpp +919 -0
  21. data/ext/lpsolver-highs/CMakeFiles/3.31.4/CompilerIdCXX/a.out +0 -0
  22. data/ext/lpsolver-highs/CMakeFiles/CMakeConfigureLog.yaml +576 -0
  23. data/ext/lpsolver-highs/CMakeFiles/cmake.check_cache +1 -0
  24. data/ext/lpsolver-highs/CMakeLists.txt +983 -0
  25. data/ext/lpsolver-highs/CODE_OF_CONDUCT.md +128 -0
  26. data/ext/lpsolver-highs/CONTRIBUTING.md +31 -0
  27. data/ext/lpsolver-highs/FEATURES.md +61 -0
  28. data/ext/lpsolver-highs/LICENSE.txt +21 -0
  29. data/ext/lpsolver-highs/MODULE.bazel +38 -0
  30. data/ext/lpsolver-highs/README.md +281 -0
  31. data/ext/lpsolver-highs/THIRD_PARTY_NOTICES.md +78 -0
  32. data/ext/lpsolver-highs/Version.txt +4 -0
  33. data/ext/lpsolver-highs/WORKSPACE +33 -0
  34. data/ext/lpsolver-highs/app/CMakeLists.txt +110 -0
  35. data/ext/lpsolver-highs/app/HighsRuntimeOptions.h +292 -0
  36. data/ext/lpsolver-highs/app/RunHighs.cpp +147 -0
  37. data/ext/lpsolver-highs/app/highs_webdemo_shell.html +73 -0
  38. data/ext/lpsolver-highs/build/bin/highs +0 -0
  39. data/ext/lpsolver-highs/build/include/highs/HConfig.h +22 -0
  40. data/ext/lpsolver-highs/build/include/highs/Highs.h +1812 -0
  41. data/ext/lpsolver-highs/build/include/highs/interfaces/highs_c_api.h +2651 -0
  42. data/ext/lpsolver-highs/build/include/highs/io/Filereader.h +45 -0
  43. data/ext/lpsolver-highs/build/include/highs/io/FilereaderLp.h +49 -0
  44. data/ext/lpsolver-highs/build/include/highs/io/FilereaderMps.h +27 -0
  45. data/ext/lpsolver-highs/build/include/highs/io/HMPSIO.h +78 -0
  46. data/ext/lpsolver-highs/build/include/highs/io/HMpsFF.h +245 -0
  47. data/ext/lpsolver-highs/build/include/highs/io/HighsIO.h +118 -0
  48. data/ext/lpsolver-highs/build/include/highs/io/LoadOptions.h +24 -0
  49. data/ext/lpsolver-highs/build/include/highs/io/filereaderlp/builder.hpp +25 -0
  50. data/ext/lpsolver-highs/build/include/highs/io/filereaderlp/def.hpp +19 -0
  51. data/ext/lpsolver-highs/build/include/highs/io/filereaderlp/model.hpp +68 -0
  52. data/ext/lpsolver-highs/build/include/highs/io/filereaderlp/reader.hpp +10 -0
  53. data/ext/lpsolver-highs/build/include/highs/ipm/IpxSolution.h +32 -0
  54. data/ext/lpsolver-highs/build/include/highs/ipm/IpxWrapper.h +106 -0
  55. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu.h +161 -0
  56. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_factorize.h +247 -0
  57. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_get_factors.h +108 -0
  58. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_initialize.h +119 -0
  59. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_factorize.h +34 -0
  60. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_free.h +19 -0
  61. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_get_factors.h +34 -0
  62. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_initialize.h +46 -0
  63. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_solve_dense.h +29 -0
  64. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_solve_for_update.h +42 -0
  65. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_solve_sparse.h +32 -0
  66. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_obj_update.h +31 -0
  67. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_object.h +30 -0
  68. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_solve_dense.h +75 -0
  69. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_solve_for_update.h +169 -0
  70. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_solve_sparse.h +112 -0
  71. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/basiclu_update.h +125 -0
  72. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/lu_def.h +39 -0
  73. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/lu_file.h +21 -0
  74. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/lu_internal.h +220 -0
  75. data/ext/lpsolver-highs/build/include/highs/ipm/basiclu/lu_list.h +173 -0
  76. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/basiclu_kernel.h +20 -0
  77. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/basiclu_wrapper.h +47 -0
  78. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/basis.h +350 -0
  79. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/conjugate_residuals.h +74 -0
  80. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/control.h +167 -0
  81. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/crossover.h +157 -0
  82. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/diagonal_precond.h +45 -0
  83. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/forrest_tomlin.h +102 -0
  84. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/guess_basis.h +21 -0
  85. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/indexed_vector.h +113 -0
  86. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/info.h +27 -0
  87. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/ipm.h +94 -0
  88. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/ipx_c.h +47 -0
  89. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/ipx_config.h +9 -0
  90. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/ipx_info.h +111 -0
  91. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/ipx_internal.h +89 -0
  92. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/ipx_parameters.h +76 -0
  93. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/ipx_status.h +57 -0
  94. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/iterate.h +331 -0
  95. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/kkt_solver.h +70 -0
  96. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/kkt_solver_basis.h +66 -0
  97. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/kkt_solver_diag.h +48 -0
  98. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/linear_operator.h +26 -0
  99. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/lp_solver.h +204 -0
  100. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/lu_factorization.h +79 -0
  101. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/lu_update.h +129 -0
  102. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/maxvolume.h +54 -0
  103. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/model.h +413 -0
  104. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/multistream.h +52 -0
  105. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/normal_matrix.h +44 -0
  106. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/power_method.h +44 -0
  107. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/sparse_matrix.h +195 -0
  108. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/sparse_utils.h +58 -0
  109. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/splitted_normal_matrix.h +63 -0
  110. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/starting_basis.h +39 -0
  111. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/symbolic_invert.h +29 -0
  112. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/timer.h +25 -0
  113. data/ext/lpsolver-highs/build/include/highs/ipm/ipx/utils.h +37 -0
  114. data/ext/lpsolver-highs/build/include/highs/lp_data/HConst.h +430 -0
  115. data/ext/lpsolver-highs/build/include/highs/lp_data/HStruct.h +213 -0
  116. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsAnalysis.h +23 -0
  117. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsCallback.h +104 -0
  118. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsCallbackStruct.h +70 -0
  119. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsDebug.h +34 -0
  120. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsIis.h +139 -0
  121. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsInfo.h +421 -0
  122. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsInfoDebug.h +27 -0
  123. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsLp.h +97 -0
  124. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsLpSolverObject.h +47 -0
  125. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsLpUtils.h +330 -0
  126. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsModelUtils.h +129 -0
  127. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsOptions.h +1715 -0
  128. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsRanging.h +43 -0
  129. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsSolution.h +179 -0
  130. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsSolutionDebug.h +87 -0
  131. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsSolve.h +29 -0
  132. data/ext/lpsolver-highs/build/include/highs/lp_data/HighsStatus.h +29 -0
  133. data/ext/lpsolver-highs/build/include/highs/mip/HighsCliqueTable.h +329 -0
  134. data/ext/lpsolver-highs/build/include/highs/mip/HighsConflictPool.h +109 -0
  135. data/ext/lpsolver-highs/build/include/highs/mip/HighsCutGeneration.h +108 -0
  136. data/ext/lpsolver-highs/build/include/highs/mip/HighsCutPool.h +168 -0
  137. data/ext/lpsolver-highs/build/include/highs/mip/HighsDebugSol.h +133 -0
  138. data/ext/lpsolver-highs/build/include/highs/mip/HighsDomain.h +657 -0
  139. data/ext/lpsolver-highs/build/include/highs/mip/HighsDomainChange.h +48 -0
  140. data/ext/lpsolver-highs/build/include/highs/mip/HighsDynamicRowMatrix.h +104 -0
  141. data/ext/lpsolver-highs/build/include/highs/mip/HighsGFkSolve.h +439 -0
  142. data/ext/lpsolver-highs/build/include/highs/mip/HighsImplications.h +194 -0
  143. data/ext/lpsolver-highs/build/include/highs/mip/HighsLpAggregator.h +50 -0
  144. data/ext/lpsolver-highs/build/include/highs/mip/HighsLpRelaxation.h +361 -0
  145. data/ext/lpsolver-highs/build/include/highs/mip/HighsMipAnalysis.h +71 -0
  146. data/ext/lpsolver-highs/build/include/highs/mip/HighsMipSolver.h +159 -0
  147. data/ext/lpsolver-highs/build/include/highs/mip/HighsMipSolverData.h +313 -0
  148. data/ext/lpsolver-highs/build/include/highs/mip/HighsModkSeparator.h +60 -0
  149. data/ext/lpsolver-highs/build/include/highs/mip/HighsNodeQueue.h +312 -0
  150. data/ext/lpsolver-highs/build/include/highs/mip/HighsObjectiveFunction.h +71 -0
  151. data/ext/lpsolver-highs/build/include/highs/mip/HighsPathSeparator.h +39 -0
  152. data/ext/lpsolver-highs/build/include/highs/mip/HighsPrimalHeuristics.h +75 -0
  153. data/ext/lpsolver-highs/build/include/highs/mip/HighsPseudocost.h +366 -0
  154. data/ext/lpsolver-highs/build/include/highs/mip/HighsRedcostFixing.h +42 -0
  155. data/ext/lpsolver-highs/build/include/highs/mip/HighsSearch.h +241 -0
  156. data/ext/lpsolver-highs/build/include/highs/mip/HighsSeparation.h +41 -0
  157. data/ext/lpsolver-highs/build/include/highs/mip/HighsSeparator.h +60 -0
  158. data/ext/lpsolver-highs/build/include/highs/mip/HighsTableauSeparator.h +34 -0
  159. data/ext/lpsolver-highs/build/include/highs/mip/HighsTransformedLp.h +63 -0
  160. data/ext/lpsolver-highs/build/include/highs/mip/MipTimer.h +544 -0
  161. data/ext/lpsolver-highs/build/include/highs/mip/feasibilityjump.hh +800 -0
  162. data/ext/lpsolver-highs/build/include/highs/model/HighsHessian.h +54 -0
  163. data/ext/lpsolver-highs/build/include/highs/model/HighsHessianUtils.h +47 -0
  164. data/ext/lpsolver-highs/build/include/highs/model/HighsModel.h +42 -0
  165. data/ext/lpsolver-highs/build/include/highs/parallel/HighsBinarySemaphore.h +108 -0
  166. data/ext/lpsolver-highs/build/include/highs/parallel/HighsCacheAlign.h +82 -0
  167. data/ext/lpsolver-highs/build/include/highs/parallel/HighsCombinable.h +116 -0
  168. data/ext/lpsolver-highs/build/include/highs/parallel/HighsMutex.h +124 -0
  169. data/ext/lpsolver-highs/build/include/highs/parallel/HighsParallel.h +128 -0
  170. data/ext/lpsolver-highs/build/include/highs/parallel/HighsRaceTimer.h +38 -0
  171. data/ext/lpsolver-highs/build/include/highs/parallel/HighsSchedulerConstants.h +19 -0
  172. data/ext/lpsolver-highs/build/include/highs/parallel/HighsSpinMutex.h +48 -0
  173. data/ext/lpsolver-highs/build/include/highs/parallel/HighsSplitDeque.h +606 -0
  174. data/ext/lpsolver-highs/build/include/highs/parallel/HighsTask.h +170 -0
  175. data/ext/lpsolver-highs/build/include/highs/parallel/HighsTaskExecutor.h +217 -0
  176. data/ext/lpsolver-highs/build/include/highs/pdlp/CupdlpWrapper.h +108 -0
  177. data/ext/lpsolver-highs/build/include/highs/pdlp/HiPdlpTimer.h +155 -0
  178. data/ext/lpsolver-highs/build/include/highs/pdlp/HiPdlpWrapper.h +26 -0
  179. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_cs.h +40 -0
  180. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_defs.h +447 -0
  181. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_linalg.h +189 -0
  182. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_proj.h +19 -0
  183. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_restart.h +31 -0
  184. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_scaling.h +26 -0
  185. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_solver.h +105 -0
  186. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_step.h +37 -0
  187. data/ext/lpsolver-highs/build/include/highs/pdlp/cupdlp/cupdlp_utils.c +1850 -0
  188. data/ext/lpsolver-highs/build/include/highs/pdlp/hipdlp/defs.hpp +222 -0
  189. data/ext/lpsolver-highs/build/include/highs/pdlp/hipdlp/linalg.hpp +61 -0
  190. data/ext/lpsolver-highs/build/include/highs/pdlp/hipdlp/logger.hpp +80 -0
  191. data/ext/lpsolver-highs/build/include/highs/pdlp/hipdlp/pdhg.hpp +358 -0
  192. data/ext/lpsolver-highs/build/include/highs/pdlp/hipdlp/restart.hpp +96 -0
  193. data/ext/lpsolver-highs/build/include/highs/pdlp/hipdlp/scaling.hpp +74 -0
  194. data/ext/lpsolver-highs/build/include/highs/pdlp/hipdlp/solver_results.hpp +65 -0
  195. data/ext/lpsolver-highs/build/include/highs/pdqsort/pdqsort.h +532 -0
  196. data/ext/lpsolver-highs/build/include/highs/presolve/HPresolve.h +505 -0
  197. data/ext/lpsolver-highs/build/include/highs/presolve/HPresolveAnalysis.h +52 -0
  198. data/ext/lpsolver-highs/build/include/highs/presolve/HighsPostsolveStack.h +943 -0
  199. data/ext/lpsolver-highs/build/include/highs/presolve/HighsSymmetry.h +284 -0
  200. data/ext/lpsolver-highs/build/include/highs/presolve/ICrash.h +124 -0
  201. data/ext/lpsolver-highs/build/include/highs/presolve/ICrashUtil.h +62 -0
  202. data/ext/lpsolver-highs/build/include/highs/presolve/ICrashX.h +23 -0
  203. data/ext/lpsolver-highs/build/include/highs/presolve/PresolveComponent.h +90 -0
  204. data/ext/lpsolver-highs/build/include/highs/qpsolver/a_asm.hpp +77 -0
  205. data/ext/lpsolver-highs/build/include/highs/qpsolver/a_quass.hpp +22 -0
  206. data/ext/lpsolver-highs/build/include/highs/qpsolver/basis.hpp +159 -0
  207. data/ext/lpsolver-highs/build/include/highs/qpsolver/crashsolution.hpp +20 -0
  208. data/ext/lpsolver-highs/build/include/highs/qpsolver/dantzigpricing.hpp +80 -0
  209. data/ext/lpsolver-highs/build/include/highs/qpsolver/devexpricing.hpp +108 -0
  210. data/ext/lpsolver-highs/build/include/highs/qpsolver/eventhandler.hpp +30 -0
  211. data/ext/lpsolver-highs/build/include/highs/qpsolver/factor.hpp +408 -0
  212. data/ext/lpsolver-highs/build/include/highs/qpsolver/feasibility_bounded.hpp +114 -0
  213. data/ext/lpsolver-highs/build/include/highs/qpsolver/feasibility_highs.hpp +301 -0
  214. data/ext/lpsolver-highs/build/include/highs/qpsolver/gradient.hpp +46 -0
  215. data/ext/lpsolver-highs/build/include/highs/qpsolver/instance.hpp +70 -0
  216. data/ext/lpsolver-highs/build/include/highs/qpsolver/matrix.hpp +342 -0
  217. data/ext/lpsolver-highs/build/include/highs/qpsolver/perturbation.hpp +15 -0
  218. data/ext/lpsolver-highs/build/include/highs/qpsolver/pricing.hpp +22 -0
  219. data/ext/lpsolver-highs/build/include/highs/qpsolver/qpconst.hpp +34 -0
  220. data/ext/lpsolver-highs/build/include/highs/qpsolver/qpvector.hpp +242 -0
  221. data/ext/lpsolver-highs/build/include/highs/qpsolver/quass.hpp +27 -0
  222. data/ext/lpsolver-highs/build/include/highs/qpsolver/ratiotest.hpp +26 -0
  223. data/ext/lpsolver-highs/build/include/highs/qpsolver/runtime.hpp +45 -0
  224. data/ext/lpsolver-highs/build/include/highs/qpsolver/scaling.hpp +15 -0
  225. data/ext/lpsolver-highs/build/include/highs/qpsolver/settings.hpp +84 -0
  226. data/ext/lpsolver-highs/build/include/highs/qpsolver/snippets.hpp +36 -0
  227. data/ext/lpsolver-highs/build/include/highs/qpsolver/statistics.hpp +30 -0
  228. data/ext/lpsolver-highs/build/include/highs/qpsolver/steepestedgepricing.hpp +173 -0
  229. data/ext/lpsolver-highs/build/include/highs/simplex/HApp.h +550 -0
  230. data/ext/lpsolver-highs/build/include/highs/simplex/HEkk.h +419 -0
  231. data/ext/lpsolver-highs/build/include/highs/simplex/HEkkDual.h +513 -0
  232. data/ext/lpsolver-highs/build/include/highs/simplex/HEkkDualRHS.h +134 -0
  233. data/ext/lpsolver-highs/build/include/highs/simplex/HEkkDualRow.h +201 -0
  234. data/ext/lpsolver-highs/build/include/highs/simplex/HEkkPrimal.h +191 -0
  235. data/ext/lpsolver-highs/build/include/highs/simplex/HSimplex.h +42 -0
  236. data/ext/lpsolver-highs/build/include/highs/simplex/HSimplexDebug.h +48 -0
  237. data/ext/lpsolver-highs/build/include/highs/simplex/HSimplexNla.h +158 -0
  238. data/ext/lpsolver-highs/build/include/highs/simplex/HSimplexReport.h +21 -0
  239. data/ext/lpsolver-highs/build/include/highs/simplex/HighsSimplexAnalysis.h +500 -0
  240. data/ext/lpsolver-highs/build/include/highs/simplex/SimplexConst.h +273 -0
  241. data/ext/lpsolver-highs/build/include/highs/simplex/SimplexStruct.h +263 -0
  242. data/ext/lpsolver-highs/build/include/highs/simplex/SimplexTimer.h +414 -0
  243. data/ext/lpsolver-highs/build/include/highs/test_kkt/DevKkt.h +143 -0
  244. data/ext/lpsolver-highs/build/include/highs/test_kkt/KktCh2.h +79 -0
  245. data/ext/lpsolver-highs/build/include/highs/util/FactorTimer.h +199 -0
  246. data/ext/lpsolver-highs/build/include/highs/util/HFactor.h +587 -0
  247. data/ext/lpsolver-highs/build/include/highs/util/HFactorConst.h +81 -0
  248. data/ext/lpsolver-highs/build/include/highs/util/HFactorDebug.h +55 -0
  249. data/ext/lpsolver-highs/build/include/highs/util/HSet.h +89 -0
  250. data/ext/lpsolver-highs/build/include/highs/util/HVector.h +22 -0
  251. data/ext/lpsolver-highs/build/include/highs/util/HVectorBase.h +102 -0
  252. data/ext/lpsolver-highs/build/include/highs/util/HighsCDouble.h +323 -0
  253. data/ext/lpsolver-highs/build/include/highs/util/HighsComponent.h +53 -0
  254. data/ext/lpsolver-highs/build/include/highs/util/HighsDataStack.h +83 -0
  255. data/ext/lpsolver-highs/build/include/highs/util/HighsDisjointSets.h +107 -0
  256. data/ext/lpsolver-highs/build/include/highs/util/HighsHash.h +1274 -0
  257. data/ext/lpsolver-highs/build/include/highs/util/HighsHashTree.h +1461 -0
  258. data/ext/lpsolver-highs/build/include/highs/util/HighsInt.h +36 -0
  259. data/ext/lpsolver-highs/build/include/highs/util/HighsIntegers.h +212 -0
  260. data/ext/lpsolver-highs/build/include/highs/util/HighsLinearSumBounds.h +203 -0
  261. data/ext/lpsolver-highs/build/include/highs/util/HighsMatrixPic.h +37 -0
  262. data/ext/lpsolver-highs/build/include/highs/util/HighsMatrixSlice.h +561 -0
  263. data/ext/lpsolver-highs/build/include/highs/util/HighsMatrixUtils.h +57 -0
  264. data/ext/lpsolver-highs/build/include/highs/util/HighsMemoryAllocation.h +63 -0
  265. data/ext/lpsolver-highs/build/include/highs/util/HighsRandom.h +242 -0
  266. data/ext/lpsolver-highs/build/include/highs/util/HighsRbTree.h +452 -0
  267. data/ext/lpsolver-highs/build/include/highs/util/HighsSort.h +131 -0
  268. data/ext/lpsolver-highs/build/include/highs/util/HighsSparseMatrix.h +151 -0
  269. data/ext/lpsolver-highs/build/include/highs/util/HighsSparseVectorSum.h +95 -0
  270. data/ext/lpsolver-highs/build/include/highs/util/HighsSplay.h +135 -0
  271. data/ext/lpsolver-highs/build/include/highs/util/HighsTimer.h +385 -0
  272. data/ext/lpsolver-highs/build/include/highs/util/HighsUtils.h +272 -0
  273. data/ext/lpsolver-highs/build/include/highs/util/stringutil.h +46 -0
  274. data/ext/lpsolver-highs/build/include/highs/zstr/strict_fstream.hpp +237 -0
  275. data/ext/lpsolver-highs/build/include/highs/zstr/zstr.hpp +473 -0
  276. data/ext/lpsolver-highs/build/include/highs_export.h +43 -0
  277. data/ext/lpsolver-highs/build/lib/cmake/highs/highs-config-version.cmake +65 -0
  278. data/ext/lpsolver-highs/build/lib/cmake/highs/highs-config.cmake +36 -0
  279. data/ext/lpsolver-highs/build/lib/cmake/highs/highs-targets-release.cmake +19 -0
  280. data/ext/lpsolver-highs/build/lib/cmake/highs/highs-targets.cmake +111 -0
  281. data/ext/lpsolver-highs/build/lib/libhighs.a +0 -0
  282. data/ext/lpsolver-highs/build/lib/pkgconfig/highs.pc +12 -0
  283. data/ext/lpsolver-highs/build/share/doc/HIGHS/AUTHORS +7 -0
  284. data/ext/lpsolver-highs/build/share/doc/HIGHS/CITATION.cff +29 -0
  285. data/ext/lpsolver-highs/build/share/doc/HIGHS/CODE_OF_CONDUCT.md +128 -0
  286. data/ext/lpsolver-highs/build/share/doc/HIGHS/CONTRIBUTING.md +31 -0
  287. data/ext/lpsolver-highs/build/share/doc/HIGHS/FEATURES.md +61 -0
  288. data/ext/lpsolver-highs/build/share/doc/HIGHS/LICENSE.txt +21 -0
  289. data/ext/lpsolver-highs/build/share/doc/HIGHS/README.md +281 -0
  290. data/ext/lpsolver-highs/build_webdemo.sh +46 -0
  291. data/ext/lpsolver-highs/check/Avgas.cpp +245 -0
  292. data/ext/lpsolver-highs/check/Avgas.h +44 -0
  293. data/ext/lpsolver-highs/check/CMakeLists.txt +573 -0
  294. data/ext/lpsolver-highs/check/HCheckConfig.h.bazel.in +6 -0
  295. data/ext/lpsolver-highs/check/HCheckConfig.h.in +12 -0
  296. data/ext/lpsolver-highs/check/HCheckConfig.h.meson.in +6 -0
  297. data/ext/lpsolver-highs/check/SpecialLps.h +405 -0
  298. data/ext/lpsolver-highs/check/TestAlienBasis.cpp +720 -0
  299. data/ext/lpsolver-highs/check/TestBasis.cpp +359 -0
  300. data/ext/lpsolver-highs/check/TestBasisSolves.cpp +669 -0
  301. data/ext/lpsolver-highs/check/TestCAPI.c +2513 -0
  302. data/ext/lpsolver-highs/check/TestCallbacks.cpp +608 -0
  303. data/ext/lpsolver-highs/check/TestCheckSolution.cpp +740 -0
  304. data/ext/lpsolver-highs/check/TestCrossover.cpp +111 -0
  305. data/ext/lpsolver-highs/check/TestDualize.cpp +172 -0
  306. data/ext/lpsolver-highs/check/TestEkk.cpp +100 -0
  307. data/ext/lpsolver-highs/check/TestFactor.cpp +389 -0
  308. data/ext/lpsolver-highs/check/TestFilereader.cpp +568 -0
  309. data/ext/lpsolver-highs/check/TestFortranAPI.f90 +65 -0
  310. data/ext/lpsolver-highs/check/TestHSet.cpp +80 -0
  311. data/ext/lpsolver-highs/check/TestHighsCDouble.cpp +109 -0
  312. data/ext/lpsolver-highs/check/TestHighsGFkSolve.cpp +102 -0
  313. data/ext/lpsolver-highs/check/TestHighsHash.cpp +126 -0
  314. data/ext/lpsolver-highs/check/TestHighsHessian.cpp +329 -0
  315. data/ext/lpsolver-highs/check/TestHighsIntegers.cpp +42 -0
  316. data/ext/lpsolver-highs/check/TestHighsModel.cpp +134 -0
  317. data/ext/lpsolver-highs/check/TestHighsParallel.cpp +277 -0
  318. data/ext/lpsolver-highs/check/TestHighsRbTree.cpp +109 -0
  319. data/ext/lpsolver-highs/check/TestHighsSparseMatrix.cpp +126 -0
  320. data/ext/lpsolver-highs/check/TestHighsVersion.cpp +61 -0
  321. data/ext/lpsolver-highs/check/TestHipo.cpp +122 -0
  322. data/ext/lpsolver-highs/check/TestICrash.cpp +46 -0
  323. data/ext/lpsolver-highs/check/TestIO.cpp +163 -0
  324. data/ext/lpsolver-highs/check/TestIis.cpp +1063 -0
  325. data/ext/lpsolver-highs/check/TestInfo.cpp +116 -0
  326. data/ext/lpsolver-highs/check/TestIpm.cpp +226 -0
  327. data/ext/lpsolver-highs/check/TestIpx.cpp +96 -0
  328. data/ext/lpsolver-highs/check/TestLPFileFormat.cpp +22 -0
  329. data/ext/lpsolver-highs/check/TestLogging.cpp +69 -0
  330. data/ext/lpsolver-highs/check/TestLpModification.cpp +2497 -0
  331. data/ext/lpsolver-highs/check/TestLpOrientation.cpp +121 -0
  332. data/ext/lpsolver-highs/check/TestLpSolvers.cpp +555 -0
  333. data/ext/lpsolver-highs/check/TestLpValidation.cpp +689 -0
  334. data/ext/lpsolver-highs/check/TestMain.cpp +6 -0
  335. data/ext/lpsolver-highs/check/TestMipSolver.cpp +1406 -0
  336. data/ext/lpsolver-highs/check/TestModelProperties.cpp +143 -0
  337. data/ext/lpsolver-highs/check/TestMultiObjective.cpp +198 -0
  338. data/ext/lpsolver-highs/check/TestNames.cpp +187 -0
  339. data/ext/lpsolver-highs/check/TestOptions.cpp +544 -0
  340. data/ext/lpsolver-highs/check/TestPdlp.cpp +327 -0
  341. data/ext/lpsolver-highs/check/TestPdlpHi.cpp +40 -0
  342. data/ext/lpsolver-highs/check/TestPresolve.cpp +912 -0
  343. data/ext/lpsolver-highs/check/TestQpSolver.cpp +1345 -0
  344. data/ext/lpsolver-highs/check/TestRanging.cpp +558 -0
  345. data/ext/lpsolver-highs/check/TestRays.cpp +1010 -0
  346. data/ext/lpsolver-highs/check/TestSemiVariables.cpp +329 -0
  347. data/ext/lpsolver-highs/check/TestSetup.cpp +12 -0
  348. data/ext/lpsolver-highs/check/TestSort.cpp +247 -0
  349. data/ext/lpsolver-highs/check/TestSpecialLps.cpp +775 -0
  350. data/ext/lpsolver-highs/check/TestThrow.cpp +83 -0
  351. data/ext/lpsolver-highs/check/TestTspSolver.cpp +19 -0
  352. data/ext/lpsolver-highs/check/TestUserScale.cpp +444 -0
  353. data/ext/lpsolver-highs/check/cublas_example.cpp +76 -0
  354. data/ext/lpsolver-highs/check/cublas_gpu_start.cpp +88 -0
  355. data/ext/lpsolver-highs/check/hipo_test_option_files/hipo_options_0 +1 -0
  356. data/ext/lpsolver-highs/check/instances/1448.lp +1 -0
  357. data/ext/lpsolver-highs/check/instances/1449a.lp +1 -0
  358. data/ext/lpsolver-highs/check/instances/1449b.lp +1 -0
  359. data/ext/lpsolver-highs/check/instances/1451.lp +8 -0
  360. data/ext/lpsolver-highs/check/instances/2122.lp +1822 -0
  361. data/ext/lpsolver-highs/check/instances/2171.mps +717 -0
  362. data/ext/lpsolver-highs/check/instances/25fv47.mps +6919 -0
  363. data/ext/lpsolver-highs/check/instances/2821-duplicate.mps +31 -0
  364. data/ext/lpsolver-highs/check/instances/2821-qmatrix.mps +31 -0
  365. data/ext/lpsolver-highs/check/instances/2821-quadobj.mps +29 -0
  366. data/ext/lpsolver-highs/check/instances/2821-summation.mps +30 -0
  367. data/ext/lpsolver-highs/check/instances/2821.mps +29 -0
  368. data/ext/lpsolver-highs/check/instances/2894.mps +89 -0
  369. data/ext/lpsolver-highs/check/instances/80bau3b.mps +23732 -0
  370. data/ext/lpsolver-highs/check/instances/WithInf.set +3 -0
  371. data/ext/lpsolver-highs/check/instances/adlittle.mps +335 -0
  372. data/ext/lpsolver-highs/check/instances/afiro.mps +83 -0
  373. data/ext/lpsolver-highs/check/instances/avgas.mps +51 -0
  374. data/ext/lpsolver-highs/check/instances/bell5.mps +384 -0
  375. data/ext/lpsolver-highs/check/instances/bgetam.mps +2112 -0
  376. data/ext/lpsolver-highs/check/instances/blending.mps +13 -0
  377. data/ext/lpsolver-highs/check/instances/box1.mps +1085 -0
  378. data/ext/lpsolver-highs/check/instances/chip.mps +13 -0
  379. data/ext/lpsolver-highs/check/instances/comment.mps +23 -0
  380. data/ext/lpsolver-highs/check/instances/cplex1.mps +9674 -0
  381. data/ext/lpsolver-highs/check/instances/dD2e.mps +10 -0
  382. data/ext/lpsolver-highs/check/instances/dcmulti.mps +2310 -0
  383. data/ext/lpsolver-highs/check/instances/e226.mps +1733 -0
  384. data/ext/lpsolver-highs/check/instances/egout-ac.mps +473 -0
  385. data/ext/lpsolver-highs/check/instances/egout.mps +403 -0
  386. data/ext/lpsolver-highs/check/instances/etamacro.mps +2084 -0
  387. data/ext/lpsolver-highs/check/instances/ex72a.mps +849 -0
  388. data/ext/lpsolver-highs/check/instances/fixed-binary.lp +11 -0
  389. data/ext/lpsolver-highs/check/instances/flugpl.mps +111 -0
  390. data/ext/lpsolver-highs/check/instances/flugpl_illegal_integer.sol +24 -0
  391. data/ext/lpsolver-highs/check/instances/flugpl_integer.sol +25 -0
  392. data/ext/lpsolver-highs/check/instances/forest6.mps +261 -0
  393. data/ext/lpsolver-highs/check/instances/galenet.mps +34 -0
  394. data/ext/lpsolver-highs/check/instances/gams10am.mps +478 -0
  395. data/ext/lpsolver-highs/check/instances/garbage.ems +3 -0
  396. data/ext/lpsolver-highs/check/instances/garbage.lp +3 -0
  397. data/ext/lpsolver-highs/check/instances/garbage.mps +3 -0
  398. data/ext/lpsolver-highs/check/instances/gas11.mps +2924 -0
  399. data/ext/lpsolver-highs/check/instances/gesa2.mps +5459 -0
  400. data/ext/lpsolver-highs/check/instances/greenbea.mps +19215 -0
  401. data/ext/lpsolver-highs/check/instances/gt2.mps +534 -0
  402. data/ext/lpsolver-highs/check/instances/infeasible-mip0.mps +140 -0
  403. data/ext/lpsolver-highs/check/instances/infeasible-mip1.mps +371 -0
  404. data/ext/lpsolver-highs/check/instances/israel.mps +1490 -0
  405. data/ext/lpsolver-highs/check/instances/issue-2095.mps +836 -0
  406. data/ext/lpsolver-highs/check/instances/issue-2173.mps +3331 -0
  407. data/ext/lpsolver-highs/check/instances/issue-2204.mps +143 -0
  408. data/ext/lpsolver-highs/check/instances/issue-2290.mps +158 -0
  409. data/ext/lpsolver-highs/check/instances/issue-2388.lp +76 -0
  410. data/ext/lpsolver-highs/check/instances/issue-2402.mps +435 -0
  411. data/ext/lpsolver-highs/check/instances/issue-2446.mps +9154 -0
  412. data/ext/lpsolver-highs/check/instances/issue-2585.lp +16 -0
  413. data/ext/lpsolver-highs/check/instances/issue-2874-3.mps +97 -0
  414. data/ext/lpsolver-highs/check/instances/klein1.mps +422 -0
  415. data/ext/lpsolver-highs/check/instances/lseu.mps +371 -0
  416. data/ext/lpsolver-highs/check/instances/model.xyz +1 -0
  417. data/ext/lpsolver-highs/check/instances/nan0.mps +13 -0
  418. data/ext/lpsolver-highs/check/instances/nan1.mps +13 -0
  419. data/ext/lpsolver-highs/check/instances/nan2.mps +13 -0
  420. data/ext/lpsolver-highs/check/instances/no-newline-eof.lp +5 -0
  421. data/ext/lpsolver-highs/check/instances/p01.mps +909 -0
  422. data/ext/lpsolver-highs/check/instances/p0548.mps +1992 -0
  423. data/ext/lpsolver-highs/check/instances/primal1.mps +3909 -0
  424. data/ext/lpsolver-highs/check/instances/qap04.mps +606 -0
  425. data/ext/lpsolver-highs/check/instances/qcqp.lp +8 -0
  426. data/ext/lpsolver-highs/check/instances/qjh.lp +9 -0
  427. data/ext/lpsolver-highs/check/instances/qjh.mps +18 -0
  428. data/ext/lpsolver-highs/check/instances/qjh_qmatrix.mps +19 -0
  429. data/ext/lpsolver-highs/check/instances/qjh_quadobj.mps +18 -0
  430. data/ext/lpsolver-highs/check/instances/qjh_quadobj_qmatrix.mps +25 -0
  431. data/ext/lpsolver-highs/check/instances/qjh_uncon.lp +10 -0
  432. data/ext/lpsolver-highs/check/instances/qjh_uncon.mps +17 -0
  433. data/ext/lpsolver-highs/check/instances/qpinfeasible.lp +8 -0
  434. data/ext/lpsolver-highs/check/instances/qptestnw.lp +7 -0
  435. data/ext/lpsolver-highs/check/instances/qpunbounded.lp +5 -0
  436. data/ext/lpsolver-highs/check/instances/refinery.mps +1882 -0
  437. data/ext/lpsolver-highs/check/instances/rgn.mps +559 -0
  438. data/ext/lpsolver-highs/check/instances/scrs8.mps +2717 -0
  439. data/ext/lpsolver-highs/check/instances/sctest.mps +66 -0
  440. data/ext/lpsolver-highs/check/instances/semi-continuous.lp +13 -0
  441. data/ext/lpsolver-highs/check/instances/semi-continuous.mps +24 -0
  442. data/ext/lpsolver-highs/check/instances/semi-integer.lp +15 -0
  443. data/ext/lpsolver-highs/check/instances/semi-integer.mps +22 -0
  444. data/ext/lpsolver-highs/check/instances/shell.mps +4039 -0
  445. data/ext/lpsolver-highs/check/instances/silly-names.mps +14 -0
  446. data/ext/lpsolver-highs/check/instances/small_mip.mps +87 -0
  447. data/ext/lpsolver-highs/check/instances/smalllp.mps +21 -0
  448. data/ext/lpsolver-highs/check/instances/sp150x300d.mps +1983 -0
  449. data/ext/lpsolver-highs/check/instances/stair.mps +2499 -0
  450. data/ext/lpsolver-highs/check/instances/standata.mps +2317 -0
  451. data/ext/lpsolver-highs/check/instances/standgub.mps +2428 -0
  452. data/ext/lpsolver-highs/check/instances/standmps.mps +2695 -0
  453. data/ext/lpsolver-highs/check/instances/test.mps +53 -0
  454. data/ext/lpsolver-highs/check/instances/vol1.mps +1895 -0
  455. data/ext/lpsolver-highs/check/instances/warnings.mps +68 -0
  456. data/ext/lpsolver-highs/check/instances/woodinfe.mps +216 -0
  457. data/ext/lpsolver-highs/check/matrix_multiplication.hpp +49 -0
  458. data/ext/lpsolver-highs/check/meson.build +92 -0
  459. data/ext/lpsolver-highs/check/pythontest.py +11 -0
  460. data/ext/lpsolver-highs/check/sample_options_file +8 -0
  461. data/ext/lpsolver-highs/cmake/CheckAtomic.cmake +74 -0
  462. data/ext/lpsolver-highs/cmake/FindCUDAConf.cmake +44 -0
  463. data/ext/lpsolver-highs/cmake/FindHipoDeps.cmake +351 -0
  464. data/ext/lpsolver-highs/cmake/README.md +243 -0
  465. data/ext/lpsolver-highs/cmake/cpp-highs.cmake +243 -0
  466. data/ext/lpsolver-highs/cmake/dotnet.cmake +94 -0
  467. data/ext/lpsolver-highs/cmake/highs-config.cmake.in +22 -0
  468. data/ext/lpsolver-highs/cmake/python-highs.cmake +74 -0
  469. data/ext/lpsolver-highs/cmake/set-version.cmake +26 -0
  470. data/ext/lpsolver-highs/cmake/sources-python.cmake +461 -0
  471. data/ext/lpsolver-highs/cmake/sources.cmake +618 -0
  472. data/ext/lpsolver-highs/docs/HiGHS_CopyrightHeader.pl +78 -0
  473. data/ext/lpsolver-highs/docs/HiGHS_CopyrightHeaderUpdateAll +32 -0
  474. data/ext/lpsolver-highs/docs/Project.toml +7 -0
  475. data/ext/lpsolver-highs/docs/README.md +27 -0
  476. data/ext/lpsolver-highs/docs/c_api_gen/HConfig.h +1 -0
  477. data/ext/lpsolver-highs/docs/c_api_gen/build.jl +48 -0
  478. data/ext/lpsolver-highs/docs/make.jl +115 -0
  479. data/ext/lpsolver-highs/docs/src/assets/logo.png +0 -0
  480. data/ext/lpsolver-highs/docs/src/callbacks.md +171 -0
  481. data/ext/lpsolver-highs/docs/src/executable.md +88 -0
  482. data/ext/lpsolver-highs/docs/src/guide/advanced.md +66 -0
  483. data/ext/lpsolver-highs/docs/src/guide/basic.md +116 -0
  484. data/ext/lpsolver-highs/docs/src/guide/further.md +193 -0
  485. data/ext/lpsolver-highs/docs/src/guide/gpu.md +58 -0
  486. data/ext/lpsolver-highs/docs/src/guide/index.md +18 -0
  487. data/ext/lpsolver-highs/docs/src/guide/kkt.md +219 -0
  488. data/ext/lpsolver-highs/docs/src/guide/numerics.md +55 -0
  489. data/ext/lpsolver-highs/docs/src/index.md +86 -0
  490. data/ext/lpsolver-highs/docs/src/installation.md +130 -0
  491. data/ext/lpsolver-highs/docs/src/interfaces/c_api.md +6 -0
  492. data/ext/lpsolver-highs/docs/src/interfaces/cpp/examples.md +1 -0
  493. data/ext/lpsolver-highs/docs/src/interfaces/cpp/index.md +29 -0
  494. data/ext/lpsolver-highs/docs/src/interfaces/cpp/library.md +107 -0
  495. data/ext/lpsolver-highs/docs/src/interfaces/csharp.md +55 -0
  496. data/ext/lpsolver-highs/docs/src/interfaces/fortran.md +11 -0
  497. data/ext/lpsolver-highs/docs/src/interfaces/julia/index.md +130 -0
  498. data/ext/lpsolver-highs/docs/src/interfaces/other.md +41 -0
  499. data/ext/lpsolver-highs/docs/src/interfaces/python/example-py.md +275 -0
  500. data/ext/lpsolver-highs/docs/src/interfaces/python/index.md +91 -0
  501. data/ext/lpsolver-highs/docs/src/interfaces/python/model-py.md +90 -0
  502. data/ext/lpsolver-highs/docs/src/options/definitions.md +529 -0
  503. data/ext/lpsolver-highs/docs/src/options/intro.md +46 -0
  504. data/ext/lpsolver-highs/docs/src/parallel.md +88 -0
  505. data/ext/lpsolver-highs/docs/src/solvers.md +168 -0
  506. data/ext/lpsolver-highs/docs/src/structures/classes/HighsHessian.md +9 -0
  507. data/ext/lpsolver-highs/docs/src/structures/classes/HighsIis.md +16 -0
  508. data/ext/lpsolver-highs/docs/src/structures/classes/HighsLp.md +19 -0
  509. data/ext/lpsolver-highs/docs/src/structures/classes/HighsModel.md +6 -0
  510. data/ext/lpsolver-highs/docs/src/structures/classes/HighsSparseMatrix.md +10 -0
  511. data/ext/lpsolver-highs/docs/src/structures/classes/index.md +11 -0
  512. data/ext/lpsolver-highs/docs/src/structures/enums.md +114 -0
  513. data/ext/lpsolver-highs/docs/src/structures/index.md +12 -0
  514. data/ext/lpsolver-highs/docs/src/structures/structs/HighsBasis.md +8 -0
  515. data/ext/lpsolver-highs/docs/src/structures/structs/HighsInfo.md +148 -0
  516. data/ext/lpsolver-highs/docs/src/structures/structs/HighsLinearObjective.md +11 -0
  517. data/ext/lpsolver-highs/docs/src/structures/structs/HighsSolution.md +10 -0
  518. data/ext/lpsolver-highs/docs/src/structures/structs/index.md +10 -0
  519. data/ext/lpsolver-highs/docs/src/terminology.md +163 -0
  520. data/ext/lpsolver-highs/examples/CMakeLists.txt +26 -0
  521. data/ext/lpsolver-highs/examples/Docs.py +104 -0
  522. data/ext/lpsolver-highs/examples/branch-and-price.py +465 -0
  523. data/ext/lpsolver-highs/examples/call_highs_from_c.c +685 -0
  524. data/ext/lpsolver-highs/examples/call_highs_from_c_minimal.c +659 -0
  525. data/ext/lpsolver-highs/examples/call_highs_from_cpp.cpp +178 -0
  526. data/ext/lpsolver-highs/examples/call_highs_from_csharp.cs +83 -0
  527. data/ext/lpsolver-highs/examples/call_highs_from_fortran.f90 +579 -0
  528. data/ext/lpsolver-highs/examples/call_highs_from_python.py +448 -0
  529. data/ext/lpsolver-highs/examples/call_highs_from_python_highspy.py +71 -0
  530. data/ext/lpsolver-highs/examples/call_highs_from_python_mps.py +59 -0
  531. data/ext/lpsolver-highs/examples/callback_gap.py +71 -0
  532. data/ext/lpsolver-highs/examples/chip.py +43 -0
  533. data/ext/lpsolver-highs/examples/chip0.py +29 -0
  534. data/ext/lpsolver-highs/examples/distillation.py +77 -0
  535. data/ext/lpsolver-highs/examples/knapsack.py +43 -0
  536. data/ext/lpsolver-highs/examples/minimal.py +11 -0
  537. data/ext/lpsolver-highs/examples/multi_objective.py +139 -0
  538. data/ext/lpsolver-highs/examples/multiple_objective.py +120 -0
  539. data/ext/lpsolver-highs/examples/network_flow.py +37 -0
  540. data/ext/lpsolver-highs/examples/nqueens.py +29 -0
  541. data/ext/lpsolver-highs/examples/plot_highs_log.py +134 -0
  542. data/ext/lpsolver-highs/extern/CLI11.hpp +11546 -0
  543. data/ext/lpsolver-highs/extern/LICENCE_1_0.txt +23 -0
  544. data/ext/lpsolver-highs/extern/amd/License.txt +35 -0
  545. data/ext/lpsolver-highs/extern/amd/SuiteSparse_config.c +54 -0
  546. data/ext/lpsolver-highs/extern/amd/SuiteSparse_config.h +56 -0
  547. data/ext/lpsolver-highs/extern/amd/amd.h +357 -0
  548. data/ext/lpsolver-highs/extern/amd/amd_1.c +172 -0
  549. data/ext/lpsolver-highs/extern/amd/amd_2.c +1761 -0
  550. data/ext/lpsolver-highs/extern/amd/amd_aat.c +179 -0
  551. data/ext/lpsolver-highs/extern/amd/amd_control.c +65 -0
  552. data/ext/lpsolver-highs/extern/amd/amd_defaults.c +37 -0
  553. data/ext/lpsolver-highs/extern/amd/amd_info.c +120 -0
  554. data/ext/lpsolver-highs/extern/amd/amd_internal.h +137 -0
  555. data/ext/lpsolver-highs/extern/amd/amd_order.c +195 -0
  556. data/ext/lpsolver-highs/extern/amd/amd_post_tree.c +105 -0
  557. data/ext/lpsolver-highs/extern/amd/amd_postorder.c +140 -0
  558. data/ext/lpsolver-highs/extern/amd/amd_preprocess.c +107 -0
  559. data/ext/lpsolver-highs/extern/amd/amd_valid.c +93 -0
  560. data/ext/lpsolver-highs/extern/amd/changes.txt +8 -0
  561. data/ext/lpsolver-highs/extern/catch.hpp +18861 -0
  562. data/ext/lpsolver-highs/extern/metis/Changes.txt +31 -0
  563. data/ext/lpsolver-highs/extern/metis/GKlib/GKlib.h +62 -0
  564. data/ext/lpsolver-highs/extern/metis/GKlib/error.c +21 -0
  565. data/ext/lpsolver-highs/extern/metis/GKlib/gk_arch.h +64 -0
  566. data/ext/lpsolver-highs/extern/metis/GKlib/gk_defs.h +19 -0
  567. data/ext/lpsolver-highs/extern/metis/GKlib/gk_macros.h +50 -0
  568. data/ext/lpsolver-highs/extern/metis/GKlib/gk_mkblas.h +51 -0
  569. data/ext/lpsolver-highs/extern/metis/GKlib/gk_mkmemory.h +80 -0
  570. data/ext/lpsolver-highs/extern/metis/GKlib/gk_mkpqueue.h +329 -0
  571. data/ext/lpsolver-highs/extern/metis/GKlib/gk_mkrandom.h +89 -0
  572. data/ext/lpsolver-highs/extern/metis/GKlib/gk_mksort.h +271 -0
  573. data/ext/lpsolver-highs/extern/metis/GKlib/gk_ms_inttypes.h +41 -0
  574. data/ext/lpsolver-highs/extern/metis/GKlib/gk_ms_stat.h +22 -0
  575. data/ext/lpsolver-highs/extern/metis/GKlib/gk_ms_stdint.h +41 -0
  576. data/ext/lpsolver-highs/extern/metis/GKlib/gk_proto.h +50 -0
  577. data/ext/lpsolver-highs/extern/metis/GKlib/gk_struct.h +66 -0
  578. data/ext/lpsolver-highs/extern/metis/GKlib/gk_types.h +15 -0
  579. data/ext/lpsolver-highs/extern/metis/GKlib/mcore.c +176 -0
  580. data/ext/lpsolver-highs/extern/metis/GKlib/memory.c +23 -0
  581. data/ext/lpsolver-highs/extern/metis/GKlib/random.c +37 -0
  582. data/ext/lpsolver-highs/extern/metis/LICENSE.txt +18 -0
  583. data/ext/lpsolver-highs/extern/metis/libmetis/auxapi.c +27 -0
  584. data/ext/lpsolver-highs/extern/metis/libmetis/balance.c +491 -0
  585. data/ext/lpsolver-highs/extern/metis/libmetis/bucketsort.c +44 -0
  586. data/ext/lpsolver-highs/extern/metis/libmetis/coarsen.c +895 -0
  587. data/ext/lpsolver-highs/extern/metis/libmetis/compress.c +231 -0
  588. data/ext/lpsolver-highs/extern/metis/libmetis/contig.c +83 -0
  589. data/ext/lpsolver-highs/extern/metis/libmetis/defs.h +39 -0
  590. data/ext/lpsolver-highs/extern/metis/libmetis/fm.c +527 -0
  591. data/ext/lpsolver-highs/extern/metis/libmetis/gklib.c +55 -0
  592. data/ext/lpsolver-highs/extern/metis/libmetis/gklib_defs.h +33 -0
  593. data/ext/lpsolver-highs/extern/metis/libmetis/graph.c +268 -0
  594. data/ext/lpsolver-highs/extern/metis/libmetis/initpart.c +385 -0
  595. data/ext/lpsolver-highs/extern/metis/libmetis/macros.h +59 -0
  596. data/ext/lpsolver-highs/extern/metis/libmetis/mcutil.c +162 -0
  597. data/ext/lpsolver-highs/extern/metis/libmetis/metislib.h +35 -0
  598. data/ext/lpsolver-highs/extern/metis/libmetis/mmd.c +598 -0
  599. data/ext/lpsolver-highs/extern/metis/libmetis/ometis.c +661 -0
  600. data/ext/lpsolver-highs/extern/metis/libmetis/options.c +260 -0
  601. data/ext/lpsolver-highs/extern/metis/libmetis/proto.h +172 -0
  602. data/ext/lpsolver-highs/extern/metis/libmetis/refine.c +99 -0
  603. data/ext/lpsolver-highs/extern/metis/libmetis/separator.c +57 -0
  604. data/ext/lpsolver-highs/extern/metis/libmetis/sfm.c +581 -0
  605. data/ext/lpsolver-highs/extern/metis/libmetis/srefine.c +152 -0
  606. data/ext/lpsolver-highs/extern/metis/libmetis/stdheaders.h +29 -0
  607. data/ext/lpsolver-highs/extern/metis/libmetis/struct.h +117 -0
  608. data/ext/lpsolver-highs/extern/metis/libmetis/util.c +59 -0
  609. data/ext/lpsolver-highs/extern/metis/libmetis/wspace.c +91 -0
  610. data/ext/lpsolver-highs/extern/metis/metis.h +271 -0
  611. data/ext/lpsolver-highs/extern/pdqsort/license.txt +16 -0
  612. data/ext/lpsolver-highs/extern/pdqsort/pdqsort.h +532 -0
  613. data/ext/lpsolver-highs/extern/rcm/LICENSE +19 -0
  614. data/ext/lpsolver-highs/extern/rcm/rcm.cpp +873 -0
  615. data/ext/lpsolver-highs/extern/rcm/rcm.h +22 -0
  616. data/ext/lpsolver-highs/extern/zstr/LICENSE +21 -0
  617. data/ext/lpsolver-highs/extern/zstr/strict_fstream.hpp +237 -0
  618. data/ext/lpsolver-highs/extern/zstr/zstr.hpp +473 -0
  619. data/ext/lpsolver-highs/flake.lock +61 -0
  620. data/ext/lpsolver-highs/flake.nix +73 -0
  621. data/ext/lpsolver-highs/highs/CMakeLists.txt +499 -0
  622. data/ext/lpsolver-highs/highs/HConfig.h.bazel.in +25 -0
  623. data/ext/lpsolver-highs/highs/HConfig.h.in +22 -0
  624. data/ext/lpsolver-highs/highs/HConfig.h.meson.in +17 -0
  625. data/ext/lpsolver-highs/highs/Highs.h +1812 -0
  626. data/ext/lpsolver-highs/highs/HighsRun.md +143 -0
  627. data/ext/lpsolver-highs/highs/highs_bindings.cpp +1826 -0
  628. data/ext/lpsolver-highs/highs/highspy/__init__.py +93 -0
  629. data/ext/lpsolver-highs/highs/highspy/__init__.pyi +91 -0
  630. data/ext/lpsolver-highs/highs/highspy/_core/__init__.pyi +1058 -0
  631. data/ext/lpsolver-highs/highs/highspy/_core/cb.pyi +118 -0
  632. data/ext/lpsolver-highs/highs/highspy/_core/simplex_constants.pyi +472 -0
  633. data/ext/lpsolver-highs/highs/highspy/highs.py +2430 -0
  634. data/ext/lpsolver-highs/highs/interfaces/highs_c_api.cpp +1812 -0
  635. data/ext/lpsolver-highs/highs/interfaces/highs_c_api.h +2651 -0
  636. data/ext/lpsolver-highs/highs/interfaces/highs_csharp_api.cs +1142 -0
  637. data/ext/lpsolver-highs/highs/interfaces/highs_fortran_api.f90 +873 -0
  638. data/ext/lpsolver-highs/highs/io/Filereader.cpp +87 -0
  639. data/ext/lpsolver-highs/highs/io/Filereader.h +45 -0
  640. data/ext/lpsolver-highs/highs/io/FilereaderLp.cpp +539 -0
  641. data/ext/lpsolver-highs/highs/io/FilereaderLp.h +49 -0
  642. data/ext/lpsolver-highs/highs/io/FilereaderMps.cpp +86 -0
  643. data/ext/lpsolver-highs/highs/io/FilereaderMps.h +27 -0
  644. data/ext/lpsolver-highs/highs/io/HMPSIO.cpp +1001 -0
  645. data/ext/lpsolver-highs/highs/io/HMPSIO.h +78 -0
  646. data/ext/lpsolver-highs/highs/io/HMpsFF.cpp +2113 -0
  647. data/ext/lpsolver-highs/highs/io/HMpsFF.h +245 -0
  648. data/ext/lpsolver-highs/highs/io/HighsIO.cpp +371 -0
  649. data/ext/lpsolver-highs/highs/io/HighsIO.h +118 -0
  650. data/ext/lpsolver-highs/highs/io/LoadOptions.cpp +60 -0
  651. data/ext/lpsolver-highs/highs/io/LoadOptions.h +24 -0
  652. data/ext/lpsolver-highs/highs/io/filereaderlp/LICENSE +19 -0
  653. data/ext/lpsolver-highs/highs/io/filereaderlp/builder.hpp +25 -0
  654. data/ext/lpsolver-highs/highs/io/filereaderlp/def.hpp +19 -0
  655. data/ext/lpsolver-highs/highs/io/filereaderlp/model.hpp +68 -0
  656. data/ext/lpsolver-highs/highs/io/filereaderlp/reader.cpp +1375 -0
  657. data/ext/lpsolver-highs/highs/io/filereaderlp/reader.hpp +10 -0
  658. data/ext/lpsolver-highs/highs/ipm/IpxSolution.h +32 -0
  659. data/ext/lpsolver-highs/highs/ipm/IpxWrapper.cpp +1526 -0
  660. data/ext/lpsolver-highs/highs/ipm/IpxWrapper.h +106 -0
  661. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu.h +161 -0
  662. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_factorize.c +132 -0
  663. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_factorize.h +247 -0
  664. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_get_factors.c +148 -0
  665. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_get_factors.h +108 -0
  666. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_initialize.c +24 -0
  667. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_initialize.h +119 -0
  668. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_factorize.h +34 -0
  669. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_free.h +19 -0
  670. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_get_factors.h +34 -0
  671. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_initialize.h +46 -0
  672. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_solve_dense.h +29 -0
  673. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_solve_for_update.h +42 -0
  674. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_solve_sparse.h +32 -0
  675. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_obj_update.h +31 -0
  676. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_object.c +325 -0
  677. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_object.h +30 -0
  678. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_solve_dense.c +46 -0
  679. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_solve_dense.h +75 -0
  680. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_solve_for_update.c +79 -0
  681. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_solve_for_update.h +169 -0
  682. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_solve_sparse.c +63 -0
  683. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_solve_sparse.h +112 -0
  684. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_update.c +44 -0
  685. data/ext/lpsolver-highs/highs/ipm/basiclu/basiclu_update.h +125 -0
  686. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_build_factors.c +441 -0
  687. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_condest.c +124 -0
  688. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_def.h +39 -0
  689. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_dfs.c +141 -0
  690. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_factorize_bump.c +56 -0
  691. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_file.c +184 -0
  692. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_file.h +21 -0
  693. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_garbage_perm.c +53 -0
  694. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_initialize.c +56 -0
  695. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_internal.c +352 -0
  696. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_internal.h +220 -0
  697. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_list.h +173 -0
  698. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_markowitz.c +188 -0
  699. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_matrix_norm.c +51 -0
  700. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_pivot.c +1247 -0
  701. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_residual_test.c +155 -0
  702. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_setup_bump.c +198 -0
  703. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_singletons.c +511 -0
  704. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_solve_dense.c +129 -0
  705. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_solve_for_update.c +360 -0
  706. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_solve_sparse.c +284 -0
  707. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_solve_symbolic.c +48 -0
  708. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_solve_triangular.c +140 -0
  709. data/ext/lpsolver-highs/highs/ipm/basiclu/lu_update.c +908 -0
  710. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/Auxiliary.cpp +301 -0
  711. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/Auxiliary.h +104 -0
  712. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/IntConfig.h +27 -0
  713. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/KrylovMethods.cpp +193 -0
  714. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/KrylovMethods.h +30 -0
  715. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/Log.cpp +60 -0
  716. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/Log.h +62 -0
  717. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/OrderingPrint.h +10 -0
  718. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/VectorOperations.cpp +117 -0
  719. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/VectorOperations.h +59 -0
  720. data/ext/lpsolver-highs/highs/ipm/hipo/auxiliary/mycblas.h +85 -0
  721. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Analyse.cpp +1367 -0
  722. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Analyse.h +122 -0
  723. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/CallAndTimeBlas.cpp +114 -0
  724. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/CallAndTimeBlas.h +46 -0
  725. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/CliqueStack.cpp +82 -0
  726. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/CliqueStack.h +83 -0
  727. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/DataCollector.cpp +326 -0
  728. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/DataCollector.h +86 -0
  729. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/DenseFact.h +48 -0
  730. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/DenseFactHybrid.cpp +279 -0
  731. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/DenseFactKernel.cpp +284 -0
  732. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/DgemmParallel.cpp +38 -0
  733. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/DgemmParallel.h +32 -0
  734. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/FactorHiGHS.cpp +57 -0
  735. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/FactorHiGHS.h +112 -0
  736. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/FactorHiGHSSettings.h +63 -0
  737. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Factorise.cpp +405 -0
  738. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Factorise.h +85 -0
  739. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/FormatHandler.cpp +46 -0
  740. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/FormatHandler.h +95 -0
  741. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/HybridHybridFormatHandler.cpp +238 -0
  742. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/HybridHybridFormatHandler.h +31 -0
  743. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/HybridSolveHandler.cpp +272 -0
  744. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/HybridSolveHandler.h +26 -0
  745. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/KrylovMethodsIpm.cpp +83 -0
  746. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/KrylovMethodsIpm.h +45 -0
  747. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Numeric.cpp +54 -0
  748. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Numeric.h +46 -0
  749. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/ReturnValues.h +19 -0
  750. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/SolveHandler.cpp +10 -0
  751. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/SolveHandler.h +48 -0
  752. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Swaps.cpp +70 -0
  753. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Swaps.h +19 -0
  754. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Symbolic.cpp +101 -0
  755. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Symbolic.h +220 -0
  756. data/ext/lpsolver-highs/highs/ipm/hipo/factorhighs/Timing.h +114 -0
  757. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Control.cpp +38 -0
  758. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Control.h +41 -0
  759. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/FactorHiGHSSolver.cpp +887 -0
  760. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/FactorHiGHSSolver.h +92 -0
  761. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Info.h +58 -0
  762. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/IpmData.cpp +8 -0
  763. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/IpmData.h +37 -0
  764. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Iterate.cpp +640 -0
  765. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Iterate.h +172 -0
  766. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/LinearSolver.h +81 -0
  767. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/LogHighs.cpp +71 -0
  768. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/LogHighs.h +33 -0
  769. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Model.cpp +403 -0
  770. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Model.h +136 -0
  771. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Options.h +35 -0
  772. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Parameters.h +63 -0
  773. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/PreProcess.cpp +646 -0
  774. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/PreProcess.h +94 -0
  775. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Refine.cpp +214 -0
  776. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Solver.cpp +1346 -0
  777. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Solver.h +338 -0
  778. data/ext/lpsolver-highs/highs/ipm/hipo/ipm/Status.h +88 -0
  779. data/ext/lpsolver-highs/highs/ipm/ipx/basiclu_kernel.cc +71 -0
  780. data/ext/lpsolver-highs/highs/ipm/ipx/basiclu_kernel.h +20 -0
  781. data/ext/lpsolver-highs/highs/ipm/ipx/basiclu_wrapper.cc +299 -0
  782. data/ext/lpsolver-highs/highs/ipm/ipx/basiclu_wrapper.h +47 -0
  783. data/ext/lpsolver-highs/highs/ipm/ipx/basis.cc +966 -0
  784. data/ext/lpsolver-highs/highs/ipm/ipx/basis.h +350 -0
  785. data/ext/lpsolver-highs/highs/ipm/ipx/conjugate_residuals.cc +217 -0
  786. data/ext/lpsolver-highs/highs/ipm/ipx/conjugate_residuals.h +74 -0
  787. data/ext/lpsolver-highs/highs/ipm/ipx/control.cc +151 -0
  788. data/ext/lpsolver-highs/highs/ipm/ipx/control.h +167 -0
  789. data/ext/lpsolver-highs/highs/ipm/ipx/crossover.cc +479 -0
  790. data/ext/lpsolver-highs/highs/ipm/ipx/crossover.h +157 -0
  791. data/ext/lpsolver-highs/highs/ipm/ipx/diagonal_precond.cc +70 -0
  792. data/ext/lpsolver-highs/highs/ipm/ipx/diagonal_precond.h +45 -0
  793. data/ext/lpsolver-highs/highs/ipm/ipx/forrest_tomlin.cc +360 -0
  794. data/ext/lpsolver-highs/highs/ipm/ipx/forrest_tomlin.h +102 -0
  795. data/ext/lpsolver-highs/highs/ipm/ipx/guess_basis.cc +233 -0
  796. data/ext/lpsolver-highs/highs/ipm/ipx/guess_basis.h +21 -0
  797. data/ext/lpsolver-highs/highs/ipm/ipx/indexed_vector.cc +30 -0
  798. data/ext/lpsolver-highs/highs/ipm/ipx/indexed_vector.h +113 -0
  799. data/ext/lpsolver-highs/highs/ipm/ipx/info.cc +124 -0
  800. data/ext/lpsolver-highs/highs/ipm/ipx/info.h +27 -0
  801. data/ext/lpsolver-highs/highs/ipm/ipx/ipm.cc +897 -0
  802. data/ext/lpsolver-highs/highs/ipm/ipx/ipm.h +94 -0
  803. data/ext/lpsolver-highs/highs/ipm/ipx/ipx_c.cc +83 -0
  804. data/ext/lpsolver-highs/highs/ipm/ipx/ipx_c.h +47 -0
  805. data/ext/lpsolver-highs/highs/ipm/ipx/ipx_config.h +9 -0
  806. data/ext/lpsolver-highs/highs/ipm/ipx/ipx_info.h +111 -0
  807. data/ext/lpsolver-highs/highs/ipm/ipx/ipx_internal.h +89 -0
  808. data/ext/lpsolver-highs/highs/ipm/ipx/ipx_parameters.h +76 -0
  809. data/ext/lpsolver-highs/highs/ipm/ipx/ipx_status.h +57 -0
  810. data/ext/lpsolver-highs/highs/ipm/ipx/iterate.cc +683 -0
  811. data/ext/lpsolver-highs/highs/ipm/ipx/iterate.h +331 -0
  812. data/ext/lpsolver-highs/highs/ipm/ipx/kkt_solver.cc +23 -0
  813. data/ext/lpsolver-highs/highs/ipm/ipx/kkt_solver.h +70 -0
  814. data/ext/lpsolver-highs/highs/ipm/ipx/kkt_solver_basis.cc +387 -0
  815. data/ext/lpsolver-highs/highs/ipm/ipx/kkt_solver_basis.h +66 -0
  816. data/ext/lpsolver-highs/highs/ipm/ipx/kkt_solver_diag.cc +120 -0
  817. data/ext/lpsolver-highs/highs/ipm/ipx/kkt_solver_diag.h +48 -0
  818. data/ext/lpsolver-highs/highs/ipm/ipx/linear_operator.cc +10 -0
  819. data/ext/lpsolver-highs/highs/ipm/ipx/linear_operator.h +26 -0
  820. data/ext/lpsolver-highs/highs/ipm/ipx/lp_solver.cc +686 -0
  821. data/ext/lpsolver-highs/highs/ipm/ipx/lp_solver.h +204 -0
  822. data/ext/lpsolver-highs/highs/ipm/ipx/lu_factorization.cc +131 -0
  823. data/ext/lpsolver-highs/highs/ipm/ipx/lu_factorization.h +79 -0
  824. data/ext/lpsolver-highs/highs/ipm/ipx/lu_update.cc +62 -0
  825. data/ext/lpsolver-highs/highs/ipm/ipx/lu_update.h +129 -0
  826. data/ext/lpsolver-highs/highs/ipm/ipx/maxvolume.cc +337 -0
  827. data/ext/lpsolver-highs/highs/ipm/ipx/maxvolume.h +54 -0
  828. data/ext/lpsolver-highs/highs/ipm/ipx/model.cc +1528 -0
  829. data/ext/lpsolver-highs/highs/ipm/ipx/model.h +413 -0
  830. data/ext/lpsolver-highs/highs/ipm/ipx/multistream.h +52 -0
  831. data/ext/lpsolver-highs/highs/ipm/ipx/normal_matrix.cc +126 -0
  832. data/ext/lpsolver-highs/highs/ipm/ipx/normal_matrix.h +44 -0
  833. data/ext/lpsolver-highs/highs/ipm/ipx/power_method.h +44 -0
  834. data/ext/lpsolver-highs/highs/ipm/ipx/sparse_matrix.cc +382 -0
  835. data/ext/lpsolver-highs/highs/ipm/ipx/sparse_matrix.h +195 -0
  836. data/ext/lpsolver-highs/highs/ipm/ipx/sparse_utils.cc +92 -0
  837. data/ext/lpsolver-highs/highs/ipm/ipx/sparse_utils.h +58 -0
  838. data/ext/lpsolver-highs/highs/ipm/ipx/splitted_normal_matrix.cc +117 -0
  839. data/ext/lpsolver-highs/highs/ipm/ipx/splitted_normal_matrix.h +63 -0
  840. data/ext/lpsolver-highs/highs/ipm/ipx/starting_basis.cc +182 -0
  841. data/ext/lpsolver-highs/highs/ipm/ipx/starting_basis.h +39 -0
  842. data/ext/lpsolver-highs/highs/ipm/ipx/symbolic_invert.cc +183 -0
  843. data/ext/lpsolver-highs/highs/ipm/ipx/symbolic_invert.h +29 -0
  844. data/ext/lpsolver-highs/highs/ipm/ipx/timer.cc +16 -0
  845. data/ext/lpsolver-highs/highs/ipm/ipx/timer.h +25 -0
  846. data/ext/lpsolver-highs/highs/ipm/ipx/utils.cc +95 -0
  847. data/ext/lpsolver-highs/highs/ipm/ipx/utils.h +37 -0
  848. data/ext/lpsolver-highs/highs/lp_data/HConst.h +430 -0
  849. data/ext/lpsolver-highs/highs/lp_data/HStruct.h +213 -0
  850. data/ext/lpsolver-highs/highs/lp_data/Highs.cpp +4949 -0
  851. data/ext/lpsolver-highs/highs/lp_data/HighsAnalysis.h +23 -0
  852. data/ext/lpsolver-highs/highs/lp_data/HighsCallback.cpp +323 -0
  853. data/ext/lpsolver-highs/highs/lp_data/HighsCallback.h +104 -0
  854. data/ext/lpsolver-highs/highs/lp_data/HighsCallbackStruct.h +70 -0
  855. data/ext/lpsolver-highs/highs/lp_data/HighsDebug.cpp +54 -0
  856. data/ext/lpsolver-highs/highs/lp_data/HighsDebug.h +34 -0
  857. data/ext/lpsolver-highs/highs/lp_data/HighsDeprecated.cpp +181 -0
  858. data/ext/lpsolver-highs/highs/lp_data/HighsIis.cpp +1290 -0
  859. data/ext/lpsolver-highs/highs/lp_data/HighsIis.h +139 -0
  860. data/ext/lpsolver-highs/highs/lp_data/HighsInfo.cpp +426 -0
  861. data/ext/lpsolver-highs/highs/lp_data/HighsInfo.h +421 -0
  862. data/ext/lpsolver-highs/highs/lp_data/HighsInfoDebug.cpp +175 -0
  863. data/ext/lpsolver-highs/highs/lp_data/HighsInfoDebug.h +27 -0
  864. data/ext/lpsolver-highs/highs/lp_data/HighsInterface.cpp +4344 -0
  865. data/ext/lpsolver-highs/highs/lp_data/HighsLp.cpp +564 -0
  866. data/ext/lpsolver-highs/highs/lp_data/HighsLp.h +97 -0
  867. data/ext/lpsolver-highs/highs/lp_data/HighsLpSolverObject.h +47 -0
  868. data/ext/lpsolver-highs/highs/lp_data/HighsLpUtils.cpp +3794 -0
  869. data/ext/lpsolver-highs/highs/lp_data/HighsLpUtils.h +330 -0
  870. data/ext/lpsolver-highs/highs/lp_data/HighsModelUtils.cpp +1650 -0
  871. data/ext/lpsolver-highs/highs/lp_data/HighsModelUtils.h +129 -0
  872. data/ext/lpsolver-highs/highs/lp_data/HighsOptions.cpp +1176 -0
  873. data/ext/lpsolver-highs/highs/lp_data/HighsOptions.h +1715 -0
  874. data/ext/lpsolver-highs/highs/lp_data/HighsRanging.cpp +733 -0
  875. data/ext/lpsolver-highs/highs/lp_data/HighsRanging.h +43 -0
  876. data/ext/lpsolver-highs/highs/lp_data/HighsSolution.cpp +2194 -0
  877. data/ext/lpsolver-highs/highs/lp_data/HighsSolution.h +179 -0
  878. data/ext/lpsolver-highs/highs/lp_data/HighsSolutionDebug.cpp +490 -0
  879. data/ext/lpsolver-highs/highs/lp_data/HighsSolutionDebug.h +87 -0
  880. data/ext/lpsolver-highs/highs/lp_data/HighsSolve.cpp +747 -0
  881. data/ext/lpsolver-highs/highs/lp_data/HighsSolve.h +29 -0
  882. data/ext/lpsolver-highs/highs/lp_data/HighsStatus.cpp +48 -0
  883. data/ext/lpsolver-highs/highs/lp_data/HighsStatus.h +29 -0
  884. data/ext/lpsolver-highs/highs/lp_data/Iis.md +113 -0
  885. data/ext/lpsolver-highs/highs/meson.build +433 -0
  886. data/ext/lpsolver-highs/highs/mip/HighsCliqueTable.cpp +2236 -0
  887. data/ext/lpsolver-highs/highs/mip/HighsCliqueTable.h +329 -0
  888. data/ext/lpsolver-highs/highs/mip/HighsConflictPool.cpp +201 -0
  889. data/ext/lpsolver-highs/highs/mip/HighsConflictPool.h +109 -0
  890. data/ext/lpsolver-highs/highs/mip/HighsCutGeneration.cpp +1491 -0
  891. data/ext/lpsolver-highs/highs/mip/HighsCutGeneration.h +108 -0
  892. data/ext/lpsolver-highs/highs/mip/HighsCutPool.cpp +526 -0
  893. data/ext/lpsolver-highs/highs/mip/HighsCutPool.h +168 -0
  894. data/ext/lpsolver-highs/highs/mip/HighsDebugSol.cpp +313 -0
  895. data/ext/lpsolver-highs/highs/mip/HighsDebugSol.h +133 -0
  896. data/ext/lpsolver-highs/highs/mip/HighsDomain.cpp +3861 -0
  897. data/ext/lpsolver-highs/highs/mip/HighsDomain.h +657 -0
  898. data/ext/lpsolver-highs/highs/mip/HighsDomainChange.h +48 -0
  899. data/ext/lpsolver-highs/highs/mip/HighsDynamicRowMatrix.cpp +199 -0
  900. data/ext/lpsolver-highs/highs/mip/HighsDynamicRowMatrix.h +104 -0
  901. data/ext/lpsolver-highs/highs/mip/HighsFeasibilityJump.cpp +139 -0
  902. data/ext/lpsolver-highs/highs/mip/HighsGFkSolve.cpp +106 -0
  903. data/ext/lpsolver-highs/highs/mip/HighsGFkSolve.h +439 -0
  904. data/ext/lpsolver-highs/highs/mip/HighsImplications.cpp +915 -0
  905. data/ext/lpsolver-highs/highs/mip/HighsImplications.h +194 -0
  906. data/ext/lpsolver-highs/highs/mip/HighsLpAggregator.cpp +56 -0
  907. data/ext/lpsolver-highs/highs/mip/HighsLpAggregator.h +50 -0
  908. data/ext/lpsolver-highs/highs/mip/HighsLpRelaxation.cpp +1609 -0
  909. data/ext/lpsolver-highs/highs/mip/HighsLpRelaxation.h +361 -0
  910. data/ext/lpsolver-highs/highs/mip/HighsMipAnalysis.cpp +313 -0
  911. data/ext/lpsolver-highs/highs/mip/HighsMipAnalysis.h +71 -0
  912. data/ext/lpsolver-highs/highs/mip/HighsMipSolver.cpp +1002 -0
  913. data/ext/lpsolver-highs/highs/mip/HighsMipSolver.h +159 -0
  914. data/ext/lpsolver-highs/highs/mip/HighsMipSolverData.cpp +2936 -0
  915. data/ext/lpsolver-highs/highs/mip/HighsMipSolverData.h +313 -0
  916. data/ext/lpsolver-highs/highs/mip/HighsModkSeparator.cpp +267 -0
  917. data/ext/lpsolver-highs/highs/mip/HighsModkSeparator.h +60 -0
  918. data/ext/lpsolver-highs/highs/mip/HighsNodeQueue.cpp +443 -0
  919. data/ext/lpsolver-highs/highs/mip/HighsNodeQueue.h +312 -0
  920. data/ext/lpsolver-highs/highs/mip/HighsObjectiveFunction.cpp +124 -0
  921. data/ext/lpsolver-highs/highs/mip/HighsObjectiveFunction.h +71 -0
  922. data/ext/lpsolver-highs/highs/mip/HighsPathSeparator.cpp +549 -0
  923. data/ext/lpsolver-highs/highs/mip/HighsPathSeparator.h +39 -0
  924. data/ext/lpsolver-highs/highs/mip/HighsPrimalHeuristics.cpp +1673 -0
  925. data/ext/lpsolver-highs/highs/mip/HighsPrimalHeuristics.h +75 -0
  926. data/ext/lpsolver-highs/highs/mip/HighsPseudocost.cpp +129 -0
  927. data/ext/lpsolver-highs/highs/mip/HighsPseudocost.h +366 -0
  928. data/ext/lpsolver-highs/highs/mip/HighsRedcostFixing.cpp +316 -0
  929. data/ext/lpsolver-highs/highs/mip/HighsRedcostFixing.h +42 -0
  930. data/ext/lpsolver-highs/highs/mip/HighsSearch.cpp +1881 -0
  931. data/ext/lpsolver-highs/highs/mip/HighsSearch.h +241 -0
  932. data/ext/lpsolver-highs/highs/mip/HighsSeparation.cpp +186 -0
  933. data/ext/lpsolver-highs/highs/mip/HighsSeparation.h +41 -0
  934. data/ext/lpsolver-highs/highs/mip/HighsSeparator.cpp +39 -0
  935. data/ext/lpsolver-highs/highs/mip/HighsSeparator.h +60 -0
  936. data/ext/lpsolver-highs/highs/mip/HighsTableauSeparator.cpp +244 -0
  937. data/ext/lpsolver-highs/highs/mip/HighsTableauSeparator.h +34 -0
  938. data/ext/lpsolver-highs/highs/mip/HighsTransformedLp.cpp +563 -0
  939. data/ext/lpsolver-highs/highs/mip/HighsTransformedLp.h +63 -0
  940. data/ext/lpsolver-highs/highs/mip/MipTimer.h +544 -0
  941. data/ext/lpsolver-highs/highs/mip/feasibilityjump.hh +800 -0
  942. data/ext/lpsolver-highs/highs/model/HighsHessian.cpp +263 -0
  943. data/ext/lpsolver-highs/highs/model/HighsHessian.h +54 -0
  944. data/ext/lpsolver-highs/highs/model/HighsHessianUtils.cpp +584 -0
  945. data/ext/lpsolver-highs/highs/model/HighsHessianUtils.h +47 -0
  946. data/ext/lpsolver-highs/highs/model/HighsModel.cpp +46 -0
  947. data/ext/lpsolver-highs/highs/model/HighsModel.h +42 -0
  948. data/ext/lpsolver-highs/highs/parallel/HighsBinarySemaphore.h +108 -0
  949. data/ext/lpsolver-highs/highs/parallel/HighsCacheAlign.h +82 -0
  950. data/ext/lpsolver-highs/highs/parallel/HighsCombinable.h +116 -0
  951. data/ext/lpsolver-highs/highs/parallel/HighsMutex.h +124 -0
  952. data/ext/lpsolver-highs/highs/parallel/HighsParallel.h +128 -0
  953. data/ext/lpsolver-highs/highs/parallel/HighsRaceTimer.h +38 -0
  954. data/ext/lpsolver-highs/highs/parallel/HighsSchedulerConstants.h +19 -0
  955. data/ext/lpsolver-highs/highs/parallel/HighsSpinMutex.h +48 -0
  956. data/ext/lpsolver-highs/highs/parallel/HighsSplitDeque.h +606 -0
  957. data/ext/lpsolver-highs/highs/parallel/HighsTask.h +170 -0
  958. data/ext/lpsolver-highs/highs/parallel/HighsTaskExecutor.cpp +43 -0
  959. data/ext/lpsolver-highs/highs/parallel/HighsTaskExecutor.h +217 -0
  960. data/ext/lpsolver-highs/highs/pdlp/CupdlpWrapper.cpp +848 -0
  961. data/ext/lpsolver-highs/highs/pdlp/CupdlpWrapper.h +108 -0
  962. data/ext/lpsolver-highs/highs/pdlp/HiPdlpTimer.h +155 -0
  963. data/ext/lpsolver-highs/highs/pdlp/HiPdlpWrapper.cpp +141 -0
  964. data/ext/lpsolver-highs/highs/pdlp/HiPdlpWrapper.h +26 -0
  965. data/ext/lpsolver-highs/highs/pdlp/cupdlp/Diff +12 -0
  966. data/ext/lpsolver-highs/highs/pdlp/cupdlp/Meld +7 -0
  967. data/ext/lpsolver-highs/highs/pdlp/cupdlp/Merge +2 -0
  968. data/ext/lpsolver-highs/highs/pdlp/cupdlp/README.md +95 -0
  969. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cuda/CMakeLists.txt +58 -0
  970. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cuda/cupdlp_cuda_kernels.cu +338 -0
  971. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cuda/cupdlp_cuda_kernels.cuh +319 -0
  972. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cuda/cupdlp_cudalinalg.cu +386 -0
  973. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cuda/cupdlp_cudalinalg.cuh +149 -0
  974. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cuda/test_cublas.c +154 -0
  975. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cuda/test_cuda_linalg.c +79 -0
  976. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp.h +16 -0
  977. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_cs.c +214 -0
  978. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_cs.h +40 -0
  979. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_defs.h +447 -0
  980. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_linalg.c +802 -0
  981. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_linalg.h +189 -0
  982. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_proj.c +148 -0
  983. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_proj.h +19 -0
  984. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_restart.c +124 -0
  985. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_restart.h +31 -0
  986. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_scaling.c +425 -0
  987. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_scaling.h +26 -0
  988. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_solver.c +1498 -0
  989. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_solver.h +105 -0
  990. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_step.c +478 -0
  991. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_step.h +37 -0
  992. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_utils.c +1850 -0
  993. data/ext/lpsolver-highs/highs/pdlp/cupdlp/cupdlp_utils.h +212 -0
  994. data/ext/lpsolver-highs/highs/pdlp/cupdlp/glbopts.h +342 -0
  995. data/ext/lpsolver-highs/highs/pdlp/hipdlp/defs.hpp +222 -0
  996. data/ext/lpsolver-highs/highs/pdlp/hipdlp/linalg.cc +231 -0
  997. data/ext/lpsolver-highs/highs/pdlp/hipdlp/linalg.hpp +61 -0
  998. data/ext/lpsolver-highs/highs/pdlp/hipdlp/logger.cc +225 -0
  999. data/ext/lpsolver-highs/highs/pdlp/hipdlp/logger.hpp +80 -0
  1000. data/ext/lpsolver-highs/highs/pdlp/hipdlp/pdhg.cc +2798 -0
  1001. data/ext/lpsolver-highs/highs/pdlp/hipdlp/pdhg.cu +497 -0
  1002. data/ext/lpsolver-highs/highs/pdlp/hipdlp/pdhg.hpp +358 -0
  1003. data/ext/lpsolver-highs/highs/pdlp/hipdlp/pdhg_kernels.hpp +77 -0
  1004. data/ext/lpsolver-highs/highs/pdlp/hipdlp/pdlp_gpu_debug.hpp +62 -0
  1005. data/ext/lpsolver-highs/highs/pdlp/hipdlp/restart.cc +132 -0
  1006. data/ext/lpsolver-highs/highs/pdlp/hipdlp/restart.hpp +96 -0
  1007. data/ext/lpsolver-highs/highs/pdlp/hipdlp/scaling.cc +307 -0
  1008. data/ext/lpsolver-highs/highs/pdlp/hipdlp/scaling.hpp +74 -0
  1009. data/ext/lpsolver-highs/highs/pdlp/hipdlp/solver_results.hpp +65 -0
  1010. data/ext/lpsolver-highs/highs/presolve/HPresolve.cpp +8511 -0
  1011. data/ext/lpsolver-highs/highs/presolve/HPresolve.h +505 -0
  1012. data/ext/lpsolver-highs/highs/presolve/HPresolveAnalysis.cpp +239 -0
  1013. data/ext/lpsolver-highs/highs/presolve/HPresolveAnalysis.h +52 -0
  1014. data/ext/lpsolver-highs/highs/presolve/HighsPostsolveStack.cpp +1368 -0
  1015. data/ext/lpsolver-highs/highs/presolve/HighsPostsolveStack.h +943 -0
  1016. data/ext/lpsolver-highs/highs/presolve/HighsSymmetry.cpp +1921 -0
  1017. data/ext/lpsolver-highs/highs/presolve/HighsSymmetry.h +284 -0
  1018. data/ext/lpsolver-highs/highs/presolve/ICrash.cpp +474 -0
  1019. data/ext/lpsolver-highs/highs/presolve/ICrash.h +124 -0
  1020. data/ext/lpsolver-highs/highs/presolve/ICrashUtil.cpp +267 -0
  1021. data/ext/lpsolver-highs/highs/presolve/ICrashUtil.h +62 -0
  1022. data/ext/lpsolver-highs/highs/presolve/ICrashX.cpp +173 -0
  1023. data/ext/lpsolver-highs/highs/presolve/ICrashX.h +23 -0
  1024. data/ext/lpsolver-highs/highs/presolve/PresolveComponent.cpp +45 -0
  1025. data/ext/lpsolver-highs/highs/presolve/PresolveComponent.h +90 -0
  1026. data/ext/lpsolver-highs/highs/qpsolver/README.md +185 -0
  1027. data/ext/lpsolver-highs/highs/qpsolver/a_asm.cpp +139 -0
  1028. data/ext/lpsolver-highs/highs/qpsolver/a_asm.hpp +77 -0
  1029. data/ext/lpsolver-highs/highs/qpsolver/a_quass.cpp +194 -0
  1030. data/ext/lpsolver-highs/highs/qpsolver/a_quass.hpp +22 -0
  1031. data/ext/lpsolver-highs/highs/qpsolver/basis.cpp +443 -0
  1032. data/ext/lpsolver-highs/highs/qpsolver/basis.hpp +159 -0
  1033. data/ext/lpsolver-highs/highs/qpsolver/crashsolution.hpp +20 -0
  1034. data/ext/lpsolver-highs/highs/qpsolver/dantzigpricing.hpp +80 -0
  1035. data/ext/lpsolver-highs/highs/qpsolver/devexharrispricing.hpp +98 -0
  1036. data/ext/lpsolver-highs/highs/qpsolver/devexpricing.hpp +108 -0
  1037. data/ext/lpsolver-highs/highs/qpsolver/eventhandler.hpp +30 -0
  1038. data/ext/lpsolver-highs/highs/qpsolver/factor.hpp +408 -0
  1039. data/ext/lpsolver-highs/highs/qpsolver/feasibility_bounded.hpp +114 -0
  1040. data/ext/lpsolver-highs/highs/qpsolver/feasibility_highs.hpp +301 -0
  1041. data/ext/lpsolver-highs/highs/qpsolver/gradient.hpp +46 -0
  1042. data/ext/lpsolver-highs/highs/qpsolver/instance.hpp +70 -0
  1043. data/ext/lpsolver-highs/highs/qpsolver/matrix.hpp +342 -0
  1044. data/ext/lpsolver-highs/highs/qpsolver/perturbation.cpp +41 -0
  1045. data/ext/lpsolver-highs/highs/qpsolver/perturbation.hpp +15 -0
  1046. data/ext/lpsolver-highs/highs/qpsolver/pricing.hpp +22 -0
  1047. data/ext/lpsolver-highs/highs/qpsolver/qpconst.hpp +34 -0
  1048. data/ext/lpsolver-highs/highs/qpsolver/qpvector.hpp +242 -0
  1049. data/ext/lpsolver-highs/highs/qpsolver/quass.cpp +551 -0
  1050. data/ext/lpsolver-highs/highs/qpsolver/quass.hpp +27 -0
  1051. data/ext/lpsolver-highs/highs/qpsolver/ratiotest.cpp +146 -0
  1052. data/ext/lpsolver-highs/highs/qpsolver/ratiotest.hpp +26 -0
  1053. data/ext/lpsolver-highs/highs/qpsolver/reducedcosts.hpp +46 -0
  1054. data/ext/lpsolver-highs/highs/qpsolver/reducedgradient.hpp +95 -0
  1055. data/ext/lpsolver-highs/highs/qpsolver/runtime.hpp +45 -0
  1056. data/ext/lpsolver-highs/highs/qpsolver/scaling.cpp +123 -0
  1057. data/ext/lpsolver-highs/highs/qpsolver/scaling.hpp +15 -0
  1058. data/ext/lpsolver-highs/highs/qpsolver/settings.hpp +84 -0
  1059. data/ext/lpsolver-highs/highs/qpsolver/snippets.hpp +36 -0
  1060. data/ext/lpsolver-highs/highs/qpsolver/statistics.hpp +30 -0
  1061. data/ext/lpsolver-highs/highs/qpsolver/steepestedgepricing.hpp +173 -0
  1062. data/ext/lpsolver-highs/highs/simplex/HApp.h +550 -0
  1063. data/ext/lpsolver-highs/highs/simplex/HEkk.cpp +4404 -0
  1064. data/ext/lpsolver-highs/highs/simplex/HEkk.h +419 -0
  1065. data/ext/lpsolver-highs/highs/simplex/HEkkControl.cpp +146 -0
  1066. data/ext/lpsolver-highs/highs/simplex/HEkkDebug.cpp +1722 -0
  1067. data/ext/lpsolver-highs/highs/simplex/HEkkDual.cpp +3003 -0
  1068. data/ext/lpsolver-highs/highs/simplex/HEkkDual.h +513 -0
  1069. data/ext/lpsolver-highs/highs/simplex/HEkkDualMulti.cpp +1020 -0
  1070. data/ext/lpsolver-highs/highs/simplex/HEkkDualRHS.cpp +535 -0
  1071. data/ext/lpsolver-highs/highs/simplex/HEkkDualRHS.h +134 -0
  1072. data/ext/lpsolver-highs/highs/simplex/HEkkDualRow.cpp +697 -0
  1073. data/ext/lpsolver-highs/highs/simplex/HEkkDualRow.h +201 -0
  1074. data/ext/lpsolver-highs/highs/simplex/HEkkInterface.cpp +26 -0
  1075. data/ext/lpsolver-highs/highs/simplex/HEkkPrimal.cpp +2984 -0
  1076. data/ext/lpsolver-highs/highs/simplex/HEkkPrimal.h +191 -0
  1077. data/ext/lpsolver-highs/highs/simplex/HSimplex.cpp +330 -0
  1078. data/ext/lpsolver-highs/highs/simplex/HSimplex.h +42 -0
  1079. data/ext/lpsolver-highs/highs/simplex/HSimplexDebug.cpp +145 -0
  1080. data/ext/lpsolver-highs/highs/simplex/HSimplexDebug.h +48 -0
  1081. data/ext/lpsolver-highs/highs/simplex/HSimplexNla.cpp +517 -0
  1082. data/ext/lpsolver-highs/highs/simplex/HSimplexNla.h +158 -0
  1083. data/ext/lpsolver-highs/highs/simplex/HSimplexNlaDebug.cpp +373 -0
  1084. data/ext/lpsolver-highs/highs/simplex/HSimplexNlaFreeze.cpp +28 -0
  1085. data/ext/lpsolver-highs/highs/simplex/HSimplexNlaProductForm.cpp +113 -0
  1086. data/ext/lpsolver-highs/highs/simplex/HSimplexReport.cpp +77 -0
  1087. data/ext/lpsolver-highs/highs/simplex/HSimplexReport.h +21 -0
  1088. data/ext/lpsolver-highs/highs/simplex/HighsSimplexAnalysis.cpp +1495 -0
  1089. data/ext/lpsolver-highs/highs/simplex/HighsSimplexAnalysis.h +500 -0
  1090. data/ext/lpsolver-highs/highs/simplex/SimplexConst.h +273 -0
  1091. data/ext/lpsolver-highs/highs/simplex/SimplexStruct.h +263 -0
  1092. data/ext/lpsolver-highs/highs/simplex/SimplexTimer.h +414 -0
  1093. data/ext/lpsolver-highs/highs/test_kkt/DevKkt.cpp +469 -0
  1094. data/ext/lpsolver-highs/highs/test_kkt/DevKkt.h +143 -0
  1095. data/ext/lpsolver-highs/highs/test_kkt/KktCh2.cpp +305 -0
  1096. data/ext/lpsolver-highs/highs/test_kkt/KktCh2.h +79 -0
  1097. data/ext/lpsolver-highs/highs/util/FactorTimer.h +199 -0
  1098. data/ext/lpsolver-highs/highs/util/HFactor.cpp +2597 -0
  1099. data/ext/lpsolver-highs/highs/util/HFactor.h +587 -0
  1100. data/ext/lpsolver-highs/highs/util/HFactorConst.h +81 -0
  1101. data/ext/lpsolver-highs/highs/util/HFactorDebug.cpp +231 -0
  1102. data/ext/lpsolver-highs/highs/util/HFactorDebug.h +55 -0
  1103. data/ext/lpsolver-highs/highs/util/HFactorExtend.cpp +229 -0
  1104. data/ext/lpsolver-highs/highs/util/HFactorRefactor.cpp +304 -0
  1105. data/ext/lpsolver-highs/highs/util/HFactorUtils.cpp +122 -0
  1106. data/ext/lpsolver-highs/highs/util/HSet.cpp +197 -0
  1107. data/ext/lpsolver-highs/highs/util/HSet.h +89 -0
  1108. data/ext/lpsolver-highs/highs/util/HVector.h +22 -0
  1109. data/ext/lpsolver-highs/highs/util/HVectorBase.cpp +271 -0
  1110. data/ext/lpsolver-highs/highs/util/HVectorBase.h +102 -0
  1111. data/ext/lpsolver-highs/highs/util/HighsCDouble.h +323 -0
  1112. data/ext/lpsolver-highs/highs/util/HighsComponent.h +53 -0
  1113. data/ext/lpsolver-highs/highs/util/HighsDataStack.h +83 -0
  1114. data/ext/lpsolver-highs/highs/util/HighsDisjointSets.h +107 -0
  1115. data/ext/lpsolver-highs/highs/util/HighsHash.cpp +10 -0
  1116. data/ext/lpsolver-highs/highs/util/HighsHash.h +1274 -0
  1117. data/ext/lpsolver-highs/highs/util/HighsHashTree.h +1461 -0
  1118. data/ext/lpsolver-highs/highs/util/HighsInt.h +36 -0
  1119. data/ext/lpsolver-highs/highs/util/HighsIntegers.h +212 -0
  1120. data/ext/lpsolver-highs/highs/util/HighsLinearSumBounds.cpp +267 -0
  1121. data/ext/lpsolver-highs/highs/util/HighsLinearSumBounds.h +203 -0
  1122. data/ext/lpsolver-highs/highs/util/HighsMatrixPic.cpp +146 -0
  1123. data/ext/lpsolver-highs/highs/util/HighsMatrixPic.h +37 -0
  1124. data/ext/lpsolver-highs/highs/util/HighsMatrixSlice.h +561 -0
  1125. data/ext/lpsolver-highs/highs/util/HighsMatrixUtils.cpp +407 -0
  1126. data/ext/lpsolver-highs/highs/util/HighsMatrixUtils.h +57 -0
  1127. data/ext/lpsolver-highs/highs/util/HighsMemoryAllocation.h +63 -0
  1128. data/ext/lpsolver-highs/highs/util/HighsRandom.h +242 -0
  1129. data/ext/lpsolver-highs/highs/util/HighsRbTree.h +452 -0
  1130. data/ext/lpsolver-highs/highs/util/HighsSort.cpp +364 -0
  1131. data/ext/lpsolver-highs/highs/util/HighsSort.h +131 -0
  1132. data/ext/lpsolver-highs/highs/util/HighsSparseMatrix.cpp +1746 -0
  1133. data/ext/lpsolver-highs/highs/util/HighsSparseMatrix.h +151 -0
  1134. data/ext/lpsolver-highs/highs/util/HighsSparseVectorSum.h +95 -0
  1135. data/ext/lpsolver-highs/highs/util/HighsSplay.h +135 -0
  1136. data/ext/lpsolver-highs/highs/util/HighsTimer.h +385 -0
  1137. data/ext/lpsolver-highs/highs/util/HighsUtils.cpp +1259 -0
  1138. data/ext/lpsolver-highs/highs/util/HighsUtils.h +272 -0
  1139. data/ext/lpsolver-highs/highs/util/stringutil.cpp +131 -0
  1140. data/ext/lpsolver-highs/highs/util/stringutil.h +46 -0
  1141. data/ext/lpsolver-highs/highs.pc.in +12 -0
  1142. data/ext/lpsolver-highs/meson.build +198 -0
  1143. data/ext/lpsolver-highs/meson_options.txt +31 -0
  1144. data/ext/lpsolver-highs/nuget/HiGHS_Logo.png +0 -0
  1145. data/ext/lpsolver-highs/nuget/Highs.csproj +25 -0
  1146. data/ext/lpsolver-highs/nuget/Highs.csproj.in +36 -0
  1147. data/ext/lpsolver-highs/nuget/HowToAlternative.md +77 -0
  1148. data/ext/lpsolver-highs/nuget/README.md +38 -0
  1149. data/ext/lpsolver-highs/nuget/arm-toolchain.cmake +15 -0
  1150. data/ext/lpsolver-highs/nuget/build_linux-arm.sh +13 -0
  1151. data/ext/lpsolver-highs/nuget/build_linux.sh +10 -0
  1152. data/ext/lpsolver-highs/nuget/build_windows.ps1 +27 -0
  1153. data/ext/lpsolver-highs/nuget/generatePackage.ps1 +28 -0
  1154. data/ext/lpsolver-highs/pyproject.toml +221 -0
  1155. data/ext/lpsolver-highs/subprojects/pybind11.wrap +13 -0
  1156. data/ext/lpsolver-highs/tests/test_highspy.py +2310 -0
  1157. data/ext/lpsolver-highs/version.rc.in +50 -0
  1158. data/lib/lpsolver/highs +0 -0
  1159. data/lib/lpsolver/model.rb +28 -4
  1160. data/lib/lpsolver/native.so +0 -0
  1161. data/lib/lpsolver/native_model.rb +261 -0
  1162. data/lib/lpsolver/solution.rb +72 -7
  1163. data/lib/lpsolver/version.rb +1 -1
  1164. data/lpsolver.gemspec +4 -1
  1165. metadata +1176 -4
@@ -0,0 +1,1368 @@
1
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2
+ /* */
3
+ /* This file is part of the HiGHS linear optimization suite */
4
+ /* */
5
+ /* Available as open-source under the MIT License */
6
+ /* */
7
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
8
+ #include "presolve/HighsPostsolveStack.h"
9
+
10
+ #include <numeric>
11
+
12
+ #include "lp_data/HConst.h"
13
+ #include "lp_data/HighsModelUtils.h" // For debugging #2001
14
+ #include "lp_data/HighsOptions.h"
15
+ #include "util/HighsCDouble.h"
16
+ #include "util/HighsUtils.h"
17
+
18
+ namespace presolve {
19
+
20
+ void HighsPostsolveStack::initializeIndexMaps(HighsInt numRow,
21
+ HighsInt numCol) {
22
+ origNumRow = numRow;
23
+ origNumCol = numCol;
24
+
25
+ origRowIndex.resize(numRow);
26
+ std::iota(origRowIndex.begin(), origRowIndex.end(), 0);
27
+
28
+ origColIndex.resize(numCol);
29
+ std::iota(origColIndex.begin(), origColIndex.end(), 0);
30
+
31
+ linearlyTransformable.resize(numCol, true);
32
+ }
33
+
34
+ void HighsPostsolveStack::compressIndexMaps(
35
+ const std::vector<HighsInt>& newRowIndex,
36
+ const std::vector<HighsInt>& newColIndex) {
37
+ // loop over rows, decrease row counter for deleted rows (marked with -1),
38
+ // store original index at new index position otherwise
39
+ HighsInt numRow = origRowIndex.size();
40
+ for (size_t i = 0; i != newRowIndex.size(); ++i) {
41
+ if (newRowIndex[i] == -1)
42
+ --numRow;
43
+ else
44
+ origRowIndex[newRowIndex[i]] = origRowIndex[i];
45
+ }
46
+ // resize original index array to new size
47
+ origRowIndex.resize(numRow);
48
+
49
+ // now compress the column array
50
+ HighsInt numCol = origColIndex.size();
51
+ for (size_t i = 0; i != newColIndex.size(); ++i) {
52
+ if (newColIndex[i] == -1)
53
+ --numCol;
54
+ else
55
+ origColIndex[newColIndex[i]] = origColIndex[i];
56
+ }
57
+ origColIndex.resize(numCol);
58
+ }
59
+
60
+ void HighsPostsolveStack::LinearTransform::undo(const HighsOptions& options,
61
+ HighsSolution& solution) const {
62
+ solution.col_value[col] *= scale;
63
+ solution.col_value[col] += constant;
64
+
65
+ if (solution.dual_valid) solution.col_dual[col] /= scale;
66
+ }
67
+
68
+ void HighsPostsolveStack::LinearTransform::transformToPresolvedSpace(
69
+ std::vector<double>& primalSol) const {
70
+ primalSol[col] -= constant;
71
+ primalSol[col] /= scale;
72
+ }
73
+
74
+ static HighsBasisStatus computeRowStatus(double dual,
75
+ HighsPostsolveStack::RowType rowType) {
76
+ if (rowType == HighsPostsolveStack::RowType::kEq)
77
+ return dual < 0 ? HighsBasisStatus::kUpper : HighsBasisStatus::kLower;
78
+ else if (rowType == HighsPostsolveStack::RowType::kGeq)
79
+ return HighsBasisStatus::kLower;
80
+ else
81
+ return HighsBasisStatus::kUpper;
82
+ }
83
+
84
+ void HighsPostsolveStack::FreeColSubstitution::undo(
85
+ const HighsOptions& options, const std::vector<Nonzero>& rowValues,
86
+ const std::vector<Nonzero>& colValues, HighsSolution& solution,
87
+ HighsBasis& basis) {
88
+ // a (removed) cut may have been used in this reduction.
89
+ bool isModelRow = static_cast<size_t>(row) < solution.row_value.size();
90
+
91
+ // compute primal values
92
+ double colCoef = 0;
93
+ HighsCDouble rowValue = 0;
94
+ for (const auto& rowVal : rowValues) {
95
+ if (rowVal.index == col)
96
+ colCoef = rowVal.value;
97
+ else
98
+ rowValue += rowVal.value * solution.col_value[rowVal.index];
99
+ }
100
+
101
+ assert(colCoef != 0);
102
+ // Row values aren't fully postsolved, so why do this?
103
+ if (isModelRow)
104
+ solution.row_value[row] =
105
+ double(rowValue + colCoef * solution.col_value[col]);
106
+ solution.col_value[col] = double((rhs - rowValue) / colCoef);
107
+
108
+ // if no dual values requested, return here
109
+ if (!solution.dual_valid) return;
110
+
111
+ // compute the row dual value such that reduced cost of basic column is 0
112
+ if (isModelRow) {
113
+ solution.row_dual[row] = 0;
114
+ HighsCDouble dualval = colCost;
115
+ for (const auto& colVal : colValues) {
116
+ if (static_cast<size_t>(colVal.index) < solution.row_dual.size())
117
+ dualval -= colVal.value * solution.row_dual[colVal.index];
118
+ }
119
+ solution.row_dual[row] = double(dualval / colCoef);
120
+ }
121
+
122
+ solution.col_dual[col] = 0;
123
+
124
+ // set basis status if necessary
125
+ if (!basis.valid) return;
126
+
127
+ basis.col_status[col] = HighsBasisStatus::kBasic;
128
+ if (isModelRow)
129
+ basis.row_status[row] = computeRowStatus(solution.row_dual[row], rowType);
130
+ }
131
+
132
+ static HighsBasisStatus computeStatus(double dual, HighsBasisStatus& status,
133
+ double dual_feasibility_tolerance) {
134
+ if (dual > dual_feasibility_tolerance)
135
+ status = HighsBasisStatus::kLower;
136
+ else if (dual < -dual_feasibility_tolerance)
137
+ status = HighsBasisStatus::kUpper;
138
+
139
+ return status;
140
+ }
141
+
142
+ static HighsBasisStatus computeStatus(double dual,
143
+ double dual_feasibility_tolerance) {
144
+ if (dual > dual_feasibility_tolerance)
145
+ return HighsBasisStatus::kLower;
146
+ else if (dual < -dual_feasibility_tolerance)
147
+ return HighsBasisStatus::kUpper;
148
+ else
149
+ return HighsBasisStatus::kBasic;
150
+ }
151
+
152
+ void HighsPostsolveStack::DoubletonEquation::undo(
153
+ const HighsOptions& options, const std::vector<Nonzero>& colValues,
154
+ HighsSolution& solution, HighsBasis& basis) const {
155
+ // retrieve the row and column index, the row side and the two
156
+ // coefficients then compute the primal values
157
+ solution.col_value[colSubst] =
158
+ double((rhs - HighsCDouble(coef) * solution.col_value[col]) / coefSubst);
159
+
160
+ // can only do primal postsolve, stop here
161
+ if (row == -1 || !solution.dual_valid) return;
162
+
163
+ const HighsBasisStatus colStatus =
164
+ !basis.valid
165
+ ? computeStatus(solution.col_dual[col],
166
+ options.dual_feasibility_tolerance)
167
+ : computeStatus(solution.col_dual[col], basis.col_status[col],
168
+ options.dual_feasibility_tolerance);
169
+
170
+ // a (removed) cut may have been used in this reduction.
171
+ bool isModelRow = static_cast<size_t>(row) < solution.row_value.size();
172
+
173
+ // compute the current dual values of the row and the substituted column
174
+ // before deciding on which column becomes basic
175
+ // for each entry in a row i of the substituted column we added the
176
+ // doubleton equation row with scale -a_i/substCoef. Therefore the dual
177
+ // multiplier of this row i implicitly increases the dual multiplier of this
178
+ // doubleton equation row with that scale.
179
+ HighsCDouble rowDual = 0.0;
180
+ if (isModelRow) {
181
+ solution.row_dual[row] = 0;
182
+ for (const auto& colVal : colValues) {
183
+ if (static_cast<size_t>(colVal.index) < solution.row_dual.size())
184
+ rowDual -= colVal.value * solution.row_dual[colVal.index];
185
+ }
186
+ rowDual /= coefSubst;
187
+ solution.row_dual[row] = double(rowDual);
188
+ }
189
+ // the equation was also added to the objective, so the current values need
190
+ // to be changed
191
+ solution.col_dual[colSubst] = substCost;
192
+ solution.col_dual[col] += substCost * coef / coefSubst;
193
+
194
+ if ((upperTightened && colStatus == HighsBasisStatus::kUpper) ||
195
+ (lowerTightened && colStatus == HighsBasisStatus::kLower)) {
196
+ // column must get zero reduced cost as the current bound cannot be used
197
+ // so alter the dual multiplier of the row to make the dual multiplier of
198
+ // column zero
199
+ double rowDualDelta = solution.col_dual[col] / coef;
200
+ if (isModelRow) solution.row_dual[row] = double(rowDual + rowDualDelta);
201
+ solution.col_dual[col] = 0.0;
202
+ solution.col_dual[colSubst] = double(
203
+ HighsCDouble(solution.col_dual[colSubst]) - rowDualDelta * coefSubst);
204
+
205
+ if (basis.valid) {
206
+ if ((std::signbit(coef) == std::signbit(coefSubst) &&
207
+ basis.col_status[col] == HighsBasisStatus::kUpper) ||
208
+ (std::signbit(coef) != std::signbit(coefSubst) &&
209
+ basis.col_status[col] == HighsBasisStatus::kLower))
210
+ basis.col_status[colSubst] = HighsBasisStatus::kLower;
211
+ else
212
+ basis.col_status[colSubst] = HighsBasisStatus::kUpper;
213
+ basis.col_status[col] = HighsBasisStatus::kBasic;
214
+ }
215
+ } else {
216
+ // otherwise make the reduced cost of the substituted column zero and make
217
+ // that column basic
218
+ double rowDualDelta = solution.col_dual[colSubst] / coefSubst;
219
+ if (isModelRow) solution.row_dual[row] = double(rowDual + rowDualDelta);
220
+ solution.col_dual[colSubst] = 0.0;
221
+ solution.col_dual[col] =
222
+ double(HighsCDouble(solution.col_dual[col]) - rowDualDelta * coef);
223
+ if (basis.valid) basis.col_status[colSubst] = HighsBasisStatus::kBasic;
224
+ }
225
+
226
+ if (!basis.valid) return;
227
+
228
+ if (isModelRow)
229
+ basis.row_status[row] = computeRowStatus(solution.row_dual[row], rowType);
230
+ }
231
+
232
+ void HighsPostsolveStack::EqualityRowAddition::undo(
233
+ const HighsOptions& options, const std::vector<Nonzero>& eqRowValues,
234
+ HighsSolution& solution, HighsBasis& basis) const {
235
+ // (removed) cuts may have been used in this reduction.
236
+ if (static_cast<size_t>(row) >= solution.row_value.size() ||
237
+ static_cast<size_t>(addedEqRow) >= solution.row_value.size())
238
+ return;
239
+
240
+ // nothing more to do if the row is zero in the dual solution or there is
241
+ // no dual solution
242
+ if (!solution.dual_valid || solution.row_dual[row] == 0.0) return;
243
+
244
+ // the dual multiplier of the row implicitly increases the dual multiplier
245
+ // of the equation with the scale the equation was added with
246
+ solution.row_dual[addedEqRow] =
247
+ double(HighsCDouble(eqRowScale) * solution.row_dual[row] +
248
+ solution.row_dual[addedEqRow]);
249
+
250
+ assert(!basis.valid);
251
+ }
252
+
253
+ void HighsPostsolveStack::EqualityRowAdditions::undo(
254
+ const HighsOptions& options, const std::vector<Nonzero>& eqRowValues,
255
+ const std::vector<Nonzero>& targetRows, HighsSolution& solution,
256
+ HighsBasis& basis) const {
257
+ // a (removed) cut may have been used in this reduction.
258
+ if (static_cast<size_t>(addedEqRow) >= solution.row_value.size()) return;
259
+
260
+ // nothing more to do if the row is zero in the dual solution or there is
261
+ // no dual solution
262
+ if (!solution.dual_valid) return;
263
+
264
+ // the dual multiplier of the rows where the eq row was added implicitly
265
+ // increases the dual multiplier of the equation with the scale that was
266
+ // used for adding the equation
267
+ HighsCDouble eqRowDual = solution.row_dual[addedEqRow];
268
+ for (const auto& targetRow : targetRows) {
269
+ if (static_cast<size_t>(targetRow.index) < solution.row_dual.size())
270
+ eqRowDual +=
271
+ HighsCDouble(targetRow.value) * solution.row_dual[targetRow.index];
272
+ }
273
+ solution.row_dual[addedEqRow] = double(eqRowDual);
274
+
275
+ assert(!basis.valid);
276
+ }
277
+
278
+ void HighsPostsolveStack::ForcingColumn::undo(
279
+ const HighsOptions& options, const std::vector<Nonzero>& colValues,
280
+ HighsSolution& solution, HighsBasis& basis) const {
281
+ HighsInt nonbasicRow = -1;
282
+ HighsBasisStatus nonbasicRowStatus = HighsBasisStatus::kNonbasic;
283
+ double colValFromNonbasicRow = colBound;
284
+
285
+ HighsInt debug_num_use_row_value = 0;
286
+ const bool debug_report = false;
287
+
288
+ auto computeColVal = [&](HighsInt direction) {
289
+ // choose solution value that makes all rows feasible
290
+ for (const auto& colVal : colValues) {
291
+ // Row values aren't fully postsolved, so how can this work?
292
+ debug_num_use_row_value++;
293
+ if (static_cast<size_t>(colVal.index) < solution.row_value.size()) {
294
+ double colValFromRow = solution.row_value[colVal.index] / colVal.value;
295
+ if (direction * colValFromRow > direction * colValFromNonbasicRow) {
296
+ nonbasicRow = colVal.index;
297
+ colValFromNonbasicRow = colValFromRow;
298
+ nonbasicRowStatus = direction * colVal.value > 0
299
+ ? HighsBasisStatus::kLower
300
+ : HighsBasisStatus::kUpper;
301
+ }
302
+ }
303
+ }
304
+ // round solution value if column is integer-constrained
305
+ if (nonbasicRow != -1 && colIntegral)
306
+ colValFromNonbasicRow =
307
+ direction * std::ceil(direction * colValFromNonbasicRow -
308
+ options.mip_feasibility_tolerance);
309
+ };
310
+
311
+ if (atInfiniteUpper) {
312
+ // choose largest value as then all rows are feasible
313
+ computeColVal(HighsInt{1});
314
+ } else {
315
+ // choose smallest value, as then all rows are feasible
316
+ computeColVal(HighsInt{-1});
317
+ }
318
+ if (debug_num_use_row_value && debug_report) {
319
+ printf(
320
+ "HighsPostsolveStack::ForcingColumn::undo Using %d unknown row "
321
+ "activit%s\n",
322
+ int(debug_num_use_row_value),
323
+ debug_num_use_row_value > 1 ? "ies" : "y");
324
+ }
325
+
326
+ solution.col_value[col] = colValFromNonbasicRow;
327
+
328
+ if (!solution.dual_valid) return;
329
+
330
+ solution.col_dual[col] = 0.0;
331
+
332
+ if (!basis.valid) return;
333
+ if (nonbasicRow == -1) {
334
+ basis.col_status[col] =
335
+ atInfiniteUpper ? HighsBasisStatus::kLower : HighsBasisStatus::kUpper;
336
+ } else {
337
+ basis.col_status[col] = HighsBasisStatus::kBasic;
338
+ basis.row_status[nonbasicRow] = nonbasicRowStatus;
339
+ }
340
+ }
341
+
342
+ void HighsPostsolveStack::ForcingColumnRemovedRow::undo(
343
+ const HighsOptions& options, const std::vector<Nonzero>& rowValues,
344
+ HighsSolution& solution, HighsBasis& basis) const {
345
+ // a (removed) cut may have been used in this reduction.
346
+ if (static_cast<size_t>(row) >= solution.row_value.size()) return;
347
+
348
+ // we use the row value as storage for the scaled value implied on the
349
+ // column dual
350
+ HighsCDouble val = rhs;
351
+ for (const auto& rowVal : rowValues)
352
+ val -= rowVal.value * solution.col_value[rowVal.index];
353
+
354
+ // Row values aren't fully postsolved, so why do this?
355
+ solution.row_value[row] = double(val);
356
+
357
+ if (solution.dual_valid) solution.row_dual[row] = 0.0;
358
+ if (basis.valid) basis.row_status[row] = HighsBasisStatus::kBasic;
359
+ }
360
+
361
+ void HighsPostsolveStack::SingletonRow::undo(const HighsOptions& options,
362
+ HighsSolution& solution,
363
+ HighsBasis& basis) const {
364
+ // a (removed) cut may have been used in this reduction.
365
+ bool isModelRow = static_cast<size_t>(row) < solution.row_value.size();
366
+
367
+ // nothing to do if the rows dual value is zero in the dual solution or
368
+ // there is no dual solution
369
+ if (!solution.dual_valid) return;
370
+
371
+ const HighsBasisStatus colStatus =
372
+ !basis.valid
373
+ ? computeStatus(solution.col_dual[col],
374
+ options.dual_feasibility_tolerance)
375
+ : computeStatus(solution.col_dual[col], basis.col_status[col],
376
+ options.dual_feasibility_tolerance);
377
+
378
+ if ((!colLowerTightened || colStatus != HighsBasisStatus::kLower) &&
379
+ (!colUpperTightened || colStatus != HighsBasisStatus::kUpper)) {
380
+ // the tightened bound is not used in the basic solution
381
+ // hence we simply make the row basic and give it a dual multiplier of 0
382
+ if (isModelRow) {
383
+ if (basis.valid) basis.row_status[row] = HighsBasisStatus::kBasic;
384
+ solution.row_dual[row] = 0;
385
+ }
386
+ return;
387
+ }
388
+
389
+ // choose the row dual value such that the columns reduced cost becomes
390
+ // zero
391
+ if (isModelRow) solution.row_dual[row] = solution.col_dual[col] / coef;
392
+ solution.col_dual[col] = 0;
393
+
394
+ if (!basis.valid) return;
395
+
396
+ if (isModelRow) {
397
+ switch (colStatus) {
398
+ case HighsBasisStatus::kLower:
399
+ assert(colLowerTightened);
400
+ if (coef > 0)
401
+ // tightened lower bound comes from row lower bound
402
+ basis.row_status[row] = HighsBasisStatus::kLower;
403
+ else
404
+ // tightened lower bound comes from row upper bound
405
+ basis.row_status[row] = HighsBasisStatus::kUpper;
406
+
407
+ break;
408
+ case HighsBasisStatus::kUpper:
409
+ if (coef > 0)
410
+ // tightened upper bound comes from row lower bound
411
+ basis.row_status[row] = HighsBasisStatus::kUpper;
412
+ else
413
+ // tightened lower bound comes from row upper bound
414
+ basis.row_status[row] = HighsBasisStatus::kLower;
415
+ break;
416
+ default:
417
+ assert(false);
418
+ }
419
+ }
420
+
421
+ // column becomes basic
422
+ basis.col_status[col] = HighsBasisStatus::kBasic;
423
+ }
424
+
425
+ // column fixed to lower or upper bound
426
+ void HighsPostsolveStack::FixedCol::undo(const HighsOptions& options,
427
+ const std::vector<Nonzero>& colValues,
428
+ HighsSolution& solution,
429
+ HighsBasis& basis) const {
430
+ // set solution value
431
+ solution.col_value[col] = fixValue;
432
+
433
+ if (!solution.dual_valid) return;
434
+
435
+ // compute reduced cost
436
+
437
+ HighsCDouble reducedCost = colCost;
438
+ for (const auto& colVal : colValues) {
439
+ if (static_cast<size_t>(colVal.index) < solution.row_dual.size())
440
+ reducedCost -= colVal.value * solution.row_dual[colVal.index];
441
+ }
442
+
443
+ solution.col_dual[col] = double(reducedCost);
444
+
445
+ // set basis status
446
+ if (basis.valid) {
447
+ basis.col_status[col] = fixType;
448
+ if (basis.col_status[col] == HighsBasisStatus::kNonbasic)
449
+ basis.col_status[col] = solution.col_dual[col] >= 0
450
+ ? HighsBasisStatus::kLower
451
+ : HighsBasisStatus::kUpper;
452
+ }
453
+ }
454
+
455
+ void HighsPostsolveStack::RedundantRow::undo(const HighsOptions& options,
456
+ HighsSolution& solution,
457
+ HighsBasis& basis) const {
458
+ // a (removed) cut may have been used in this reduction.
459
+ if (static_cast<size_t>(row) >= solution.row_value.size()) return;
460
+
461
+ // set row dual to zero if dual solution requested
462
+ if (!solution.dual_valid) return;
463
+
464
+ solution.row_dual[row] = 0.0;
465
+
466
+ if (basis.valid) basis.row_status[row] = HighsBasisStatus::kBasic;
467
+ }
468
+
469
+ void HighsPostsolveStack::ForcingRow::undo(
470
+ const HighsOptions& options, const std::vector<Nonzero>& rowValues,
471
+ HighsSolution& solution, HighsBasis& basis) const {
472
+ if (!solution.dual_valid) return;
473
+
474
+ // compute the row dual multiplier and determine the new basic column
475
+ HighsInt basicCol = -1;
476
+ double dualDelta = 0;
477
+ HighsInt direction = rowType == RowType::kLeq ? 1 : -1;
478
+ for (const auto& rowVal : rowValues) {
479
+ double colDual = solution.col_dual[rowVal.index] - rowVal.value * dualDelta;
480
+ if (direction * colDual * rowVal.value < 0) {
481
+ // column is dual infeasible, decrease the row dual such that its
482
+ // reduced cost become zero and remember this column as the new basic
483
+ // column for this row
484
+ dualDelta = solution.col_dual[rowVal.index] / rowVal.value;
485
+ basicCol = rowVal.index;
486
+ }
487
+ }
488
+
489
+ if (basicCol != -1) {
490
+ bool isModelRow = static_cast<size_t>(row) < solution.row_dual.size();
491
+ if (isModelRow) solution.row_dual[row] = solution.row_dual[row] + dualDelta;
492
+ for (const auto& rowVal : rowValues) {
493
+ solution.col_dual[rowVal.index] =
494
+ double(solution.col_dual[rowVal.index] -
495
+ HighsCDouble(dualDelta) * rowVal.value);
496
+ }
497
+ solution.col_dual[basicCol] = 0;
498
+
499
+ if (basis.valid) {
500
+ if (isModelRow)
501
+ basis.row_status[row] =
502
+ (rowType == RowType::kGeq ? HighsBasisStatus::kLower
503
+ : HighsBasisStatus::kUpper);
504
+
505
+ basis.col_status[basicCol] = HighsBasisStatus::kBasic;
506
+ }
507
+ }
508
+ }
509
+
510
+ void HighsPostsolveStack::DuplicateRow::undo(const HighsOptions& options,
511
+ HighsSolution& solution,
512
+ HighsBasis& basis) const {
513
+ // (removed) cuts may have been used in this reduction.
514
+ if (static_cast<size_t>(row) >= solution.row_value.size()) return;
515
+ bool duplicateIsModelRow =
516
+ static_cast<size_t>(duplicateRow) < solution.row_value.size();
517
+
518
+ if (!solution.dual_valid) return;
519
+ if (!rowUpperTightened && !rowLowerTightened) {
520
+ // simple case of row2 being redundant, in which case it just gets a
521
+ // dual multiplier of 0 and is made basic
522
+ if (duplicateIsModelRow) {
523
+ solution.row_dual[duplicateRow] = 0.0;
524
+ if (basis.valid)
525
+ basis.row_status[duplicateRow] = HighsBasisStatus::kBasic;
526
+ }
527
+ return;
528
+ }
529
+
530
+ const HighsBasisStatus rowStatus =
531
+ !basis.valid
532
+ ? computeStatus(solution.row_dual[row],
533
+ options.dual_feasibility_tolerance)
534
+ : computeStatus(solution.row_dual[row], basis.row_status[row],
535
+ options.dual_feasibility_tolerance);
536
+
537
+ auto computeRowDualAndStatus = [&](bool tighened) {
538
+ if (tighened) {
539
+ if (duplicateIsModelRow) {
540
+ solution.row_dual[duplicateRow] =
541
+ solution.row_dual[row] / duplicateRowScale;
542
+ if (basis.valid) {
543
+ if (duplicateRowScale > 0)
544
+ basis.row_status[duplicateRow] = HighsBasisStatus::kUpper;
545
+ else
546
+ basis.row_status[duplicateRow] = HighsBasisStatus::kLower;
547
+ }
548
+ }
549
+ solution.row_dual[row] = 0.0;
550
+ if (basis.valid) basis.row_status[row] = HighsBasisStatus::kBasic;
551
+ } else if (duplicateIsModelRow) {
552
+ solution.row_dual[duplicateRow] = 0.0;
553
+ if (basis.valid)
554
+ basis.row_status[duplicateRow] = HighsBasisStatus::kBasic;
555
+ }
556
+ };
557
+
558
+ // at least one bound of the row was tightened by using the bound of the
559
+ // scaled parallel row, hence we might need to make the parallel row
560
+ // nonbasic and the row basic
561
+
562
+ switch (rowStatus) {
563
+ case HighsBasisStatus::kBasic:
564
+ // if row is basic the parallel row is also basic
565
+ if (duplicateIsModelRow) {
566
+ solution.row_dual[duplicateRow] = 0.0;
567
+ if (basis.valid)
568
+ basis.row_status[duplicateRow] = HighsBasisStatus::kBasic;
569
+ }
570
+ break;
571
+ case HighsBasisStatus::kUpper:
572
+ // if row sits on its upper bound, and the row upper bound was
573
+ // tightened using the parallel row we make the row basic and
574
+ // transfer its dual value to the parallel row with the proper scale
575
+ computeRowDualAndStatus(rowUpperTightened);
576
+ break;
577
+ case HighsBasisStatus::kLower:
578
+ computeRowDualAndStatus(rowLowerTightened);
579
+ break;
580
+ default:
581
+ assert(false);
582
+ }
583
+ }
584
+
585
+ void HighsPostsolveStack::DuplicateColumn::undo(const HighsOptions& options,
586
+ HighsSolution& solution,
587
+ HighsBasis& basis) const {
588
+ const bool debug_report = false;
589
+ const double mergeVal = solution.col_value[col];
590
+
591
+ auto okResidual = [&](const double x, const double y) {
592
+ const double check_mergeVal = x + colScale * y;
593
+ const double residual = std::fabs(check_mergeVal - mergeVal);
594
+ const bool ok_residual = residual <= options.primal_feasibility_tolerance;
595
+ if (!ok_residual && debug_report) {
596
+ printf(
597
+ "HighsPostsolveStack::DuplicateColumn::undo %g + %g.%g = %g != %g: "
598
+ "residual = %g\n",
599
+ x, colScale, y, check_mergeVal, mergeVal, residual);
600
+ }
601
+ return ok_residual;
602
+ };
603
+
604
+ auto isAtBound = [&](const double value, const double bound) {
605
+ if (value < bound - options.primal_feasibility_tolerance) return false;
606
+ if (value <= bound + options.primal_feasibility_tolerance) return true;
607
+ return false;
608
+ };
609
+
610
+ // const bool ok_merge = okMerge(options.mip_feasibility_tolerance);
611
+ // assert(ok_merge);
612
+ //
613
+ // the column dual of the duplicate column is easily computed by scaling
614
+ // since col * colScale yields the coefficient values and cost of the
615
+ // duplicate column.
616
+ if (solution.dual_valid)
617
+ solution.col_dual[duplicateCol] = solution.col_dual[col] * colScale;
618
+
619
+ if (basis.valid) {
620
+ // do postsolve using basis status if a basis is available: if the
621
+ // merged column is nonbasic, we can just set both columns to
622
+ // appropriate nonbasic status and value
623
+ //
624
+ // Undoing z = x + a.y
625
+ //
626
+ // Since x became z, its basis status is unchanged
627
+ //
628
+ // For a > 0, z\in [x_l + a.y_l, x_u + a.y_u]
629
+ //
630
+ // If z is nonbasic at its lower (upper) bound, set y to be
631
+ // nonbasic at its lower (upper) bound
632
+ //
633
+ // For a < 0, z\in [x_l + a.y_u, x_u + a.y_l]
634
+ //
635
+ // If z is nonbasic at lower (upper) bound, set y to be nonbasic
636
+ // at its upper (lower) bounds
637
+ //
638
+ // Check for perturbations
639
+ switch (basis.col_status[col]) {
640
+ case HighsBasisStatus::kLower: {
641
+ solution.col_value[col] = colLower;
642
+ if (colScale > 0) {
643
+ basis.col_status[duplicateCol] = HighsBasisStatus::kLower;
644
+ solution.col_value[duplicateCol] = duplicateColLower;
645
+ } else {
646
+ basis.col_status[duplicateCol] = HighsBasisStatus::kUpper;
647
+ solution.col_value[duplicateCol] = duplicateColUpper;
648
+ }
649
+ // nothing else to do
650
+ assert(okResidual(solution.col_value[col],
651
+ solution.col_value[duplicateCol]));
652
+ return;
653
+ }
654
+ case HighsBasisStatus::kUpper: {
655
+ solution.col_value[col] = colUpper;
656
+ if (colScale > 0) {
657
+ basis.col_status[duplicateCol] = HighsBasisStatus::kUpper;
658
+ solution.col_value[duplicateCol] = duplicateColUpper;
659
+ } else {
660
+ basis.col_status[duplicateCol] = HighsBasisStatus::kLower;
661
+ solution.col_value[duplicateCol] = duplicateColLower;
662
+ }
663
+ // nothing else to do
664
+ assert(okResidual(solution.col_value[col],
665
+ solution.col_value[duplicateCol]));
666
+ return;
667
+ }
668
+ case HighsBasisStatus::kZero: {
669
+ solution.col_value[col] = 0.0;
670
+ basis.col_status[duplicateCol] = HighsBasisStatus::kZero;
671
+ solution.col_value[duplicateCol] = 0.0;
672
+ // nothing else to do
673
+ assert(okResidual(solution.col_value[col],
674
+ solution.col_value[duplicateCol]));
675
+ return;
676
+ }
677
+ case HighsBasisStatus::kBasic:
678
+ case HighsBasisStatus::kNonbasic:;
679
+ }
680
+ // Nonbasic cases should have been considered; basic case
681
+ // considered later
682
+ assert(basis.col_status[col] == HighsBasisStatus::kBasic);
683
+ }
684
+
685
+ // either no basis for postsolve, or column status is basic. One of
686
+ // the two columns must become nonbasic. In case of integrality it is
687
+ // simpler to choose col, since it has a coefficient of +1 in the equation z
688
+ // = col + colScale * duplicateCol where the merged column is z and is
689
+ // currently using the index of col. The duplicateCol can have a positive or
690
+ // negative coefficient. So for postsolve, we first start out with col
691
+ // sitting at the lower bound and compute the corresponding value for the
692
+ // duplicate column as (z - colLower)/colScale. Then the following things
693
+ // might happen:
694
+ // - case 1: the value computed for duplicateCol is within the bounds
695
+ // - case 1.1: duplicateCol is continuous -> accept value, make col nonbasic
696
+ // at lower and duplicateCol basic
697
+ // - case 1.2: duplicateCol is integer -> accept value if integer feasible,
698
+ // otherwise round down and compute value of col as
699
+ // col = z - colScale * duplicateCol
700
+ // - case 2: the value for duplicateCol violates the column bounds: make it
701
+ // sit at the bound that is violated
702
+ // and compute the value of col as col = z - colScale *
703
+ // duplicateCol for basis postsolve col is basic and duplicateCol
704
+ // nonbasic at lower/upper depending on which bound is violated.
705
+
706
+ if (colLower != -kHighsInf)
707
+ solution.col_value[col] = colLower;
708
+ else
709
+ solution.col_value[col] = std::min(0.0, colUpper);
710
+ solution.col_value[duplicateCol] = static_cast<double>(
711
+ (static_cast<HighsCDouble>(mergeVal) - solution.col_value[col]) /
712
+ colScale);
713
+
714
+ bool recomputeCol = false;
715
+
716
+ // Set any basis status for duplicateCol to kNonbasic to check that
717
+ // it is set
718
+ if (basis.valid) basis.col_status[duplicateCol] = HighsBasisStatus::kNonbasic;
719
+
720
+ if (solution.col_value[duplicateCol] > duplicateColUpper) {
721
+ solution.col_value[duplicateCol] = duplicateColUpper;
722
+ recomputeCol = true;
723
+ if (basis.valid) basis.col_status[duplicateCol] = HighsBasisStatus::kUpper;
724
+ } else if (solution.col_value[duplicateCol] < duplicateColLower) {
725
+ solution.col_value[duplicateCol] = duplicateColLower;
726
+ recomputeCol = true;
727
+ if (basis.valid) basis.col_status[duplicateCol] = HighsBasisStatus::kLower;
728
+ } else if (duplicateColIntegral) {
729
+ // Doesn't set basis.col_status[duplicateCol], so assume no basis
730
+ assert(!basis.valid);
731
+ if (fractionality(solution.col_value[duplicateCol]) >
732
+ options.mip_feasibility_tolerance) {
733
+ solution.col_value[duplicateCol] =
734
+ std::floor(solution.col_value[duplicateCol]);
735
+ recomputeCol = true;
736
+ }
737
+ }
738
+
739
+ if (recomputeCol) {
740
+ solution.col_value[col] =
741
+ mergeVal - colScale * solution.col_value[duplicateCol];
742
+ if (!duplicateColIntegral && colIntegral) {
743
+ // if column is integral and duplicateCol is not we need to make sure
744
+ // we split the values into an integral one for col
745
+ //
746
+ // Doesn't set basis.col_status[duplicateCol], so assume no basis
747
+ assert(!basis.valid);
748
+ solution.col_value[col] = std::ceil(solution.col_value[col] -
749
+ options.mip_feasibility_tolerance);
750
+ solution.col_value[duplicateCol] = static_cast<double>(
751
+ (static_cast<HighsCDouble>(mergeVal) - solution.col_value[col]) /
752
+ colScale);
753
+ }
754
+ } else {
755
+ // setting col to its lower bound yielded a feasible value for
756
+ // duplicateCol - not necessarily!
757
+ if (basis.valid) {
758
+ // This makes duplicateCol basic
759
+ basis.col_status[duplicateCol] = basis.col_status[col];
760
+ basis.col_status[col] = HighsBasisStatus::kLower;
761
+ assert(basis.col_status[duplicateCol] == HighsBasisStatus::kBasic);
762
+ }
763
+ }
764
+ // Check that any basis status for duplicateCol has been set
765
+ if (basis.valid)
766
+ assert(basis.col_status[duplicateCol] != HighsBasisStatus::kNonbasic);
767
+
768
+ auto hasError = [&]() {
769
+ bool illegal_duplicateCol_lower =
770
+ solution.col_value[duplicateCol] <
771
+ duplicateColLower - options.mip_feasibility_tolerance;
772
+ bool illegal_duplicateCol_upper =
773
+ solution.col_value[duplicateCol] >
774
+ duplicateColUpper + options.mip_feasibility_tolerance;
775
+ bool illegal_col_lower =
776
+ solution.col_value[col] < colLower - options.mip_feasibility_tolerance;
777
+ bool illegal_col_upper =
778
+ solution.col_value[col] > colUpper + options.mip_feasibility_tolerance;
779
+ bool illegal_residual =
780
+ !okResidual(solution.col_value[col], solution.col_value[duplicateCol]);
781
+ return (illegal_duplicateCol_lower || illegal_duplicateCol_upper ||
782
+ illegal_col_lower || illegal_col_upper || illegal_residual);
783
+ };
784
+
785
+ if (hasError()) {
786
+ if (debug_report)
787
+ printf(
788
+ "DuplicateColumn::undo error: col = %d(%g), duplicateCol = %d(%g)\n"
789
+ "%g\n%g\n%g %g %d\n%g %g %d\n",
790
+ int(col), solution.col_value[col], int(duplicateCol),
791
+ solution.col_value[duplicateCol], mergeVal, colScale, colLower,
792
+ colUpper, colIntegral, duplicateColLower, duplicateColUpper,
793
+ duplicateColIntegral);
794
+ // Fix error due to undo
795
+ undoFix(options, solution, mergeVal);
796
+ } else {
797
+ return;
798
+ }
799
+ const bool allow_assert = false;
800
+ if (allow_assert) assert(!hasError());
801
+ // Following undoFix, set any basis status, ideally keeping col basic
802
+ if (basis.valid) {
803
+ bool duplicateCol_basic = false;
804
+ if (duplicateColLower <= -kHighsInf && duplicateColUpper >= kHighsInf) {
805
+ // duplicateCol is free, so may be zero
806
+ if (solution.col_value[duplicateCol] == 0) {
807
+ basis.col_status[col] = HighsBasisStatus::kBasic;
808
+ basis.col_status[duplicateCol] = HighsBasisStatus::kZero;
809
+ } else {
810
+ duplicateCol_basic = true;
811
+ }
812
+ } else if (isAtBound(solution.col_value[duplicateCol], duplicateColLower)) {
813
+ basis.col_status[col] = HighsBasisStatus::kBasic;
814
+ basis.col_status[duplicateCol] = HighsBasisStatus::kLower;
815
+ } else if (isAtBound(solution.col_value[duplicateCol], duplicateColUpper)) {
816
+ basis.col_status[col] = HighsBasisStatus::kBasic;
817
+ basis.col_status[duplicateCol] = HighsBasisStatus::kUpper;
818
+ } else {
819
+ // duplicateCol is not free or at a bound, so must be basic
820
+ duplicateCol_basic = true;
821
+ }
822
+ if (duplicateCol_basic) {
823
+ // duplicateCol must be basic
824
+ basis.col_status[duplicateCol] = HighsBasisStatus::kBasic;
825
+ // Hopefully col can be nonbasic
826
+ if (isAtBound(solution.col_value[col], colLower)) {
827
+ basis.col_status[col] = HighsBasisStatus::kLower;
828
+ } else if (isAtBound(solution.col_value[col], colUpper)) {
829
+ basis.col_status[col] = HighsBasisStatus::kUpper;
830
+ } else {
831
+ basis.col_status[col] = HighsBasisStatus::kNonbasic;
832
+ if (debug_report)
833
+ printf(
834
+ "When demerging, neither col nor duplicateCol can be "
835
+ "nonbasic\n");
836
+ if (kAllowDeveloperAssert) assert(666 == 999);
837
+ }
838
+ }
839
+ }
840
+ }
841
+
842
+ bool HighsPostsolveStack::DuplicateColumn::okMerge(
843
+ const double tolerance) const {
844
+ // When merging x and y to x+a.y, not all values of a are permitted,
845
+ // since it must be possible to map back onto feasible values of x
846
+ // and y.
847
+ //
848
+ // Assume WLOG that a > 0, x\in[x_l, x_u], y\in[y_l, y_u]
849
+ //
850
+ // Let z = x + a.y
851
+ //
852
+ // Range for z is [x_l+a.y_l, x_u+a.y_u]
853
+ //
854
+ // * If x and y are both integer:
855
+ //
856
+ // z will be integer and x+a.y must generate all integer values in
857
+ // [x_l+a.y_l, x_u+a.y_u]. Hence a must be an integer. If a >=
858
+ // (x_u-x_l)+2 then, since [a.y_l, a.y_u] contains integer multiples
859
+ // of a, some of the intervening integers don't correspond to a
860
+ // value of x. Hence a must be an integer and a <= (x_u-x_l)+1
861
+ //
862
+ // For example, if x and y are binary, then x+a.y is [0, 1, a,
863
+ // 1+a]. For this to be a continuous sequence of integers, we must
864
+ // have a <= 2.
865
+ //
866
+ // * If x is integer and y is continuous:
867
+ //
868
+ // z will be continuous and x+a.y must generate all values in
869
+ // [x_l+a.y_l, x_u+a.y_u]. Since [x_l, x_u] are integers, [a.y_l,
870
+ // a.y_u] = a[y_l, y_u] must be of length at least 1. Hence a must
871
+ // be at least 1/(y_u-y_l) in magnitude.
872
+ //
873
+ // * If x is continuous and y is integer:
874
+ //
875
+ // z will be continuous and x+a.y must generate all values in
876
+ // [x_l+a.y_l, x_u+a.y_u]. Since [a.y_l, a.y_u] contains integer
877
+ // multiples of a, the gaps between them must not exceed the length
878
+ // of [x_l, x_u]. Hence a must be at most x_u-x_l in
879
+ // magnitude.
880
+ //
881
+ // Observe that this is equivalent to requiring 1/a to be at least
882
+ // 1/(x_u-x_l) in magnitude, the symmetric result corresponding to
883
+ // the merge (1/a)x+y.
884
+ //
885
+ // * If x and y are both continuous
886
+ //
887
+ // z will be continuous and x+a.y naturally generates all values in
888
+ // [x_l+a.y_l, x_u+a.y_u].
889
+
890
+ const double scale = colScale;
891
+ const bool x_int = colIntegral;
892
+ const bool y_int = duplicateColIntegral;
893
+ const double x_lo = x_int ? std::ceil(colLower - tolerance) : colLower;
894
+ const double x_up = x_int ? std::floor(colUpper + tolerance) : colUpper;
895
+ const double y_lo =
896
+ y_int ? std::ceil(duplicateColLower - tolerance) : duplicateColLower;
897
+ const double y_up =
898
+ y_int ? std::floor(duplicateColUpper + tolerance) : duplicateColUpper;
899
+ const double x_len = x_up - x_lo;
900
+ const double y_len = y_up - y_lo;
901
+ std::string newline = "\n";
902
+ bool ok_merge = true;
903
+ const bool debug_report = false;
904
+ if (scale == 0) {
905
+ if (debug_report)
906
+ printf("%sDuplicateColumn::checkMerge: Scale cannot be zero\n",
907
+ newline.c_str());
908
+ newline = "";
909
+ ok_merge = false;
910
+ }
911
+ const double abs_scale = std::fabs(scale);
912
+ if (x_int) {
913
+ if (y_int) {
914
+ // Scale must be integer and not exceed (x_u-x_l)+1 in magnitude
915
+ if (fractionality(scale) > tolerance) {
916
+ if (debug_report)
917
+ printf(
918
+ "%sDuplicateColumn::checkMerge: scale must be integer, but is "
919
+ "%g\n",
920
+ newline.c_str(), scale);
921
+ newline = "";
922
+ ok_merge = false;
923
+ }
924
+ double scale_limit = x_len + 1 + tolerance;
925
+ if (abs_scale > scale_limit) {
926
+ if (debug_report)
927
+ printf(
928
+ "%sDuplicateColumn::checkMerge: scale = %g, but |scale| cannot "
929
+ "exceed %g since x is [%g, %g]\n",
930
+ newline.c_str(), scale, scale_limit, x_lo, x_up);
931
+ newline = "";
932
+ ok_merge = false;
933
+ }
934
+ } else { // y is continuous
935
+ if (debug_report)
936
+ printf("DuplicateColumn::checkMerge: x-integer; y-continuous\n");
937
+ // Scale must be at least 1/(y_u-y_l) in magnitude
938
+ if (y_len == 0) {
939
+ if (debug_report)
940
+ printf(
941
+ "%sDuplicateColumn::checkMerge: scale = %g is too small in "
942
+ "magnitude, as y is [%g, %g]\n",
943
+ newline.c_str(), scale, y_lo, y_up);
944
+ newline = "";
945
+ ok_merge = false;
946
+ } else {
947
+ double scale_limit = 1 / y_len;
948
+ if (abs_scale < scale_limit) {
949
+ if (debug_report)
950
+ printf(
951
+ "%sDuplicateColumn::checkMerge: scale = %g, but |scale| must "
952
+ "be "
953
+ "at least %g since y is [%g, %g]\n",
954
+ newline.c_str(), scale, scale_limit, y_lo, y_up);
955
+ newline = "";
956
+ ok_merge = false;
957
+ }
958
+ }
959
+ }
960
+ } else {
961
+ if (y_int) {
962
+ if (debug_report)
963
+ printf("DuplicateColumn::checkMerge: x-continuous; y-integer\n");
964
+ // Scale must be at most (x_u-x_l) in magnitude
965
+ double scale_limit = x_len;
966
+ if (abs_scale > scale_limit) {
967
+ if (debug_report)
968
+ printf(
969
+ "%sDuplicateColumn::checkMerge: scale = %g, but |scale| must "
970
+ "be "
971
+ "at "
972
+ "most %g since x is [%g, %g]\n",
973
+ newline.c_str(), scale, scale_limit, x_lo, x_up);
974
+ newline = "";
975
+ ok_merge = false;
976
+ }
977
+ } else {
978
+ // x and y are continuous
979
+ // if (debug_report) printf("DuplicateColumn::checkMerge:
980
+ // x-continuous ;
981
+ // y-continuous\n");
982
+ }
983
+ }
984
+ return ok_merge;
985
+ }
986
+
987
+ void HighsPostsolveStack::DuplicateColumn::undoFix(
988
+ const HighsOptions& options, HighsSolution& solution,
989
+ const double mergeValue) const {
990
+ const double mip_feasibility_tolerance = options.mip_feasibility_tolerance;
991
+ const double primal_feasibility_tolerance =
992
+ options.primal_feasibility_tolerance;
993
+ std::vector<double>& col_value = solution.col_value;
994
+ const bool allow_assert = false;
995
+ const bool debug_report = false;
996
+ //=============================================================================================
997
+
998
+ auto isInteger = [&](const double v) {
999
+ return (fractionality(v) <= mip_feasibility_tolerance);
1000
+ };
1001
+
1002
+ auto isFeasible = [&](const double l, const double v, const double u) {
1003
+ return v >= l - primal_feasibility_tolerance &&
1004
+ v <= u + primal_feasibility_tolerance;
1005
+ };
1006
+ const double scale = colScale;
1007
+ const bool x_int = colIntegral;
1008
+ const bool y_int = duplicateColIntegral;
1009
+ const int x_ix = col;
1010
+ const int y_ix = duplicateCol;
1011
+ const double x_lo =
1012
+ x_int ? std::ceil(colLower - mip_feasibility_tolerance) : colLower;
1013
+ const double x_up =
1014
+ x_int ? std::floor(colUpper + mip_feasibility_tolerance) : colUpper;
1015
+ const double y_lo =
1016
+ y_int ? std::ceil(duplicateColLower - mip_feasibility_tolerance)
1017
+ : duplicateColLower;
1018
+ const double y_up =
1019
+ y_int ? std::floor(duplicateColUpper + mip_feasibility_tolerance)
1020
+ : duplicateColUpper;
1021
+ if (kAllowDeveloperAssert) assert(scale);
1022
+ double x_v = mergeValue;
1023
+ double y_v = -kHighsInf;
1024
+
1025
+ auto checkIntVar = [](double z_lo, double z_up, double& z_0, double& z_d,
1026
+ double& z_1, bool& z_free) {
1027
+ const double value_max = 1000;
1028
+ z_0 = 0;
1029
+ z_d = 0;
1030
+ z_1 = 0;
1031
+ z_free = false;
1032
+ if (z_lo <= -kHighsInf) {
1033
+ if (z_up >= kHighsInf) {
1034
+ // z is free
1035
+ z_free = true;
1036
+ z_0 = 0;
1037
+ z_d = 1.0;
1038
+ z_1 = value_max;
1039
+ } else {
1040
+ // z is (-int, u]
1041
+ z_0 = z_up;
1042
+ z_d = -1.0;
1043
+ z_1 = -value_max;
1044
+ }
1045
+ } else {
1046
+ // z is [l, u] or [l, inf) respectively
1047
+ z_0 = z_lo;
1048
+ z_d = 1.0;
1049
+ z_1 = z_up >= kHighsInf ? value_max : z_up;
1050
+ }
1051
+ };
1052
+
1053
+ auto computeValue = [mergeValue, scale](double value) {
1054
+ return static_cast<double>((static_cast<HighsCDouble>(mergeValue) - value) /
1055
+ scale);
1056
+ };
1057
+
1058
+ auto computeInvValue = [mergeValue, scale](double value) {
1059
+ return static_cast<double>(static_cast<HighsCDouble>(mergeValue) -
1060
+ static_cast<HighsCDouble>(value) * scale);
1061
+ };
1062
+
1063
+ auto findValue = [&](double& z_value, double z_0, double z_1, double z_delta,
1064
+ double& other_value, double other_lower,
1065
+ double other_upper, bool other_int) {
1066
+ const double eps = 1e-8;
1067
+ for (z_value = z_0;; z_value += z_delta) {
1068
+ other_value = computeValue(z_value);
1069
+ if (isFeasible(other_lower, other_value, other_upper) &&
1070
+ (!other_int || isInteger(other_value)))
1071
+ return true;
1072
+ if (z_delta > 0 && z_value + z_delta >= z_1 + eps) return false;
1073
+ if (z_delta < 0 && z_value + z_delta <= z_1 - eps) return false;
1074
+ }
1075
+ return false;
1076
+ };
1077
+
1078
+ auto setXValue = [&](double value) {
1079
+ x_v = value;
1080
+ y_v = computeValue(value);
1081
+ };
1082
+
1083
+ auto setYValue = [&](double value) {
1084
+ y_v = value;
1085
+ x_v = computeInvValue(value);
1086
+ };
1087
+
1088
+ if (x_int) {
1089
+ double x_0;
1090
+ double x_d;
1091
+ double x_1;
1092
+ bool x_free;
1093
+ checkIntVar(x_lo, x_up, x_0, x_d, x_1, x_free);
1094
+ // x is integer, so look through its possible values to find a
1095
+ // suitable y
1096
+ if (x_free && debug_report) printf("DuplicateColumn::undo x is free\n");
1097
+ if (debug_report)
1098
+ printf("DuplicateColumn::undo Using x (%g; %g; %g)\n", x_0, x_d, x_1);
1099
+ bool found_y = findValue(x_v, x_0, x_1, x_d, y_v, y_lo, y_up, y_int);
1100
+ if (allow_assert) assert(found_y);
1101
+ } else if (y_int) {
1102
+ double y_0;
1103
+ double y_d;
1104
+ double y_1;
1105
+ bool y_free;
1106
+ checkIntVar(y_lo, y_up, y_0, y_d, y_1, y_free);
1107
+ // y is integer, so look through its possible values to find a
1108
+ // suitable x
1109
+ if (y_free && debug_report) printf("DuplicateColumn::undo y is free\n");
1110
+ if (debug_report)
1111
+ printf("DuplicateColumn::undo Using y (%g; %g; %g)\n", y_0, y_d, y_1);
1112
+ bool found_x = findValue(y_v, y_0, y_1, y_d, x_v, x_lo, x_up, x_int);
1113
+ if (allow_assert) assert(found_x);
1114
+ } else {
1115
+ // x and y are both continuous
1116
+ double v_m_a_ylo = 0;
1117
+ double v_m_a_yup = 0;
1118
+ if (y_lo <= -kHighsInf) {
1119
+ v_m_a_ylo = scale > 0 ? kHighsInf : -kHighsInf;
1120
+ } else {
1121
+ v_m_a_ylo = computeInvValue(y_lo);
1122
+ }
1123
+ if (y_up >= kHighsInf) {
1124
+ v_m_a_yup = scale > 0 ? -kHighsInf : kHighsInf;
1125
+ } else {
1126
+ v_m_a_yup = computeInvValue(y_up);
1127
+ }
1128
+ // Need to ensure that y puts x in [x_l, x_u]
1129
+ if (scale > 0) {
1130
+ if (debug_report)
1131
+ printf("DuplicateColumn::undo [V-a(y_u), V-a(y_l)] == [%g, %g]\n",
1132
+ v_m_a_yup, v_m_a_ylo);
1133
+ // V-ay is in [V-a(y_u), V-a(y_l)] == [v_m_a_yup, v_m_a_ylo]
1134
+ if (y_up < kHighsInf) {
1135
+ // If v_m_a_yup is right of x_up+eps then [v_m_a_yup, v_m_a_ylo] is
1136
+ // right of [x_lo-eps, x_up+eps] so there's no solution. [Could
1137
+ // try v_m_a_ylo computed from y_lo-eps.]
1138
+ if (kAllowDeveloperAssert)
1139
+ assert(x_up + primal_feasibility_tolerance >= v_m_a_yup);
1140
+ // This assignment is OK unless x_v < x_lo-eps
1141
+ setYValue(y_up);
1142
+ if (x_v < x_lo - primal_feasibility_tolerance) {
1143
+ // Try y_v corresponding to x_lo
1144
+ setXValue(x_lo);
1145
+ if (y_v < y_lo - primal_feasibility_tolerance) {
1146
+ // Very tight: use x_v on its margin and hope!
1147
+ setXValue(x_lo - primal_feasibility_tolerance);
1148
+ }
1149
+ }
1150
+ } else if (y_lo > -kHighsInf) {
1151
+ // If v_m_a_ylo is left of x_lo-eps then [v_m_a_yup, v_m_a_ylo] is
1152
+ // left of [x_lo-eps, x_up+eps] so there's no solution. [Could
1153
+ // try v_m_a_yup computed from y_up+eps.]
1154
+ if (kAllowDeveloperAssert)
1155
+ assert(x_lo - primal_feasibility_tolerance <= v_m_a_ylo);
1156
+ // This assignment is OK unless x_v > x_up-eps
1157
+ setYValue(y_lo);
1158
+ if (x_v > x_up + primal_feasibility_tolerance) {
1159
+ // Try y_v corresponding to x_up
1160
+ setXValue(x_up);
1161
+ if (y_v > y_up + primal_feasibility_tolerance) {
1162
+ // Very tight: use x_v on its margin and hope!
1163
+ setXValue(x_up + primal_feasibility_tolerance);
1164
+ }
1165
+ }
1166
+ } else {
1167
+ // y is free, so use x_v = max(0, x_lo)
1168
+ setXValue(std::max(0.0, x_lo));
1169
+ }
1170
+ } else { // scale < 0
1171
+ if (debug_report)
1172
+ printf("DuplicateColumn::undo [V-a(y_l), V-a(y_u)] == [%g, %g]\n",
1173
+ v_m_a_ylo, v_m_a_yup);
1174
+ // V-ay is in [V-a(y_l), V-a(y_u)] == [v_m_a_ylo, v_m_a_yup]
1175
+ if (y_lo > -kHighsInf) {
1176
+ // If v_m_a_ylo is right of x_up+eps then [v_m_a_ylo, v_m_a_yup] is
1177
+ // right of [x_lo-eps, x_up+eps] so there's no solution. [Could
1178
+ // try v_m_a_ylo computed from y_up+eps.]
1179
+ if (kAllowDeveloperAssert)
1180
+ assert(x_up + primal_feasibility_tolerance >= v_m_a_ylo);
1181
+ // This assignment is OK unless x_v < x_lo-eps
1182
+ setYValue(y_lo);
1183
+ if (x_v < x_lo - primal_feasibility_tolerance) {
1184
+ // Try y_v corresponding to x_lo
1185
+ setXValue(x_lo);
1186
+ if (y_v > y_up + primal_feasibility_tolerance) {
1187
+ // Very tight: use x_v on its margin and hope!
1188
+ setXValue(x_lo - primal_feasibility_tolerance);
1189
+ }
1190
+ }
1191
+ } else if (y_up < kHighsInf) {
1192
+ // If v_m_a_yup is left of x_lo-eps then [v_m_a_ylo, v_m_a_yup] is
1193
+ // left of [x_lo-eps, x_up+eps] so there's no solution. [Could
1194
+ // try v_m_a_yup computed from y_lo-eps.]
1195
+ if (kAllowDeveloperAssert)
1196
+ assert(x_lo - primal_feasibility_tolerance <= v_m_a_yup);
1197
+ // This assignment is OK unless x_v < x_lo-eps
1198
+ setYValue(y_up);
1199
+ if (x_v > x_up + primal_feasibility_tolerance) {
1200
+ // Try y_v corresponding to x_up
1201
+ setXValue(x_up);
1202
+ if (y_v < y_lo - primal_feasibility_tolerance) {
1203
+ // Very tight: use x_v on its margin and hope!
1204
+ setXValue(x_up + primal_feasibility_tolerance);
1205
+ }
1206
+ }
1207
+ } else {
1208
+ // y is free, so use x_v = max(0, x_lo)
1209
+ setXValue(std::max(0.0, x_lo));
1210
+ }
1211
+ }
1212
+ }
1213
+ const double residual_tolerance = 1e-12;
1214
+ double residual = std::fabs(static_cast<double>(
1215
+ static_cast<HighsCDouble>(x_v) - computeInvValue(y_v)));
1216
+ const bool x_y_ok =
1217
+ isFeasible(x_lo, x_v, x_up) && isFeasible(y_lo, y_v, y_up) &&
1218
+ (!x_int || isInteger(x_v)) && (!y_int || isInteger(y_v)) &&
1219
+ (std::fabs(x_v) < kHighsInf) && (std::fabs(y_v) < kHighsInf) &&
1220
+ (residual <= residual_tolerance);
1221
+
1222
+ bool check;
1223
+ check = isFeasible(x_lo, x_v, x_up);
1224
+ if (!check) {
1225
+ if (debug_report)
1226
+ printf(
1227
+ "DuplicateColumn::undo error: isFeasible(x_lo, x_v, x_up) is "
1228
+ "false\n");
1229
+ if (allow_assert) assert(check);
1230
+ }
1231
+ check = isFeasible(y_lo, y_v, y_up);
1232
+ if (!check) {
1233
+ if (debug_report)
1234
+ printf(
1235
+ "DuplicateColumn::undo error: isFeasible(y_lo, y_v, y_up) is "
1236
+ "false\n");
1237
+ if (allow_assert) assert(check);
1238
+ }
1239
+ check = !x_int || isInteger(x_v);
1240
+ if (!check) {
1241
+ if (debug_report)
1242
+ printf(
1243
+ "DuplicateColumn::undo error: !x_int || isInteger(x_v) is false\n");
1244
+ if (allow_assert) assert(check);
1245
+ }
1246
+ check = !y_int || isInteger(y_v);
1247
+ if (!check) {
1248
+ if (debug_report)
1249
+ printf(
1250
+ "DuplicateColumn::undo error: !y_int || isInteger(y_v) is false\n");
1251
+ if (allow_assert) assert(check);
1252
+ }
1253
+ check = std::fabs(x_v) < kHighsInf;
1254
+ if (!check) {
1255
+ if (debug_report)
1256
+ printf(
1257
+ "DuplicateColumn::undo error: std::fabs(x_v) < kHighsInf is "
1258
+ "false\n");
1259
+ if (allow_assert) assert(check);
1260
+ }
1261
+ check = std::fabs(y_v) < kHighsInf;
1262
+ if (!check) {
1263
+ if (debug_report)
1264
+ printf(
1265
+ "DuplicateColumn::undo error: std::fabs(y_v) < kHighsInf is "
1266
+ "false\n");
1267
+ if (allow_assert) assert(check);
1268
+ }
1269
+ check = residual <= residual_tolerance;
1270
+ if (!check) {
1271
+ if (debug_report)
1272
+ printf(
1273
+ "DuplicateColumn::undo error: residual <= residual_tolerance is "
1274
+ "false\n");
1275
+ if (allow_assert) assert(check);
1276
+ }
1277
+ check = residual <= residual_tolerance;
1278
+ if (debug_report)
1279
+ printf("DuplicateColumn::undo%s x = %g; y = %g to give x + (%g)y = %g",
1280
+ x_y_ok ? "" : " ERROR", x_v, y_v, scale, mergeValue);
1281
+ if (x_y_ok) {
1282
+ if (debug_report) printf(": FIXED\n");
1283
+ } else if (check) {
1284
+ if (debug_report) printf("\n");
1285
+ } else {
1286
+ if (debug_report) printf(": residual = %g\n", residual);
1287
+ }
1288
+ //=============================================================================================
1289
+ if (x_y_ok) {
1290
+ col_value[x_ix] = x_v;
1291
+ col_value[y_ix] = y_v;
1292
+ }
1293
+ }
1294
+
1295
+ void HighsPostsolveStack::DuplicateColumn::transformToPresolvedSpace(
1296
+ std::vector<double>& primalSol) const {
1297
+ primalSol[col] = primalSol[col] + colScale * primalSol[duplicateCol];
1298
+ }
1299
+
1300
+ void HighsPostsolveStack::SlackColSubstitution::undo(
1301
+ const HighsOptions& options, const std::vector<Nonzero>& rowValues,
1302
+ HighsSolution& solution, HighsBasis& basis) {
1303
+ bool debug_print = false;
1304
+ // May have to determine row dual and basis status unless doing
1305
+ // primal-only transformation in MIP solver, in which case row may
1306
+ // no longer exist if it corresponds to a removed cut, so have to
1307
+ // avoid exceeding array bounds of solution.row_value
1308
+ bool isModelRow = static_cast<size_t>(row) < solution.row_value.size();
1309
+
1310
+ // compute primal values
1311
+ double colCoef = 0;
1312
+ HighsCDouble rowValue = 0;
1313
+ for (const auto& rowVal : rowValues) {
1314
+ if (rowVal.index == col)
1315
+ colCoef = rowVal.value;
1316
+ else
1317
+ rowValue += rowVal.value * solution.col_value[rowVal.index];
1318
+ }
1319
+
1320
+ assert(colCoef != 0);
1321
+ // Row values aren't fully postsolved, so why do this?
1322
+ if (isModelRow)
1323
+ solution.row_value[row] =
1324
+ double(rowValue + colCoef * solution.col_value[col]);
1325
+
1326
+ solution.col_value[col] = double((rhs - rowValue) / colCoef);
1327
+
1328
+ // If no dual values requested, return here
1329
+ if (!solution.dual_valid) return;
1330
+
1331
+ // Row retains its dual value, and column has this dual value scaled by coeff
1332
+ if (isModelRow) solution.col_dual[col] = -solution.row_dual[row] / colCoef;
1333
+
1334
+ // Set basis status if necessary
1335
+ if (!basis.valid) return;
1336
+
1337
+ // If row is basic, then slack is basic, otherwise row retains its status
1338
+ if (isModelRow) {
1339
+ HighsBasisStatus save_row_basis_status = basis.row_status[row];
1340
+ if (basis.row_status[row] == HighsBasisStatus::kBasic) {
1341
+ basis.col_status[col] = HighsBasisStatus::kBasic;
1342
+ basis.row_status[row] =
1343
+ computeRowStatus(solution.row_dual[row], RowType::kEq);
1344
+ } else if (basis.row_status[row] == HighsBasisStatus::kLower) {
1345
+ basis.col_status[col] =
1346
+ colCoef > 0 ? HighsBasisStatus::kUpper : HighsBasisStatus::kLower;
1347
+ } else {
1348
+ basis.col_status[col] =
1349
+ colCoef > 0 ? HighsBasisStatus::kLower : HighsBasisStatus::kUpper;
1350
+ }
1351
+ if (debug_print)
1352
+ printf(
1353
+ "HighsPostsolveStack::SlackColSubstitution::undo OgRowStatus = %s; "
1354
+ "RowStatus = %s; ColStatus = %s\n",
1355
+ utilBasisStatusToString(save_row_basis_status).c_str(),
1356
+ utilBasisStatusToString(basis.row_status[row]).c_str(),
1357
+ utilBasisStatusToString(basis.col_status[col]).c_str());
1358
+ if (basis.col_status[col] == HighsBasisStatus::kLower) {
1359
+ assert(solution.col_dual[col] > -options.dual_feasibility_tolerance);
1360
+ } else if (basis.col_status[col] == HighsBasisStatus::kUpper) {
1361
+ assert(solution.col_dual[col] < options.dual_feasibility_tolerance);
1362
+ }
1363
+ } else {
1364
+ basis.col_status[col] = HighsBasisStatus::kNonbasic;
1365
+ }
1366
+ }
1367
+
1368
+ } // namespace presolve