sleipnirgroup-jormungandr 0.6.6.dev18__tar.gz → 0.6.6.dev20__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.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/PKG-INFO +1 -1
  2. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/interior_point.hpp +15 -38
  3. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/newton.hpp +7 -11
  4. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/sqp.hpp +13 -27
  5. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/bounds.hpp +1 -1
  6. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/feasibility_restoration.hpp +60 -2
  7. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/filter.hpp +1 -1
  8. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/src/sleipnir/__init__.py +1 -1
  9. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/solver/exit_status_test.py +33 -0
  10. sleipnirgroup_jormungandr-0.6.6.dev18/include/sleipnir/optimization/solver/util/is_locally_infeasible.hpp +0 -62
  11. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/CMakeLists.txt +0 -0
  12. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/LICENSE.txt +0 -0
  13. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/README.md +0 -0
  14. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/SleipnirConfig.cmake.in +0 -0
  15. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/cmake/BuildTypes.cmake +0 -0
  16. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/cmake/CompilerFlags.cmake +0 -0
  17. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/cmake/Pybind11Mkdoc.cmake +0 -0
  18. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/cmake/SubdirList.cmake +0 -0
  19. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/cmake/arm-none-eabi.cmake +0 -0
  20. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/expression.hpp +0 -0
  21. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/expression_graph.hpp +0 -0
  22. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/expression_type.hpp +0 -0
  23. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/gradient.hpp +0 -0
  24. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/hessian.hpp +0 -0
  25. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/jacobian.hpp +0 -0
  26. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/sleipnir_base.hpp +0 -0
  27. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/slice.hpp +0 -0
  28. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/variable.hpp +0 -0
  29. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/variable_block.hpp +0 -0
  30. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/autodiff/variable_matrix.hpp +0 -0
  31. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/multistart.hpp +0 -0
  32. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/ocp/dynamics_type.hpp +0 -0
  33. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/ocp/timestep_method.hpp +0 -0
  34. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/ocp/transcription_method.hpp +0 -0
  35. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/ocp.hpp +0 -0
  36. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/problem.hpp +0 -0
  37. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/exit_status.hpp +0 -0
  38. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/interior_point_matrix_callbacks.hpp +0 -0
  39. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/iteration_info.hpp +0 -0
  40. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/newton_matrix_callbacks.hpp +0 -0
  41. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/options.hpp +0 -0
  42. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/sqp_matrix_callbacks.hpp +0 -0
  43. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/all_finite.hpp +0 -0
  44. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/append_as_triplets.hpp +0 -0
  45. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/dense_regularized_ldlt.hpp +0 -0
  46. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/fraction_to_the_boundary_rule.hpp +0 -0
  47. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/inertia.hpp +0 -0
  48. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/kkt_error.hpp +0 -0
  49. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp +0 -0
  50. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/problem_scaling.hpp +0 -0
  51. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/regularized_ldlt.hpp +0 -0
  52. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/sparse_inf_norms.hpp +0 -0
  53. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/optimization/solver/util/sparse_regularized_ldlt.hpp +0 -0
  54. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/assert.hpp +0 -0
  55. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/concepts.hpp +0 -0
  56. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/empty.hpp +0 -0
  57. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/function_ref.hpp +0 -0
  58. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/intrusive_shared_ptr.hpp +0 -0
  59. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/pool.hpp +0 -0
  60. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/print.hpp +0 -0
  61. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/print_diagnostics.hpp +0 -0
  62. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/profiler.hpp +0 -0
  63. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/scope_exit.hpp +0 -0
  64. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/spy.hpp +0 -0
  65. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/include/sleipnir/util/symbol_exports.hpp +0 -0
  66. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/pyproject.toml +0 -0
  67. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/autodiff/bind_expression_type.cpp +0 -0
  68. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/autodiff/bind_gradient.cpp +0 -0
  69. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/autodiff/bind_hessian.cpp +0 -0
  70. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/autodiff/bind_jacobian.cpp +0 -0
  71. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/autodiff/bind_variable.cpp +0 -0
  72. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/autodiff/bind_variable_block.cpp +0 -0
  73. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/autodiff/bind_variable_matrix.cpp +0 -0
  74. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/binders.hpp +0 -0
  75. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/docstrings.hpp +0 -0
  76. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/for_each_type.hpp +0 -0
  77. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/main.cpp +0 -0
  78. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/bind_equality_constraints.cpp +0 -0
  79. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/bind_inequality_constraints.cpp +0 -0
  80. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/bind_ocp.cpp +0 -0
  81. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/bind_problem.cpp +0 -0
  82. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/ocp/bind_dynamics_type.cpp +0 -0
  83. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/ocp/bind_timestep_method.cpp +0 -0
  84. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/ocp/bind_transcription_method.cpp +0 -0
  85. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/solver/bind_exit_status.cpp +0 -0
  86. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/optimization/solver/bind_iteration_info.cpp +0 -0
  87. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/cpp/try_cast.hpp +0 -0
  88. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/src/sleipnir/autodiff/__init__.py +0 -0
  89. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/src/sleipnir/optimization/__init__.py +0 -0
  90. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/autodiff/gradient_test.py +0 -0
  91. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/autodiff/hessian_test.py +0 -0
  92. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/autodiff/jacobian_test.py +0 -0
  93. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/autodiff/variable_matrix_test.py +0 -0
  94. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/autodiff/variable_test.py +0 -0
  95. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/arm_on_elevator_problem_test.py +0 -0
  96. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/cart_pole_ocp_test.py +0 -0
  97. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/cart_pole_problem_test.py +0 -0
  98. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/cart_pole_util.py +0 -0
  99. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/constraints_test.py +0 -0
  100. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/decision_variable_test.py +0 -0
  101. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/differential_drive_ocp_test.py +0 -0
  102. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/differential_drive_problem_test.py +0 -0
  103. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/differential_drive_util.py +0 -0
  104. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/double_integrator_problem_test.py +0 -0
  105. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/flywheel_ocp_test.py +0 -0
  106. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/flywheel_problem_test.py +0 -0
  107. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/linear_problem_test.py +0 -0
  108. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/multistart_test.py +0 -0
  109. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/nonlinear_problem_test.py +0 -0
  110. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/problem_spy_test.py +0 -0
  111. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/quadratic_problem_test.py +0 -0
  112. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/rk4.py +0 -0
  113. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/python/test/optimization/trivial_problem_test.py +0 -0
  114. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/autodiff/gradient.cpp +0 -0
  115. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/autodiff/hessian.cpp +0 -0
  116. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/autodiff/jacobian.cpp +0 -0
  117. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/autodiff/variable_matrix.cpp +0 -0
  118. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/optimization/ocp.cpp +0 -0
  119. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/optimization/problem.cpp +0 -0
  120. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/optimization/solver/interior_point.cpp +0 -0
  121. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/optimization/solver/newton.cpp +0 -0
  122. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/src/optimization/solver/sqp.cpp +0 -0
  123. {sleipnirgroup_jormungandr-0.6.6.dev18 → sleipnirgroup_jormungandr-0.6.6.dev20}/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.6.dev18
3
+ Version: 0.6.6.dev20
4
4
  Summary: Reverse mode autodiff library and NLP solver DSL
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE.txt
@@ -21,7 +21,6 @@
21
21
  #include "sleipnir/optimization/solver/util/feasibility_restoration.hpp"
22
22
  #include "sleipnir/optimization/solver/util/filter.hpp"
23
23
  #include "sleipnir/optimization/solver/util/fraction_to_the_boundary_rule.hpp"
24
- #include "sleipnir/optimization/solver/util/is_locally_infeasible.hpp"
25
24
  #include "sleipnir/optimization/solver/util/kkt_error.hpp"
26
25
  #include "sleipnir/optimization/solver/util/regularized_ldlt.hpp"
27
26
  #include "sleipnir/util/assert.hpp"
@@ -156,7 +155,6 @@ ExitStatus interior_point(
156
155
  solve_profilers.emplace_back("solver");
157
156
  solve_profilers.emplace_back("↳ setup");
158
157
  solve_profilers.emplace_back("↳ iteration");
159
- solve_profilers.emplace_back(" ↳ feasibility check");
160
158
  solve_profilers.emplace_back(" ↳ callbacks");
161
159
  solve_profilers.emplace_back(" ↳ KKT matrix build");
162
160
  solve_profilers.emplace_back(" ↳ KKT matrix decomp");
@@ -176,25 +174,24 @@ ExitStatus interior_point(
176
174
  auto& solver_prof = solve_profilers[0];
177
175
  auto& setup_prof = solve_profilers[1];
178
176
  auto& inner_iter_prof = solve_profilers[2];
179
- auto& feasibility_check_prof = solve_profilers[3];
180
- auto& iter_callbacks_prof = solve_profilers[4];
181
- auto& kkt_matrix_build_prof = solve_profilers[5];
182
- auto& kkt_matrix_decomp_prof = solve_profilers[6];
183
- auto& kkt_system_solve_prof = solve_profilers[7];
184
- auto& line_search_prof = solve_profilers[8];
185
- auto& soc_prof = solve_profilers[9];
186
- auto& feasibility_restoration_prof = solve_profilers[10];
177
+ auto& iter_callbacks_prof = solve_profilers[3];
178
+ auto& kkt_matrix_build_prof = solve_profilers[4];
179
+ auto& kkt_matrix_decomp_prof = solve_profilers[5];
180
+ auto& kkt_system_solve_prof = solve_profilers[6];
181
+ auto& line_search_prof = solve_profilers[7];
182
+ auto& soc_prof = solve_profilers[8];
183
+ auto& feasibility_restoration_prof = solve_profilers[9];
187
184
 
188
185
  // Set up profiled matrix callbacks
189
186
  #ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
190
- auto& f_prof = solve_profilers[11];
191
- auto& g_prof = solve_profilers[12];
192
- auto& H_prof = solve_profilers[13];
193
- auto& H_c_prof = solve_profilers[14];
194
- auto& c_e_prof = solve_profilers[15];
195
- auto& A_e_prof = solve_profilers[16];
196
- auto& c_i_prof = solve_profilers[17];
197
- auto& A_i_prof = solve_profilers[18];
187
+ auto& f_prof = solve_profilers[10];
188
+ auto& g_prof = solve_profilers[11];
189
+ auto& H_prof = solve_profilers[12];
190
+ auto& H_c_prof = solve_profilers[13];
191
+ auto& c_e_prof = solve_profilers[14];
192
+ auto& A_e_prof = solve_profilers[15];
193
+ auto& c_i_prof = solve_profilers[16];
194
+ auto& A_i_prof = solve_profilers[17];
198
195
 
199
196
  InteriorPointMatrixCallbacks<Scalar> matrices{
200
197
  matrix_callbacks.num_decision_variables,
@@ -381,25 +378,6 @@ ExitStatus interior_point(
381
378
 
382
379
  while (E_0 > Scalar(options.tolerance)) {
383
380
  ScopedProfiler inner_iter_profiler{inner_iter_prof};
384
- ScopedProfiler feasibility_check_profiler{feasibility_check_prof};
385
-
386
- // Check for local equality constraint infeasibility
387
- if (is_equality_locally_infeasible(A_e, c_e)) {
388
- if (options.diagnostics) {
389
- print_c_e_local_infeasibility_error(c_e, Scalar(options.tolerance));
390
- }
391
-
392
- return ExitStatus::LOCALLY_INFEASIBLE;
393
- }
394
-
395
- // Check for local inequality constraint infeasibility
396
- if (is_inequality_locally_infeasible(A_i, c_i)) {
397
- if (options.diagnostics) {
398
- print_c_i_local_infeasibility_error(c_i, Scalar(options.tolerance));
399
- }
400
-
401
- return ExitStatus::LOCALLY_INFEASIBLE;
402
- }
403
381
 
404
382
  // Check for diverging iterates
405
383
  if (x.template lpNorm<Eigen::Infinity>() > Scalar(1e10) || !x.allFinite() ||
@@ -407,7 +385,6 @@ ExitStatus interior_point(
407
385
  return ExitStatus::DIVERGING_ITERATES;
408
386
  }
409
387
 
410
- feasibility_check_profiler.stop();
411
388
  ScopedProfiler iter_callbacks_profiler{iter_callbacks_prof};
412
389
 
413
390
  // Call iteration callbacks
@@ -65,7 +65,6 @@ ExitStatus newton(
65
65
  solve_profilers.emplace_back("solver");
66
66
  solve_profilers.emplace_back("↳ setup");
67
67
  solve_profilers.emplace_back("↳ iteration");
68
- solve_profilers.emplace_back(" ↳ feasibility check");
69
68
  solve_profilers.emplace_back(" ↳ callbacks");
70
69
  solve_profilers.emplace_back(" ↳ KKT matrix decomp");
71
70
  solve_profilers.emplace_back(" ↳ KKT system solve");
@@ -77,17 +76,16 @@ ExitStatus newton(
77
76
  auto& solver_prof = solve_profilers[0];
78
77
  auto& setup_prof = solve_profilers[1];
79
78
  auto& inner_iter_prof = solve_profilers[2];
80
- auto& feasibility_check_prof = solve_profilers[3];
81
- auto& iter_callbacks_prof = solve_profilers[4];
82
- auto& kkt_matrix_decomp_prof = solve_profilers[5];
83
- auto& kkt_system_solve_prof = solve_profilers[6];
84
- auto& line_search_prof = solve_profilers[7];
79
+ auto& iter_callbacks_prof = solve_profilers[3];
80
+ auto& kkt_matrix_decomp_prof = solve_profilers[4];
81
+ auto& kkt_system_solve_prof = solve_profilers[5];
82
+ auto& line_search_prof = solve_profilers[6];
85
83
 
86
84
  // Set up profiled matrix callbacks
87
85
  #ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
88
- auto& f_prof = solve_profilers[8];
89
- auto& g_prof = solve_profilers[9];
90
- auto& H_prof = solve_profilers[10];
86
+ auto& f_prof = solve_profilers[7];
87
+ auto& g_prof = solve_profilers[8];
88
+ auto& H_prof = solve_profilers[9];
91
89
 
92
90
  NewtonMatrixCallbacks<Scalar> matrices{
93
91
  matrix_callbacks.num_decision_variables,
@@ -160,14 +158,12 @@ ExitStatus newton(
160
158
 
161
159
  while (E_0 > Scalar(options.tolerance)) {
162
160
  ScopedProfiler inner_iter_profiler{inner_iter_prof};
163
- ScopedProfiler feasibility_check_profiler{feasibility_check_prof};
164
161
 
165
162
  // Check for diverging iterates
166
163
  if (x.template lpNorm<Eigen::Infinity>() > Scalar(1e10) || !x.allFinite()) {
167
164
  return ExitStatus::DIVERGING_ITERATES;
168
165
  }
169
166
 
170
- feasibility_check_profiler.stop();
171
167
  ScopedProfiler iter_callbacks_profiler{iter_callbacks_prof};
172
168
 
173
169
  // Call iteration callbacks
@@ -19,7 +19,6 @@
19
19
  #include "sleipnir/optimization/solver/util/append_as_triplets.hpp"
20
20
  #include "sleipnir/optimization/solver/util/feasibility_restoration.hpp"
21
21
  #include "sleipnir/optimization/solver/util/filter.hpp"
22
- #include "sleipnir/optimization/solver/util/is_locally_infeasible.hpp"
23
22
  #include "sleipnir/optimization/solver/util/kkt_error.hpp"
24
23
  #include "sleipnir/optimization/solver/util/regularized_ldlt.hpp"
25
24
  #include "sleipnir/util/assert.hpp"
@@ -113,7 +112,6 @@ ExitStatus sqp(const SQPMatrixCallbacks<Scalar>& matrix_callbacks,
113
112
  solve_profilers.emplace_back("solver");
114
113
  solve_profilers.emplace_back("↳ setup");
115
114
  solve_profilers.emplace_back("↳ iteration");
116
- solve_profilers.emplace_back(" ↳ feasibility check");
117
115
  solve_profilers.emplace_back(" ↳ callbacks");
118
116
  solve_profilers.emplace_back(" ↳ KKT matrix build");
119
117
  solve_profilers.emplace_back(" ↳ KKT matrix decomp");
@@ -131,23 +129,22 @@ ExitStatus sqp(const SQPMatrixCallbacks<Scalar>& matrix_callbacks,
131
129
  auto& solver_prof = solve_profilers[0];
132
130
  auto& setup_prof = solve_profilers[1];
133
131
  auto& inner_iter_prof = solve_profilers[2];
134
- auto& feasibility_check_prof = solve_profilers[3];
135
- auto& iter_callbacks_prof = solve_profilers[4];
136
- auto& kkt_matrix_build_prof = solve_profilers[5];
137
- auto& kkt_matrix_decomp_prof = solve_profilers[6];
138
- auto& kkt_system_solve_prof = solve_profilers[7];
139
- auto& line_search_prof = solve_profilers[8];
140
- auto& soc_prof = solve_profilers[9];
141
- auto& feasibility_restoration_prof = solve_profilers[10];
132
+ auto& iter_callbacks_prof = solve_profilers[3];
133
+ auto& kkt_matrix_build_prof = solve_profilers[4];
134
+ auto& kkt_matrix_decomp_prof = solve_profilers[5];
135
+ auto& kkt_system_solve_prof = solve_profilers[6];
136
+ auto& line_search_prof = solve_profilers[7];
137
+ auto& soc_prof = solve_profilers[8];
138
+ auto& feasibility_restoration_prof = solve_profilers[9];
142
139
 
143
140
  // Set up profiled matrix callbacks
144
141
  #ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
145
- auto& f_prof = solve_profilers[11];
146
- auto& g_prof = solve_profilers[12];
147
- auto& H_prof = solve_profilers[13];
148
- auto& H_c_prof = solve_profilers[14];
149
- auto& c_e_prof = solve_profilers[15];
150
- auto& A_e_prof = solve_profilers[16];
142
+ auto& f_prof = solve_profilers[10];
143
+ auto& g_prof = solve_profilers[11];
144
+ auto& H_prof = solve_profilers[12];
145
+ auto& H_c_prof = solve_profilers[13];
146
+ auto& c_e_prof = solve_profilers[14];
147
+ auto& A_e_prof = solve_profilers[15];
151
148
 
152
149
  SQPMatrixCallbacks<Scalar> matrices{
153
150
  matrix_callbacks.num_decision_variables,
@@ -258,23 +255,12 @@ ExitStatus sqp(const SQPMatrixCallbacks<Scalar>& matrix_callbacks,
258
255
 
259
256
  while (E_0 > Scalar(options.tolerance)) {
260
257
  ScopedProfiler inner_iter_profiler{inner_iter_prof};
261
- ScopedProfiler feasibility_check_profiler{feasibility_check_prof};
262
-
263
- // Check for local equality constraint infeasibility
264
- if (is_equality_locally_infeasible(A_e, c_e)) {
265
- if (options.diagnostics) {
266
- print_c_e_local_infeasibility_error(c_e, Scalar(options.tolerance));
267
- }
268
-
269
- return ExitStatus::LOCALLY_INFEASIBLE;
270
- }
271
258
 
272
259
  // Check for diverging iterates
273
260
  if (x.template lpNorm<Eigen::Infinity>() > Scalar(1e10) || !x.allFinite()) {
274
261
  return ExitStatus::DIVERGING_ITERATES;
275
262
  }
276
263
 
277
- feasibility_check_profiler.stop();
278
264
  ScopedProfiler iter_callbacks_profiler{iter_callbacks_prof};
279
265
 
280
266
  // Call iteration callbacks
@@ -215,7 +215,7 @@ void project_onto_bounds(
215
215
  // We assume that bound infeasibility is handled elsewhere.
216
216
  slp_assert(lower <= upper);
217
217
 
218
- // See B.2 in [5] and section 3.6 in [2]
218
+ // See B.2 in [4] and section 3.6 in [2]
219
219
  if (isfinite(lower) && isfinite(upper)) {
220
220
  auto p_L = std::min(κ_1 * std::max(Scalar(1), abs(lower)),
221
221
  κ_2 * (upper - lower));
@@ -21,6 +21,7 @@
21
21
  #include "sleipnir/optimization/solver/util/append_as_triplets.hpp"
22
22
  #include "sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp"
23
23
  #include "sleipnir/optimization/solver/util/problem_scaling.hpp"
24
+ #include "sleipnir/util/print_diagnostics.hpp"
24
25
 
25
26
  namespace slp {
26
27
 
@@ -318,7 +319,26 @@ ExitStatus feasibility_restoration(
318
319
 
319
320
  return ExitStatus::SUCCESS;
320
321
  } else if (status == ExitStatus::SUCCESS) {
321
- return ExitStatus::LOCALLY_INFEASIBLE;
322
+ // Feasibility restoration converged to a minimizer of the constraint
323
+ // violation. If the constraint violation is still above the tolerance,
324
+ // that minimizer is a certificate of local infeasibility. Declaring local
325
+ // infeasibility anywhere else risks false positives (e.g., a
326
+ // point-in-time test can reject iterates the solver would otherwise
327
+ // escape). See section 3.3, p. 14 of [2].
328
+ DenseVector c_e = matrices.c_e(x);
329
+ if (matrices.scaling.c_e.size() > 0) {
330
+ c_e = matrices.scaling.c_e.cwiseInverse().cwiseProduct(c_e);
331
+ }
332
+
333
+ if (c_e.template lpNorm<Eigen::Infinity>() > Scalar(options.tolerance)) {
334
+ if (options.diagnostics) {
335
+ print_c_e_local_infeasibility_error(c_e, Scalar(options.tolerance));
336
+ }
337
+
338
+ return ExitStatus::LOCALLY_INFEASIBLE;
339
+ }
340
+
341
+ return ExitStatus::FEASIBILITY_RESTORATION_FAILED;
322
342
  } else {
323
343
  return ExitStatus::FEASIBILITY_RESTORATION_FAILED;
324
344
  }
@@ -621,7 +641,45 @@ ExitStatus feasibility_restoration(
621
641
 
622
642
  return ExitStatus::SUCCESS;
623
643
  } else if (status == ExitStatus::SUCCESS) {
624
- return ExitStatus::LOCALLY_INFEASIBLE;
644
+ // Feasibility restoration converged to a minimizer of the constraint
645
+ // violation. If the constraint violation is still above the tolerance,
646
+ // that minimizer is a certificate of local infeasibility. Declaring local
647
+ // infeasibility anywhere else risks false positives (e.g., a
648
+ // point-in-time test can reject iterates the solver would otherwise
649
+ // escape). See section 3.3, p. 14 of [2].
650
+ DenseVector c_e = matrices.c_e(x);
651
+ if (matrices.scaling.c_e.size() > 0) {
652
+ c_e = matrices.scaling.c_e.cwiseInverse().cwiseProduct(c_e);
653
+ }
654
+
655
+ DenseVector c_i = matrices.c_i(x);
656
+ if (matrices.scaling.c_i.size() > 0) {
657
+ c_i = matrices.scaling.c_i.cwiseInverse().cwiseProduct(c_i);
658
+ }
659
+
660
+ // Inequality constraints cᵢ(x) ≥ 0 are only violated where they're
661
+ // negative
662
+ const DenseVector c_i_violation = (-c_i).cwiseMax(Scalar(0));
663
+
664
+ const bool c_e_violated =
665
+ c_e.template lpNorm<Eigen::Infinity>() > Scalar(options.tolerance);
666
+ const bool c_i_violated = c_i_violation.template lpNorm<Eigen::Infinity>() >
667
+ Scalar(options.tolerance);
668
+
669
+ if (c_e_violated || c_i_violated) {
670
+ if (options.diagnostics) {
671
+ if (c_e_violated) {
672
+ print_c_e_local_infeasibility_error(c_e, Scalar(options.tolerance));
673
+ }
674
+ if (c_i_violated) {
675
+ print_c_i_local_infeasibility_error(c_i, Scalar(options.tolerance));
676
+ }
677
+ }
678
+
679
+ return ExitStatus::LOCALLY_INFEASIBLE;
680
+ }
681
+
682
+ return ExitStatus::FEASIBILITY_RESTORATION_FAILED;
625
683
  } else {
626
684
  return ExitStatus::FEASIBILITY_RESTORATION_FAILED;
627
685
  }
@@ -131,7 +131,7 @@ class Filter {
131
131
 
132
132
  // Sufficient decrease condition
133
133
  //
134
- // See equation (2.13) of [4].
134
+ // See equation (2.13) of [3].
135
135
  Scalar ϕ = pow(α, Scalar(1.5));
136
136
  bool sufficient_decrease =
137
137
  trial_entry.cost <=
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._sleipnir import *
4
4
 
5
- __version__ = "0.6.6.dev18"
5
+ __version__ = "0.6.6.dev20"
@@ -1,5 +1,6 @@
1
1
  """These tests ensure coverage of the off-nominal exit statuses"""
2
2
 
3
+ import pytest
3
4
  from sleipnir.autodiff import ExpressionType, sqrt
4
5
  from sleipnir.optimization import ExitStatus, Problem
5
6
 
@@ -72,6 +73,38 @@ def test_locally_infeasible_inequality_constraints():
72
73
  assert problem.solve(diagnostics=True) == ExitStatus.LOCALLY_INFEASIBLE
73
74
 
74
75
 
76
+ def test_small_equality_constraint_scaling_is_feasible():
77
+ problem = Problem()
78
+
79
+ x = problem.decision_variable()
80
+ x.set_value(5005)
81
+
82
+ problem.subject_to(1e-5 * (x - 5) == 0)
83
+
84
+ assert problem.cost_function_type() == ExpressionType.NONE
85
+ assert problem.equality_constraint_type() == ExpressionType.LINEAR
86
+ assert problem.inequality_constraint_type() == ExpressionType.NONE
87
+
88
+ assert problem.solve(diagnostics=True) == ExitStatus.SUCCESS
89
+ assert x.value() == pytest.approx(5, abs=1e-3)
90
+
91
+
92
+ def test_small_inequality_constraint_scaling_is_feasible():
93
+ problem = Problem()
94
+
95
+ x = problem.decision_variable()
96
+ x.set_value(5005)
97
+
98
+ problem.subject_to(1e-5 * (5 - x) >= 0)
99
+
100
+ assert problem.cost_function_type() == ExpressionType.NONE
101
+ assert problem.equality_constraint_type() == ExpressionType.NONE
102
+ assert problem.inequality_constraint_type() == ExpressionType.LINEAR
103
+
104
+ assert problem.solve(diagnostics=True) == ExitStatus.SUCCESS
105
+ assert x.value() <= 5 + 1e-3
106
+
107
+
75
108
  def test_nonfinite_cost():
76
109
  problem = Problem()
77
110
  x = problem.decision_variable()
@@ -1,62 +0,0 @@
1
- // Copyright (c) Sleipnir contributors
2
-
3
- #pragma once
4
-
5
- #include <Eigen/Core>
6
- #include <Eigen/SparseCore>
7
-
8
- // See docs/algorithms.md#Works_cited for citation definitions
9
-
10
- namespace slp {
11
-
12
- /// Returns true if the problem's equality constraints are locally infeasible.
13
- ///
14
- /// @tparam Scalar Scalar type.
15
- /// @param A_e Equality constraint Jacobian Aₑ(x).
16
- /// @param c_e Equality constraints cₑ(x).
17
- template <typename Scalar>
18
- bool is_equality_locally_infeasible(
19
- const Eigen::SparseMatrix<Scalar>& A_e,
20
- const Eigen::Vector<Scalar, Eigen::Dynamic>& c_e) {
21
- // The equality constraints are locally infeasible if
22
- //
23
- // Aₑᵀcₑ → 0
24
- // ‖cₑ‖ > ε
25
- //
26
- // See "Infeasibility detection" in section 6 of [3].
27
- return A_e.rows() > 0 && (A_e.transpose() * c_e).norm() < Scalar(1e-6) &&
28
- c_e.norm() > Scalar(1e-2);
29
- }
30
-
31
- /// Returns true if the problem's inequality constraints are locally infeasible.
32
- ///
33
- /// @tparam Scalar Scalar type.
34
- /// @param A_i Inequality constraint Jacobian Aᵢ(x).
35
- /// @param c_i Inequality constraints cᵢ(x).
36
- template <typename Scalar>
37
- bool is_inequality_locally_infeasible(
38
- const Eigen::SparseMatrix<Scalar>& A_i,
39
- const Eigen::Vector<Scalar, Eigen::Dynamic>& c_i) {
40
- // The inequality constraints are locally infeasible if
41
- //
42
- // Aᵢᵀcᵢ⁺ → 0
43
- // ‖cᵢ⁺‖ > ε
44
- //
45
- // where cᵢ⁺ = min(cᵢ, 0).
46
- //
47
- // See "Infeasibility detection" in section 6 of [3].
48
- //
49
- // cᵢ⁺ is used instead of cᵢ⁻ from the paper to follow the convention that
50
- // feasible inequality constraints are ≥ 0.
51
- if (A_i.rows() > 0) {
52
- Eigen::Vector<Scalar, Eigen::Dynamic> c_i_plus = c_i.cwiseMin(Scalar(0));
53
- if ((A_i.transpose() * c_i_plus).norm() < Scalar(1e-6) &&
54
- c_i_plus.norm() > Scalar(1e-6)) {
55
- return true;
56
- }
57
- }
58
-
59
- return false;
60
- }
61
-
62
- } // namespace slp