sleipnirgroup-jormungandr 0.6.7.dev7__tar.gz → 0.6.7.dev9__tar.gz

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.

Potentially problematic release.


This version of sleipnirgroup-jormungandr might be problematic. Click here for more details.

Files changed (122) hide show
  1. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/PKG-INFO +1 -1
  2. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/pool.hpp +94 -21
  3. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/src/sleipnir/__init__.py +1 -1
  4. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/CMakeLists.txt +0 -0
  5. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/LICENSE.txt +0 -0
  6. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/README.md +0 -0
  7. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/SleipnirConfig.cmake.in +0 -0
  8. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/cmake/BuildTypes.cmake +0 -0
  9. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/cmake/CompilerFlags.cmake +0 -0
  10. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/cmake/Pybind11Mkdoc.cmake +0 -0
  11. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/cmake/SubdirList.cmake +0 -0
  12. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/cmake/arm-none-eabi.cmake +0 -0
  13. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/expression.hpp +0 -0
  14. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/expression_graph.hpp +0 -0
  15. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/expression_type.hpp +0 -0
  16. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/gradient.hpp +0 -0
  17. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/hessian.hpp +0 -0
  18. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/jacobian.hpp +0 -0
  19. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/sleipnir_base.hpp +0 -0
  20. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/slice.hpp +0 -0
  21. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/variable.hpp +0 -0
  22. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/variable_block.hpp +0 -0
  23. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/autodiff/variable_matrix.hpp +0 -0
  24. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/multistart.hpp +0 -0
  25. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/ocp/dynamics_type.hpp +0 -0
  26. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/ocp/timestep_method.hpp +0 -0
  27. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/ocp/transcription_method.hpp +0 -0
  28. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/ocp.hpp +0 -0
  29. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/problem.hpp +0 -0
  30. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/exit_status.hpp +0 -0
  31. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/ipm.hpp +0 -0
  32. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/ipm_matrix_callbacks.hpp +0 -0
  33. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/iteration_info.hpp +0 -0
  34. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/newton.hpp +0 -0
  35. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/newton_matrix_callbacks.hpp +0 -0
  36. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/options.hpp +0 -0
  37. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/sqp.hpp +0 -0
  38. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/sqp_matrix_callbacks.hpp +0 -0
  39. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/all_finite.hpp +0 -0
  40. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/append_as_triplets.hpp +0 -0
  41. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/bounds.hpp +0 -0
  42. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/dense_kkt_solver.hpp +0 -0
  43. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/feasibility_restoration.hpp +0 -0
  44. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/filter.hpp +0 -0
  45. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/fraction_to_the_boundary_rule.hpp +0 -0
  46. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/inertia.hpp +0 -0
  47. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/kkt_error.hpp +0 -0
  48. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/kkt_solver.hpp +0 -0
  49. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp +0 -0
  50. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/problem_scaling.hpp +0 -0
  51. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/sparse_inf_norms.hpp +0 -0
  52. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/optimization/solver/util/sparse_kkt_solver.hpp +0 -0
  53. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/assert.hpp +0 -0
  54. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/concepts.hpp +0 -0
  55. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/empty.hpp +0 -0
  56. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/function_ref.hpp +0 -0
  57. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/intrusive_shared_ptr.hpp +0 -0
  58. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/print.hpp +0 -0
  59. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/print_diagnostics.hpp +0 -0
  60. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/profiler.hpp +0 -0
  61. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/scope_exit.hpp +0 -0
  62. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/spy.hpp +0 -0
  63. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/include/sleipnir/util/symbol_exports.hpp +0 -0
  64. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/pyproject.toml +0 -0
  65. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/autodiff/bind_expression_type.cpp +0 -0
  66. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/autodiff/bind_gradient.cpp +0 -0
  67. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/autodiff/bind_hessian.cpp +0 -0
  68. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/autodiff/bind_jacobian.cpp +0 -0
  69. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/autodiff/bind_variable.cpp +0 -0
  70. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/autodiff/bind_variable_block.cpp +0 -0
  71. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/autodiff/bind_variable_matrix.cpp +0 -0
  72. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/binders.hpp +0 -0
  73. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/docstrings.hpp +0 -0
  74. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/for_each_type.hpp +0 -0
  75. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/main.cpp +0 -0
  76. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/bind_equality_constraints.cpp +0 -0
  77. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/bind_inequality_constraints.cpp +0 -0
  78. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/bind_ocp.cpp +0 -0
  79. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/bind_problem.cpp +0 -0
  80. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/ocp/bind_dynamics_type.cpp +0 -0
  81. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/ocp/bind_timestep_method.cpp +0 -0
  82. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/ocp/bind_transcription_method.cpp +0 -0
  83. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/solver/bind_exit_status.cpp +0 -0
  84. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/optimization/solver/bind_iteration_info.cpp +0 -0
  85. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/cpp/try_cast.hpp +0 -0
  86. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/src/sleipnir/autodiff/__init__.py +0 -0
  87. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/src/sleipnir/optimization/__init__.py +0 -0
  88. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/autodiff/gradient_test.py +0 -0
  89. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/autodiff/hessian_test.py +0 -0
  90. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/autodiff/jacobian_test.py +0 -0
  91. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/autodiff/variable_matrix_test.py +0 -0
  92. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/autodiff/variable_test.py +0 -0
  93. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/arm_on_elevator_problem_test.py +0 -0
  94. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/cart_pole_ocp_test.py +0 -0
  95. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/cart_pole_problem_test.py +0 -0
  96. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/cart_pole_util.py +0 -0
  97. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/constraints_test.py +0 -0
  98. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/decision_variable_test.py +0 -0
  99. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/differential_drive_ocp_test.py +0 -0
  100. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/differential_drive_problem_test.py +0 -0
  101. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/differential_drive_util.py +0 -0
  102. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/double_integrator_problem_test.py +0 -0
  103. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/flywheel_ocp_test.py +0 -0
  104. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/flywheel_problem_test.py +0 -0
  105. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/linear_problem_test.py +0 -0
  106. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/multistart_test.py +0 -0
  107. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/nonlinear_problem_test.py +0 -0
  108. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/problem_spy_test.py +0 -0
  109. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/quadratic_problem_test.py +0 -0
  110. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/rk4.py +0 -0
  111. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/solver/exit_status_test.py +0 -0
  112. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/python/test/optimization/trivial_problem_test.py +0 -0
  113. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/autodiff/gradient.cpp +0 -0
  114. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/autodiff/hessian.cpp +0 -0
  115. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/autodiff/jacobian.cpp +0 -0
  116. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/autodiff/variable_matrix.cpp +0 -0
  117. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/optimization/ocp.cpp +0 -0
  118. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/optimization/problem.cpp +0 -0
  119. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/optimization/solver/ipm.cpp +0 -0
  120. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/optimization/solver/newton.cpp +0 -0
  121. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/optimization/solver/sqp.cpp +0 -0
  122. {sleipnirgroup_jormungandr-0.6.7.dev7 → sleipnirgroup_jormungandr-0.6.7.dev9}/src/util/pool.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sleipnirgroup-jormungandr
3
- Version: 0.6.7.dev7
3
+ Version: 0.6.7.dev9
4
4
  Summary: Reverse mode autodiff library and NLP solver DSL
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE.txt
@@ -2,6 +2,7 @@
2
2
 
3
3
  #pragma once
4
4
 
5
+ #include <algorithm>
5
6
  #include <cstddef>
6
7
  #include <memory>
7
8
 
@@ -13,9 +14,11 @@ namespace slp {
13
14
 
14
15
  /// This class implements a pool memory resource.
15
16
  ///
16
- /// The pool allocates chunks of memory and splits them into blocks managed by a
17
- /// free list. Allocations return pointers from the free list, and deallocations
18
- /// return pointers to the free list.
17
+ /// The pool allocates chunks of memory and splits them into blocks managed by
18
+ /// free lists. Each distinct requested block size gets its own chunks and free
19
+ /// list. Allocations return pointers from the free list for the requested size,
20
+ /// and deallocations return pointers to the free list of the chunk they came
21
+ /// from.
19
22
  class SLEIPNIR_DLLEXPORT PoolResource {
20
23
  public:
21
24
  /// Constructs a default PoolResource.
@@ -43,29 +46,50 @@ class SLEIPNIR_DLLEXPORT PoolResource {
43
46
  /// Returns a block of memory from the pool.
44
47
  ///
45
48
  /// @param bytes Number of bytes in the block.
46
- /// @param alignment Alignment of the block (unused).
49
+ /// @param alignment Alignment of the block. Must be a power of two no larger
50
+ /// than alignof(std::max_align_t).
47
51
  /// @return A block of memory from the pool.
48
52
  [[nodiscard]]
49
- void* allocate(size_t bytes, [[maybe_unused]] size_t alignment =
50
- alignof(std::max_align_t)) {
51
- if (m_free_list.empty()) {
52
- add_chunk(bytes);
53
+ void* allocate(size_t bytes, size_t alignment = alignof(std::max_align_t)) {
54
+ // Round up to a multiple of the alignment so consecutive blocks in a chunk
55
+ // stay aligned. `alignment` is a power of two, so `alignment - 1` is a mask
56
+ // of the bits below it.
57
+ //
58
+ // 1. Add `alignment - 1` so the round-down in step 4 becomes a round-up
59
+ // 2. Create mask `alignment - 1` with every bit below the alignment set
60
+ // 3. Invert mask via `~(alignment - 1)` so only higher bits are set
61
+ // 4. Bitwise AND to zero out lower bits, rounding down to a multiple of the
62
+ // alignment
63
+ size_t block_size = (bytes + alignment - 1) & ~(alignment - 1);
64
+
65
+ auto& pool = get_pool(block_size);
66
+ if (pool.free_list.empty()) {
67
+ add_chunk(pool);
53
68
  }
54
69
 
55
- auto ptr = m_free_list.back();
56
- m_free_list.pop_back();
70
+ auto ptr = pool.free_list.back();
71
+ pool.free_list.pop_back();
57
72
  return ptr;
58
73
  }
59
74
 
60
75
  /// Gives a block of memory back to the pool.
61
76
  ///
77
+ /// The block is returned to the free list of the chunk it was allocated from,
78
+ /// so the size and alignment don't need to match the original allocation.
79
+ ///
62
80
  /// @param p A pointer to the block of memory.
63
81
  /// @param bytes Number of bytes in the block (unused).
64
82
  /// @param alignment Alignment of the block (unused).
65
83
  void deallocate(
66
84
  void* p, [[maybe_unused]] size_t bytes,
67
85
  [[maybe_unused]] size_t alignment = alignof(std::max_align_t)) {
68
- m_free_list.emplace_back(p);
86
+ // Find the last chunk that starts at or before p
87
+ auto chunk = std::upper_bound(
88
+ m_chunks.begin(), m_chunks.end(), static_cast<std::byte*>(p),
89
+ [](const std::byte* ptr, const Chunk& c) { return ptr < c.begin; });
90
+ --chunk;
91
+
92
+ m_pools[chunk->pool_index].free_list.emplace_back(p);
69
93
  }
70
94
 
71
95
  /// Returns true if this pool resource has the same backing storage as
@@ -82,22 +106,71 @@ class SLEIPNIR_DLLEXPORT PoolResource {
82
106
  ///
83
107
  /// @return The number of blocks from this pool resource that are in use.
84
108
  size_t blocks_in_use() const noexcept {
85
- return m_buffer.size() * blocks_per_chunk - m_free_list.size();
109
+ size_t free_blocks = 0;
110
+ for (const auto& pool : m_pools) {
111
+ free_blocks += pool.free_list.size();
112
+ }
113
+ return m_chunks.size() * blocks_per_chunk - free_blocks;
86
114
  }
87
115
 
88
116
  private:
117
+ /// Free list for blocks of one size.
118
+ struct Pool {
119
+ /// Number of bytes per block.
120
+ size_t block_size;
121
+
122
+ /// Pointers to free blocks.
123
+ gch::small_vector<void*> free_list;
124
+ };
125
+
126
+ /// Chunk of memory owned by a pool.
127
+ struct Chunk {
128
+ /// Start of the chunk's memory.
129
+ std::byte* begin;
130
+
131
+ /// Index of the pool whose blocks were carved from this chunk.
132
+ size_t pool_index;
133
+ };
134
+
89
135
  gch::small_vector<std::unique_ptr<std::byte[]>> m_buffer;
90
- gch::small_vector<void*> m_free_list;
136
+
137
+ /// Chunks sorted by start address.
138
+ gch::small_vector<Chunk> m_chunks;
139
+
140
+ gch::small_vector<Pool> m_pools;
91
141
  size_t blocks_per_chunk;
92
142
 
93
- /// Adds a memory chunk to the pool, partitions it into blocks with the given
94
- /// number of bytes, and appends pointers to them to the free list.
143
+ /// Returns the pool for the given block size, creating it if necessary.
144
+ ///
145
+ /// @param block_size Number of bytes per block.
146
+ /// @return The pool for the given block size.
147
+ Pool& get_pool(size_t block_size) {
148
+ for (auto& pool : m_pools) {
149
+ if (pool.block_size == block_size) {
150
+ return pool;
151
+ }
152
+ }
153
+
154
+ return m_pools.emplace_back(Pool{block_size, {}});
155
+ }
156
+
157
+ /// Adds a memory chunk to the given pool, partitions it into blocks with the
158
+ /// pool's block size, and appends pointers to them to the pool's free list.
95
159
  ///
96
- /// @param bytes_per_block Number of bytes in the block.
97
- void add_chunk(size_t bytes_per_block) {
98
- m_buffer.emplace_back(new std::byte[bytes_per_block * blocks_per_chunk]);
160
+ /// @param pool The pool.
161
+ void add_chunk(Pool& pool) {
162
+ auto begin =
163
+ m_buffer.emplace_back(new std::byte[pool.block_size * blocks_per_chunk])
164
+ .get();
165
+
166
+ size_t pool_index = &pool - m_pools.data();
167
+ auto pos = std::upper_bound(
168
+ m_chunks.begin(), m_chunks.end(), begin,
169
+ [](const std::byte* ptr, const Chunk& c) { return ptr < c.begin; });
170
+ m_chunks.insert(pos, Chunk{begin, pool_index});
171
+
99
172
  for (int i = blocks_per_chunk - 1; i >= 0; --i) {
100
- m_free_list.emplace_back(m_buffer.back().get() + bytes_per_block * i);
173
+ pool.free_list.emplace_back(begin + pool.block_size * i);
101
174
  }
102
175
  }
103
176
  };
@@ -130,7 +203,7 @@ class PoolAllocator {
130
203
  /// @return A block of memory from the pool.
131
204
  [[nodiscard]]
132
205
  constexpr T* allocate(size_t n) {
133
- return static_cast<T*>(m_memory_resource->allocate(n));
206
+ return static_cast<T*>(m_memory_resource->allocate(n, alignof(T)));
134
207
  }
135
208
 
136
209
  /// Gives a block of memory back to the pool.
@@ -138,7 +211,7 @@ class PoolAllocator {
138
211
  /// @param p A pointer to the block of memory.
139
212
  /// @param n Number of bytes in the block.
140
213
  constexpr void deallocate(T* p, size_t n) {
141
- m_memory_resource->deallocate(p, n);
214
+ m_memory_resource->deallocate(p, n, alignof(T));
142
215
  }
143
216
 
144
217
  private:
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._sleipnir import *
4
4
 
5
- __version__ = "0.6.7.dev7"
5
+ __version__ = "0.6.7.dev9"