sleipnirgroup-jormungandr 0.6.7.dev34__tar.gz → 0.6.7.dev44__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 (123) hide show
  1. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/CMakeLists.txt +61 -7
  2. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/PKG-INFO +1 -1
  3. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/ipm.hpp +33 -22
  4. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/sqp.hpp +11 -0
  5. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/bounds.hpp +1 -1
  6. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/feasibility_restoration.hpp +5 -4
  7. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/filter.hpp +47 -8
  8. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/src/sleipnir/__init__.py +1 -1
  9. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/cart_pole_problem_test.py +4 -2
  10. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/flywheel_ocp_test.py +1 -1
  11. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/flywheel_problem_test.py +1 -1
  12. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/nonlinear_problem_test.py +32 -0
  13. sleipnirgroup_jormungandr-0.6.7.dev34/include/sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp +0 -30
  14. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/LICENSE.txt +0 -0
  15. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/README.md +0 -0
  16. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/SleipnirConfig.cmake.in +0 -0
  17. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/cmake/BuildTypes.cmake +0 -0
  18. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/cmake/CompilerFlags.cmake +0 -0
  19. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/cmake/Pybind11Mkdoc.cmake +0 -0
  20. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/cmake/SubdirList.cmake +0 -0
  21. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/cmake/arm-none-eabi.cmake +0 -0
  22. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/expression.hpp +0 -0
  23. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/expression_graph.hpp +0 -0
  24. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/expression_type.hpp +0 -0
  25. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/gradient.hpp +0 -0
  26. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/hessian.hpp +0 -0
  27. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/jacobian.hpp +0 -0
  28. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/sleipnir_base.hpp +0 -0
  29. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/slice.hpp +0 -0
  30. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/variable.hpp +0 -0
  31. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/variable_block.hpp +0 -0
  32. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/autodiff/variable_matrix.hpp +0 -0
  33. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/multistart.hpp +0 -0
  34. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/ocp/dynamics_type.hpp +0 -0
  35. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/ocp/timestep_method.hpp +0 -0
  36. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/ocp/transcription_method.hpp +0 -0
  37. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/ocp.hpp +0 -0
  38. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/problem.hpp +0 -0
  39. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/exit_status.hpp +0 -0
  40. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/ipm_matrix_callbacks.hpp +0 -0
  41. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/iteration_info.hpp +0 -0
  42. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/newton.hpp +0 -0
  43. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/newton_matrix_callbacks.hpp +0 -0
  44. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/options.hpp +0 -0
  45. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/sqp_matrix_callbacks.hpp +0 -0
  46. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/all_finite.hpp +0 -0
  47. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/append_as_triplets.hpp +0 -0
  48. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/dense_kkt_solver.hpp +0 -0
  49. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/fraction_to_the_boundary_rule.hpp +0 -0
  50. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/inertia.hpp +0 -0
  51. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/kkt_error.hpp +0 -0
  52. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/kkt_solver.hpp +0 -0
  53. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/problem_scaling.hpp +0 -0
  54. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/sparse_inf_norms.hpp +0 -0
  55. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/optimization/solver/util/sparse_kkt_solver.hpp +0 -0
  56. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/assert.hpp +0 -0
  57. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/concepts.hpp +0 -0
  58. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/empty.hpp +0 -0
  59. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/function_ref.hpp +0 -0
  60. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/intrusive_shared_ptr.hpp +0 -0
  61. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/pool.hpp +0 -0
  62. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/print.hpp +0 -0
  63. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/print_diagnostics.hpp +0 -0
  64. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/profiler.hpp +0 -0
  65. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/scope_exit.hpp +0 -0
  66. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/spy.hpp +0 -0
  67. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/include/sleipnir/util/symbol_exports.hpp +0 -0
  68. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/pyproject.toml +0 -0
  69. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/autodiff/bind_expression_type.cpp +0 -0
  70. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/autodiff/bind_gradient.cpp +0 -0
  71. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/autodiff/bind_hessian.cpp +0 -0
  72. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/autodiff/bind_jacobian.cpp +0 -0
  73. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/autodiff/bind_variable.cpp +0 -0
  74. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/autodiff/bind_variable_block.cpp +0 -0
  75. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/autodiff/bind_variable_matrix.cpp +0 -0
  76. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/binders.hpp +0 -0
  77. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/docstrings.hpp +0 -0
  78. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/for_each_type.hpp +0 -0
  79. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/main.cpp +0 -0
  80. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/bind_equality_constraints.cpp +0 -0
  81. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/bind_inequality_constraints.cpp +0 -0
  82. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/bind_ocp.cpp +0 -0
  83. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/bind_problem.cpp +0 -0
  84. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/ocp/bind_dynamics_type.cpp +0 -0
  85. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/ocp/bind_timestep_method.cpp +0 -0
  86. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/ocp/bind_transcription_method.cpp +0 -0
  87. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/solver/bind_exit_status.cpp +0 -0
  88. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/optimization/solver/bind_iteration_info.cpp +0 -0
  89. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/cpp/try_cast.hpp +0 -0
  90. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/src/sleipnir/autodiff/__init__.py +0 -0
  91. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/src/sleipnir/optimization/__init__.py +0 -0
  92. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/autodiff/gradient_test.py +0 -0
  93. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/autodiff/hessian_test.py +0 -0
  94. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/autodiff/jacobian_test.py +0 -0
  95. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/autodiff/variable_matrix_test.py +0 -0
  96. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/autodiff/variable_test.py +0 -0
  97. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/arm_on_elevator_problem_test.py +0 -0
  98. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/cart_pole_ocp_test.py +0 -0
  99. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/cart_pole_util.py +0 -0
  100. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/constraints_test.py +0 -0
  101. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/decision_variable_test.py +0 -0
  102. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/differential_drive_ocp_test.py +0 -0
  103. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/differential_drive_problem_test.py +0 -0
  104. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/differential_drive_util.py +0 -0
  105. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/double_integrator_problem_test.py +0 -0
  106. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/linear_problem_test.py +0 -0
  107. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/multistart_test.py +0 -0
  108. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/near.py +0 -0
  109. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/problem_spy_test.py +0 -0
  110. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/quadratic_problem_test.py +0 -0
  111. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/rk4.py +0 -0
  112. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/solver/exit_status_test.py +0 -0
  113. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/python/test/optimization/trivial_problem_test.py +0 -0
  114. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/autodiff/gradient.cpp +0 -0
  115. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/autodiff/hessian.cpp +0 -0
  116. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/autodiff/jacobian.cpp +0 -0
  117. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/autodiff/variable_matrix.cpp +0 -0
  118. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/optimization/ocp.cpp +0 -0
  119. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/optimization/problem.cpp +0 -0
  120. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/optimization/solver/ipm.cpp +0 -0
  121. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/optimization/solver/newton.cpp +0 -0
  122. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/optimization/solver/sqp.cpp +0 -0
  123. {sleipnirgroup_jormungandr-0.6.7.dev34 → sleipnirgroup_jormungandr-0.6.7.dev44}/src/util/pool.cpp +0 -0
@@ -206,17 +206,71 @@ if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING AND NOT CMAKE_CROSSCOMPILING)
206
206
  list(APPEND CMAKE_MODULE_PATH ${Catch2_SOURCE_DIR}/extras)
207
207
  include(Catch)
208
208
 
209
- # Build Sleipnir tests
210
- file(GLOB_RECURSE sleipnir_test_src test/src/*.cpp)
211
- add_executable(sleipnir_test ${sleipnir_test_src})
212
- compiler_flags(sleipnir_test)
209
+ # Build autodiff explicit instantiations shared by autodiff and
210
+ # optimization tests
211
+ file(
212
+ GLOB_RECURSE sleipnir_autodiff_explicit_double_src
213
+ test/src/autodiff/*_explicit_double.cpp
214
+ )
215
+ add_library(
216
+ sleipnir_autodiff_explicit_double
217
+ OBJECT
218
+ ${sleipnir_autodiff_explicit_double_src}
219
+ )
220
+ compiler_flags(sleipnir_autodiff_explicit_double)
221
+ target_include_directories(
222
+ sleipnir_autodiff_explicit_double
223
+ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/test/include
224
+ )
225
+ target_link_libraries(sleipnir_autodiff_explicit_double PUBLIC Sleipnir)
226
+
227
+ # Build Sleipnir autodiff tests
228
+ file(GLOB_RECURSE sleipnir_autodiff_test_src test/src/autodiff/*_test.cpp)
229
+ add_executable(sleipnir_autodiff_test ${sleipnir_autodiff_test_src})
230
+ compiler_flags(sleipnir_autodiff_test)
231
+ target_include_directories(
232
+ sleipnir_autodiff_test
233
+ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/test/include
234
+ )
235
+ target_link_libraries(
236
+ sleipnir_autodiff_test
237
+ PUBLIC Sleipnir sleipnir_autodiff_explicit_double Catch2::Catch2WithMain
238
+ )
239
+
240
+ # Build Sleipnir optimization tests
241
+ file(
242
+ GLOB_RECURSE sleipnir_optimization_test_src
243
+ test/src/optimization/*_explicit_double.cpp
244
+ test/src/optimization/*_test.cpp
245
+ )
246
+ add_executable(sleipnir_optimization_test ${sleipnir_optimization_test_src})
247
+ compiler_flags(sleipnir_optimization_test)
213
248
  target_include_directories(
214
- sleipnir_test
249
+ sleipnir_optimization_test
215
250
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/test/include
216
251
  )
217
- target_link_libraries(sleipnir_test PUBLIC Sleipnir Catch2::Catch2WithMain)
252
+ target_link_libraries(
253
+ sleipnir_optimization_test
254
+ PUBLIC Sleipnir sleipnir_autodiff_explicit_double Catch2::Catch2WithMain
255
+ )
256
+
257
+ # Build Sleipnir util tests
258
+ file(GLOB_RECURSE sleipnir_util_test_src test/src/util/*_test.cpp)
259
+ add_executable(sleipnir_util_test ${sleipnir_util_test_src})
260
+ compiler_flags(sleipnir_util_test)
261
+ target_include_directories(
262
+ sleipnir_util_test
263
+ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/test/include
264
+ )
265
+ target_link_libraries(
266
+ sleipnir_util_test
267
+ PUBLIC Sleipnir Catch2::Catch2WithMain
268
+ )
269
+
218
270
  if(NOT CMAKE_TOOLCHAIN_FILE)
219
- catch_discover_tests(sleipnir_test)
271
+ catch_discover_tests(sleipnir_autodiff_test)
272
+ catch_discover_tests(sleipnir_optimization_test)
273
+ catch_discover_tests(sleipnir_util_test)
220
274
  endif()
221
275
  endif()
222
276
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sleipnirgroup-jormungandr
3
- Version: 0.6.7.dev34
3
+ Version: 0.6.7.dev44
4
4
  Summary: Reverse mode autodiff library and NLP solver DSL
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE.txt
@@ -353,6 +353,8 @@ ExitStatus ipm(const IPMMatrixCallbacks<Scalar>& matrix_callbacks,
353
353
 
354
354
  int full_step_rejected_counter = 0;
355
355
 
356
+ StallDetector<Scalar> stall_detector;
357
+
356
358
  // Error
357
359
  Scalar E_0 = unscaled_kkt_error<Scalar, KKTErrorType::INF_NORM_SCALED>(
358
360
  matrices.scaling, g, A_e, c_e, A_i, c_i, s, y, z, Scalar(0));
@@ -504,7 +506,7 @@ ExitStatus ipm(const IPMMatrixCallbacks<Scalar>& matrix_callbacks,
504
506
  } else {
505
507
  trial_s = s + α * step.p_s;
506
508
  }
507
- trial_y = y + α_z * step.p_y;
509
+ trial_y = y + α * step.p_y;
508
510
  trial_z = z + α_z * step.p_z;
509
511
 
510
512
  trial_f = matrices.f(trial_x);
@@ -608,7 +610,7 @@ ExitStatus ipm(const IPMMatrixCallbacks<Scalar>& matrix_callbacks,
608
610
 
609
611
  trial_x = x + α_soc * soc_step.p_x;
610
612
  trial_s = s + α_soc * soc_step.p_s;
611
- trial_y = y + α_z_soc * soc_step.p_y;
613
+ trial_y = y + α_soc * soc_step.p_y;
612
614
  trial_z = z + α_z_soc * soc_step.p_z;
613
615
 
614
616
  trial_f = matrices.f(trial_x);
@@ -677,7 +679,7 @@ ExitStatus ipm(const IPMMatrixCallbacks<Scalar>& matrix_callbacks,
677
679
 
678
680
  trial_x = x + α_max * step.p_x;
679
681
  trial_s = s + α_max * step.p_s;
680
- trial_y = y + α_z * step.p_y;
682
+ trial_y = y + α_max * step.p_y;
681
683
  trial_z = z + α_z * step.p_z;
682
684
 
683
685
  trial_f = matrices.f(trial_x);
@@ -702,6 +704,15 @@ ExitStatus ipm(const IPMMatrixCallbacks<Scalar>& matrix_callbacks,
702
704
 
703
705
  line_search_profiler.stop();
704
706
 
707
+ // If solver stalled, invoke feasibility restoration
708
+ if (!call_feasibility_restoration && !in_feasibility_restoration) {
709
+ FilterEntry trial_entry{trial_f, trial_s, trial_c_e, trial_c_i, μ};
710
+ if (stall_detector.update(current_entry, trial_entry, α,
711
+ filter.min_constraint_violation)) {
712
+ call_feasibility_restoration = true;
713
+ }
714
+ }
715
+
705
716
  if (call_feasibility_restoration) {
706
717
  ScopedProfiler feasibility_restoration_profiler{
707
718
  feasibility_restoration_prof};
@@ -766,30 +777,30 @@ ExitStatus ipm(const IPMMatrixCallbacks<Scalar>& matrix_callbacks,
766
777
  y = trial_y;
767
778
  z = trial_z;
768
779
 
769
- // A requirement for the convergence proof is that the primal-dual barrier
770
- // term Hessian Σₖ₊₁ does not deviate arbitrarily much from the primal
771
- // barrier term Hessian μSₖ₊₁⁻².
772
- //
773
- // Σₖ₊₁ = μSₖ₊₁⁻²
774
- // Sₖ₊₁⁻¹Zₖ₊₁ = μSₖ₊₁⁻²
775
- // Zₖ₊₁ = μSₖ₊₁⁻¹
776
- //
777
- // We ensure this by resetting
778
- //
779
- // zₖ₊₁ = clamp(zₖ₊₁, 1/κ_Σ μ/sₖ₊₁, κ_Σ μ/sₖ₊₁)
780
- //
781
- // for some fixed κ_Σ ≥ 1 after each step. See equation (16) of [2].
782
- for (int row = 0; row < z.rows(); ++row) {
783
- constexpr Scalar κ_Σ(1e10);
784
- z[row] =
785
- std::clamp(z[row], Scalar(1) / κ_Σ * μ / s[row], κ_Σ * μ / s[row]);
786
- }
787
-
788
780
  f = trial_f;
789
781
  c_e = trial_c_e;
790
782
  c_i = trial_c_i;
791
783
  }
792
784
 
785
+ // A requirement for the convergence proof is that the primal-dual barrier
786
+ // term Hessian Σₖ₊₁ does not deviate arbitrarily much from the primal
787
+ // barrier term Hessian μSₖ₊₁⁻².
788
+ //
789
+ // Σₖ₊₁ = μSₖ₊₁⁻²
790
+ // Sₖ₊₁⁻¹Zₖ₊₁ = μSₖ₊₁⁻²
791
+ // Zₖ₊₁ = μSₖ₊₁⁻¹
792
+ //
793
+ // We ensure this by resetting
794
+ //
795
+ // zₖ₊₁ = clamp(zₖ₊₁, 1/κ_Σ μ/sₖ₊₁, κ_Σ μ/sₖ₊₁)
796
+ //
797
+ // for some fixed κ_Σ ≥ 1 after each step. See equation (16) of [2].
798
+ for (int row = 0; row < z.rows(); ++row) {
799
+ constexpr Scalar κ_Σ(1e10);
800
+ z[row] =
801
+ std::clamp(z[row], Scalar(1) / κ_Σ * μ / s[row], κ_Σ * μ / s[row]);
802
+ }
803
+
793
804
  // Update autodiff for Jacobians and Hessian
794
805
  A_e = matrices.A_e(x);
795
806
  A_i = matrices.A_i(x);
@@ -236,6 +236,8 @@ ExitStatus sqp(const SQPMatrixCallbacks<Scalar>& matrix_callbacks,
236
236
 
237
237
  int full_step_rejected_counter = 0;
238
238
 
239
+ StallDetector<Scalar> stall_detector;
240
+
239
241
  // Error
240
242
  Scalar E_0 = unscaled_kkt_error<Scalar, KKTErrorType::INF_NORM_SCALED>(
241
243
  matrices.scaling, g, A_e, c_e, y);
@@ -499,6 +501,15 @@ ExitStatus sqp(const SQPMatrixCallbacks<Scalar>& matrix_callbacks,
499
501
 
500
502
  line_search_profiler.stop();
501
503
 
504
+ // If solver stalled, invoke feasibility restoration
505
+ if (!call_feasibility_restoration) {
506
+ FilterEntry trial_entry{trial_f, trial_c_e};
507
+ if (stall_detector.update(current_entry, trial_entry, α,
508
+ filter.min_constraint_violation)) {
509
+ call_feasibility_restoration = true;
510
+ }
511
+ }
512
+
502
513
  if (call_feasibility_restoration) {
503
514
  ScopedProfiler feasibility_restoration_profiler{
504
515
  feasibility_restoration_prof};
@@ -225,7 +225,7 @@ void project_onto_bounds(
225
225
  // We assume that bound infeasibility is handled elsewhere.
226
226
  slp_assert(lower <= upper);
227
227
 
228
- // See appendix B.2 of [4] and section 3.6 of [2]
228
+ // See section 3.6 of [2]
229
229
  if (isfinite(lower) && isfinite(upper)) {
230
230
  auto p_L = std::min(κ_1 * std::max(Scalar(1), abs(lower)),
231
231
  κ_2 * (upper - lower));
@@ -19,7 +19,6 @@
19
19
  #include "sleipnir/optimization/solver/options.hpp"
20
20
  #include "sleipnir/optimization/solver/sqp_matrix_callbacks.hpp"
21
21
  #include "sleipnir/optimization/solver/util/append_as_triplets.hpp"
22
- #include "sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp"
23
22
  #include "sleipnir/optimization/solver/util/problem_scaling.hpp"
24
23
  #include "sleipnir/util/print_diagnostics.hpp"
25
24
 
@@ -317,7 +316,9 @@ ExitStatus feasibility_restoration(
317
316
  auto g = matrices.g(x);
318
317
  auto A_e = matrices.A_e(x);
319
318
 
320
- y = lagrange_multiplier_estimate(g, A_e);
319
+ // Reset the equality constraint duals since feasibility restoration didn't
320
+ // account for the cost function
321
+ y.setZero();
321
322
 
322
323
  return ExitStatus::SUCCESS;
323
324
  } else if (status == ExitStatus::SUCCESS) {
@@ -649,8 +650,8 @@ ExitStatus feasibility_restoration(
649
650
  const DenseVector c_i = matrices.c_i(x);
650
651
  s = (c_i.array() >= Scalar(1e-2)).select(c_i, Scalar(1));
651
652
 
652
- // Reset the equality constraint duals since the restoration phase didn't
653
- // take the cost function into account
653
+ // Reset the equality constraint duals since feasibility restoration didn't
654
+ // account for the cost function
654
655
  y.setZero();
655
656
 
656
657
  // Update the inequality constraint duals with a Newton step for
@@ -130,15 +130,11 @@ class Filter {
130
130
  trial_entry.cost <= current_entry.cost + η_ϕ * α * D_ϕ;
131
131
 
132
132
  // Sufficient decrease condition
133
- //
134
- // See equation (2.13) of [3].
135
- Scalar ϕ = pow(α, Scalar(1.5));
136
133
  bool sufficient_decrease =
137
134
  trial_entry.cost <=
138
- current_entry.cost -
139
- ϕ * γ_cost * current_entry.constraint_violation ||
135
+ current_entry.cost - γ_cost * current_entry.constraint_violation ||
140
136
  trial_entry.constraint_violation <=
141
- (Scalar(1) - ϕ * γ_constraint) * current_entry.constraint_violation;
137
+ (Scalar(1) - γ_constraint) * current_entry.constraint_violation;
142
138
 
143
139
  // If constraint violation is below threshold and switching condition is
144
140
  // true, check Armijo condition for step rejection. Otherwise, check
@@ -164,8 +160,8 @@ class Filter {
164
160
  // condition are false
165
161
  if (!switching_condition || !armijo_condition) {
166
162
  add(FilterEntry{
167
- current_entry.cost - ϕ * γ_cost * current_entry.constraint_violation,
168
- (Scalar(1) - ϕ * γ_constraint) * current_entry.constraint_violation});
163
+ current_entry.cost - γ_cost * current_entry.constraint_violation,
164
+ (Scalar(1) - γ_constraint) * current_entry.constraint_violation});
169
165
  }
170
166
 
171
167
  return true;
@@ -211,4 +207,47 @@ class Filter {
211
207
  }
212
208
  };
213
209
 
210
+ /// Detects a solver stall.
211
+ ///
212
+ /// @tparam Scalar Scalar type.
213
+ template <typename Scalar>
214
+ class StallDetector {
215
+ public:
216
+ /// Returns true if the solver stalled.
217
+ ///
218
+ /// @param current_entry The entry corresponding to the current iterate.
219
+ /// @param trial_entry The entry corresponding to the accepted trial iterate.
220
+ /// @param α The accepted step size.
221
+ /// @param min_constraint_violation The minimum constraint violation from the
222
+ /// filter.
223
+ /// @return True if the solver stalled.
224
+ bool update(const FilterEntry<Scalar>& current_entry,
225
+ const FilterEntry<Scalar>& trial_entry, Scalar α,
226
+ Scalar min_constraint_violation) {
227
+ // If step is tiny, current iterate is infeasible, and accepted trial
228
+ // iterate made insufficient progress toward feasibility, increment stalled
229
+ // step counter
230
+ if (α < Scalar(1e-3) &&
231
+ current_entry.constraint_violation > min_constraint_violation &&
232
+ trial_entry.constraint_violation >
233
+ Scalar(0.99) * current_entry.constraint_violation) {
234
+ ++m_stalled_step_counter;
235
+
236
+ // If there were too many consecutive tiny steps, report a stall
237
+ if (m_stalled_step_counter >= 5) {
238
+ m_stalled_step_counter = 0;
239
+ return true;
240
+ }
241
+ } else {
242
+ // A break in stalled steps resets the counter
243
+ m_stalled_step_counter = 0;
244
+ }
245
+
246
+ return false;
247
+ }
248
+
249
+ private:
250
+ int m_stalled_step_counter = 0;
251
+ };
252
+
214
253
  } // namespace slp
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._sleipnir import *
4
4
 
5
- __version__ = "0.6.7.dev34"
5
+ __version__ = "0.6.7.dev44"
@@ -15,9 +15,11 @@ def lerp(a, b, t):
15
15
  return a + t * (b - a)
16
16
 
17
17
 
18
- def test_cart_pole_problem():
18
+ # dt = 0.25 s is sensitive to small solver changes, so a failure here may just
19
+ # mean the iterates found a different basin rather than a regression.
20
+ @pytest.mark.parametrize("dt", [0.05, 0.125, 0.25])
21
+ def test_cart_pole_problem(dt):
19
22
  TOTAL_TIME = 5.0 # s
20
- dt = 0.05 # s
21
23
  N = int(TOTAL_TIME / dt)
22
24
 
23
25
  u_max = 20.0 # N
@@ -96,7 +96,7 @@ def flywheel_test(
96
96
  # steady-states.
97
97
  assert problem.U().value(0, k) == pytest.approx(u, abs=2.0)
98
98
  else:
99
- assert problem.U().value(0, k) == pytest.approx(u, abs=1e-4)
99
+ assert problem.U().value(0, k) == pytest.approx(u, abs=2e-4)
100
100
 
101
101
  # Project state forward
102
102
  x = A_discrete * x + B_discrete * u
@@ -83,7 +83,7 @@ def test_flywheel_problem():
83
83
  assert U.value(0, k) >= u_ss
84
84
  assert U.value(0, k) <= 12.0
85
85
  else:
86
- assert U.value(0, k) == pytest.approx(u, abs=1e-4)
86
+ assert U.value(0, k) == pytest.approx(u, abs=2e-4)
87
87
 
88
88
  # Project state forward
89
89
  x = A * x + B * u
@@ -160,3 +160,35 @@ def test_wachter_and_biegler_line_search_failure():
160
160
  assert x.value() == pytest.approx(-1.0, abs=1e-6)
161
161
  assert s1.value() == pytest.approx(0.0, abs=1e-6)
162
162
  assert s2.value() == pytest.approx(0.0, abs=3e-5)
163
+
164
+
165
+ def test_hock_schittkowski_13():
166
+ # Problem 13 of [1] (see
167
+ # https://vanderbei.princeton.edu/ampl/nlmodels/cute/hs013.mod) has
168
+ # constraint gradients that are linearly dependent at the solution.
169
+ #
170
+ # [1] Hock, W. and Schittkowski, K. "Test Examples for Nonlinear Programming
171
+ # Codes", Springer, 1981.
172
+
173
+ problem = Problem()
174
+
175
+ x, y = problem.decision_variable(2)
176
+ x.set_value(-2)
177
+ y.set_value(-2)
178
+
179
+ problem.minimize((x - 2) ** 2 + y**2)
180
+
181
+ problem.subject_to((1 - x) ** 3 >= y)
182
+ problem.subject_to(x >= 0)
183
+ problem.subject_to(y >= 0)
184
+
185
+ assert problem.cost_function_type() == ExpressionType.QUADRATIC
186
+ assert problem.equality_constraint_type() == ExpressionType.NONE
187
+ assert problem.inequality_constraint_type() == ExpressionType.NONLINEAR
188
+
189
+ assert problem.solve(diagnostics=True) == ExitStatus.SUCCESS
190
+
191
+ # The solution has no finite Lagrange multipliers, so the iterates only
192
+ # approach it to within the square root of the tolerance
193
+ assert x.value() == pytest.approx(1.0, abs=1e-4)
194
+ assert y.value() == pytest.approx(0.0, abs=1e-4)
@@ -1,30 +0,0 @@
1
- // Copyright (c) Sleipnir contributors
2
-
3
- #pragma once
4
-
5
- #include <Eigen/Core>
6
- #include <Eigen/SparseCholesky>
7
- #include <Eigen/SparseCore>
8
-
9
- namespace slp {
10
-
11
- /// Estimates Lagrange multipliers for SQP.
12
- ///
13
- /// @tparam Scalar Scalar type.
14
- /// @param g Cost function gradient ∇f.
15
- /// @param A_e Equality constraint Jacobian Aₑ(x).
16
- template <typename Scalar>
17
- Eigen::Vector<Scalar, Eigen::Dynamic> lagrange_multiplier_estimate(
18
- const Eigen::SparseVector<Scalar>& g,
19
- const Eigen::SparseMatrix<Scalar>& A_e) {
20
- // Lagrange multiplier estimates
21
- //
22
- // ∇f − Aₑᵀy = 0
23
- // Aₑᵀy = ∇f
24
- // y = (AₑAₑᵀ)⁻¹Aₑ∇f
25
- return Eigen::SimplicialLDLT<Eigen::SparseMatrix<Scalar>>{A_e *
26
- A_e.transpose()}
27
- .solve(A_e * g);
28
- }
29
-
30
- } // namespace slp