casadi 3.6.7__cp313-none-macosx_10_13_x86_64.macosx_10_13_intel.whl
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.
- casadi/__init__.py +92 -0
- casadi/_casadi.so +0 -0
- casadi/casadi-cli +0 -0
- casadi/casadi.py +50976 -0
- casadi/cbc +0 -0
- casadi/clp +0 -0
- casadi/cmake/casadi-config-version.cmake +11 -0
- casadi/cmake/casadi-config.cmake +8 -0
- casadi/cmake/casadi-targets-release.cmake +19 -0
- casadi/cmake/casadi-targets.cmake +106 -0
- casadi/cmake/highs/highs-config.cmake +17 -0
- casadi/cmake/highs/highs-targets-release.cmake +28 -0
- casadi/cmake/highs/highs-targets.cmake +117 -0
- casadi/cmake/osqp/osqp-config.cmake +1 -0
- casadi/cmake/osqp/osqp-targets-noconfig.cmake +29 -0
- casadi/cmake/osqp/osqp-targets.cmake +113 -0
- casadi/cmake/qdldl/qdldl-config.cmake +1 -0
- casadi/cmake/qdldl/qdldl-targets-noconfig.cmake +29 -0
- casadi/cmake/qdldl/qdldl-targets.cmake +113 -0
- casadi/cmake/sleqp/sleqp-config-version.cmake +65 -0
- casadi/cmake/sleqp/sleqp-config.cmake +1 -0
- casadi/cmake/sleqp/sleqp-targets-release.cmake +20 -0
- casadi/cmake/sleqp/sleqp-targets.cmake +106 -0
- casadi/cmake/trlib/trlib-config-release.cmake +19 -0
- casadi/cmake/trlib/trlib-config-version.cmake +83 -0
- casadi/cmake/trlib/trlib-config.cmake +107 -0
- casadi/highs +0 -0
- casadi/include/blasfeo.h +52 -0
- casadi/include/blasfeo_block_size.h +447 -0
- casadi/include/blasfeo_common.h +274 -0
- casadi/include/blasfeo_d_aux.h +255 -0
- casadi/include/blasfeo_d_aux_ext_dep.h +145 -0
- casadi/include/blasfeo_d_aux_ext_dep_ref.h +84 -0
- casadi/include/blasfeo_d_aux_old.h +75 -0
- casadi/include/blasfeo_d_aux_ref.h +208 -0
- casadi/include/blasfeo_d_aux_test.h +226 -0
- casadi/include/blasfeo_d_blas.h +46 -0
- casadi/include/blasfeo_d_blas_api.h +281 -0
- casadi/include/blasfeo_d_blasfeo_api.h +364 -0
- casadi/include/blasfeo_d_blasfeo_api_ref.h +147 -0
- casadi/include/blasfeo_d_blasfeo_hp_api.h +84 -0
- casadi/include/blasfeo_d_blasfeo_ref_api.h +283 -0
- casadi/include/blasfeo_d_kernel.h +1321 -0
- casadi/include/blasfeo_i_aux_ext_dep.h +69 -0
- casadi/include/blasfeo_m_aux.h +57 -0
- casadi/include/blasfeo_memory.h +62 -0
- casadi/include/blasfeo_naming.h +77 -0
- casadi/include/blasfeo_processor_features.h +88 -0
- casadi/include/blasfeo_s_aux.h +168 -0
- casadi/include/blasfeo_s_aux_ext_dep.h +141 -0
- casadi/include/blasfeo_s_aux_ext_dep_ref.h +82 -0
- casadi/include/blasfeo_s_aux_old.h +64 -0
- casadi/include/blasfeo_s_aux_ref.h +147 -0
- casadi/include/blasfeo_s_aux_test.h +177 -0
- casadi/include/blasfeo_s_blas.h +46 -0
- casadi/include/blasfeo_s_blas_api.h +182 -0
- casadi/include/blasfeo_s_blasfeo_api.h +284 -0
- casadi/include/blasfeo_s_blasfeo_api_ref.h +135 -0
- casadi/include/blasfeo_s_blasfeo_ref_api.h +252 -0
- casadi/include/blasfeo_s_kernel.h +692 -0
- casadi/include/blasfeo_stdlib.h +62 -0
- casadi/include/blasfeo_target.h +73 -0
- casadi/include/blasfeo_timing.h +114 -0
- casadi/include/blasfeo_v_aux_ext_dep.h +83 -0
- casadi/include/casadi/casadi.hpp +31 -0
- casadi/include/casadi/casadi.i +4691 -0
- casadi/include/casadi/casadi_c.h +138 -0
- casadi/include/casadi/casadi_numpy.hpp +97 -0
- casadi/include/casadi/config.h +46 -0
- casadi/include/casadi/core/calculus.hpp +1750 -0
- casadi/include/casadi/core/callback.hpp +226 -0
- casadi/include/casadi/core/casadi_common.hpp +318 -0
- casadi/include/casadi/core/casadi_enum.hpp +90 -0
- casadi/include/casadi/core/casadi_export.h +43 -0
- casadi/include/casadi/core/casadi_interrupt.hpp +83 -0
- casadi/include/casadi/core/casadi_limits.hpp +104 -0
- casadi/include/casadi/core/casadi_logger.hpp +134 -0
- casadi/include/casadi/core/casadi_meta.hpp +107 -0
- casadi/include/casadi/core/casadi_misc.hpp +1001 -0
- casadi/include/casadi/core/casadi_types.hpp +66 -0
- casadi/include/casadi/core/code_generator.hpp +975 -0
- casadi/include/casadi/core/conic.hpp +213 -0
- casadi/include/casadi/core/core.hpp +70 -0
- casadi/include/casadi/core/dae_builder.hpp +723 -0
- casadi/include/casadi/core/dm.hpp +87 -0
- casadi/include/casadi/core/dm_fwd.hpp +39 -0
- casadi/include/casadi/core/dple.hpp +138 -0
- casadi/include/casadi/core/exception.hpp +167 -0
- casadi/include/casadi/core/expm.hpp +84 -0
- casadi/include/casadi/core/external.hpp +70 -0
- casadi/include/casadi/core/fmu.hpp +224 -0
- casadi/include/casadi/core/function.hpp +1347 -0
- casadi/include/casadi/core/generic_expression.hpp +760 -0
- casadi/include/casadi/core/generic_matrix.hpp +1598 -0
- casadi/include/casadi/core/generic_type.hpp +311 -0
- casadi/include/casadi/core/global_options.hpp +97 -0
- casadi/include/casadi/core/im.hpp +52 -0
- casadi/include/casadi/core/im_fwd.hpp +35 -0
- casadi/include/casadi/core/importer.hpp +221 -0
- casadi/include/casadi/core/integration_tools.hpp +292 -0
- casadi/include/casadi/core/integrator.hpp +256 -0
- casadi/include/casadi/core/interpolant.hpp +163 -0
- casadi/include/casadi/core/linsol.hpp +171 -0
- casadi/include/casadi/core/matrix_decl.hpp +1352 -0
- casadi/include/casadi/core/matrix_fwd.hpp +37 -0
- casadi/include/casadi/core/mx.hpp +953 -0
- casadi/include/casadi/core/nlp_builder.hpp +162 -0
- casadi/include/casadi/core/nlp_tools.hpp +124 -0
- casadi/include/casadi/core/nlpsol.hpp +234 -0
- casadi/include/casadi/core/nonzeros.hpp +111 -0
- casadi/include/casadi/core/options.hpp +119 -0
- casadi/include/casadi/core/optistack.hpp +670 -0
- casadi/include/casadi/core/polynomial.hpp +126 -0
- casadi/include/casadi/core/printable.hpp +73 -0
- casadi/include/casadi/core/rootfinder.hpp +176 -0
- casadi/include/casadi/core/runtime/casadi_axpy.hpp +8 -0
- casadi/include/casadi/core/runtime/casadi_bfgs.hpp +49 -0
- casadi/include/casadi/core/runtime/casadi_bilin.hpp +42 -0
- casadi/include/casadi/core/runtime/casadi_bound_consistency.hpp +51 -0
- casadi/include/casadi/core/runtime/casadi_cache.hpp +59 -0
- casadi/include/casadi/core/runtime/casadi_clear.hpp +27 -0
- casadi/include/casadi/core/runtime/casadi_clip_max.hpp +33 -0
- casadi/include/casadi/core/runtime/casadi_clip_min.hpp +33 -0
- casadi/include/casadi/core/runtime/casadi_convexify.hpp +182 -0
- casadi/include/casadi/core/runtime/casadi_copy.hpp +31 -0
- casadi/include/casadi/core/runtime/casadi_cvx.hpp +463 -0
- casadi/include/casadi/core/runtime/casadi_de_boor.hpp +36 -0
- casadi/include/casadi/core/runtime/casadi_dense_lsqr.hpp +247 -0
- casadi/include/casadi/core/runtime/casadi_densify.hpp +48 -0
- casadi/include/casadi/core/runtime/casadi_dot.hpp +27 -0
- casadi/include/casadi/core/runtime/casadi_feasiblesqpmethod.hpp +208 -0
- casadi/include/casadi/core/runtime/casadi_file_slurp.hpp +32 -0
- casadi/include/casadi/core/runtime/casadi_fill.hpp +27 -0
- casadi/include/casadi/core/runtime/casadi_finite_diff.hpp +345 -0
- casadi/include/casadi/core/runtime/casadi_flip.hpp +33 -0
- casadi/include/casadi/core/runtime/casadi_getu.hpp +35 -0
- casadi/include/casadi/core/runtime/casadi_iamax.hpp +36 -0
- casadi/include/casadi/core/runtime/casadi_interpn.hpp +39 -0
- casadi/include/casadi/core/runtime/casadi_interpn_grad.hpp +72 -0
- casadi/include/casadi/core/runtime/casadi_interpn_interpolate.hpp +43 -0
- casadi/include/casadi/core/runtime/casadi_interpn_weights.hpp +39 -0
- casadi/include/casadi/core/runtime/casadi_ipqp.hpp +868 -0
- casadi/include/casadi/core/runtime/casadi_jac.hpp +186 -0
- casadi/include/casadi/core/runtime/casadi_kkt.hpp +67 -0
- casadi/include/casadi/core/runtime/casadi_kron.hpp +50 -0
- casadi/include/casadi/core/runtime/casadi_ldl.hpp +109 -0
- casadi/include/casadi/core/runtime/casadi_logsumexp.hpp +41 -0
- casadi/include/casadi/core/runtime/casadi_low.hpp +65 -0
- casadi/include/casadi/core/runtime/casadi_lsqr.hpp +247 -0
- casadi/include/casadi/core/runtime/casadi_masked_norm_inf.hpp +33 -0
- casadi/include/casadi/core/runtime/casadi_max_viol.hpp +37 -0
- casadi/include/casadi/core/runtime/casadi_mmax.hpp +28 -0
- casadi/include/casadi/core/runtime/casadi_mmin.hpp +29 -0
- casadi/include/casadi/core/runtime/casadi_mtimes.hpp +75 -0
- casadi/include/casadi/core/runtime/casadi_mv.hpp +46 -0
- casadi/include/casadi/core/runtime/casadi_mv_dense.hpp +39 -0
- casadi/include/casadi/core/runtime/casadi_nd_boor_dual_eval.hpp +127 -0
- casadi/include/casadi/core/runtime/casadi_nd_boor_eval.hpp +120 -0
- casadi/include/casadi/core/runtime/casadi_newton.hpp +66 -0
- casadi/include/casadi/core/runtime/casadi_nlp.hpp +289 -0
- casadi/include/casadi/core/runtime/casadi_norm_1.hpp +29 -0
- casadi/include/casadi/core/runtime/casadi_norm_2.hpp +24 -0
- casadi/include/casadi/core/runtime/casadi_norm_inf.hpp +28 -0
- casadi/include/casadi/core/runtime/casadi_norm_inf_mul.hpp +105 -0
- casadi/include/casadi/core/runtime/casadi_ocp_block.hpp +55 -0
- casadi/include/casadi/core/runtime/casadi_oracle.hpp +44 -0
- casadi/include/casadi/core/runtime/casadi_oracle_callback.hpp +39 -0
- casadi/include/casadi/core/runtime/casadi_polyval.hpp +29 -0
- casadi/include/casadi/core/runtime/casadi_project.hpp +39 -0
- casadi/include/casadi/core/runtime/casadi_qp.hpp +86 -0
- casadi/include/casadi/core/runtime/casadi_qr.hpp +272 -0
- casadi/include/casadi/core/runtime/casadi_qrqp.hpp +1239 -0
- casadi/include/casadi/core/runtime/casadi_rank1.hpp +40 -0
- casadi/include/casadi/core/runtime/casadi_regularize.hpp +73 -0
- casadi/include/casadi/core/runtime/casadi_runtime.hpp +318 -0
- casadi/include/casadi/core/runtime/casadi_scal.hpp +26 -0
- casadi/include/casadi/core/runtime/casadi_scaled_copy.hpp +31 -0
- casadi/include/casadi/core/runtime/casadi_sparsify.hpp +42 -0
- casadi/include/casadi/core/runtime/casadi_sparsity.hpp +24 -0
- casadi/include/casadi/core/runtime/casadi_sqpmethod.hpp +178 -0
- casadi/include/casadi/core/runtime/casadi_sum.hpp +31 -0
- casadi/include/casadi/core/runtime/casadi_sum_viol.hpp +37 -0
- casadi/include/casadi/core/runtime/casadi_swap.hpp +32 -0
- casadi/include/casadi/core/runtime/casadi_trans.hpp +35 -0
- casadi/include/casadi/core/runtime/casadi_tri_project.hpp +37 -0
- casadi/include/casadi/core/runtime/casadi_trilsolve.hpp +81 -0
- casadi/include/casadi/core/runtime/casadi_triusolve.hpp +81 -0
- casadi/include/casadi/core/runtime/casadi_vector_fmax.hpp +28 -0
- casadi/include/casadi/core/runtime/casadi_vector_fmin.hpp +28 -0
- casadi/include/casadi/core/runtime/casadi_vfmax.hpp +28 -0
- casadi/include/casadi/core/runtime/casadi_vfmin.hpp +28 -0
- casadi/include/casadi/core/runtime/shared.hpp +261 -0
- casadi/include/casadi/core/serializer.hpp +256 -0
- casadi/include/casadi/core/serializing_stream.hpp +329 -0
- casadi/include/casadi/core/shared_object.hpp +270 -0
- casadi/include/casadi/core/slice.hpp +149 -0
- casadi/include/casadi/core/sparsity.hpp +1495 -0
- casadi/include/casadi/core/sparsity_interface.hpp +745 -0
- casadi/include/casadi/core/submatrix.hpp +156 -0
- casadi/include/casadi/core/sx.hpp +203 -0
- casadi/include/casadi/core/sx_elem.hpp +351 -0
- casadi/include/casadi/core/sx_fwd.hpp +45 -0
- casadi/include/casadi/core/timing.hpp +98 -0
- casadi/include/casadi/core/tools.hpp +67 -0
- casadi/include/casadi/core/xml_file.hpp +93 -0
- casadi/include/casadi/core/xml_node.hpp +207 -0
- casadi/include/casadi/doc.i +58615 -0
- casadi/include/casadi/doc_merged.i +36123 -0
- casadi/include/casadi/mem.h +311 -0
- casadi/include/casadi/valgrind-casadi.supp +511 -0
- casadi/include/casadi/valgrind-python.supp +1416 -0
- casadi/include/coin/BonArraysHelpers.hpp +52 -0
- casadi/include/coin/BonAuxInfos.hpp +110 -0
- casadi/include/coin/BonBabInfos.hpp +57 -0
- casadi/include/coin/BonBabSetupBase.hpp +386 -0
- casadi/include/coin/BonBonminSetup.hpp +95 -0
- casadi/include/coin/BonBranchingTQP.hpp +197 -0
- casadi/include/coin/BonCbc.hpp +127 -0
- casadi/include/coin/BonCbcLpStrategy.hpp +45 -0
- casadi/include/coin/BonCbcNlpStrategy.hpp +98 -0
- casadi/include/coin/BonCbcNode.hpp +133 -0
- casadi/include/coin/BonChooseVariable.hpp +345 -0
- casadi/include/coin/BonCurvBranchingSolver.hpp +77 -0
- casadi/include/coin/BonCutStrengthener.hpp +244 -0
- casadi/include/coin/BonDiver.hpp +424 -0
- casadi/include/coin/BonDummyHeuristic.hpp +53 -0
- casadi/include/coin/BonDummyPump.hpp +43 -0
- casadi/include/coin/BonEcpCuts.hpp +97 -0
- casadi/include/coin/BonExitCodes.hpp +12 -0
- casadi/include/coin/BonFixAndSolveHeuristic.hpp +43 -0
- casadi/include/coin/BonGuessHeuristic.hpp +46 -0
- casadi/include/coin/BonHeuristicDive.hpp +88 -0
- casadi/include/coin/BonHeuristicDiveFractional.hpp +67 -0
- casadi/include/coin/BonHeuristicDiveMIP.hpp +83 -0
- casadi/include/coin/BonHeuristicDiveMIPFractional.hpp +67 -0
- casadi/include/coin/BonHeuristicDiveMIPVectorLength.hpp +74 -0
- casadi/include/coin/BonHeuristicDiveVectorLength.hpp +74 -0
- casadi/include/coin/BonHeuristicFPump.hpp +111 -0
- casadi/include/coin/BonHeuristicLocalBranching.hpp +59 -0
- casadi/include/coin/BonHeuristicRINS.hpp +55 -0
- casadi/include/coin/BonIpoptInteriorWarmStarter.hpp +103 -0
- casadi/include/coin/BonIpoptSolver.hpp +188 -0
- casadi/include/coin/BonIpoptWarmStart.hpp +148 -0
- casadi/include/coin/BonLinearCutsGenerator.hpp +75 -0
- casadi/include/coin/BonLocalSolverBasedHeuristic.hpp +102 -0
- casadi/include/coin/BonLpBranchingSolver.hpp +80 -0
- casadi/include/coin/BonMilpRounding.hpp +74 -0
- casadi/include/coin/BonOACutGenerator2.hpp +56 -0
- casadi/include/coin/BonOAMessages.hpp +44 -0
- casadi/include/coin/BonOaDecBase.hpp +297 -0
- casadi/include/coin/BonOaFeasChecker.hpp +73 -0
- casadi/include/coin/BonOaNlpOptim.hpp +116 -0
- casadi/include/coin/BonOsiTMINLPInterface.hpp +1342 -0
- casadi/include/coin/BonOuterApprox.hpp +123 -0
- casadi/include/coin/BonPseudoCosts.hpp +91 -0
- casadi/include/coin/BonPumpForMinlp.hpp +45 -0
- casadi/include/coin/BonQuadCut.hpp +217 -0
- casadi/include/coin/BonQuadRow.hpp +122 -0
- casadi/include/coin/BonRegisteredOptions.hpp +225 -0
- casadi/include/coin/BonStrongBranchingSolver.hpp +69 -0
- casadi/include/coin/BonSubMipSolver.hpp +143 -0
- casadi/include/coin/BonTMINLP.hpp +420 -0
- casadi/include/coin/BonTMINLP2OsiLP.hpp +164 -0
- casadi/include/coin/BonTMINLP2Quad.hpp +191 -0
- casadi/include/coin/BonTMINLP2TNLP.hpp +509 -0
- casadi/include/coin/BonTMINLPLinObj.hpp +216 -0
- casadi/include/coin/BonTMatrix.hpp +167 -0
- casadi/include/coin/BonTNLP2FPNLP.hpp +264 -0
- casadi/include/coin/BonTNLPSolver.hpp +241 -0
- casadi/include/coin/BonTypes.hpp +95 -0
- casadi/include/coin/BonminConfig.h +19 -0
- casadi/include/coin/CbcBranchActual.hpp +26 -0
- casadi/include/coin/CbcBranchAllDifferent.hpp +61 -0
- casadi/include/coin/CbcBranchBase.hpp +79 -0
- casadi/include/coin/CbcBranchCut.hpp +182 -0
- casadi/include/coin/CbcBranchDecision.hpp +135 -0
- casadi/include/coin/CbcBranchDefaultDecision.hpp +101 -0
- casadi/include/coin/CbcBranchDynamic.hpp +210 -0
- casadi/include/coin/CbcBranchLotsize.hpp +249 -0
- casadi/include/coin/CbcBranchToFixLots.hpp +94 -0
- casadi/include/coin/CbcBranchingObject.hpp +245 -0
- casadi/include/coin/CbcClique.hpp +309 -0
- casadi/include/coin/CbcCompare.hpp +46 -0
- casadi/include/coin/CbcCompareActual.hpp +16 -0
- casadi/include/coin/CbcCompareBase.hpp +155 -0
- casadi/include/coin/CbcCompareDefault.hpp +129 -0
- casadi/include/coin/CbcCompareDepth.hpp +48 -0
- casadi/include/coin/CbcCompareEstimate.hpp +48 -0
- casadi/include/coin/CbcCompareObjective.hpp +50 -0
- casadi/include/coin/CbcConfig.h +18 -0
- casadi/include/coin/CbcConsequence.hpp +50 -0
- casadi/include/coin/CbcCountRowCut.hpp +176 -0
- casadi/include/coin/CbcCutGenerator.hpp +550 -0
- casadi/include/coin/CbcCutModifier.hpp +59 -0
- casadi/include/coin/CbcCutSubsetModifier.hpp +69 -0
- casadi/include/coin/CbcDummyBranchingObject.hpp +83 -0
- casadi/include/coin/CbcEventHandler.hpp +250 -0
- casadi/include/coin/CbcFathom.hpp +136 -0
- casadi/include/coin/CbcFathomDynamicProgramming.hpp +177 -0
- casadi/include/coin/CbcFeasibilityBase.hpp +60 -0
- casadi/include/coin/CbcFixVariable.hpp +68 -0
- casadi/include/coin/CbcFollowOn.hpp +207 -0
- casadi/include/coin/CbcFullNodeInfo.hpp +171 -0
- casadi/include/coin/CbcGeneral.hpp +60 -0
- casadi/include/coin/CbcGeneralDepth.hpp +289 -0
- casadi/include/coin/CbcHeuristic.hpp +735 -0
- casadi/include/coin/CbcHeuristicDINS.hpp +98 -0
- casadi/include/coin/CbcHeuristicDW.hpp +374 -0
- casadi/include/coin/CbcHeuristicDive.hpp +198 -0
- casadi/include/coin/CbcHeuristicDiveCoefficient.hpp +52 -0
- casadi/include/coin/CbcHeuristicDiveFractional.hpp +52 -0
- casadi/include/coin/CbcHeuristicDiveGuided.hpp +55 -0
- casadi/include/coin/CbcHeuristicDiveLineSearch.hpp +52 -0
- casadi/include/coin/CbcHeuristicDivePseudoCost.hpp +60 -0
- casadi/include/coin/CbcHeuristicDiveVectorLength.hpp +52 -0
- casadi/include/coin/CbcHeuristicFPump.hpp +375 -0
- casadi/include/coin/CbcHeuristicGreedy.hpp +289 -0
- casadi/include/coin/CbcHeuristicLocal.hpp +276 -0
- casadi/include/coin/CbcHeuristicPivotAndFix.hpp +58 -0
- casadi/include/coin/CbcHeuristicRENS.hpp +79 -0
- casadi/include/coin/CbcHeuristicRINS.hpp +106 -0
- casadi/include/coin/CbcHeuristicRandRound.hpp +58 -0
- casadi/include/coin/CbcHeuristicVND.hpp +95 -0
- casadi/include/coin/CbcLinked.hpp +1443 -0
- casadi/include/coin/CbcMessage.hpp +94 -0
- casadi/include/coin/CbcMipStartIO.hpp +29 -0
- casadi/include/coin/CbcModel.hpp +3296 -0
- casadi/include/coin/CbcNWay.hpp +171 -0
- casadi/include/coin/CbcNode.hpp +380 -0
- casadi/include/coin/CbcNodeInfo.hpp +377 -0
- casadi/include/coin/CbcObject.hpp +288 -0
- casadi/include/coin/CbcObjectUpdateData.hpp +63 -0
- casadi/include/coin/CbcOrClpParam.cpp +4321 -0
- casadi/include/coin/CbcOrClpParam.hpp +585 -0
- casadi/include/coin/CbcParam.hpp +338 -0
- casadi/include/coin/CbcPartialNodeInfo.hpp +116 -0
- casadi/include/coin/CbcSOS.hpp +290 -0
- casadi/include/coin/CbcSimpleInteger.hpp +299 -0
- casadi/include/coin/CbcSimpleIntegerDynamicPseudoCost.hpp +619 -0
- casadi/include/coin/CbcSimpleIntegerPseudoCost.hpp +122 -0
- casadi/include/coin/CbcSolver.hpp +460 -0
- casadi/include/coin/CbcStrategy.hpp +269 -0
- casadi/include/coin/CbcSubProblem.hpp +84 -0
- casadi/include/coin/CbcTree.hpp +493 -0
- casadi/include/coin/CbcTreeLocal.hpp +393 -0
- casadi/include/coin/Cbc_C_Interface.h +904 -0
- casadi/include/coin/Cgl012cut.hpp +464 -0
- casadi/include/coin/CglAllDifferent.hpp +115 -0
- casadi/include/coin/CglClique.hpp +312 -0
- casadi/include/coin/CglConfig.h +19 -0
- casadi/include/coin/CglCutGenerator.hpp +133 -0
- casadi/include/coin/CglDuplicateRow.hpp +189 -0
- casadi/include/coin/CglFlowCover.hpp +371 -0
- casadi/include/coin/CglGMI.hpp +364 -0
- casadi/include/coin/CglGMIParam.hpp +313 -0
- casadi/include/coin/CglGomory.hpp +204 -0
- casadi/include/coin/CglKnapsackCover.hpp +310 -0
- casadi/include/coin/CglLandP.hpp +306 -0
- casadi/include/coin/CglLandPValidator.hpp +130 -0
- casadi/include/coin/CglLiftAndProject.hpp +104 -0
- casadi/include/coin/CglMessage.hpp +49 -0
- casadi/include/coin/CglMixedIntegerRounding.hpp +429 -0
- casadi/include/coin/CglMixedIntegerRounding2.hpp +427 -0
- casadi/include/coin/CglOddHole.hpp +160 -0
- casadi/include/coin/CglParam.hpp +93 -0
- casadi/include/coin/CglPreProcess.hpp +600 -0
- casadi/include/coin/CglProbing.hpp +543 -0
- casadi/include/coin/CglRedSplit.hpp +448 -0
- casadi/include/coin/CglRedSplit2.hpp +494 -0
- casadi/include/coin/CglRedSplit2Param.hpp +495 -0
- casadi/include/coin/CglRedSplitParam.hpp +272 -0
- casadi/include/coin/CglResidualCapacity.hpp +240 -0
- casadi/include/coin/CglSimpleRounding.hpp +174 -0
- casadi/include/coin/CglStored.hpp +140 -0
- casadi/include/coin/CglTreeInfo.hpp +216 -0
- casadi/include/coin/CglTwomir.hpp +562 -0
- casadi/include/coin/CglZeroHalf.hpp +133 -0
- casadi/include/coin/ClpAmplObjective.hpp +113 -0
- casadi/include/coin/ClpCholeskyBase.hpp +321 -0
- casadi/include/coin/ClpCholeskyDense.hpp +157 -0
- casadi/include/coin/ClpCholeskyMumps.hpp +65 -0
- casadi/include/coin/ClpCholeskyPardiso.hpp +67 -0
- casadi/include/coin/ClpConfig.h +17 -0
- casadi/include/coin/ClpConstraint.hpp +129 -0
- casadi/include/coin/ClpConstraintAmpl.hpp +109 -0
- casadi/include/coin/ClpConstraintLinear.hpp +113 -0
- casadi/include/coin/ClpConstraintQuadratic.hpp +123 -0
- casadi/include/coin/ClpDualRowDantzig.hpp +72 -0
- casadi/include/coin/ClpDualRowPivot.hpp +136 -0
- casadi/include/coin/ClpDualRowSteepest.hpp +160 -0
- casadi/include/coin/ClpDummyMatrix.hpp +186 -0
- casadi/include/coin/ClpDynamicExampleMatrix.hpp +199 -0
- casadi/include/coin/ClpDynamicMatrix.hpp +420 -0
- casadi/include/coin/ClpEventHandler.hpp +193 -0
- casadi/include/coin/ClpFactorization.hpp +556 -0
- casadi/include/coin/ClpGubDynamicMatrix.hpp +270 -0
- casadi/include/coin/ClpGubMatrix.hpp +373 -0
- casadi/include/coin/ClpInterior.hpp +622 -0
- casadi/include/coin/ClpLinearObjective.hpp +104 -0
- casadi/include/coin/ClpMatrixBase.hpp +561 -0
- casadi/include/coin/ClpMessage.hpp +131 -0
- casadi/include/coin/ClpModel.hpp +1442 -0
- casadi/include/coin/ClpNetworkMatrix.hpp +235 -0
- casadi/include/coin/ClpNode.hpp +364 -0
- casadi/include/coin/ClpNonLinearCost.hpp +432 -0
- casadi/include/coin/ClpObjective.hpp +142 -0
- casadi/include/coin/ClpPEDualRowDantzig.hpp +84 -0
- casadi/include/coin/ClpPEDualRowSteepest.hpp +100 -0
- casadi/include/coin/ClpPEPrimalColumnDantzig.hpp +71 -0
- casadi/include/coin/ClpPEPrimalColumnSteepest.hpp +107 -0
- casadi/include/coin/ClpPESimplex.hpp +231 -0
- casadi/include/coin/ClpPackedMatrix.hpp +778 -0
- casadi/include/coin/ClpParameters.hpp +132 -0
- casadi/include/coin/ClpPdcoBase.hpp +110 -0
- casadi/include/coin/ClpPlusMinusOneMatrix.hpp +565 -0
- casadi/include/coin/ClpPresolve.hpp +379 -0
- casadi/include/coin/ClpPrimalColumnDantzig.hpp +74 -0
- casadi/include/coin/ClpPrimalColumnPivot.hpp +163 -0
- casadi/include/coin/ClpPrimalColumnSteepest.hpp +281 -0
- casadi/include/coin/ClpQuadraticObjective.hpp +161 -0
- casadi/include/coin/ClpSimplex.hpp +2137 -0
- casadi/include/coin/ClpSimplexDual.hpp +304 -0
- casadi/include/coin/ClpSimplexNonlinear.hpp +117 -0
- casadi/include/coin/ClpSimplexOther.hpp +282 -0
- casadi/include/coin/ClpSimplexPrimal.hpp +244 -0
- casadi/include/coin/ClpSolve.hpp +505 -0
- casadi/include/coin/Clp_C_Interface.h +554 -0
- casadi/include/coin/CoinAlloc.hpp +179 -0
- casadi/include/coin/CoinBuild.hpp +159 -0
- casadi/include/coin/CoinDenseFactorization.hpp +452 -0
- casadi/include/coin/CoinDenseVector.hpp +401 -0
- casadi/include/coin/CoinDistance.hpp +51 -0
- casadi/include/coin/CoinError.hpp +274 -0
- casadi/include/coin/CoinFactorization.hpp +2178 -0
- casadi/include/coin/CoinFileIO.hpp +185 -0
- casadi/include/coin/CoinFinite.hpp +37 -0
- casadi/include/coin/CoinFloatEqual.hpp +204 -0
- casadi/include/coin/CoinHelperFunctions.hpp +1270 -0
- casadi/include/coin/CoinIndexedVector.hpp +1437 -0
- casadi/include/coin/CoinLpIO.hpp +836 -0
- casadi/include/coin/CoinMessage.hpp +95 -0
- casadi/include/coin/CoinMessageHandler.hpp +717 -0
- casadi/include/coin/CoinModel.hpp +1214 -0
- casadi/include/coin/CoinModelUseful.hpp +518 -0
- casadi/include/coin/CoinMpsIO.hpp +1142 -0
- casadi/include/coin/CoinOslFactorization.hpp +287 -0
- casadi/include/coin/CoinPackedMatrix.hpp +956 -0
- casadi/include/coin/CoinPackedVector.hpp +670 -0
- casadi/include/coin/CoinPackedVectorBase.hpp +274 -0
- casadi/include/coin/CoinParam.hpp +644 -0
- casadi/include/coin/CoinPragma.hpp +29 -0
- casadi/include/coin/CoinPresolveDoubleton.hpp +76 -0
- casadi/include/coin/CoinPresolveDual.hpp +84 -0
- casadi/include/coin/CoinPresolveDupcol.hpp +259 -0
- casadi/include/coin/CoinPresolveEmpty.hpp +120 -0
- casadi/include/coin/CoinPresolveFixed.hpp +185 -0
- casadi/include/coin/CoinPresolveForcing.hpp +69 -0
- casadi/include/coin/CoinPresolveImpliedFree.hpp +66 -0
- casadi/include/coin/CoinPresolveIsolated.hpp +59 -0
- casadi/include/coin/CoinPresolveMatrix.hpp +1996 -0
- casadi/include/coin/CoinPresolveMonitor.hpp +105 -0
- casadi/include/coin/CoinPresolvePsdebug.hpp +169 -0
- casadi/include/coin/CoinPresolveSingleton.hpp +115 -0
- casadi/include/coin/CoinPresolveSubst.hpp +103 -0
- casadi/include/coin/CoinPresolveTighten.hpp +58 -0
- casadi/include/coin/CoinPresolveTripleton.hpp +69 -0
- casadi/include/coin/CoinPresolveUseless.hpp +63 -0
- casadi/include/coin/CoinPresolveZeros.hpp +65 -0
- casadi/include/coin/CoinRational.hpp +43 -0
- casadi/include/coin/CoinSearchTree.hpp +523 -0
- casadi/include/coin/CoinShallowPackedVector.hpp +149 -0
- casadi/include/coin/CoinSignal.hpp +127 -0
- casadi/include/coin/CoinSimpFactorization.hpp +432 -0
- casadi/include/coin/CoinSmartPtr.hpp +548 -0
- casadi/include/coin/CoinSnapshot.hpp +572 -0
- casadi/include/coin/CoinSort.hpp +753 -0
- casadi/include/coin/CoinStructuredModel.hpp +270 -0
- casadi/include/coin/CoinTime.hpp +350 -0
- casadi/include/coin/CoinTypes.hpp +67 -0
- casadi/include/coin/CoinUtility.hpp +26 -0
- casadi/include/coin/CoinUtilsConfig.h +34 -0
- casadi/include/coin/CoinWarmStart.hpp +56 -0
- casadi/include/coin/CoinWarmStartBasis.hpp +468 -0
- casadi/include/coin/CoinWarmStartDual.hpp +180 -0
- casadi/include/coin/CoinWarmStartPrimalDual.hpp +233 -0
- casadi/include/coin/CoinWarmStartVector.hpp +523 -0
- casadi/include/coin/Coin_C_defines.h +149 -0
- casadi/include/coin/Idiot.hpp +327 -0
- casadi/include/coin/OsiAuxInfo.hpp +261 -0
- casadi/include/coin/OsiBranchingObject.hpp +1097 -0
- casadi/include/coin/OsiCbcSolverInterface.hpp +791 -0
- casadi/include/coin/OsiChooseVariable.hpp +645 -0
- casadi/include/coin/OsiClpSolverInterface.hpp +1604 -0
- casadi/include/coin/OsiColCut.hpp +322 -0
- casadi/include/coin/OsiCollections.hpp +34 -0
- casadi/include/coin/OsiConfig.h +19 -0
- casadi/include/coin/OsiCut.hpp +251 -0
- casadi/include/coin/OsiCuts.hpp +505 -0
- casadi/include/coin/OsiPresolve.hpp +272 -0
- casadi/include/coin/OsiRowCut.hpp +345 -0
- casadi/include/coin/OsiRowCutDebugger.hpp +190 -0
- casadi/include/coin/OsiSolverBranch.hpp +169 -0
- casadi/include/coin/OsiSolverInterface.hpp +2221 -0
- casadi/include/coin/OsiSolverParameters.hpp +144 -0
- casadi/include/coin/OsiUnitTests.hpp +390 -0
- casadi/include/coin-or/IpAlgBuilder.hpp +417 -0
- casadi/include/coin-or/IpAlgStrategy.hpp +201 -0
- casadi/include/coin-or/IpAlgTypes.hpp +64 -0
- casadi/include/coin-or/IpAugSystemSolver.hpp +212 -0
- casadi/include/coin-or/IpBlas.hpp +426 -0
- casadi/include/coin-or/IpCachedResults.hpp +897 -0
- casadi/include/coin-or/IpCompoundMatrix.hpp +423 -0
- casadi/include/coin-or/IpCompoundSymMatrix.hpp +348 -0
- casadi/include/coin-or/IpCompoundVector.hpp +395 -0
- casadi/include/coin-or/IpConvCheck.hpp +97 -0
- casadi/include/coin-or/IpDebug.hpp +167 -0
- casadi/include/coin-or/IpDenseVector.hpp +626 -0
- casadi/include/coin-or/IpDiagMatrix.hpp +158 -0
- casadi/include/coin-or/IpEqMultCalculator.hpp +76 -0
- casadi/include/coin-or/IpException.hpp +156 -0
- casadi/include/coin-or/IpExpansionMatrix.hpp +245 -0
- casadi/include/coin-or/IpGenTMatrix.hpp +290 -0
- casadi/include/coin-or/IpHessianUpdater.hpp +73 -0
- casadi/include/coin-or/IpIdentityMatrix.hpp +167 -0
- casadi/include/coin-or/IpIpoptAlg.hpp +257 -0
- casadi/include/coin-or/IpIpoptApplication.hpp +367 -0
- casadi/include/coin-or/IpIpoptCalculatedQuantities.hpp +1009 -0
- casadi/include/coin-or/IpIpoptData.hpp +966 -0
- casadi/include/coin-or/IpIpoptNLP.hpp +328 -0
- casadi/include/coin-or/IpIterateInitializer.hpp +68 -0
- casadi/include/coin-or/IpIteratesVector.hpp +840 -0
- casadi/include/coin-or/IpIterationOutput.hpp +78 -0
- casadi/include/coin-or/IpJournalist.hpp +573 -0
- casadi/include/coin-or/IpLapack.hpp +227 -0
- casadi/include/coin-or/IpLibraryLoader.hpp +76 -0
- casadi/include/coin-or/IpLineSearch.hpp +106 -0
- casadi/include/coin-or/IpLinearSolvers.h +46 -0
- casadi/include/coin-or/IpMatrix.hpp +434 -0
- casadi/include/coin-or/IpMuUpdate.hpp +77 -0
- casadi/include/coin-or/IpNLP.hpp +306 -0
- casadi/include/coin-or/IpNLPScaling.hpp +582 -0
- casadi/include/coin-or/IpObserver.hpp +422 -0
- casadi/include/coin-or/IpOptionsList.hpp +412 -0
- casadi/include/coin-or/IpOrigIpoptNLP.hpp +603 -0
- casadi/include/coin-or/IpPDSystemSolver.hpp +137 -0
- casadi/include/coin-or/IpReferenced.hpp +262 -0
- casadi/include/coin-or/IpRegOptions.hpp +1152 -0
- casadi/include/coin-or/IpReturnCodes.h +23 -0
- casadi/include/coin-or/IpReturnCodes.hpp +18 -0
- casadi/include/coin-or/IpReturnCodes.inc +71 -0
- casadi/include/coin-or/IpReturnCodes_inc.h +45 -0
- casadi/include/coin-or/IpScaledMatrix.hpp +291 -0
- casadi/include/coin-or/IpSearchDirCalculator.hpp +72 -0
- casadi/include/coin-or/IpSmartPtr.hpp +865 -0
- casadi/include/coin-or/IpSolveStatistics.hpp +210 -0
- casadi/include/coin-or/IpSparseSymLinearSolverInterface.hpp +260 -0
- casadi/include/coin-or/IpStdAugSystemSolver.cpp +555 -0
- casadi/include/coin-or/IpStdCInterface.h +428 -0
- casadi/include/coin-or/IpSumSymMatrix.hpp +186 -0
- casadi/include/coin-or/IpSymLinearSolver.hpp +141 -0
- casadi/include/coin-or/IpSymMatrix.hpp +167 -0
- casadi/include/coin-or/IpSymScaledMatrix.hpp +255 -0
- casadi/include/coin-or/IpSymTMatrix.hpp +275 -0
- casadi/include/coin-or/IpTNLP.hpp +820 -0
- casadi/include/coin-or/IpTNLPAdapter.hpp +648 -0
- casadi/include/coin-or/IpTNLPReducer.hpp +274 -0
- casadi/include/coin-or/IpTaggedObject.hpp +128 -0
- casadi/include/coin-or/IpTimedTask.hpp +218 -0
- casadi/include/coin-or/IpTimingStatistics.hpp +323 -0
- casadi/include/coin-or/IpTripletHelper.hpp +308 -0
- casadi/include/coin-or/IpTypes.h +81 -0
- casadi/include/coin-or/IpTypes.hpp +30 -0
- casadi/include/coin-or/IpUtils.hpp +166 -0
- casadi/include/coin-or/IpVector.hpp +892 -0
- casadi/include/coin-or/IpZeroSymMatrix.hpp +155 -0
- casadi/include/coin-or/IpoptConfig.h +45 -0
- casadi/include/coin-or/SensAlgorithm.hpp +114 -0
- casadi/include/coin-or/SensApplication.hpp +188 -0
- casadi/include/coin-or/SensBacksolver.hpp +36 -0
- casadi/include/coin-or/SensMeasurement.hpp +56 -0
- casadi/include/coin-or/SensPCalculator.hpp +137 -0
- casadi/include/coin-or/SensRegOp.hpp +21 -0
- casadi/include/coin-or/SensSchurData.hpp +182 -0
- casadi/include/coin-or/SensSchurDriver.hpp +118 -0
- casadi/include/coin-or/SensSimpleBacksolver.hpp +49 -0
- casadi/include/coin-or/SensStepCalc.hpp +85 -0
- casadi/include/coin-or/SensUtils.hpp +63 -0
- casadi/include/coin-or/metis/defs.h +161 -0
- casadi/include/coin-or/metis/macros.h +143 -0
- casadi/include/coin-or/metis/metis.h +37 -0
- casadi/include/coin-or/metis/proto.h +505 -0
- casadi/include/coin-or/metis/rename.h +418 -0
- casadi/include/coin-or/metis/struct.h +251 -0
- casadi/include/coin-or/mumps/dmumps_c.h +142 -0
- casadi/include/coin-or/mumps/mumps_c_types.h +72 -0
- casadi/include/coin-or/mumps/mumps_compat.h +27 -0
- casadi/include/coin-or/mumps/mumps_int_def.h +11 -0
- casadi/include/coin-or/mumps/mumps_mpi.h +67 -0
- casadi/include/d_blas.h +78 -0
- casadi/include/d_blas_64.h +73 -0
- casadi/include/fatrop/auxiliary/Common.hpp +34 -0
- casadi/include/fatrop/auxiliary/DynamicLib.hpp +34 -0
- casadi/include/fatrop/auxiliary/FatropOptions.hpp +68 -0
- casadi/include/fatrop/auxiliary/FatropVector.hpp +143 -0
- casadi/include/fatrop/auxiliary/LinearAlgebra.hpp +88 -0
- casadi/include/fatrop/auxiliary/VectorUtils.hpp +54 -0
- casadi/include/fatrop/blasfeo_wrapper/LinearAlgebraBlasfeo.hpp +493 -0
- casadi/include/fatrop/fatrop.hpp +39 -0
- casadi/include/fatrop/function_evaluation/CasadiCodegen.hpp +104 -0
- casadi/include/fatrop/function_evaluation/FunctionEvaluation.hpp +60 -0
- casadi/include/fatrop/json/json.h +946 -0
- casadi/include/fatrop/ocp/CasadiCApiUserdataWrap.hpp +87 -0
- casadi/include/fatrop/ocp/DuInfEvaluator.hpp +38 -0
- casadi/include/fatrop/ocp/FatropOCP.hpp +161 -0
- casadi/include/fatrop/ocp/FatropOCPBuilder.hpp +52 -0
- casadi/include/fatrop/ocp/FatropOCPResto.hpp +299 -0
- casadi/include/fatrop/ocp/OCP.hpp +82 -0
- casadi/include/fatrop/ocp/OCPAbstract.hpp +254 -0
- casadi/include/fatrop/ocp/OCPAdapter.hpp +197 -0
- casadi/include/fatrop/ocp/OCPCInterface.h +289 -0
- casadi/include/fatrop/ocp/OCPDims.hpp +60 -0
- casadi/include/fatrop/ocp/OCPInitializer.hpp +41 -0
- casadi/include/fatrop/ocp/OCPKKT.hpp +69 -0
- casadi/include/fatrop/ocp/OCPLSRiccati.hpp +198 -0
- casadi/include/fatrop/ocp/OCPLSScaler.hpp +66 -0
- casadi/include/fatrop/ocp/OCPLinearSolver.hpp +75 -0
- casadi/include/fatrop/ocp/OCPNoScaling.hpp +42 -0
- casadi/include/fatrop/ocp/OCPScalingMethod.hpp +42 -0
- casadi/include/fatrop/ocp/StageOCP.hpp +592 -0
- casadi/include/fatrop/ocp/StageOCPApplication.hpp +242 -0
- casadi/include/fatrop/ocp/StageOCPExpressions.hpp +182 -0
- casadi/include/fatrop/ocp/UStageEvalAbstract.hpp +168 -0
- casadi/include/fatrop/ocp/UStageOCPImpl.hpp +152 -0
- casadi/include/fatrop/quasi_newton/bfgs.hpp +159 -0
- casadi/include/fatrop/solver/AlgBuilder.hpp +76 -0
- casadi/include/fatrop/solver/AlgStrategy.hpp +33 -0
- casadi/include/fatrop/solver/FatropAlg.hpp +121 -0
- casadi/include/fatrop/solver/FatropData.hpp +188 -0
- casadi/include/fatrop/solver/FatropOptions.hpp +95 -0
- casadi/include/fatrop/solver/FatropPrinter.hpp +65 -0
- casadi/include/fatrop/solver/FatropStats.hpp +63 -0
- casadi/include/fatrop/solver/Filter.hpp +54 -0
- casadi/include/fatrop/solver/IterationData.hpp +56 -0
- casadi/include/fatrop/solver/LineSearch.hpp +86 -0
- casadi/include/fatrop/solver/NLPL1.hpp +263 -0
- casadi/include/fatrop/templates/NLPAlg.hpp +104 -0
- casadi/include/highs/HConfig.h +21 -0
- casadi/include/highs/Highs.h +1529 -0
- casadi/include/highs/filereaderlp/builder.hpp +25 -0
- casadi/include/highs/filereaderlp/def.hpp +19 -0
- casadi/include/highs/filereaderlp/model.hpp +68 -0
- casadi/include/highs/filereaderlp/reader.hpp +10 -0
- casadi/include/highs/interfaces/highs_c_api.h +2283 -0
- casadi/include/highs/io/Filereader.h +47 -0
- casadi/include/highs/io/FilereaderEms.h +33 -0
- casadi/include/highs/io/FilereaderLp.h +54 -0
- casadi/include/highs/io/FilereaderMps.h +30 -0
- casadi/include/highs/io/HMPSIO.h +81 -0
- casadi/include/highs/io/HMpsFF.h +235 -0
- casadi/include/highs/io/HighsIO.h +109 -0
- casadi/include/highs/io/LoadOptions.h +27 -0
- casadi/include/highs/ipm/IpxSolution.h +35 -0
- casadi/include/highs/ipm/IpxWrapper.h +73 -0
- casadi/include/highs/ipm/basiclu/basiclu.h +161 -0
- casadi/include/highs/ipm/basiclu/basiclu_factorize.h +247 -0
- casadi/include/highs/ipm/basiclu/basiclu_get_factors.h +108 -0
- casadi/include/highs/ipm/basiclu/basiclu_initialize.h +119 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_factorize.h +34 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_free.h +19 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_get_factors.h +34 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_initialize.h +46 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_solve_dense.h +29 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_solve_for_update.h +42 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_solve_sparse.h +32 -0
- casadi/include/highs/ipm/basiclu/basiclu_obj_update.h +31 -0
- casadi/include/highs/ipm/basiclu/basiclu_object.h +30 -0
- casadi/include/highs/ipm/basiclu/basiclu_solve_dense.h +75 -0
- casadi/include/highs/ipm/basiclu/basiclu_solve_for_update.h +169 -0
- casadi/include/highs/ipm/basiclu/basiclu_solve_sparse.h +112 -0
- casadi/include/highs/ipm/basiclu/basiclu_update.h +125 -0
- casadi/include/highs/ipm/basiclu/lu_def.h +39 -0
- casadi/include/highs/ipm/basiclu/lu_file.h +21 -0
- casadi/include/highs/ipm/basiclu/lu_internal.h +220 -0
- casadi/include/highs/ipm/basiclu/lu_list.h +168 -0
- casadi/include/highs/ipm/ipx/basiclu_kernel.h +20 -0
- casadi/include/highs/ipm/ipx/basiclu_wrapper.h +47 -0
- casadi/include/highs/ipm/ipx/basis.h +351 -0
- casadi/include/highs/ipm/ipx/conjugate_residuals.h +74 -0
- casadi/include/highs/ipm/ipx/control.h +163 -0
- casadi/include/highs/ipm/ipx/crossover.h +157 -0
- casadi/include/highs/ipm/ipx/diagonal_precond.h +45 -0
- casadi/include/highs/ipm/ipx/forrest_tomlin.h +102 -0
- casadi/include/highs/ipm/ipx/guess_basis.h +21 -0
- casadi/include/highs/ipm/ipx/indexed_vector.h +113 -0
- casadi/include/highs/ipm/ipx/info.h +27 -0
- casadi/include/highs/ipm/ipx/ipm.h +94 -0
- casadi/include/highs/ipm/ipx/ipx_c.h +47 -0
- casadi/include/highs/ipm/ipx/ipx_config.h +9 -0
- casadi/include/highs/ipm/ipx/ipx_info.h +111 -0
- casadi/include/highs/ipm/ipx/ipx_internal.h +88 -0
- casadi/include/highs/ipm/ipx/ipx_parameters.h +75 -0
- casadi/include/highs/ipm/ipx/ipx_status.h +57 -0
- casadi/include/highs/ipm/ipx/iterate.h +328 -0
- casadi/include/highs/ipm/ipx/kkt_solver.h +70 -0
- casadi/include/highs/ipm/ipx/kkt_solver_basis.h +66 -0
- casadi/include/highs/ipm/ipx/kkt_solver_diag.h +48 -0
- casadi/include/highs/ipm/ipx/linear_operator.h +26 -0
- casadi/include/highs/ipm/ipx/lp_solver.h +201 -0
- casadi/include/highs/ipm/ipx/lu_factorization.h +79 -0
- casadi/include/highs/ipm/ipx/lu_update.h +129 -0
- casadi/include/highs/ipm/ipx/maxvolume.h +54 -0
- casadi/include/highs/ipm/ipx/model.h +409 -0
- casadi/include/highs/ipm/ipx/multistream.h +52 -0
- casadi/include/highs/ipm/ipx/normal_matrix.h +44 -0
- casadi/include/highs/ipm/ipx/power_method.h +44 -0
- casadi/include/highs/ipm/ipx/sparse_matrix.h +195 -0
- casadi/include/highs/ipm/ipx/sparse_utils.h +58 -0
- casadi/include/highs/ipm/ipx/splitted_normal_matrix.h +63 -0
- casadi/include/highs/ipm/ipx/starting_basis.h +39 -0
- casadi/include/highs/ipm/ipx/symbolic_invert.h +29 -0
- casadi/include/highs/ipm/ipx/timer.h +24 -0
- casadi/include/highs/ipm/ipx/utils.h +39 -0
- casadi/include/highs/lp_data/HConst.h +305 -0
- casadi/include/highs/lp_data/HStruct.h +146 -0
- casadi/include/highs/lp_data/HighsAnalysis.h +26 -0
- casadi/include/highs/lp_data/HighsCallback.h +40 -0
- casadi/include/highs/lp_data/HighsCallbackStruct.h +62 -0
- casadi/include/highs/lp_data/HighsDebug.h +37 -0
- casadi/include/highs/lp_data/HighsInfo.h +322 -0
- casadi/include/highs/lp_data/HighsInfoDebug.h +30 -0
- casadi/include/highs/lp_data/HighsLp.h +101 -0
- casadi/include/highs/lp_data/HighsLpSolverObject.h +48 -0
- casadi/include/highs/lp_data/HighsLpUtils.h +266 -0
- casadi/include/highs/lp_data/HighsModelUtils.h +109 -0
- casadi/include/highs/lp_data/HighsOptions.h +1357 -0
- casadi/include/highs/lp_data/HighsRanging.h +46 -0
- casadi/include/highs/lp_data/HighsRuntimeOptions.h +276 -0
- casadi/include/highs/lp_data/HighsSolution.h +137 -0
- casadi/include/highs/lp_data/HighsSolutionDebug.h +90 -0
- casadi/include/highs/lp_data/HighsSolve.h +26 -0
- casadi/include/highs/lp_data/HighsStatus.h +32 -0
- casadi/include/highs/mip/HighsCliqueTable.h +318 -0
- casadi/include/highs/mip/HighsConflictPool.h +112 -0
- casadi/include/highs/mip/HighsCutGeneration.h +96 -0
- casadi/include/highs/mip/HighsCutPool.h +171 -0
- casadi/include/highs/mip/HighsDebugSol.h +135 -0
- casadi/include/highs/mip/HighsDomain.h +641 -0
- casadi/include/highs/mip/HighsDomainChange.h +51 -0
- casadi/include/highs/mip/HighsDynamicRowMatrix.h +107 -0
- casadi/include/highs/mip/HighsGFkSolve.h +441 -0
- casadi/include/highs/mip/HighsImplications.h +146 -0
- casadi/include/highs/mip/HighsLpAggregator.h +53 -0
- casadi/include/highs/mip/HighsLpRelaxation.h +360 -0
- casadi/include/highs/mip/HighsMipSolver.h +105 -0
- casadi/include/highs/mip/HighsMipSolverData.h +236 -0
- casadi/include/highs/mip/HighsModkSeparator.h +63 -0
- casadi/include/highs/mip/HighsNodeQueue.h +314 -0
- casadi/include/highs/mip/HighsObjectiveFunction.h +74 -0
- casadi/include/highs/mip/HighsPathSeparator.h +42 -0
- casadi/include/highs/mip/HighsPrimalHeuristics.h +68 -0
- casadi/include/highs/mip/HighsPseudocost.h +363 -0
- casadi/include/highs/mip/HighsRedcostFixing.h +45 -0
- casadi/include/highs/mip/HighsSearch.h +244 -0
- casadi/include/highs/mip/HighsSeparation.h +44 -0
- casadi/include/highs/mip/HighsSeparator.h +56 -0
- casadi/include/highs/mip/HighsTableauSeparator.h +37 -0
- casadi/include/highs/mip/HighsTransformedLp.h +66 -0
- casadi/include/highs/model/HighsHessian.h +54 -0
- casadi/include/highs/model/HighsHessianUtils.h +49 -0
- casadi/include/highs/model/HighsModel.h +52 -0
- casadi/include/highs/parallel/HighsBinarySemaphore.h +113 -0
- casadi/include/highs/parallel/HighsCacheAlign.h +87 -0
- casadi/include/highs/parallel/HighsCombinable.h +121 -0
- casadi/include/highs/parallel/HighsMutex.h +129 -0
- casadi/include/highs/parallel/HighsParallel.h +133 -0
- casadi/include/highs/parallel/HighsRaceTimer.h +43 -0
- casadi/include/highs/parallel/HighsSchedulerConstants.h +24 -0
- casadi/include/highs/parallel/HighsSpinMutex.h +53 -0
- casadi/include/highs/parallel/HighsSplitDeque.h +583 -0
- casadi/include/highs/parallel/HighsTask.h +175 -0
- casadi/include/highs/parallel/HighsTaskExecutor.h +209 -0
- casadi/include/highs/pdlp/CupdlpWrapper.h +93 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_cs.h +41 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_defs.h +423 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_linalg.h +183 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_proj.h +19 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_restart.h +31 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_scaling_cuda.h +28 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_solver.h +98 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_step.h +33 -0
- casadi/include/highs/pdlp/cupdlp/cupdlp_utils.c +1726 -0
- casadi/include/highs/pdqsort/pdqsort.h +532 -0
- casadi/include/highs/presolve/HPresolve.h +365 -0
- casadi/include/highs/presolve/HPresolveAnalysis.h +54 -0
- casadi/include/highs/presolve/HighsPostsolveStack.h +907 -0
- casadi/include/highs/presolve/HighsSymmetry.h +284 -0
- casadi/include/highs/presolve/ICrash.h +127 -0
- casadi/include/highs/presolve/ICrashUtil.h +65 -0
- casadi/include/highs/presolve/ICrashX.h +26 -0
- casadi/include/highs/presolve/PresolveComponent.h +93 -0
- casadi/include/highs/qpsolver/a_asm.hpp +67 -0
- casadi/include/highs/qpsolver/a_quass.hpp +19 -0
- casadi/include/highs/qpsolver/basis.hpp +150 -0
- casadi/include/highs/qpsolver/crashsolution.hpp +12 -0
- casadi/include/highs/qpsolver/dantzigpricing.hpp +72 -0
- casadi/include/highs/qpsolver/devexpricing.hpp +99 -0
- casadi/include/highs/qpsolver/eventhandler.hpp +23 -0
- casadi/include/highs/qpsolver/factor.hpp +400 -0
- casadi/include/highs/qpsolver/feasibility_bounded.hpp +105 -0
- casadi/include/highs/qpsolver/feasibility_highs.hpp +270 -0
- casadi/include/highs/qpsolver/gradient.hpp +39 -0
- casadi/include/highs/qpsolver/instance.hpp +63 -0
- casadi/include/highs/qpsolver/matrix.hpp +335 -0
- casadi/include/highs/qpsolver/perturbation.hpp +8 -0
- casadi/include/highs/qpsolver/pricing.hpp +15 -0
- casadi/include/highs/qpsolver/qpconst.hpp +27 -0
- casadi/include/highs/qpsolver/qpvector.hpp +235 -0
- casadi/include/highs/qpsolver/quass.hpp +20 -0
- casadi/include/highs/qpsolver/ratiotest.hpp +19 -0
- casadi/include/highs/qpsolver/runtime.hpp +38 -0
- casadi/include/highs/qpsolver/scaling.hpp +8 -0
- casadi/include/highs/qpsolver/settings.hpp +57 -0
- casadi/include/highs/qpsolver/snippets.hpp +29 -0
- casadi/include/highs/qpsolver/statistics.hpp +23 -0
- casadi/include/highs/qpsolver/steepestedgepricing.hpp +167 -0
- casadi/include/highs/simplex/HApp.h +422 -0
- casadi/include/highs/simplex/HEkk.h +403 -0
- casadi/include/highs/simplex/HEkkDual.h +515 -0
- casadi/include/highs/simplex/HEkkDualRHS.h +137 -0
- casadi/include/highs/simplex/HEkkDualRow.h +204 -0
- casadi/include/highs/simplex/HEkkPrimal.h +195 -0
- casadi/include/highs/simplex/HSimplex.h +45 -0
- casadi/include/highs/simplex/HSimplexDebug.h +51 -0
- casadi/include/highs/simplex/HSimplexNla.h +184 -0
- casadi/include/highs/simplex/HSimplexReport.h +24 -0
- casadi/include/highs/simplex/HighsSimplexAnalysis.h +503 -0
- casadi/include/highs/simplex/SimplexConst.h +274 -0
- casadi/include/highs/simplex/SimplexStruct.h +264 -0
- casadi/include/highs/simplex/SimplexTimer.h +427 -0
- casadi/include/highs/test/DevKkt.h +146 -0
- casadi/include/highs/test/KktCh2.h +82 -0
- casadi/include/highs/util/FactorTimer.h +224 -0
- casadi/include/highs/util/HFactor.h +587 -0
- casadi/include/highs/util/HFactorConst.h +84 -0
- casadi/include/highs/util/HFactorDebug.h +58 -0
- casadi/include/highs/util/HSet.h +92 -0
- casadi/include/highs/util/HVector.h +25 -0
- casadi/include/highs/util/HVectorBase.h +105 -0
- casadi/include/highs/util/HighsCDouble.h +310 -0
- casadi/include/highs/util/HighsComponent.h +56 -0
- casadi/include/highs/util/HighsDataStack.h +86 -0
- casadi/include/highs/util/HighsDisjointSets.h +110 -0
- casadi/include/highs/util/HighsHash.h +1277 -0
- casadi/include/highs/util/HighsHashTree.h +1443 -0
- casadi/include/highs/util/HighsInt.h +39 -0
- casadi/include/highs/util/HighsIntegers.h +215 -0
- casadi/include/highs/util/HighsLinearSumBounds.h +160 -0
- casadi/include/highs/util/HighsMatrixPic.h +40 -0
- casadi/include/highs/util/HighsMatrixSlice.h +564 -0
- casadi/include/highs/util/HighsMatrixUtils.h +57 -0
- casadi/include/highs/util/HighsMemoryAllocation.h +55 -0
- casadi/include/highs/util/HighsRandom.h +245 -0
- casadi/include/highs/util/HighsRbTree.h +455 -0
- casadi/include/highs/util/HighsSort.h +134 -0
- casadi/include/highs/util/HighsSparseMatrix.h +147 -0
- casadi/include/highs/util/HighsSparseVectorSum.h +98 -0
- casadi/include/highs/util/HighsSplay.h +138 -0
- casadi/include/highs/util/HighsTimer.h +343 -0
- casadi/include/highs/util/HighsUtils.h +210 -0
- casadi/include/highs/util/stringutil.h +44 -0
- casadi/include/highs/zstr/strict_fstream.hpp +237 -0
- casadi/include/highs/zstr/zstr.hpp +472 -0
- casadi/include/highs_export.h +43 -0
- casadi/include/hpipm_aux_mem.h +52 -0
- casadi/include/hpipm_aux_string.h +50 -0
- casadi/include/hpipm_common.h +76 -0
- casadi/include/hpipm_d_cast_qcqp.h +71 -0
- casadi/include/hpipm_d_cond.h +135 -0
- casadi/include/hpipm_d_cond_aux.h +92 -0
- casadi/include/hpipm_d_cond_qcqp.h +129 -0
- casadi/include/hpipm_d_core_qp_ipm.h +101 -0
- casadi/include/hpipm_d_core_qp_ipm_aux.h +68 -0
- casadi/include/hpipm_d_dense_qcqp.h +199 -0
- casadi/include/hpipm_d_dense_qcqp_dim.h +98 -0
- casadi/include/hpipm_d_dense_qcqp_ipm.h +193 -0
- casadi/include/hpipm_d_dense_qcqp_res.h +108 -0
- casadi/include/hpipm_d_dense_qcqp_sol.h +85 -0
- casadi/include/hpipm_d_dense_qcqp_utils.h +82 -0
- casadi/include/hpipm_d_dense_qp.h +207 -0
- casadi/include/hpipm_d_dense_qp_dim.h +92 -0
- casadi/include/hpipm_d_dense_qp_ipm.h +260 -0
- casadi/include/hpipm_d_dense_qp_kkt.h +72 -0
- casadi/include/hpipm_d_dense_qp_res.h +106 -0
- casadi/include/hpipm_d_dense_qp_sol.h +94 -0
- casadi/include/hpipm_d_dense_qp_utils.h +83 -0
- casadi/include/hpipm_d_ocp_qcqp.h +322 -0
- casadi/include/hpipm_d_ocp_qcqp_dim.h +130 -0
- casadi/include/hpipm_d_ocp_qcqp_ipm.h +192 -0
- casadi/include/hpipm_d_ocp_qcqp_red.h +118 -0
- casadi/include/hpipm_d_ocp_qcqp_res.h +115 -0
- casadi/include/hpipm_d_ocp_qcqp_sol.h +114 -0
- casadi/include/hpipm_d_ocp_qcqp_utils.h +81 -0
- casadi/include/hpipm_d_ocp_qp.h +306 -0
- casadi/include/hpipm_d_ocp_qp_dim.h +142 -0
- casadi/include/hpipm_d_ocp_qp_ipm.h +252 -0
- casadi/include/hpipm_d_ocp_qp_kkt.h +66 -0
- casadi/include/hpipm_d_ocp_qp_red.h +117 -0
- casadi/include/hpipm_d_ocp_qp_res.h +113 -0
- casadi/include/hpipm_d_ocp_qp_sol.h +128 -0
- casadi/include/hpipm_d_ocp_qp_utils.h +82 -0
- casadi/include/hpipm_d_part_cond.h +115 -0
- casadi/include/hpipm_d_part_cond_qcqp.h +106 -0
- casadi/include/hpipm_d_sim_erk.h +122 -0
- casadi/include/hpipm_d_sim_rk.h +71 -0
- casadi/include/hpipm_d_tree_ocp_qcqp.h +213 -0
- casadi/include/hpipm_d_tree_ocp_qcqp_dim.h +117 -0
- casadi/include/hpipm_d_tree_ocp_qcqp_ipm.h +191 -0
- casadi/include/hpipm_d_tree_ocp_qcqp_res.h +109 -0
- casadi/include/hpipm_d_tree_ocp_qcqp_sol.h +99 -0
- casadi/include/hpipm_d_tree_ocp_qcqp_utils.h +84 -0
- casadi/include/hpipm_d_tree_ocp_qp.h +195 -0
- casadi/include/hpipm_d_tree_ocp_qp_dim.h +111 -0
- casadi/include/hpipm_d_tree_ocp_qp_ipm.h +209 -0
- casadi/include/hpipm_d_tree_ocp_qp_kkt.h +52 -0
- casadi/include/hpipm_d_tree_ocp_qp_res.h +107 -0
- casadi/include/hpipm_d_tree_ocp_qp_sol.h +100 -0
- casadi/include/hpipm_d_tree_ocp_qp_utils.h +83 -0
- casadi/include/hpipm_m_dense_qp.h +68 -0
- casadi/include/hpipm_m_dense_qp_dim.h +68 -0
- casadi/include/hpipm_m_ocp_qp.h +49 -0
- casadi/include/hpipm_m_ocp_qp_ipm_hard.h +115 -0
- casadi/include/hpipm_m_ocp_qp_kkt.h +45 -0
- casadi/include/hpipm_s_cast_qcqp.h +72 -0
- casadi/include/hpipm_s_cond.h +137 -0
- casadi/include/hpipm_s_cond_aux.h +92 -0
- casadi/include/hpipm_s_cond_qcqp.h +130 -0
- casadi/include/hpipm_s_core_qp_ipm.h +101 -0
- casadi/include/hpipm_s_core_qp_ipm_aux.h +68 -0
- casadi/include/hpipm_s_dense_qcqp.h +200 -0
- casadi/include/hpipm_s_dense_qcqp_dim.h +99 -0
- casadi/include/hpipm_s_dense_qcqp_ipm.h +204 -0
- casadi/include/hpipm_s_dense_qcqp_res.h +109 -0
- casadi/include/hpipm_s_dense_qcqp_sol.h +86 -0
- casadi/include/hpipm_s_dense_qcqp_utils.h +83 -0
- casadi/include/hpipm_s_dense_qp.h +207 -0
- casadi/include/hpipm_s_dense_qp_dim.h +94 -0
- casadi/include/hpipm_s_dense_qp_ipm.h +260 -0
- casadi/include/hpipm_s_dense_qp_kkt.h +72 -0
- casadi/include/hpipm_s_dense_qp_res.h +107 -0
- casadi/include/hpipm_s_dense_qp_sol.h +94 -0
- casadi/include/hpipm_s_dense_qp_utils.h +84 -0
- casadi/include/hpipm_s_ocp_qcqp.h +322 -0
- casadi/include/hpipm_s_ocp_qcqp_dim.h +131 -0
- casadi/include/hpipm_s_ocp_qcqp_ipm.h +193 -0
- casadi/include/hpipm_s_ocp_qcqp_red.h +119 -0
- casadi/include/hpipm_s_ocp_qcqp_res.h +116 -0
- casadi/include/hpipm_s_ocp_qcqp_sol.h +115 -0
- casadi/include/hpipm_s_ocp_qcqp_utils.h +82 -0
- casadi/include/hpipm_s_ocp_qp.h +306 -0
- casadi/include/hpipm_s_ocp_qp_dim.h +141 -0
- casadi/include/hpipm_s_ocp_qp_ipm.h +252 -0
- casadi/include/hpipm_s_ocp_qp_kkt.h +66 -0
- casadi/include/hpipm_s_ocp_qp_red.h +118 -0
- casadi/include/hpipm_s_ocp_qp_res.h +115 -0
- casadi/include/hpipm_s_ocp_qp_sol.h +128 -0
- casadi/include/hpipm_s_ocp_qp_utils.h +83 -0
- casadi/include/hpipm_s_part_cond.h +115 -0
- casadi/include/hpipm_s_part_cond_qcqp.h +107 -0
- casadi/include/hpipm_s_sim_erk.h +121 -0
- casadi/include/hpipm_s_sim_rk.h +72 -0
- casadi/include/hpipm_s_tree_ocp_qcqp.h +213 -0
- casadi/include/hpipm_s_tree_ocp_qcqp_dim.h +118 -0
- casadi/include/hpipm_s_tree_ocp_qcqp_ipm.h +192 -0
- casadi/include/hpipm_s_tree_ocp_qcqp_res.h +110 -0
- casadi/include/hpipm_s_tree_ocp_qcqp_sol.h +97 -0
- casadi/include/hpipm_s_tree_ocp_qcqp_utils.h +85 -0
- casadi/include/hpipm_s_tree_ocp_qp.h +196 -0
- casadi/include/hpipm_s_tree_ocp_qp_dim.h +111 -0
- casadi/include/hpipm_s_tree_ocp_qp_ipm.h +208 -0
- casadi/include/hpipm_s_tree_ocp_qp_kkt.h +54 -0
- casadi/include/hpipm_s_tree_ocp_qp_res.h +108 -0
- casadi/include/hpipm_s_tree_ocp_qp_sol.h +98 -0
- casadi/include/hpipm_s_tree_ocp_qp_utils.h +84 -0
- casadi/include/hpipm_scenario_tree.h +70 -0
- casadi/include/hpipm_timing.h +67 -0
- casadi/include/hpipm_tree.h +76 -0
- casadi/include/licenses/CSparse/Doc/License.txt +19 -0
- casadi/include/licenses/FMI-Standard-2.0.2/LICENSE.txt +473 -0
- casadi/include/licenses/FMI-Standard-3.0/LICENSE.txt +464 -0
- casadi/include/licenses/blasfeo-external/LICENSE.txt +26 -0
- casadi/include/licenses/bonmin-external/Bonmin/LICENSE +87 -0
- casadi/include/licenses/bonmin-external/LICENSE +3 -0
- casadi/include/licenses/casadi/LICENSE/LICENSE.txt +165 -0
- casadi/include/licenses/casadi-sundials/LICENSE +64 -0
- casadi/include/licenses/casadi-sundials/cvodes/LICENSE +60 -0
- casadi/include/licenses/casadi-sundials/idas/LICENSE +59 -0
- casadi/include/licenses/casadi-sundials/kinsol/LICENSE +59 -0
- casadi/include/licenses/casadi-sundials/sundials/LICENSE +67 -0
- casadi/include/licenses/cbc-external/Cbc/LICENSE +239 -0
- casadi/include/licenses/cbc-external/LICENSE +245 -0
- casadi/include/licenses/cgl-external/Cgl/LICENSE +239 -0
- casadi/include/licenses/cgl-external/LICENSE +245 -0
- casadi/include/licenses/clp-external/Clp/LICENSE +239 -0
- casadi/include/licenses/clp-external/LICENSE +245 -0
- casadi/include/licenses/coinutils-external/CoinUtils/LICENSE +239 -0
- casadi/include/licenses/coinutils-external/LICENSE +245 -0
- casadi/include/licenses/fatrop-external/LICENSE.txt +165 -0
- casadi/include/licenses/fatrop-external/external/blasfeo/LICENSE.txt +26 -0
- casadi/include/licenses/fatrop-external/external/pybind11/LICENSE +29 -0
- casadi/include/licenses/fatrop-external/misc/license_header.txt +17 -0
- casadi/include/licenses/highs-external/LICENSE.txt +21 -0
- casadi/include/licenses/highs-external/extern/filereaderlp/LICENSE +19 -0
- casadi/include/licenses/highs-external/extern/pdqsort/license.txt +16 -0
- casadi/include/licenses/hpipm-external/LICENSE.txt +26 -0
- casadi/include/licenses/hpipm-external/experimental/andrea/prototype/code/plotregion/license.txt +24 -0
- casadi/include/licenses/ipopt-external/LICENSE +260 -0
- casadi/include/licenses/metis-external/LICENSE +87 -0
- casadi/include/licenses/metis-external/metis-4.0/LICENSE +18 -0
- casadi/include/licenses/mockups-external/LICENSE +21 -0
- casadi/include/licenses/mumps-external/LICENSE +87 -0
- casadi/include/licenses/mumps-external/MUMPS/LICENSE +50 -0
- casadi/include/licenses/osi-external/LICENSE +245 -0
- casadi/include/licenses/osi-external/Osi/LICENSE +239 -0
- casadi/include/licenses/osqp-external/LICENSE +201 -0
- casadi/include/licenses/osqp-external/lin_sys/direct/qdldl/amd/LICENSE +36 -0
- casadi/include/licenses/osqp-external/lin_sys/direct/qdldl/qdldl_sources/LICENSE +201 -0
- casadi/include/licenses/qpOASES/LICENSE.txt +503 -0
- casadi/include/licenses/sleqp-external/LICENSE +165 -0
- casadi/include/licenses/superscs-external/LICENSE.txt +24 -0
- casadi/include/licenses/tinyxml2-9.0.0/LICENSE.txt +18 -0
- casadi/include/licenses/trlib-external/LICENSE +21 -0
- casadi/include/osqp/auxil.h +181 -0
- casadi/include/osqp/constants.h +128 -0
- casadi/include/osqp/cs.h +180 -0
- casadi/include/osqp/ctrlc.h +56 -0
- casadi/include/osqp/error.h +38 -0
- casadi/include/osqp/glob_opts.h +167 -0
- casadi/include/osqp/lin_alg.h +216 -0
- casadi/include/osqp/lin_sys.h +54 -0
- casadi/include/osqp/osqp.h +430 -0
- casadi/include/osqp/osqp_configure.h +49 -0
- casadi/include/osqp/polish.h +25 -0
- casadi/include/osqp/proj.h +37 -0
- casadi/include/osqp/scaling.h +44 -0
- casadi/include/osqp/types.h +326 -0
- casadi/include/osqp/util.h +222 -0
- casadi/include/osqp/version.h +9 -0
- casadi/include/qdldl/qdldl.h +169 -0
- casadi/include/qdldl/qdldl_types.h +23 -0
- casadi/include/s_blas.h +78 -0
- casadi/include/s_blas_64.h +73 -0
- casadi/include/sleqp/defs.h +58 -0
- casadi/include/sleqp/export.h +43 -0
- casadi/include/sleqp/pub_cmp.h +18 -0
- casadi/include/sleqp/pub_dyn.h +140 -0
- casadi/include/sleqp/pub_error.h +50 -0
- casadi/include/sleqp/pub_func.h +257 -0
- casadi/include/sleqp/pub_hess_struct.h +105 -0
- casadi/include/sleqp/pub_iterate.h +88 -0
- casadi/include/sleqp/pub_log.h +88 -0
- casadi/include/sleqp/pub_lsq.h +158 -0
- casadi/include/sleqp/pub_mem.h +52 -0
- casadi/include/sleqp/pub_problem.h +213 -0
- casadi/include/sleqp/pub_scale.h +150 -0
- casadi/include/sleqp/pub_settings.h +162 -0
- casadi/include/sleqp/pub_solver.h +155 -0
- casadi/include/sleqp/pub_types.h +230 -0
- casadi/include/sleqp/pub_working_set.h +135 -0
- casadi/include/sleqp/sparse/pub_mat.h +153 -0
- casadi/include/sleqp/sparse/pub_vec.h +336 -0
- casadi/include/sleqp.h +38 -0
- casadi/include/superscs/cones.h +185 -0
- casadi/include/superscs/constants.h +144 -0
- casadi/include/superscs/cs.h +109 -0
- casadi/include/superscs/ctrlc.h +77 -0
- casadi/include/superscs/directions.h +125 -0
- casadi/include/superscs/glbopts.h +240 -0
- casadi/include/superscs/linAlg.h +437 -0
- casadi/include/superscs/linSys.h +205 -0
- casadi/include/superscs/linsys/amatrix.h +77 -0
- casadi/include/superscs/linsys/common.h +49 -0
- casadi/include/superscs/normalize.h +138 -0
- casadi/include/superscs/scs.h +656 -0
- casadi/include/superscs/scs_blas.h +79 -0
- casadi/include/superscs/scs_parser.h +187 -0
- casadi/include/superscs/unit_test_util.h +210 -0
- casadi/include/superscs/util.h +354 -0
- casadi/include/tinyxml2.h +2380 -0
- casadi/include/trlib/trlib_eigen_inverse.h +118 -0
- casadi/include/trlib/trlib_krylov.h +493 -0
- casadi/include/trlib/trlib_leftmost.h +181 -0
- casadi/include/trlib/trlib_private.h +109 -0
- casadi/include/trlib/trlib_quadratic_zero.h +57 -0
- casadi/include/trlib/trlib_tri_factor.h +409 -0
- casadi/include/trlib/trlib_types.h +36 -0
- casadi/include/trlib.h +44 -0
- casadi/lib/cmake/tinyxml2/tinyxml2-config-version.cmake +65 -0
- casadi/lib/cmake/tinyxml2/tinyxml2-config.cmake +57 -0
- casadi/lib/cmake/tinyxml2/tinyxml2-static-targets-release.cmake +19 -0
- casadi/lib/cmake/tinyxml2/tinyxml2-static-targets.cmake +107 -0
- casadi/lib/libtinyxml2.a +0 -0
- casadi/lib/pkgconfig/tinyxml2.pc +10 -0
- casadi/libCbc.3.10.11.dylib +0 -0
- casadi/libCbc.3.dylib +0 -0
- casadi/libCbc.dylib +0 -0
- casadi/libCbc.la +35 -0
- casadi/libCbcSolver.3.10.11.dylib +0 -0
- casadi/libCbcSolver.3.dylib +0 -0
- casadi/libCbcSolver.dylib +0 -0
- casadi/libCbcSolver.la +35 -0
- casadi/libCgl.1.10.8.dylib +0 -0
- casadi/libCgl.1.dylib +0 -0
- casadi/libCgl.dylib +0 -0
- casadi/libCgl.la +35 -0
- casadi/libClp.1.14.9.dylib +0 -0
- casadi/libClp.1.dylib +0 -0
- casadi/libClp.dylib +0 -0
- casadi/libClp.la +35 -0
- casadi/libClpSolver.1.14.9.dylib +0 -0
- casadi/libClpSolver.1.dylib +0 -0
- casadi/libClpSolver.dylib +0 -0
- casadi/libClpSolver.la +35 -0
- casadi/libCoinUtils.3.11.10.dylib +0 -0
- casadi/libCoinUtils.3.dylib +0 -0
- casadi/libCoinUtils.dylib +0 -0
- casadi/libCoinUtils.la +35 -0
- casadi/libOsi.1.13.9.dylib +0 -0
- casadi/libOsi.1.dylib +0 -0
- casadi/libOsi.dylib +0 -0
- casadi/libOsi.la +35 -0
- casadi/libOsiCbc.3.10.11.dylib +0 -0
- casadi/libOsiCbc.3.dylib +0 -0
- casadi/libOsiCbc.dylib +0 -0
- casadi/libOsiCbc.la +35 -0
- casadi/libOsiClp.1.14.9.dylib +0 -0
- casadi/libOsiClp.1.dylib +0 -0
- casadi/libOsiClp.dylib +0 -0
- casadi/libOsiClp.la +35 -0
- casadi/libOsiCommonTests.1.13.9.dylib +0 -0
- casadi/libOsiCommonTests.1.dylib +0 -0
- casadi/libOsiCommonTests.dylib +0 -0
- casadi/libOsiCommonTests.la +35 -0
- casadi/libblasfeo.dylib +0 -0
- casadi/libbonmin.4.8.9.dylib +0 -0
- casadi/libbonmin.4.dylib +0 -0
- casadi/libbonmin.dylib +0 -0
- casadi/libbonmin.la +35 -0
- casadi/libc++.1.0.dylib +0 -0
- casadi/libcasadi.3.7.dylib +0 -0
- casadi/libcasadi.dylib +0 -0
- casadi/libcasadi_conic_cbc.3.7.dylib +0 -0
- casadi/libcasadi_conic_cbc.dylib +0 -0
- casadi/libcasadi_conic_clp.3.7.dylib +0 -0
- casadi/libcasadi_conic_clp.dylib +0 -0
- casadi/libcasadi_conic_cplex.3.7.dylib +0 -0
- casadi/libcasadi_conic_cplex.dylib +0 -0
- casadi/libcasadi_conic_fatrop.3.7.dylib +0 -0
- casadi/libcasadi_conic_fatrop.dylib +0 -0
- casadi/libcasadi_conic_gurobi.3.7.dylib +0 -0
- casadi/libcasadi_conic_gurobi.dylib +0 -0
- casadi/libcasadi_conic_highs.3.7.dylib +0 -0
- casadi/libcasadi_conic_highs.dylib +0 -0
- casadi/libcasadi_conic_hpipm.3.7.dylib +0 -0
- casadi/libcasadi_conic_hpipm.dylib +0 -0
- casadi/libcasadi_conic_ipqp.3.7.dylib +0 -0
- casadi/libcasadi_conic_ipqp.dylib +0 -0
- casadi/libcasadi_conic_nlpsol.3.7.dylib +0 -0
- casadi/libcasadi_conic_nlpsol.dylib +0 -0
- casadi/libcasadi_conic_osqp.3.7.dylib +0 -0
- casadi/libcasadi_conic_osqp.dylib +0 -0
- casadi/libcasadi_conic_qpoases.3.7.dylib +0 -0
- casadi/libcasadi_conic_qpoases.dylib +0 -0
- casadi/libcasadi_conic_qrqp.3.7.dylib +0 -0
- casadi/libcasadi_conic_qrqp.dylib +0 -0
- casadi/libcasadi_conic_superscs.3.7.dylib +0 -0
- casadi/libcasadi_conic_superscs.dylib +0 -0
- casadi/libcasadi_importer_shell.3.7.dylib +0 -0
- casadi/libcasadi_importer_shell.dylib +0 -0
- casadi/libcasadi_integrator_collocation.3.7.dylib +0 -0
- casadi/libcasadi_integrator_collocation.dylib +0 -0
- casadi/libcasadi_integrator_cvodes.3.7.dylib +0 -0
- casadi/libcasadi_integrator_cvodes.dylib +0 -0
- casadi/libcasadi_integrator_idas.3.7.dylib +0 -0
- casadi/libcasadi_integrator_idas.dylib +0 -0
- casadi/libcasadi_integrator_rk.3.7.dylib +0 -0
- casadi/libcasadi_integrator_rk.dylib +0 -0
- casadi/libcasadi_interpolant_bspline.3.7.dylib +0 -0
- casadi/libcasadi_interpolant_bspline.dylib +0 -0
- casadi/libcasadi_interpolant_linear.3.7.dylib +0 -0
- casadi/libcasadi_interpolant_linear.dylib +0 -0
- casadi/libcasadi_linsol_csparse.3.7.dylib +0 -0
- casadi/libcasadi_linsol_csparse.dylib +0 -0
- casadi/libcasadi_linsol_csparsecholesky.3.7.dylib +0 -0
- casadi/libcasadi_linsol_csparsecholesky.dylib +0 -0
- casadi/libcasadi_linsol_lapacklu.3.7.dylib +0 -0
- casadi/libcasadi_linsol_lapacklu.dylib +0 -0
- casadi/libcasadi_linsol_lapackqr.3.7.dylib +0 -0
- casadi/libcasadi_linsol_lapackqr.dylib +0 -0
- casadi/libcasadi_linsol_ldl.3.7.dylib +0 -0
- casadi/libcasadi_linsol_ldl.dylib +0 -0
- casadi/libcasadi_linsol_lsqr.3.7.dylib +0 -0
- casadi/libcasadi_linsol_lsqr.dylib +0 -0
- casadi/libcasadi_linsol_ma27.3.7.dylib +0 -0
- casadi/libcasadi_linsol_ma27.dylib +0 -0
- casadi/libcasadi_linsol_mumps.3.7.dylib +0 -0
- casadi/libcasadi_linsol_mumps.dylib +0 -0
- casadi/libcasadi_linsol_qr.3.7.dylib +0 -0
- casadi/libcasadi_linsol_qr.dylib +0 -0
- casadi/libcasadi_linsol_symbolicqr.3.7.dylib +0 -0
- casadi/libcasadi_linsol_symbolicqr.dylib +0 -0
- casadi/libcasadi_linsol_tridiag.3.7.dylib +0 -0
- casadi/libcasadi_linsol_tridiag.dylib +0 -0
- casadi/libcasadi_nlpsol_ampl.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_ampl.dylib +0 -0
- casadi/libcasadi_nlpsol_blocksqp.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_blocksqp.dylib +0 -0
- casadi/libcasadi_nlpsol_bonmin.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_bonmin.dylib +0 -0
- casadi/libcasadi_nlpsol_fatrop.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_fatrop.dylib +0 -0
- casadi/libcasadi_nlpsol_feasiblesqpmethod.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_feasiblesqpmethod.dylib +0 -0
- casadi/libcasadi_nlpsol_ipopt.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_ipopt.dylib +0 -0
- casadi/libcasadi_nlpsol_knitro.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_knitro.dylib +0 -0
- casadi/libcasadi_nlpsol_madnlp.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_madnlp.dylib +0 -0
- casadi/libcasadi_nlpsol_qrsqp.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_qrsqp.dylib +0 -0
- casadi/libcasadi_nlpsol_scpgen.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_scpgen.dylib +0 -0
- casadi/libcasadi_nlpsol_sleqp.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_sleqp.dylib +0 -0
- casadi/libcasadi_nlpsol_snopt.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_snopt.dylib +0 -0
- casadi/libcasadi_nlpsol_sqpmethod.3.7.dylib +0 -0
- casadi/libcasadi_nlpsol_sqpmethod.dylib +0 -0
- casadi/libcasadi_rootfinder_fast_newton.3.7.dylib +0 -0
- casadi/libcasadi_rootfinder_fast_newton.dylib +0 -0
- casadi/libcasadi_rootfinder_kinsol.3.7.dylib +0 -0
- casadi/libcasadi_rootfinder_kinsol.dylib +0 -0
- casadi/libcasadi_rootfinder_newton.3.7.dylib +0 -0
- casadi/libcasadi_rootfinder_newton.dylib +0 -0
- casadi/libcasadi_rootfinder_nlpsol.3.7.dylib +0 -0
- casadi/libcasadi_rootfinder_nlpsol.dylib +0 -0
- casadi/libcasadi_sundials_common.3.7.dylib +0 -0
- casadi/libcasadi_sundials_common.dylib +0 -0
- casadi/libcasadi_xmlfile_tinyxml.3.7.dylib +0 -0
- casadi/libcasadi_xmlfile_tinyxml.dylib +0 -0
- casadi/libcoinmetis.2.dylib +0 -0
- casadi/libcoinmetis.dylib +0 -0
- casadi/libcoinmetis.la +41 -0
- casadi/libcoinmumps.3.dylib +0 -0
- casadi/libcoinmumps.dylib +0 -0
- casadi/libcoinmumps.la +41 -0
- casadi/libcplex_adaptor.dylib +0 -0
- casadi/libfatrop.dylib +0 -0
- casadi/libgcc_s.1.1.dylib +0 -0
- casadi/libgcc_s.1.dylib +0 -0
- casadi/libgfortran.5.dylib +0 -0
- casadi/libgurobi_adaptor.dylib +0 -0
- casadi/libhighs.1.7.dylib +0 -0
- casadi/libhighs.1.dylib +0 -0
- casadi/libhighs.dylib +0 -0
- casadi/libhpipm.dylib +0 -0
- casadi/libindirect.a +0 -0
- casadi/libipopt.3.dylib +0 -0
- casadi/libipopt.dylib +0 -0
- casadi/libipopt.la +41 -0
- casadi/liblinsys.a +0 -0
- casadi/libmatlab_ipc.dylib +0 -0
- casadi/libosqp.a +0 -0
- casadi/libosqp.dylib +0 -0
- casadi/libqdldl.a +0 -0
- casadi/libqdldl.dylib +0 -0
- casadi/libquadmath.0.dylib +0 -0
- casadi/libsipopt.3.dylib +0 -0
- casadi/libsipopt.dylib +0 -0
- casadi/libsipopt.la +41 -0
- casadi/libsleqp.1.0.1.dylib +0 -0
- casadi/libsleqp.dylib +0 -0
- casadi/libsuperscs.a +0 -0
- casadi/libtrlib.0.4.dylib +0 -0
- casadi/libtrlib.dylib +0 -0
- casadi/libz.1.2.13.dylib +0 -0
- casadi/pkgconfig/bonmin.pc +12 -0
- casadi/pkgconfig/casadi.pc +12 -0
- casadi/pkgconfig/cbc.pc +12 -0
- casadi/pkgconfig/cgl.pc +12 -0
- casadi/pkgconfig/clp.pc +12 -0
- casadi/pkgconfig/coinmetis.pc +13 -0
- casadi/pkgconfig/coinmumps.pc +15 -0
- casadi/pkgconfig/coinutils.pc +12 -0
- casadi/pkgconfig/highs.pc +12 -0
- casadi/pkgconfig/ipopt.pc +15 -0
- casadi/pkgconfig/osi-cbc.pc +12 -0
- casadi/pkgconfig/osi-clp.pc +12 -0
- casadi/pkgconfig/osi-unittests.pc +12 -0
- casadi/pkgconfig/osi.pc +12 -0
- casadi/pkgconfig/sleqp.pc +10 -0
- casadi/tools/__init__.py +52 -0
- casadi/tools/bounds.py +107 -0
- casadi/tools/graph/__init__.py +35 -0
- casadi/tools/graph/graph.py +747 -0
- casadi/tools/in_out.py +89 -0
- casadi/tools/structure.py +1446 -0
- casadi/tools/structure3.py +1441 -0
- casadi-3.6.7.dist-info/METADATA +45 -0
- casadi-3.6.7.dist-info/RECORD +1312 -0
- casadi-3.6.7.dist-info/WHEEL +5 -0
- dummy.txt +1 -0
@@ -0,0 +1,1443 @@
|
|
1
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
2
|
+
/* */
|
3
|
+
/* This file is part of the HiGHS linear optimization suite */
|
4
|
+
/* */
|
5
|
+
/* Written and engineered 2008-2024 by Julian Hall, Ivet Galabova, */
|
6
|
+
/* Leona Gottwald and Michael Feldmeier */
|
7
|
+
/* */
|
8
|
+
/* Available as open-source under the MIT License */
|
9
|
+
/* */
|
10
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
11
|
+
#ifndef HIGHS_UTIL_HASH_TREE_H_
|
12
|
+
#define HIGHS_UTIL_HASH_TREE_H_
|
13
|
+
|
14
|
+
#include <stdexcept>
|
15
|
+
|
16
|
+
#include "util/HighsHash.h"
|
17
|
+
|
18
|
+
using std::memcpy;
|
19
|
+
using std::memmove;
|
20
|
+
|
21
|
+
template <typename K, typename V = void>
|
22
|
+
class HighsHashTree {
|
23
|
+
using Entry = HighsHashTableEntry<K, V>;
|
24
|
+
using ValueType =
|
25
|
+
typename std::remove_reference<decltype(Entry().value())>::type;
|
26
|
+
|
27
|
+
enum Type {
|
28
|
+
kEmpty = 0,
|
29
|
+
kListLeaf = 1,
|
30
|
+
kInnerLeafSizeClass1 = 2,
|
31
|
+
kInnerLeafSizeClass2 = 3,
|
32
|
+
kInnerLeafSizeClass3 = 4,
|
33
|
+
kInnerLeafSizeClass4 = 5,
|
34
|
+
kBranchNode = 6,
|
35
|
+
};
|
36
|
+
|
37
|
+
enum Constants {
|
38
|
+
kBitsPerLevel = 6,
|
39
|
+
kBranchFactor = 1 << kBitsPerLevel,
|
40
|
+
// even though we could use up to 64 bits of the hash this would require
|
41
|
+
// additional handling in the last levels to avoid negative shift values
|
42
|
+
// up to 9 depth levels are Ok though as up to index 8 the
|
43
|
+
// get_hash_chunks16() function shifts right by a non-negative amount
|
44
|
+
kMaxDepth = 9,
|
45
|
+
kMinLeafSize = 6,
|
46
|
+
kLeafBurstThreshold = 54,
|
47
|
+
};
|
48
|
+
|
49
|
+
static uint64_t compute_hash(const K& key) {
|
50
|
+
return HighsHashHelpers::hash(key);
|
51
|
+
}
|
52
|
+
|
53
|
+
static uint8_t get_hash_chunk(uint64_t hash, int pos) {
|
54
|
+
return (hash >> (64 - kBitsPerLevel - pos * kBitsPerLevel)) &
|
55
|
+
(kBranchFactor - 1);
|
56
|
+
}
|
57
|
+
|
58
|
+
static uint16_t get_hash_chunks16(uint64_t hash, int pos) {
|
59
|
+
return (hash >> (48 - pos * kBitsPerLevel));
|
60
|
+
}
|
61
|
+
|
62
|
+
static uint8_t get_first_chunk16(uint16_t chunks) {
|
63
|
+
return chunks >> (16 - kBitsPerLevel);
|
64
|
+
}
|
65
|
+
|
66
|
+
static void set_hash_chunk(uint64_t& hash, uint64_t chunk, int chunkPos) {
|
67
|
+
const int shiftAmount = (60 - kBitsPerLevel - chunkPos * kBitsPerLevel);
|
68
|
+
chunk ^= (hash >> shiftAmount) & (kBranchFactor - 1);
|
69
|
+
hash ^= chunk << shiftAmount;
|
70
|
+
}
|
71
|
+
|
72
|
+
struct Occupation {
|
73
|
+
uint64_t occupation;
|
74
|
+
|
75
|
+
Occupation() {}
|
76
|
+
Occupation(uint64_t occupation) : occupation(occupation) {}
|
77
|
+
operator uint64_t() const { return occupation; }
|
78
|
+
|
79
|
+
void set(uint8_t pos) { occupation |= uint64_t{1} << (pos); }
|
80
|
+
|
81
|
+
void flip(uint8_t pos) { occupation ^= uint64_t{1} << (pos); }
|
82
|
+
|
83
|
+
bool test(uint8_t pos) const { return occupation & (uint64_t{1} << pos); }
|
84
|
+
|
85
|
+
int num_set_until(uint8_t pos) const {
|
86
|
+
return HighsHashHelpers::popcnt(occupation >> pos);
|
87
|
+
}
|
88
|
+
|
89
|
+
int num_set_after(uint8_t pos) const {
|
90
|
+
return HighsHashHelpers::popcnt(occupation << (63 - (pos)));
|
91
|
+
}
|
92
|
+
|
93
|
+
int num_set() const { return HighsHashHelpers::popcnt(occupation); }
|
94
|
+
};
|
95
|
+
|
96
|
+
static constexpr int entries_to_size_class(unsigned int numEntries) {
|
97
|
+
return 1 + unsigned(numEntries + ((kLeafBurstThreshold - kMinLeafSize) / 3 -
|
98
|
+
kMinLeafSize - 1)) /
|
99
|
+
((kLeafBurstThreshold - kMinLeafSize) / 3);
|
100
|
+
}
|
101
|
+
|
102
|
+
template <int kSizeClass>
|
103
|
+
struct InnerLeaf {
|
104
|
+
static constexpr int capacity() {
|
105
|
+
return kMinLeafSize +
|
106
|
+
(kSizeClass - 1) * (kLeafBurstThreshold - kMinLeafSize) / 3;
|
107
|
+
}
|
108
|
+
// the leaf stores entries the same way as inner nodes
|
109
|
+
// but handles collisions on the occupation flag like a
|
110
|
+
// linear probing hash table.
|
111
|
+
// Since the occupation flag has 64 bits and we only use
|
112
|
+
// 15 collisions should be rare and most often we won't need
|
113
|
+
// to do a linear scan and key comparisons at all
|
114
|
+
Occupation occupation;
|
115
|
+
int size;
|
116
|
+
uint64_t hashes[capacity() + 1];
|
117
|
+
Entry entries[capacity()];
|
118
|
+
|
119
|
+
InnerLeaf() : occupation(0), size(0) { hashes[0] = 0; }
|
120
|
+
|
121
|
+
template <int kOtherSize>
|
122
|
+
InnerLeaf(InnerLeaf<kOtherSize>&& other) {
|
123
|
+
assert(other.size <= capacity());
|
124
|
+
memcpy((void*)this, (void*)&other,
|
125
|
+
(char*)&other.hashes[other.size + 1] - (char*)&other);
|
126
|
+
std::move(&other.entries[0], &other.entries[size], &entries[0]);
|
127
|
+
}
|
128
|
+
|
129
|
+
int get_num_entries() const { return size; }
|
130
|
+
|
131
|
+
std::pair<ValueType*, bool> insert_entry(uint64_t fullHash, int hashPos,
|
132
|
+
Entry& entry) {
|
133
|
+
assert(size < capacity());
|
134
|
+
uint16_t hash = get_hash_chunks16(fullHash, hashPos);
|
135
|
+
uint8_t hashChunk = get_first_chunk16(hash);
|
136
|
+
|
137
|
+
int pos = occupation.num_set_until(hashChunk);
|
138
|
+
|
139
|
+
if (occupation.test(hashChunk)) {
|
140
|
+
// since the occupation flag is set we need to start searching from
|
141
|
+
// pos-1 and can rely on a hash chunk with the same value existing for
|
142
|
+
// the scan
|
143
|
+
--pos;
|
144
|
+
while (hashes[pos] > hash) ++pos;
|
145
|
+
|
146
|
+
if (find_key(entry.key(), hash, pos))
|
147
|
+
return std::make_pair(&entries[pos].value(), false);
|
148
|
+
|
149
|
+
} else {
|
150
|
+
occupation.set(hashChunk);
|
151
|
+
|
152
|
+
if (pos < size)
|
153
|
+
while (hashes[pos] > hash) ++pos;
|
154
|
+
}
|
155
|
+
|
156
|
+
if (pos < size) move_backward(pos, size);
|
157
|
+
entries[pos] = std::move(entry);
|
158
|
+
hashes[pos] = hash;
|
159
|
+
++size;
|
160
|
+
hashes[size] = 0;
|
161
|
+
|
162
|
+
return std::make_pair(&entries[pos].value(), true);
|
163
|
+
}
|
164
|
+
|
165
|
+
ValueType* find_entry(uint64_t fullHash, int hashPos, const K& key) {
|
166
|
+
uint16_t hash = get_hash_chunks16(fullHash, hashPos);
|
167
|
+
uint8_t hashChunk = get_first_chunk16(hash);
|
168
|
+
if (!occupation.test(hashChunk)) return nullptr;
|
169
|
+
|
170
|
+
int pos = occupation.num_set_until(hashChunk) - 1;
|
171
|
+
while (hashes[pos] > hash) ++pos;
|
172
|
+
|
173
|
+
if (find_key(key, hash, pos)) return &entries[pos].value();
|
174
|
+
|
175
|
+
return nullptr;
|
176
|
+
}
|
177
|
+
|
178
|
+
bool erase_entry(uint64_t fullHash, int hashPos, const K& key) {
|
179
|
+
uint16_t hash = get_hash_chunks16(fullHash, hashPos);
|
180
|
+
uint8_t hashChunk = get_first_chunk16(hash);
|
181
|
+
if (!occupation.test(hashChunk)) return false;
|
182
|
+
|
183
|
+
int startPos = occupation.num_set_until(hashChunk) - 1;
|
184
|
+
while (get_first_chunk16(hashes[startPos]) > hashChunk) ++startPos;
|
185
|
+
|
186
|
+
int pos = startPos;
|
187
|
+
while (hashes[pos] > hash) ++pos;
|
188
|
+
|
189
|
+
if (!find_key(key, hash, pos)) return false;
|
190
|
+
|
191
|
+
--size;
|
192
|
+
if (pos < size) {
|
193
|
+
std::move(&entries[pos + 1], &entries[size + 1], &entries[pos]);
|
194
|
+
memmove(&hashes[pos], &hashes[pos + 1],
|
195
|
+
sizeof(hashes[0]) * (size - pos));
|
196
|
+
if (get_first_chunk16(hashes[startPos]) != hashChunk)
|
197
|
+
occupation.flip(hashChunk);
|
198
|
+
} else if (startPos == pos)
|
199
|
+
occupation.flip(hashChunk);
|
200
|
+
|
201
|
+
hashes[size] = 0;
|
202
|
+
return true;
|
203
|
+
}
|
204
|
+
|
205
|
+
void rehash(int hashPos) {
|
206
|
+
// function needs to possibly reorder elements by a different hash value
|
207
|
+
// chances are very high we are already ordered correctly as we use 16
|
208
|
+
// bits of the hash and one level is uses 6 bits, so the new values
|
209
|
+
// are guaranteed to be ordered correctly by their 10 most significant
|
210
|
+
// bits if increasing the hash position by 1 and only if the 10 bits of
|
211
|
+
// the hash had a collision the new 6 bits might break a tie differently.
|
212
|
+
// It is, however, important to maintain the exact ordering as otherwise
|
213
|
+
// elements may not be found.
|
214
|
+
occupation = 0;
|
215
|
+
for (int i = 0; i < size; ++i) {
|
216
|
+
hashes[i] = get_hash_chunks16(compute_hash(entries[i].key()), hashPos);
|
217
|
+
occupation.set(get_first_chunk16(hashes[i]));
|
218
|
+
}
|
219
|
+
|
220
|
+
int i = 0;
|
221
|
+
while (i < size) {
|
222
|
+
uint8_t hashChunk = get_first_chunk16(hashes[i]);
|
223
|
+
int pos = occupation.num_set_until(hashChunk) - 1;
|
224
|
+
|
225
|
+
// if the position is after i the element definitely comes later, so we
|
226
|
+
// swap it to that position and proceed without increasing i until
|
227
|
+
// eventually an element appears that comes at position i or before
|
228
|
+
if (pos > i) {
|
229
|
+
std::swap(hashes[pos], hashes[i]);
|
230
|
+
std::swap(entries[pos], entries[i]);
|
231
|
+
continue;
|
232
|
+
}
|
233
|
+
|
234
|
+
// the position is before or at i, now check where the exact location
|
235
|
+
// should be for the ordering by hash so that the invariant is that all
|
236
|
+
// elements up to i are properly sorted. Essentially insertion sort but
|
237
|
+
// with the modification of having a high chance to guess the correct
|
238
|
+
// position already using the occupation flags.
|
239
|
+
while (pos < i && hashes[pos] >= hashes[i]) ++pos;
|
240
|
+
|
241
|
+
// if the final position is before i we need to move elements to
|
242
|
+
// make space at that position, otherwise nothing needs to be done but
|
243
|
+
// incrementing i increasing the sorted range by 1.
|
244
|
+
if (pos < i) {
|
245
|
+
uint64_t hash = hashes[i];
|
246
|
+
auto entry = std::move(entries[i]);
|
247
|
+
move_backward(pos, i);
|
248
|
+
hashes[pos] = hash;
|
249
|
+
entries[pos] = std::move(entry);
|
250
|
+
}
|
251
|
+
++i;
|
252
|
+
}
|
253
|
+
}
|
254
|
+
|
255
|
+
void move_backward(const int& first, const int& last) {
|
256
|
+
// move elements backwards
|
257
|
+
std::move_backward(&entries[first], &entries[last], &entries[last + 1]);
|
258
|
+
memmove(&hashes[first + 1], &hashes[first],
|
259
|
+
sizeof(hashes[0]) * (last - first));
|
260
|
+
}
|
261
|
+
|
262
|
+
bool find_key(const K& key, const uint16_t& hash, int& pos) const {
|
263
|
+
// find key
|
264
|
+
while (pos != size && hashes[pos] == hash) {
|
265
|
+
if (key == entries[pos].key()) return true;
|
266
|
+
++pos;
|
267
|
+
}
|
268
|
+
return false;
|
269
|
+
}
|
270
|
+
};
|
271
|
+
|
272
|
+
struct ListNode {
|
273
|
+
ListNode* next;
|
274
|
+
HighsHashTableEntry<K, V> entry;
|
275
|
+
ListNode(HighsHashTableEntry<K, V>&& entry)
|
276
|
+
: next(nullptr), entry(std::move(entry)) {}
|
277
|
+
};
|
278
|
+
struct ListLeaf {
|
279
|
+
ListNode first;
|
280
|
+
int count;
|
281
|
+
|
282
|
+
ListLeaf(HighsHashTableEntry<K, V>&& entry)
|
283
|
+
: first(std::move(entry)), count(1) {}
|
284
|
+
};
|
285
|
+
|
286
|
+
struct BranchNode;
|
287
|
+
|
288
|
+
struct NodePtr {
|
289
|
+
uintptr_t ptrAndType;
|
290
|
+
|
291
|
+
NodePtr() : ptrAndType(kEmpty) {}
|
292
|
+
NodePtr(std::nullptr_t) : ptrAndType(kEmpty) {}
|
293
|
+
NodePtr(ListLeaf* ptr)
|
294
|
+
: ptrAndType(reinterpret_cast<uintptr_t>(ptr) | kListLeaf) {}
|
295
|
+
NodePtr(InnerLeaf<1>* ptr)
|
296
|
+
: ptrAndType(reinterpret_cast<uintptr_t>(ptr) | kInnerLeafSizeClass1) {}
|
297
|
+
NodePtr(InnerLeaf<2>* ptr)
|
298
|
+
: ptrAndType(reinterpret_cast<uintptr_t>(ptr) | kInnerLeafSizeClass2) {}
|
299
|
+
NodePtr(InnerLeaf<3>* ptr)
|
300
|
+
: ptrAndType(reinterpret_cast<uintptr_t>(ptr) | kInnerLeafSizeClass3) {}
|
301
|
+
NodePtr(InnerLeaf<4>* ptr)
|
302
|
+
: ptrAndType(reinterpret_cast<uintptr_t>(ptr) | kInnerLeafSizeClass4) {}
|
303
|
+
NodePtr(BranchNode* ptr)
|
304
|
+
: ptrAndType(reinterpret_cast<uintptr_t>(ptr) | kBranchNode) {
|
305
|
+
assert(ptr != nullptr);
|
306
|
+
}
|
307
|
+
|
308
|
+
Type getType() const { return Type(ptrAndType & 7u); }
|
309
|
+
|
310
|
+
int numEntriesEstimate() const {
|
311
|
+
switch (getType()) {
|
312
|
+
case kEmpty:
|
313
|
+
return 0;
|
314
|
+
case kListLeaf:
|
315
|
+
return 1;
|
316
|
+
case kInnerLeafSizeClass1:
|
317
|
+
return InnerLeaf<1>::capacity();
|
318
|
+
case kInnerLeafSizeClass2:
|
319
|
+
return InnerLeaf<2>::capacity();
|
320
|
+
case kInnerLeafSizeClass3:
|
321
|
+
return InnerLeaf<3>::capacity();
|
322
|
+
case kInnerLeafSizeClass4:
|
323
|
+
return InnerLeaf<4>::capacity();
|
324
|
+
case kBranchNode:
|
325
|
+
// something large should be returned so that the number of entries
|
326
|
+
// is estimated above the threshold to merge when the parent checks
|
327
|
+
// its children after deletion
|
328
|
+
return kBranchFactor;
|
329
|
+
default:
|
330
|
+
throw std::logic_error("Unexpected type in hash tree");
|
331
|
+
}
|
332
|
+
}
|
333
|
+
|
334
|
+
int numEntries() const {
|
335
|
+
switch (getType()) {
|
336
|
+
case kEmpty:
|
337
|
+
return 0;
|
338
|
+
case kListLeaf:
|
339
|
+
return getListLeaf()->count;
|
340
|
+
case kInnerLeafSizeClass1:
|
341
|
+
return getInnerLeafSizeClass1()->size;
|
342
|
+
case kInnerLeafSizeClass2:
|
343
|
+
return getInnerLeafSizeClass2()->size;
|
344
|
+
case kInnerLeafSizeClass3:
|
345
|
+
return getInnerLeafSizeClass3()->size;
|
346
|
+
case kInnerLeafSizeClass4:
|
347
|
+
return getInnerLeafSizeClass4()->size;
|
348
|
+
case kBranchNode:
|
349
|
+
// something large should be returned so that the number of entries
|
350
|
+
// is estimated above the threshold to merge when the parent checks
|
351
|
+
// its children after deletion
|
352
|
+
return kBranchFactor;
|
353
|
+
default:
|
354
|
+
throw std::logic_error("Unexpected type in hash tree");
|
355
|
+
}
|
356
|
+
}
|
357
|
+
|
358
|
+
ListLeaf* getListLeaf() const {
|
359
|
+
assert(getType() == kListLeaf);
|
360
|
+
return reinterpret_cast<ListLeaf*>(ptrAndType & ~uintptr_t{7});
|
361
|
+
}
|
362
|
+
|
363
|
+
InnerLeaf<1>* getInnerLeafSizeClass1() const {
|
364
|
+
assert(getType() == kInnerLeafSizeClass1);
|
365
|
+
return reinterpret_cast<InnerLeaf<1>*>(ptrAndType & ~uintptr_t{7});
|
366
|
+
}
|
367
|
+
InnerLeaf<2>* getInnerLeafSizeClass2() const {
|
368
|
+
assert(getType() == kInnerLeafSizeClass2);
|
369
|
+
return reinterpret_cast<InnerLeaf<2>*>(ptrAndType & ~uintptr_t{7});
|
370
|
+
}
|
371
|
+
|
372
|
+
InnerLeaf<3>* getInnerLeafSizeClass3() const {
|
373
|
+
assert(getType() == kInnerLeafSizeClass3);
|
374
|
+
return reinterpret_cast<InnerLeaf<3>*>(ptrAndType & ~uintptr_t{7});
|
375
|
+
}
|
376
|
+
|
377
|
+
InnerLeaf<4>* getInnerLeafSizeClass4() const {
|
378
|
+
assert(getType() == kInnerLeafSizeClass4);
|
379
|
+
return reinterpret_cast<InnerLeaf<4>*>(ptrAndType & ~uintptr_t{7});
|
380
|
+
}
|
381
|
+
|
382
|
+
BranchNode* getBranchNode() const {
|
383
|
+
assert(getType() == kBranchNode);
|
384
|
+
return reinterpret_cast<BranchNode*>(ptrAndType & ~uintptr_t{7});
|
385
|
+
}
|
386
|
+
};
|
387
|
+
|
388
|
+
struct BranchNode {
|
389
|
+
Occupation occupation;
|
390
|
+
NodePtr child[1];
|
391
|
+
};
|
392
|
+
|
393
|
+
// allocate branch nodes in multiples of 64 bytes to reduce allocator stress
|
394
|
+
// with different sizes and reduce reallocations of nodes
|
395
|
+
static constexpr size_t getBranchNodeSize(int numChilds) {
|
396
|
+
return (sizeof(BranchNode) + size_t(numChilds - 1) * sizeof(NodePtr) + 63) &
|
397
|
+
~63;
|
398
|
+
};
|
399
|
+
|
400
|
+
static BranchNode* createBranchingNode(int numChilds) {
|
401
|
+
BranchNode* branch =
|
402
|
+
(BranchNode*)::operator new(getBranchNodeSize(numChilds));
|
403
|
+
branch->occupation = 0;
|
404
|
+
return branch;
|
405
|
+
}
|
406
|
+
|
407
|
+
static void destroyBranchingNode(void* innerNode) {
|
408
|
+
::operator delete(innerNode);
|
409
|
+
}
|
410
|
+
|
411
|
+
static BranchNode* addChildToBranchNode(BranchNode* branch, uint8_t hashValue,
|
412
|
+
int location) {
|
413
|
+
int rightChilds = branch->occupation.num_set_after(hashValue);
|
414
|
+
assert(rightChilds + location == branch->occupation.num_set());
|
415
|
+
|
416
|
+
size_t newSize = getBranchNodeSize(location + rightChilds + 1);
|
417
|
+
size_t rightSize = rightChilds * sizeof(NodePtr);
|
418
|
+
|
419
|
+
if (newSize == getBranchNodeSize(location + rightChilds)) {
|
420
|
+
memmove(&branch->child[location + 1], &branch->child[location],
|
421
|
+
rightSize);
|
422
|
+
|
423
|
+
return branch;
|
424
|
+
}
|
425
|
+
|
426
|
+
BranchNode* newBranch = (BranchNode*)::operator new(newSize);
|
427
|
+
// sizeof(Branch) already contains the size for 1 pointer. So we just
|
428
|
+
// need to add the left and right sizes up for the number of
|
429
|
+
// additional pointers
|
430
|
+
size_t leftSize = sizeof(BranchNode) + (location - 1) * sizeof(NodePtr);
|
431
|
+
|
432
|
+
memcpy(newBranch, branch, leftSize);
|
433
|
+
memcpy(&newBranch->child[location + 1], &branch->child[location],
|
434
|
+
rightSize);
|
435
|
+
|
436
|
+
destroyBranchingNode(branch);
|
437
|
+
|
438
|
+
return newBranch;
|
439
|
+
}
|
440
|
+
|
441
|
+
template <int SizeClass1, int SizeClass2>
|
442
|
+
static void mergeIntoLeaf(InnerLeaf<SizeClass1>* leaf,
|
443
|
+
InnerLeaf<SizeClass2>* mergeLeaf, int hashPos) {
|
444
|
+
for (int i = 0; i < mergeLeaf->size; ++i)
|
445
|
+
leaf->insert_entry(compute_hash(mergeLeaf->entries[i].key()), hashPos,
|
446
|
+
mergeLeaf->entries[i]);
|
447
|
+
}
|
448
|
+
|
449
|
+
template <int SizeClass>
|
450
|
+
static void mergeIntoLeaf(InnerLeaf<SizeClass>* leaf, int hashPos,
|
451
|
+
NodePtr mergeNode) {
|
452
|
+
switch (mergeNode.getType()) {
|
453
|
+
case kListLeaf: {
|
454
|
+
ListLeaf* mergeLeaf = mergeNode.getListLeaf();
|
455
|
+
leaf->insert_entry(compute_hash(mergeLeaf->first.entry.key()), hashPos,
|
456
|
+
mergeLeaf->first.entry);
|
457
|
+
ListNode* iter = mergeLeaf->first.next;
|
458
|
+
while (iter != nullptr) {
|
459
|
+
ListNode* next = iter->next;
|
460
|
+
leaf->insert_entry(compute_hash(iter->entry.key()), hashPos,
|
461
|
+
iter->entry);
|
462
|
+
delete iter;
|
463
|
+
iter = next;
|
464
|
+
}
|
465
|
+
break;
|
466
|
+
}
|
467
|
+
case kInnerLeafSizeClass1:
|
468
|
+
mergeIntoLeaf(leaf, mergeNode.getInnerLeafSizeClass1(), hashPos);
|
469
|
+
delete mergeNode.getInnerLeafSizeClass1();
|
470
|
+
break;
|
471
|
+
case kInnerLeafSizeClass2:
|
472
|
+
mergeIntoLeaf(leaf, mergeNode.getInnerLeafSizeClass2(), hashPos);
|
473
|
+
delete mergeNode.getInnerLeafSizeClass2();
|
474
|
+
break;
|
475
|
+
case kInnerLeafSizeClass3:
|
476
|
+
mergeIntoLeaf(leaf, mergeNode.getInnerLeafSizeClass3(), hashPos);
|
477
|
+
delete mergeNode.getInnerLeafSizeClass3();
|
478
|
+
break;
|
479
|
+
case kInnerLeafSizeClass4:
|
480
|
+
mergeIntoLeaf(leaf, mergeNode.getInnerLeafSizeClass4(), hashPos);
|
481
|
+
delete mergeNode.getInnerLeafSizeClass4();
|
482
|
+
break;
|
483
|
+
default:
|
484
|
+
break;
|
485
|
+
}
|
486
|
+
}
|
487
|
+
|
488
|
+
template <int SizeClass1, int SizeClass2>
|
489
|
+
static HighsHashTableEntry<K, V>* findCommonInLeaf(
|
490
|
+
InnerLeaf<SizeClass1>* leaf1, InnerLeaf<SizeClass2>* leaf2, int hashPos) {
|
491
|
+
uint64_t matchMask = leaf1->occupation & leaf2->occupation;
|
492
|
+
if (matchMask == 0) return nullptr;
|
493
|
+
|
494
|
+
int offset1 = -1;
|
495
|
+
int offset2 = -1;
|
496
|
+
while (matchMask) {
|
497
|
+
int pos = HighsHashHelpers::log2i(matchMask);
|
498
|
+
matchMask ^= (uint64_t{1} << pos);
|
499
|
+
|
500
|
+
int i =
|
501
|
+
leaf1->occupation.num_set_until(static_cast<uint8_t>(pos)) + offset1;
|
502
|
+
while (get_first_chunk16(leaf1->hashes[i]) != pos) {
|
503
|
+
++i;
|
504
|
+
++offset1;
|
505
|
+
}
|
506
|
+
|
507
|
+
int j =
|
508
|
+
leaf2->occupation.num_set_until(static_cast<uint8_t>(pos)) + offset2;
|
509
|
+
while (get_first_chunk16(leaf2->hashes[j]) != pos) {
|
510
|
+
++j;
|
511
|
+
++offset2;
|
512
|
+
}
|
513
|
+
|
514
|
+
while (true) {
|
515
|
+
if (leaf1->hashes[i] > leaf2->hashes[j]) {
|
516
|
+
++i;
|
517
|
+
if (i == leaf1->size || get_first_chunk16(leaf1->hashes[i]) != pos)
|
518
|
+
break;
|
519
|
+
} else if (leaf2->hashes[j] > leaf1->hashes[i]) {
|
520
|
+
++j;
|
521
|
+
if (j == leaf2->size || get_first_chunk16(leaf2->hashes[j]) != pos)
|
522
|
+
break;
|
523
|
+
} else {
|
524
|
+
if (leaf1->entries[i].key() == leaf2->entries[j].key())
|
525
|
+
return &leaf1->entries[i];
|
526
|
+
|
527
|
+
++i;
|
528
|
+
if (i == leaf1->size || get_first_chunk16(leaf1->hashes[i]) != pos)
|
529
|
+
break;
|
530
|
+
++j;
|
531
|
+
if (j == leaf2->size || get_first_chunk16(leaf2->hashes[j]) != pos)
|
532
|
+
break;
|
533
|
+
}
|
534
|
+
};
|
535
|
+
}
|
536
|
+
|
537
|
+
return nullptr;
|
538
|
+
}
|
539
|
+
|
540
|
+
template <int SizeClass>
|
541
|
+
static HighsHashTableEntry<K, V>* findCommonInLeaf(InnerLeaf<SizeClass>* leaf,
|
542
|
+
NodePtr n2, int hashPos) {
|
543
|
+
switch (n2.getType()) {
|
544
|
+
case kInnerLeafSizeClass1:
|
545
|
+
return findCommonInLeaf(leaf, n2.getInnerLeafSizeClass1(), hashPos);
|
546
|
+
case kInnerLeafSizeClass2:
|
547
|
+
return findCommonInLeaf(leaf, n2.getInnerLeafSizeClass2(), hashPos);
|
548
|
+
case kInnerLeafSizeClass3:
|
549
|
+
return findCommonInLeaf(leaf, n2.getInnerLeafSizeClass3(), hashPos);
|
550
|
+
case kInnerLeafSizeClass4:
|
551
|
+
return findCommonInLeaf(leaf, n2.getInnerLeafSizeClass4(), hashPos);
|
552
|
+
case kBranchNode: {
|
553
|
+
BranchNode* branch = n2.getBranchNode();
|
554
|
+
uint64_t matchMask = branch->occupation & leaf->occupation;
|
555
|
+
|
556
|
+
int offset = -1;
|
557
|
+
while (matchMask) {
|
558
|
+
int pos = HighsHashHelpers::log2i(matchMask);
|
559
|
+
matchMask ^= (uint64_t{1} << pos);
|
560
|
+
|
561
|
+
int i = leaf->occupation.num_set_until(static_cast<uint8_t>(pos)) +
|
562
|
+
offset;
|
563
|
+
while (get_first_chunk16(leaf->hashes[i]) != pos) {
|
564
|
+
++i;
|
565
|
+
++offset;
|
566
|
+
}
|
567
|
+
|
568
|
+
int j =
|
569
|
+
branch->occupation.num_set_until(static_cast<uint8_t>(pos)) - 1;
|
570
|
+
|
571
|
+
do {
|
572
|
+
if (find_recurse(branch->child[j],
|
573
|
+
compute_hash(leaf->entries[i].key()), hashPos + 1,
|
574
|
+
leaf->entries[i].key()))
|
575
|
+
return &leaf->entries[i];
|
576
|
+
++i;
|
577
|
+
} while (i < leaf->size && get_first_chunk16(leaf->hashes[i]) == pos);
|
578
|
+
}
|
579
|
+
break;
|
580
|
+
}
|
581
|
+
default:
|
582
|
+
break;
|
583
|
+
}
|
584
|
+
|
585
|
+
return nullptr;
|
586
|
+
}
|
587
|
+
|
588
|
+
static NodePtr removeChildFromBranchNode(BranchNode* branch, int location,
|
589
|
+
uint64_t hash, int hashPos) {
|
590
|
+
NodePtr newNode;
|
591
|
+
int newNumChild = branch->occupation.num_set();
|
592
|
+
|
593
|
+
// first check if we might be able to merge all children into one new leaf
|
594
|
+
// based on the node numbers and assuming all of them might be in the
|
595
|
+
// smallest size class
|
596
|
+
if (newNumChild * InnerLeaf<1>::capacity() <= kLeafBurstThreshold) {
|
597
|
+
// since we have a good chance of merging we now check the actual size
|
598
|
+
// classes to see if that yields a number of entries at most the burst
|
599
|
+
// threshold
|
600
|
+
int childEntries = 0;
|
601
|
+
for (int i = 0; i <= newNumChild; ++i) {
|
602
|
+
childEntries += branch->child[i].numEntriesEstimate();
|
603
|
+
if (childEntries > kLeafBurstThreshold) break;
|
604
|
+
}
|
605
|
+
|
606
|
+
if (childEntries < kLeafBurstThreshold) {
|
607
|
+
// create a new merged inner leaf node containing all entries of
|
608
|
+
// children first recompute the number of entries, but this time access
|
609
|
+
// each child to get the actual number of entries needed and determine
|
610
|
+
// this nodes size class since before we estimated the number of child
|
611
|
+
// entries from the capacities of our child leaf node types which are
|
612
|
+
// stored in the branch nodes pointers directly and avoid unnecessary
|
613
|
+
// accesses of nodes that are not in cache.
|
614
|
+
childEntries = 0;
|
615
|
+
for (int i = 0; i <= newNumChild; ++i)
|
616
|
+
childEntries += branch->child[i].numEntries();
|
617
|
+
|
618
|
+
// check again if we exceed due to the extremely unlikely case
|
619
|
+
// of having less than 5 list nodes with together more than 30 entries
|
620
|
+
// as list nodes are only created in the last depth level
|
621
|
+
if (childEntries < kLeafBurstThreshold) {
|
622
|
+
switch (entries_to_size_class(childEntries)) {
|
623
|
+
case 1: {
|
624
|
+
InnerLeaf<1>* newLeafSize1 = new InnerLeaf<1>;
|
625
|
+
newNode = newLeafSize1;
|
626
|
+
for (int i = 0; i <= newNumChild; ++i)
|
627
|
+
mergeIntoLeaf(newLeafSize1, hashPos, branch->child[i]);
|
628
|
+
break;
|
629
|
+
}
|
630
|
+
case 2: {
|
631
|
+
InnerLeaf<2>* newLeafSize2 = new InnerLeaf<2>;
|
632
|
+
newNode = newLeafSize2;
|
633
|
+
for (int i = 0; i <= newNumChild; ++i)
|
634
|
+
mergeIntoLeaf(newLeafSize2, hashPos, branch->child[i]);
|
635
|
+
break;
|
636
|
+
}
|
637
|
+
case 3: {
|
638
|
+
InnerLeaf<3>* newLeafSize3 = new InnerLeaf<3>;
|
639
|
+
newNode = newLeafSize3;
|
640
|
+
for (int i = 0; i <= newNumChild; ++i)
|
641
|
+
mergeIntoLeaf(newLeafSize3, hashPos, branch->child[i]);
|
642
|
+
break;
|
643
|
+
}
|
644
|
+
case 4: {
|
645
|
+
InnerLeaf<4>* newLeafSize4 = new InnerLeaf<4>;
|
646
|
+
newNode = newLeafSize4;
|
647
|
+
for (int i = 0; i <= newNumChild; ++i)
|
648
|
+
mergeIntoLeaf(newLeafSize4, hashPos, branch->child[i]);
|
649
|
+
break;
|
650
|
+
}
|
651
|
+
default:
|
652
|
+
// Unexpected result from 'entries_to_size_class'
|
653
|
+
assert(false);
|
654
|
+
}
|
655
|
+
|
656
|
+
destroyBranchingNode(branch);
|
657
|
+
return newNode;
|
658
|
+
}
|
659
|
+
}
|
660
|
+
}
|
661
|
+
|
662
|
+
size_t newSize = getBranchNodeSize(newNumChild);
|
663
|
+
size_t rightSize = (newNumChild - location) * sizeof(NodePtr);
|
664
|
+
if (newSize == getBranchNodeSize(newNumChild + 1)) {
|
665
|
+
// allocated size class is the same, so we do not allocate a new node
|
666
|
+
memmove(&branch->child[location], &branch->child[location + 1],
|
667
|
+
rightSize);
|
668
|
+
newNode = branch;
|
669
|
+
} else {
|
670
|
+
// allocated size class changed, so we allocate a smaller branch node
|
671
|
+
BranchNode* compressedBranch = (BranchNode*)::operator new(newSize);
|
672
|
+
newNode = compressedBranch;
|
673
|
+
|
674
|
+
size_t leftSize =
|
675
|
+
offsetof(BranchNode, child) + location * sizeof(NodePtr);
|
676
|
+
memcpy(compressedBranch, branch, leftSize);
|
677
|
+
memcpy(&compressedBranch->child[location], &branch->child[location + 1],
|
678
|
+
rightSize);
|
679
|
+
|
680
|
+
destroyBranchingNode(branch);
|
681
|
+
}
|
682
|
+
|
683
|
+
return newNode;
|
684
|
+
}
|
685
|
+
|
686
|
+
NodePtr root;
|
687
|
+
|
688
|
+
template <int SizeClass>
|
689
|
+
static std::pair<ValueType*, bool> insert_into_leaf(
|
690
|
+
NodePtr* insertNode, InnerLeaf<SizeClass>* leaf, uint64_t hash,
|
691
|
+
int hashPos, HighsHashTableEntry<K, V>& entry) {
|
692
|
+
if (leaf->size == InnerLeaf<SizeClass>::capacity()) {
|
693
|
+
auto existingEntry = leaf->find_entry(hash, hashPos, entry.key());
|
694
|
+
if (existingEntry) return std::make_pair(existingEntry, false);
|
695
|
+
|
696
|
+
InnerLeaf<SizeClass + 1>* newLeaf =
|
697
|
+
new InnerLeaf<SizeClass + 1>(std::move(*leaf));
|
698
|
+
*insertNode = newLeaf;
|
699
|
+
delete leaf;
|
700
|
+
return newLeaf->insert_entry(hash, hashPos, entry);
|
701
|
+
}
|
702
|
+
|
703
|
+
return leaf->insert_entry(hash, hashPos, entry);
|
704
|
+
}
|
705
|
+
|
706
|
+
static std::pair<ValueType*, bool> insert_recurse(
|
707
|
+
NodePtr* insertNode, uint64_t hash, int hashPos,
|
708
|
+
HighsHashTableEntry<K, V>& entry) {
|
709
|
+
switch (insertNode->getType()) {
|
710
|
+
case kEmpty: {
|
711
|
+
if (hashPos == kMaxDepth) {
|
712
|
+
ListLeaf* leaf = new ListLeaf(std::move(entry));
|
713
|
+
*insertNode = leaf;
|
714
|
+
return std::make_pair(&leaf->first.entry.value(), true);
|
715
|
+
} else {
|
716
|
+
InnerLeaf<1>* leaf = new InnerLeaf<1>;
|
717
|
+
*insertNode = leaf;
|
718
|
+
return leaf->insert_entry(hash, hashPos, entry);
|
719
|
+
}
|
720
|
+
}
|
721
|
+
case kListLeaf: {
|
722
|
+
ListLeaf* leaf = insertNode->getListLeaf();
|
723
|
+
ListNode* iter = &leaf->first;
|
724
|
+
while (true) {
|
725
|
+
// check for existing key
|
726
|
+
if (iter->entry.key() == entry.key())
|
727
|
+
return std::make_pair(&iter->entry.value(), false);
|
728
|
+
|
729
|
+
if (iter->next == nullptr) {
|
730
|
+
// reached the end of the list and key is not duplicate, so insert
|
731
|
+
iter->next = new ListNode(std::move(entry));
|
732
|
+
++leaf->count;
|
733
|
+
return std::make_pair(&iter->next->entry.value(), true);
|
734
|
+
}
|
735
|
+
iter = iter->next;
|
736
|
+
}
|
737
|
+
|
738
|
+
break;
|
739
|
+
}
|
740
|
+
case kInnerLeafSizeClass1:
|
741
|
+
return insert_into_leaf(insertNode,
|
742
|
+
insertNode->getInnerLeafSizeClass1(), hash,
|
743
|
+
hashPos, entry);
|
744
|
+
break;
|
745
|
+
case kInnerLeafSizeClass2:
|
746
|
+
return insert_into_leaf(insertNode,
|
747
|
+
insertNode->getInnerLeafSizeClass2(), hash,
|
748
|
+
hashPos, entry);
|
749
|
+
break;
|
750
|
+
case kInnerLeafSizeClass3:
|
751
|
+
return insert_into_leaf(insertNode,
|
752
|
+
insertNode->getInnerLeafSizeClass3(), hash,
|
753
|
+
hashPos, entry);
|
754
|
+
break;
|
755
|
+
case kInnerLeafSizeClass4: {
|
756
|
+
InnerLeaf<4>* leaf = insertNode->getInnerLeafSizeClass4();
|
757
|
+
if (leaf->size < InnerLeaf<4>::capacity())
|
758
|
+
return leaf->insert_entry(hash, hashPos, entry);
|
759
|
+
|
760
|
+
auto existingEntry = leaf->find_entry(hash, hashPos, entry.key());
|
761
|
+
if (existingEntry) return std::make_pair(existingEntry, false);
|
762
|
+
Occupation occupation = leaf->occupation;
|
763
|
+
|
764
|
+
uint8_t hashChunk = get_hash_chunk(hash, hashPos);
|
765
|
+
occupation.set(hashChunk);
|
766
|
+
|
767
|
+
int branchSize = occupation.num_set();
|
768
|
+
|
769
|
+
BranchNode* branch = createBranchingNode(branchSize);
|
770
|
+
*insertNode = branch;
|
771
|
+
branch->occupation = occupation;
|
772
|
+
|
773
|
+
if (hashPos + 1 == kMaxDepth) {
|
774
|
+
for (int i = 0; i < branchSize; ++i) branch->child[i] = nullptr;
|
775
|
+
|
776
|
+
for (int i = 0; i < leaf->size; ++i) {
|
777
|
+
int pos =
|
778
|
+
occupation.num_set_until(get_first_chunk16(leaf->hashes[i])) -
|
779
|
+
1;
|
780
|
+
if (branch->child[pos].getType() == kEmpty)
|
781
|
+
branch->child[pos] = new ListLeaf(std::move(leaf->entries[i]));
|
782
|
+
else {
|
783
|
+
ListLeaf* listLeaf = branch->child[pos].getListLeaf();
|
784
|
+
ListNode* newNode = new ListNode(std::move(listLeaf->first));
|
785
|
+
listLeaf->first.next = newNode;
|
786
|
+
listLeaf->first.entry = std::move(leaf->entries[i]);
|
787
|
+
++listLeaf->count;
|
788
|
+
}
|
789
|
+
}
|
790
|
+
|
791
|
+
delete leaf;
|
792
|
+
|
793
|
+
ListLeaf* listLeaf;
|
794
|
+
|
795
|
+
int pos = occupation.num_set_until(get_hash_chunk(hash, hashPos)) - 1;
|
796
|
+
if (branch->child[pos].getType() == kEmpty) {
|
797
|
+
listLeaf = new ListLeaf(std::move(entry));
|
798
|
+
branch->child[pos] = listLeaf;
|
799
|
+
} else {
|
800
|
+
listLeaf = branch->child[pos].getListLeaf();
|
801
|
+
ListNode* newNode = new ListNode(std::move(listLeaf->first));
|
802
|
+
listLeaf->first.next = newNode;
|
803
|
+
listLeaf->first.entry = std::move(entry);
|
804
|
+
++listLeaf->count;
|
805
|
+
}
|
806
|
+
|
807
|
+
return std::make_pair(&listLeaf->first.entry.value(), true);
|
808
|
+
}
|
809
|
+
|
810
|
+
if (branchSize > 1) {
|
811
|
+
// maxsize in one bucket = number of items - (num buckets-1)
|
812
|
+
// since each bucket has at least 1 item the largest one can only
|
813
|
+
// have all remaining ones After adding the item: If it does not
|
814
|
+
// collide
|
815
|
+
int maxEntriesPerLeaf = 2 + leaf->size - branchSize;
|
816
|
+
|
817
|
+
if (maxEntriesPerLeaf <= InnerLeaf<1>::capacity()) {
|
818
|
+
// all items can go into the smallest leaf size
|
819
|
+
for (int i = 0; i < branchSize; ++i)
|
820
|
+
branch->child[i] = new InnerLeaf<1>;
|
821
|
+
|
822
|
+
for (int i = 0; i < leaf->size; ++i) {
|
823
|
+
int pos =
|
824
|
+
occupation.num_set_until(get_first_chunk16(leaf->hashes[i])) -
|
825
|
+
1;
|
826
|
+
branch->child[pos].getInnerLeafSizeClass1()->insert_entry(
|
827
|
+
compute_hash(leaf->entries[i].key()), hashPos + 1,
|
828
|
+
leaf->entries[i]);
|
829
|
+
}
|
830
|
+
|
831
|
+
delete leaf;
|
832
|
+
|
833
|
+
int pos =
|
834
|
+
occupation.num_set_until(get_hash_chunk(hash, hashPos)) - 1;
|
835
|
+
return branch->child[pos].getInnerLeafSizeClass1()->insert_entry(
|
836
|
+
hash, hashPos + 1, entry);
|
837
|
+
} else {
|
838
|
+
// there are many collisions, determine the exact sizes first
|
839
|
+
uint8_t sizes[InnerLeaf<4>::capacity() + 1] = {};
|
840
|
+
sizes[occupation.num_set_until(hashChunk) - 1] += 1;
|
841
|
+
for (int i = 0; i < leaf->size; ++i) {
|
842
|
+
int pos =
|
843
|
+
occupation.num_set_until(get_first_chunk16(leaf->hashes[i])) -
|
844
|
+
1;
|
845
|
+
sizes[pos] += 1;
|
846
|
+
}
|
847
|
+
|
848
|
+
for (int i = 0; i < branchSize; ++i) {
|
849
|
+
switch (entries_to_size_class(sizes[i])) {
|
850
|
+
case 1:
|
851
|
+
branch->child[i] = new InnerLeaf<1>;
|
852
|
+
break;
|
853
|
+
case 2:
|
854
|
+
branch->child[i] = new InnerLeaf<2>;
|
855
|
+
break;
|
856
|
+
case 3:
|
857
|
+
branch->child[i] = new InnerLeaf<3>;
|
858
|
+
break;
|
859
|
+
case 4:
|
860
|
+
branch->child[i] = new InnerLeaf<4>;
|
861
|
+
break;
|
862
|
+
default:
|
863
|
+
// Unexpected result from 'entries_to_size_class'
|
864
|
+
assert(false);
|
865
|
+
}
|
866
|
+
}
|
867
|
+
|
868
|
+
for (int i = 0; i < leaf->size; ++i) {
|
869
|
+
int pos =
|
870
|
+
occupation.num_set_until(get_first_chunk16(leaf->hashes[i])) -
|
871
|
+
1;
|
872
|
+
|
873
|
+
switch (branch->child[pos].getType()) {
|
874
|
+
case kInnerLeafSizeClass1:
|
875
|
+
branch->child[pos].getInnerLeafSizeClass1()->insert_entry(
|
876
|
+
compute_hash(leaf->entries[i].key()), hashPos + 1,
|
877
|
+
leaf->entries[i]);
|
878
|
+
break;
|
879
|
+
case kInnerLeafSizeClass2:
|
880
|
+
branch->child[pos].getInnerLeafSizeClass2()->insert_entry(
|
881
|
+
compute_hash(leaf->entries[i].key()), hashPos + 1,
|
882
|
+
leaf->entries[i]);
|
883
|
+
break;
|
884
|
+
case kInnerLeafSizeClass3:
|
885
|
+
branch->child[pos].getInnerLeafSizeClass3()->insert_entry(
|
886
|
+
compute_hash(leaf->entries[i].key()), hashPos + 1,
|
887
|
+
leaf->entries[i]);
|
888
|
+
break;
|
889
|
+
case kInnerLeafSizeClass4:
|
890
|
+
branch->child[pos].getInnerLeafSizeClass4()->insert_entry(
|
891
|
+
compute_hash(leaf->entries[i].key()), hashPos + 1,
|
892
|
+
leaf->entries[i]);
|
893
|
+
break;
|
894
|
+
default:
|
895
|
+
break;
|
896
|
+
}
|
897
|
+
}
|
898
|
+
}
|
899
|
+
|
900
|
+
delete leaf;
|
901
|
+
|
902
|
+
int pos = occupation.num_set_until(hashChunk) - 1;
|
903
|
+
insertNode = &branch->child[pos];
|
904
|
+
++hashPos;
|
905
|
+
} else {
|
906
|
+
// extremely unlikely that the new branch node only gets one
|
907
|
+
// child in that case create it and defer the insertion into
|
908
|
+
// the next depth
|
909
|
+
branch->child[0] = leaf;
|
910
|
+
insertNode = &branch->child[0];
|
911
|
+
++hashPos;
|
912
|
+
leaf->rehash(hashPos);
|
913
|
+
}
|
914
|
+
|
915
|
+
break;
|
916
|
+
}
|
917
|
+
case kBranchNode: {
|
918
|
+
BranchNode* branch = insertNode->getBranchNode();
|
919
|
+
|
920
|
+
int location =
|
921
|
+
branch->occupation.num_set_until(get_hash_chunk(hash, hashPos));
|
922
|
+
|
923
|
+
if (branch->occupation.test(get_hash_chunk(hash, hashPos))) {
|
924
|
+
--location;
|
925
|
+
} else {
|
926
|
+
branch = addChildToBranchNode(branch, get_hash_chunk(hash, hashPos),
|
927
|
+
location);
|
928
|
+
|
929
|
+
branch->child[location] = nullptr;
|
930
|
+
branch->occupation.set(get_hash_chunk(hash, hashPos));
|
931
|
+
}
|
932
|
+
|
933
|
+
*insertNode = branch;
|
934
|
+
insertNode = &branch->child[location];
|
935
|
+
++hashPos;
|
936
|
+
}
|
937
|
+
}
|
938
|
+
|
939
|
+
return insert_recurse(insertNode, hash, hashPos, entry);
|
940
|
+
}
|
941
|
+
|
942
|
+
static void erase_recurse(NodePtr* erase_node, uint64_t hash, int hashPos,
|
943
|
+
const K& key) {
|
944
|
+
switch (erase_node->getType()) {
|
945
|
+
case kEmpty: {
|
946
|
+
return;
|
947
|
+
}
|
948
|
+
case kListLeaf: {
|
949
|
+
ListLeaf* leaf = erase_node->getListLeaf();
|
950
|
+
|
951
|
+
// check for existing key
|
952
|
+
ListNode* iter = &leaf->first;
|
953
|
+
|
954
|
+
do {
|
955
|
+
ListNode* next = iter->next;
|
956
|
+
if (iter->entry.key() == key) {
|
957
|
+
// key found, decrease count
|
958
|
+
--leaf->count;
|
959
|
+
if (next != nullptr) {
|
960
|
+
// if we have a next node after replace the entry in iter by
|
961
|
+
// moving that node into it
|
962
|
+
*iter = std::move(*next);
|
963
|
+
// delete memory of that node
|
964
|
+
delete next;
|
965
|
+
}
|
966
|
+
|
967
|
+
break;
|
968
|
+
}
|
969
|
+
|
970
|
+
iter = next;
|
971
|
+
} while (iter != nullptr);
|
972
|
+
|
973
|
+
if (leaf->count == 0) {
|
974
|
+
delete leaf;
|
975
|
+
*erase_node = nullptr;
|
976
|
+
}
|
977
|
+
|
978
|
+
return;
|
979
|
+
}
|
980
|
+
case kInnerLeafSizeClass1: {
|
981
|
+
InnerLeaf<1>* leaf = erase_node->getInnerLeafSizeClass1();
|
982
|
+
if (leaf->erase_entry(hash, hashPos, key)) {
|
983
|
+
if (leaf->size == 0) {
|
984
|
+
delete leaf;
|
985
|
+
*erase_node = nullptr;
|
986
|
+
}
|
987
|
+
}
|
988
|
+
|
989
|
+
return;
|
990
|
+
}
|
991
|
+
case kInnerLeafSizeClass2: {
|
992
|
+
InnerLeaf<2>* leaf = erase_node->getInnerLeafSizeClass2();
|
993
|
+
|
994
|
+
if (leaf->erase_entry(hash, hashPos, key)) {
|
995
|
+
if (leaf->size == InnerLeaf<1>::capacity()) {
|
996
|
+
InnerLeaf<1>* newLeaf = new InnerLeaf<1>(std::move(*leaf));
|
997
|
+
*erase_node = newLeaf;
|
998
|
+
delete leaf;
|
999
|
+
}
|
1000
|
+
}
|
1001
|
+
|
1002
|
+
return;
|
1003
|
+
}
|
1004
|
+
case kInnerLeafSizeClass3: {
|
1005
|
+
InnerLeaf<3>* leaf = erase_node->getInnerLeafSizeClass3();
|
1006
|
+
|
1007
|
+
if (leaf->erase_entry(hash, hashPos, key)) {
|
1008
|
+
if (leaf->size == InnerLeaf<2>::capacity()) {
|
1009
|
+
InnerLeaf<2>* newLeaf = new InnerLeaf<2>(std::move(*leaf));
|
1010
|
+
*erase_node = newLeaf;
|
1011
|
+
delete leaf;
|
1012
|
+
}
|
1013
|
+
}
|
1014
|
+
|
1015
|
+
return;
|
1016
|
+
}
|
1017
|
+
case kInnerLeafSizeClass4: {
|
1018
|
+
InnerLeaf<4>* leaf = erase_node->getInnerLeafSizeClass4();
|
1019
|
+
|
1020
|
+
if (leaf->erase_entry(hash, hashPos, key)) {
|
1021
|
+
if (leaf->size == InnerLeaf<3>::capacity()) {
|
1022
|
+
InnerLeaf<3>* newLeaf = new InnerLeaf<3>(std::move(*leaf));
|
1023
|
+
*erase_node = newLeaf;
|
1024
|
+
delete leaf;
|
1025
|
+
}
|
1026
|
+
}
|
1027
|
+
|
1028
|
+
return;
|
1029
|
+
}
|
1030
|
+
case kBranchNode: {
|
1031
|
+
BranchNode* branch = erase_node->getBranchNode();
|
1032
|
+
|
1033
|
+
if (!branch->occupation.test(get_hash_chunk(hash, hashPos))) return;
|
1034
|
+
|
1035
|
+
int location =
|
1036
|
+
branch->occupation.num_set_until(get_hash_chunk(hash, hashPos)) - 1;
|
1037
|
+
erase_recurse(&branch->child[location], hash, hashPos + 1, key);
|
1038
|
+
|
1039
|
+
if (branch->child[location].getType() != kEmpty) return;
|
1040
|
+
|
1041
|
+
branch->occupation.flip(get_hash_chunk(hash, hashPos));
|
1042
|
+
|
1043
|
+
*erase_node =
|
1044
|
+
removeChildFromBranchNode(branch, location, hash, hashPos);
|
1045
|
+
break;
|
1046
|
+
}
|
1047
|
+
}
|
1048
|
+
}
|
1049
|
+
|
1050
|
+
static const ValueType* find_recurse(NodePtr node, uint64_t hash, int hashPos,
|
1051
|
+
const K& key) {
|
1052
|
+
int startPos = hashPos;
|
1053
|
+
switch (node.getType()) {
|
1054
|
+
case kEmpty:
|
1055
|
+
return nullptr;
|
1056
|
+
case kListLeaf: {
|
1057
|
+
ListLeaf* leaf = node.getListLeaf();
|
1058
|
+
ListNode* iter = &leaf->first;
|
1059
|
+
do {
|
1060
|
+
if (iter->entry.key() == key) return &iter->entry.value();
|
1061
|
+
iter = iter->next;
|
1062
|
+
} while (iter != nullptr);
|
1063
|
+
return nullptr;
|
1064
|
+
}
|
1065
|
+
case kInnerLeafSizeClass1: {
|
1066
|
+
InnerLeaf<1>* leaf = node.getInnerLeafSizeClass1();
|
1067
|
+
return leaf->find_entry(hash, hashPos, key);
|
1068
|
+
}
|
1069
|
+
case kInnerLeafSizeClass2: {
|
1070
|
+
InnerLeaf<2>* leaf = node.getInnerLeafSizeClass2();
|
1071
|
+
return leaf->find_entry(hash, hashPos, key);
|
1072
|
+
}
|
1073
|
+
case kInnerLeafSizeClass3: {
|
1074
|
+
InnerLeaf<3>* leaf = node.getInnerLeafSizeClass3();
|
1075
|
+
return leaf->find_entry(hash, hashPos, key);
|
1076
|
+
}
|
1077
|
+
case kInnerLeafSizeClass4: {
|
1078
|
+
InnerLeaf<4>* leaf = node.getInnerLeafSizeClass4();
|
1079
|
+
return leaf->find_entry(hash, hashPos, key);
|
1080
|
+
}
|
1081
|
+
case kBranchNode: {
|
1082
|
+
BranchNode* branch = node.getBranchNode();
|
1083
|
+
if (!branch->occupation.test(get_hash_chunk(hash, hashPos)))
|
1084
|
+
return nullptr;
|
1085
|
+
int location =
|
1086
|
+
branch->occupation.num_set_until(get_hash_chunk(hash, hashPos)) - 1;
|
1087
|
+
node = branch->child[location];
|
1088
|
+
++hashPos;
|
1089
|
+
}
|
1090
|
+
}
|
1091
|
+
|
1092
|
+
assert(hashPos > startPos);
|
1093
|
+
|
1094
|
+
return find_recurse(node, hash, hashPos, key);
|
1095
|
+
}
|
1096
|
+
|
1097
|
+
static const HighsHashTableEntry<K, V>* find_common_recurse(NodePtr n1,
|
1098
|
+
NodePtr n2,
|
1099
|
+
int hashPos) {
|
1100
|
+
if (n1.getType() > n2.getType()) std::swap(n1, n2);
|
1101
|
+
|
1102
|
+
switch (n1.getType()) {
|
1103
|
+
case kEmpty:
|
1104
|
+
return nullptr;
|
1105
|
+
case kListLeaf: {
|
1106
|
+
ListLeaf* leaf = n1.getListLeaf();
|
1107
|
+
ListNode* iter = &leaf->first;
|
1108
|
+
do {
|
1109
|
+
if (find_recurse(n2, compute_hash(iter->entry.key()), hashPos,
|
1110
|
+
iter->entry.key()))
|
1111
|
+
return &iter->entry;
|
1112
|
+
iter = iter->next;
|
1113
|
+
} while (iter != nullptr);
|
1114
|
+
return nullptr;
|
1115
|
+
}
|
1116
|
+
case kInnerLeafSizeClass1:
|
1117
|
+
return findCommonInLeaf(n1.getInnerLeafSizeClass1(), n2, hashPos);
|
1118
|
+
case kInnerLeafSizeClass2:
|
1119
|
+
return findCommonInLeaf(n1.getInnerLeafSizeClass2(), n2, hashPos);
|
1120
|
+
case kInnerLeafSizeClass3:
|
1121
|
+
return findCommonInLeaf(n1.getInnerLeafSizeClass3(), n2, hashPos);
|
1122
|
+
case kInnerLeafSizeClass4:
|
1123
|
+
return findCommonInLeaf(n1.getInnerLeafSizeClass4(), n2, hashPos);
|
1124
|
+
case kBranchNode: {
|
1125
|
+
BranchNode* branch1 = n1.getBranchNode();
|
1126
|
+
BranchNode* branch2 = n2.getBranchNode();
|
1127
|
+
|
1128
|
+
uint64_t matchMask = branch1->occupation & branch2->occupation;
|
1129
|
+
|
1130
|
+
while (matchMask) {
|
1131
|
+
int pos = HighsHashHelpers::log2i(matchMask);
|
1132
|
+
assert((branch1->occupation >> pos) & 1);
|
1133
|
+
assert((branch2->occupation >> pos) & 1);
|
1134
|
+
assert((matchMask >> pos) & 1);
|
1135
|
+
|
1136
|
+
matchMask ^= (uint64_t{1} << pos);
|
1137
|
+
|
1138
|
+
assert(((matchMask >> pos) & 1) == 0);
|
1139
|
+
|
1140
|
+
int location1 =
|
1141
|
+
branch1->occupation.num_set_until(static_cast<uint8_t>(pos)) - 1;
|
1142
|
+
int location2 =
|
1143
|
+
branch2->occupation.num_set_until(static_cast<uint8_t>(pos)) - 1;
|
1144
|
+
|
1145
|
+
const HighsHashTableEntry<K, V>* match =
|
1146
|
+
find_common_recurse(branch1->child[location1],
|
1147
|
+
branch2->child[location2], hashPos + 1);
|
1148
|
+
if (match != nullptr) return match;
|
1149
|
+
}
|
1150
|
+
|
1151
|
+
return nullptr;
|
1152
|
+
}
|
1153
|
+
default:
|
1154
|
+
throw std::logic_error("Unexpected type in hash tree");
|
1155
|
+
}
|
1156
|
+
}
|
1157
|
+
|
1158
|
+
static void destroy_recurse(NodePtr node) {
|
1159
|
+
switch (node.getType()) {
|
1160
|
+
case kEmpty:
|
1161
|
+
break;
|
1162
|
+
case kListLeaf: {
|
1163
|
+
ListLeaf* leaf = node.getListLeaf();
|
1164
|
+
ListNode* iter = leaf->first.next;
|
1165
|
+
delete leaf;
|
1166
|
+
while (iter != nullptr) {
|
1167
|
+
ListNode* next = iter->next;
|
1168
|
+
delete iter;
|
1169
|
+
iter = next;
|
1170
|
+
}
|
1171
|
+
|
1172
|
+
break;
|
1173
|
+
}
|
1174
|
+
case kInnerLeafSizeClass1:
|
1175
|
+
delete node.getInnerLeafSizeClass1();
|
1176
|
+
break;
|
1177
|
+
case kInnerLeafSizeClass2:
|
1178
|
+
delete node.getInnerLeafSizeClass2();
|
1179
|
+
break;
|
1180
|
+
case kInnerLeafSizeClass3:
|
1181
|
+
delete node.getInnerLeafSizeClass3();
|
1182
|
+
break;
|
1183
|
+
case kInnerLeafSizeClass4:
|
1184
|
+
delete node.getInnerLeafSizeClass4();
|
1185
|
+
break;
|
1186
|
+
case kBranchNode: {
|
1187
|
+
BranchNode* branch = node.getBranchNode();
|
1188
|
+
int size = branch->occupation.num_set();
|
1189
|
+
|
1190
|
+
for (int i = 0; i < size; ++i) destroy_recurse(branch->child[i]);
|
1191
|
+
|
1192
|
+
destroyBranchingNode(branch);
|
1193
|
+
}
|
1194
|
+
}
|
1195
|
+
}
|
1196
|
+
|
1197
|
+
static NodePtr copy_recurse(NodePtr node) {
|
1198
|
+
switch (node.getType()) {
|
1199
|
+
case kEmpty:
|
1200
|
+
throw std::logic_error("Unexpected node type in empty in hash tree");
|
1201
|
+
case kListLeaf: {
|
1202
|
+
ListLeaf* leaf = node.getListLeaf();
|
1203
|
+
|
1204
|
+
ListLeaf* copyLeaf = new ListLeaf(*leaf);
|
1205
|
+
|
1206
|
+
ListNode* iter = &leaf->first;
|
1207
|
+
ListNode* copyIter = ©Leaf->first;
|
1208
|
+
do {
|
1209
|
+
copyIter->next = new ListNode(*iter->next);
|
1210
|
+
iter = iter->next;
|
1211
|
+
copyIter = copyIter->next;
|
1212
|
+
} while (iter->next != nullptr);
|
1213
|
+
|
1214
|
+
return copyLeaf;
|
1215
|
+
}
|
1216
|
+
case kInnerLeafSizeClass1: {
|
1217
|
+
InnerLeaf<1>* leaf = node.getInnerLeafSizeClass1();
|
1218
|
+
return new InnerLeaf<1>(*leaf);
|
1219
|
+
}
|
1220
|
+
case kInnerLeafSizeClass2: {
|
1221
|
+
InnerLeaf<2>* leaf = node.getInnerLeafSizeClass2();
|
1222
|
+
return new InnerLeaf<2>(*leaf);
|
1223
|
+
}
|
1224
|
+
case kInnerLeafSizeClass3: {
|
1225
|
+
InnerLeaf<3>* leaf = node.getInnerLeafSizeClass3();
|
1226
|
+
return new InnerLeaf<3>(*leaf);
|
1227
|
+
}
|
1228
|
+
case kInnerLeafSizeClass4: {
|
1229
|
+
InnerLeaf<4>* leaf = node.getInnerLeafSizeClass4();
|
1230
|
+
return new InnerLeaf<4>(*leaf);
|
1231
|
+
}
|
1232
|
+
case kBranchNode: {
|
1233
|
+
BranchNode* branch = node.getBranchNode();
|
1234
|
+
int size = branch->occupation.num_set();
|
1235
|
+
BranchNode* newBranch =
|
1236
|
+
(BranchNode*)::operator new(getBranchNodeSize(size));
|
1237
|
+
newBranch->occupation = branch->occupation;
|
1238
|
+
for (int i = 0; i < size; ++i)
|
1239
|
+
newBranch->child[i] = copy_recurse(branch->child[i]);
|
1240
|
+
|
1241
|
+
return newBranch;
|
1242
|
+
}
|
1243
|
+
default:
|
1244
|
+
throw std::logic_error("Unexpected type in hash tree");
|
1245
|
+
}
|
1246
|
+
}
|
1247
|
+
|
1248
|
+
template <typename R, typename F,
|
1249
|
+
typename std::enable_if<std::is_void<R>::value, int>::type = 0>
|
1250
|
+
static void for_each_recurse(NodePtr node, F&& f) {
|
1251
|
+
switch (node.getType()) {
|
1252
|
+
case kEmpty:
|
1253
|
+
break;
|
1254
|
+
case kListLeaf: {
|
1255
|
+
ListLeaf* leaf = node.getListLeaf();
|
1256
|
+
ListNode* iter = &leaf->first;
|
1257
|
+
do {
|
1258
|
+
iter->entry.forward(f);
|
1259
|
+
iter = iter->next;
|
1260
|
+
} while (iter != nullptr);
|
1261
|
+
break;
|
1262
|
+
}
|
1263
|
+
case kInnerLeafSizeClass1: {
|
1264
|
+
InnerLeaf<1>* leaf = node.getInnerLeafSizeClass1();
|
1265
|
+
for (int i = 0; i < leaf->size; ++i) leaf->entries[i].forward(f);
|
1266
|
+
|
1267
|
+
break;
|
1268
|
+
}
|
1269
|
+
case kInnerLeafSizeClass2: {
|
1270
|
+
InnerLeaf<2>* leaf = node.getInnerLeafSizeClass2();
|
1271
|
+
for (int i = 0; i < leaf->size; ++i) leaf->entries[i].forward(f);
|
1272
|
+
|
1273
|
+
break;
|
1274
|
+
}
|
1275
|
+
case kInnerLeafSizeClass3: {
|
1276
|
+
InnerLeaf<3>* leaf = node.getInnerLeafSizeClass3();
|
1277
|
+
for (int i = 0; i < leaf->size; ++i) leaf->entries[i].forward(f);
|
1278
|
+
|
1279
|
+
break;
|
1280
|
+
}
|
1281
|
+
case kInnerLeafSizeClass4: {
|
1282
|
+
InnerLeaf<4>* leaf = node.getInnerLeafSizeClass4();
|
1283
|
+
for (int i = 0; i < leaf->size; ++i) leaf->entries[i].forward(f);
|
1284
|
+
|
1285
|
+
break;
|
1286
|
+
}
|
1287
|
+
case kBranchNode: {
|
1288
|
+
BranchNode* branch = node.getBranchNode();
|
1289
|
+
int size = branch->occupation.num_set();
|
1290
|
+
|
1291
|
+
for (int i = 0; i < size; ++i) for_each_recurse<R>(branch->child[i], f);
|
1292
|
+
}
|
1293
|
+
}
|
1294
|
+
}
|
1295
|
+
|
1296
|
+
template <typename R, typename F,
|
1297
|
+
typename std::enable_if<!std::is_void<R>::value, int>::type = 0>
|
1298
|
+
static R for_each_recurse(NodePtr node, F&& f) {
|
1299
|
+
switch (node.getType()) {
|
1300
|
+
case kEmpty:
|
1301
|
+
break;
|
1302
|
+
case kListLeaf: {
|
1303
|
+
ListLeaf* leaf = node.getListLeaf();
|
1304
|
+
ListNode* iter = &leaf->first;
|
1305
|
+
do {
|
1306
|
+
auto x = iter->entry.forward(f);
|
1307
|
+
if (x) return x;
|
1308
|
+
iter = iter->next;
|
1309
|
+
} while (iter != nullptr);
|
1310
|
+
break;
|
1311
|
+
}
|
1312
|
+
case kInnerLeafSizeClass1: {
|
1313
|
+
InnerLeaf<1>* leaf = node.getInnerLeafSizeClass1();
|
1314
|
+
for (int i = 0; i < leaf->size; ++i) {
|
1315
|
+
auto x = leaf->entries[i].forward(f);
|
1316
|
+
if (x) return x;
|
1317
|
+
}
|
1318
|
+
|
1319
|
+
break;
|
1320
|
+
}
|
1321
|
+
case kInnerLeafSizeClass2: {
|
1322
|
+
InnerLeaf<2>* leaf = node.getInnerLeafSizeClass2();
|
1323
|
+
for (int i = 0; i < leaf->size; ++i) {
|
1324
|
+
auto x = leaf->entries[i].forward(f);
|
1325
|
+
if (x) return x;
|
1326
|
+
}
|
1327
|
+
|
1328
|
+
break;
|
1329
|
+
}
|
1330
|
+
case kInnerLeafSizeClass3: {
|
1331
|
+
InnerLeaf<3>* leaf = node.getInnerLeafSizeClass3();
|
1332
|
+
for (int i = 0; i < leaf->size; ++i) {
|
1333
|
+
auto x = leaf->entries[i].forward(f);
|
1334
|
+
if (x) return x;
|
1335
|
+
}
|
1336
|
+
|
1337
|
+
break;
|
1338
|
+
}
|
1339
|
+
case kInnerLeafSizeClass4: {
|
1340
|
+
InnerLeaf<4>* leaf = node.getInnerLeafSizeClass4();
|
1341
|
+
for (int i = 0; i < leaf->size; ++i) {
|
1342
|
+
auto x = leaf->entries[i].forward(f);
|
1343
|
+
if (x) return x;
|
1344
|
+
}
|
1345
|
+
|
1346
|
+
break;
|
1347
|
+
}
|
1348
|
+
case kBranchNode: {
|
1349
|
+
BranchNode* branch = node.getBranchNode();
|
1350
|
+
int size = branch->occupation.num_set();
|
1351
|
+
|
1352
|
+
for (int i = 0; i < size; ++i) {
|
1353
|
+
auto x = for_each_recurse<R>(branch->child[i], f);
|
1354
|
+
if (x) return x;
|
1355
|
+
}
|
1356
|
+
}
|
1357
|
+
}
|
1358
|
+
|
1359
|
+
return R();
|
1360
|
+
}
|
1361
|
+
|
1362
|
+
public:
|
1363
|
+
template <typename... Args>
|
1364
|
+
bool insert(Args&&... args) {
|
1365
|
+
HighsHashTableEntry<K, V> entry(std::forward<Args>(args)...);
|
1366
|
+
uint64_t hash = compute_hash(entry.key());
|
1367
|
+
return insert_recurse(&root, hash, 0, entry).second;
|
1368
|
+
}
|
1369
|
+
|
1370
|
+
template <typename... Args>
|
1371
|
+
std::pair<ValueType*, bool> insert_or_get(Args&&... args) {
|
1372
|
+
HighsHashTableEntry<K, V> entry(std::forward<Args>(args)...);
|
1373
|
+
uint64_t hash = compute_hash(entry.key());
|
1374
|
+
return insert_recurse(&root, hash, 0, entry);
|
1375
|
+
}
|
1376
|
+
|
1377
|
+
void erase(const K& key) {
|
1378
|
+
uint64_t hash = compute_hash(key);
|
1379
|
+
|
1380
|
+
erase_recurse(&root, hash, 0, key);
|
1381
|
+
}
|
1382
|
+
|
1383
|
+
bool contains(const K& key) const {
|
1384
|
+
uint64_t hash = compute_hash(key);
|
1385
|
+
return find_recurse(root, hash, 0, key) != nullptr;
|
1386
|
+
}
|
1387
|
+
|
1388
|
+
const ValueType* find(const K& key) const {
|
1389
|
+
uint64_t hash = compute_hash(key);
|
1390
|
+
|
1391
|
+
return find_recurse(root, hash, 0, key);
|
1392
|
+
}
|
1393
|
+
|
1394
|
+
ValueType* find(const K& key) {
|
1395
|
+
uint64_t hash = compute_hash(key);
|
1396
|
+
|
1397
|
+
return find_recurse(root, hash, 0, key);
|
1398
|
+
}
|
1399
|
+
|
1400
|
+
const HighsHashTableEntry<K, V>* find_common(
|
1401
|
+
const HighsHashTree<K, V>& other) const {
|
1402
|
+
return find_common_recurse(root, other.root, 0);
|
1403
|
+
}
|
1404
|
+
|
1405
|
+
bool empty() const { return root.getType() == kEmpty; }
|
1406
|
+
|
1407
|
+
void clear() {
|
1408
|
+
destroy_recurse(root);
|
1409
|
+
root = nullptr;
|
1410
|
+
}
|
1411
|
+
|
1412
|
+
template <typename F>
|
1413
|
+
auto for_each(F&& f) const
|
1414
|
+
-> decltype(HighsHashTableEntry<K, V>().forward(f)) {
|
1415
|
+
using R = decltype(for_each(f));
|
1416
|
+
return for_each_recurse<R>(root, f);
|
1417
|
+
}
|
1418
|
+
|
1419
|
+
HighsHashTree() = default;
|
1420
|
+
|
1421
|
+
HighsHashTree(HighsHashTree&& other) : root(other.root) {
|
1422
|
+
other.root = nullptr;
|
1423
|
+
}
|
1424
|
+
|
1425
|
+
HighsHashTree(const HighsHashTree& other) : root(copy_recurse(other.root)) {}
|
1426
|
+
|
1427
|
+
HighsHashTree& operator=(HighsHashTree&& other) {
|
1428
|
+
destroy_recurse(root);
|
1429
|
+
root = other.root;
|
1430
|
+
other.root = nullptr;
|
1431
|
+
return *this;
|
1432
|
+
}
|
1433
|
+
|
1434
|
+
HighsHashTree& operator=(const HighsHashTree& other) {
|
1435
|
+
destroy_recurse(root);
|
1436
|
+
root = copy_recurse(other.root);
|
1437
|
+
return *this;
|
1438
|
+
}
|
1439
|
+
|
1440
|
+
~HighsHashTree() { destroy_recurse(root); }
|
1441
|
+
};
|
1442
|
+
|
1443
|
+
#endif
|