sleipnirgroup-jormungandr 0.6.6.dev17__tar.gz → 0.6.6.dev19__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.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/PKG-INFO +1 -1
  2. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/interior_point.hpp +0 -19
  3. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/sqp.hpp +0 -10
  4. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/bounds.hpp +1 -1
  5. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/feasibility_restoration.hpp +60 -2
  6. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/filter.hpp +1 -1
  7. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/print_diagnostics.hpp +10 -4
  8. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/src/sleipnir/__init__.py +1 -1
  9. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/solver/exit_status_test.py +33 -0
  10. sleipnirgroup_jormungandr-0.6.6.dev17/include/sleipnir/optimization/solver/util/is_locally_infeasible.hpp +0 -62
  11. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/CMakeLists.txt +0 -0
  12. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/LICENSE.txt +0 -0
  13. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/README.md +0 -0
  14. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/SleipnirConfig.cmake.in +0 -0
  15. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/cmake/BuildTypes.cmake +0 -0
  16. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/cmake/CompilerFlags.cmake +0 -0
  17. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/cmake/Pybind11Mkdoc.cmake +0 -0
  18. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/cmake/SubdirList.cmake +0 -0
  19. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/cmake/arm-none-eabi.cmake +0 -0
  20. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/expression.hpp +0 -0
  21. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/expression_graph.hpp +0 -0
  22. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/expression_type.hpp +0 -0
  23. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/gradient.hpp +0 -0
  24. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/hessian.hpp +0 -0
  25. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/jacobian.hpp +0 -0
  26. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/sleipnir_base.hpp +0 -0
  27. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/slice.hpp +0 -0
  28. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/variable.hpp +0 -0
  29. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/variable_block.hpp +0 -0
  30. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/autodiff/variable_matrix.hpp +0 -0
  31. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/multistart.hpp +0 -0
  32. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/ocp/dynamics_type.hpp +0 -0
  33. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/ocp/timestep_method.hpp +0 -0
  34. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/ocp/transcription_method.hpp +0 -0
  35. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/ocp.hpp +0 -0
  36. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/problem.hpp +0 -0
  37. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/exit_status.hpp +0 -0
  38. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/interior_point_matrix_callbacks.hpp +0 -0
  39. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/iteration_info.hpp +0 -0
  40. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/newton.hpp +0 -0
  41. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/newton_matrix_callbacks.hpp +0 -0
  42. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/options.hpp +0 -0
  43. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/sqp_matrix_callbacks.hpp +0 -0
  44. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/all_finite.hpp +0 -0
  45. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/append_as_triplets.hpp +0 -0
  46. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/dense_regularized_ldlt.hpp +0 -0
  47. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/fraction_to_the_boundary_rule.hpp +0 -0
  48. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/inertia.hpp +0 -0
  49. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/kkt_error.hpp +0 -0
  50. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp +0 -0
  51. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/problem_scaling.hpp +0 -0
  52. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/regularized_ldlt.hpp +0 -0
  53. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/sparse_inf_norms.hpp +0 -0
  54. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/optimization/solver/util/sparse_regularized_ldlt.hpp +0 -0
  55. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/assert.hpp +0 -0
  56. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/concepts.hpp +0 -0
  57. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/empty.hpp +0 -0
  58. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/function_ref.hpp +0 -0
  59. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/intrusive_shared_ptr.hpp +0 -0
  60. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/pool.hpp +0 -0
  61. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/print.hpp +0 -0
  62. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/profiler.hpp +0 -0
  63. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/scope_exit.hpp +0 -0
  64. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/spy.hpp +0 -0
  65. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/include/sleipnir/util/symbol_exports.hpp +0 -0
  66. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/pyproject.toml +0 -0
  67. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/autodiff/bind_expression_type.cpp +0 -0
  68. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/autodiff/bind_gradient.cpp +0 -0
  69. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/autodiff/bind_hessian.cpp +0 -0
  70. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/autodiff/bind_jacobian.cpp +0 -0
  71. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/autodiff/bind_variable.cpp +0 -0
  72. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/autodiff/bind_variable_block.cpp +0 -0
  73. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/autodiff/bind_variable_matrix.cpp +0 -0
  74. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/binders.hpp +0 -0
  75. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/docstrings.hpp +0 -0
  76. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/for_each_type.hpp +0 -0
  77. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/main.cpp +0 -0
  78. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/bind_equality_constraints.cpp +0 -0
  79. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/bind_inequality_constraints.cpp +0 -0
  80. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/bind_ocp.cpp +0 -0
  81. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/bind_problem.cpp +0 -0
  82. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/ocp/bind_dynamics_type.cpp +0 -0
  83. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/ocp/bind_timestep_method.cpp +0 -0
  84. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/ocp/bind_transcription_method.cpp +0 -0
  85. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/solver/bind_exit_status.cpp +0 -0
  86. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/optimization/solver/bind_iteration_info.cpp +0 -0
  87. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/cpp/try_cast.hpp +0 -0
  88. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/src/sleipnir/autodiff/__init__.py +0 -0
  89. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/src/sleipnir/optimization/__init__.py +0 -0
  90. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/autodiff/gradient_test.py +0 -0
  91. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/autodiff/hessian_test.py +0 -0
  92. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/autodiff/jacobian_test.py +0 -0
  93. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/autodiff/variable_matrix_test.py +0 -0
  94. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/autodiff/variable_test.py +0 -0
  95. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/arm_on_elevator_problem_test.py +0 -0
  96. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/cart_pole_ocp_test.py +0 -0
  97. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/cart_pole_problem_test.py +0 -0
  98. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/cart_pole_util.py +0 -0
  99. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/constraints_test.py +0 -0
  100. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/decision_variable_test.py +0 -0
  101. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/differential_drive_ocp_test.py +0 -0
  102. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/differential_drive_problem_test.py +0 -0
  103. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/differential_drive_util.py +0 -0
  104. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/double_integrator_problem_test.py +0 -0
  105. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/flywheel_ocp_test.py +0 -0
  106. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/flywheel_problem_test.py +0 -0
  107. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/linear_problem_test.py +0 -0
  108. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/multistart_test.py +0 -0
  109. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/nonlinear_problem_test.py +0 -0
  110. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/problem_spy_test.py +0 -0
  111. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/quadratic_problem_test.py +0 -0
  112. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/rk4.py +0 -0
  113. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/python/test/optimization/trivial_problem_test.py +0 -0
  114. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/autodiff/gradient.cpp +0 -0
  115. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/autodiff/hessian.cpp +0 -0
  116. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/autodiff/jacobian.cpp +0 -0
  117. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/autodiff/variable_matrix.cpp +0 -0
  118. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/optimization/ocp.cpp +0 -0
  119. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/optimization/problem.cpp +0 -0
  120. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/optimization/solver/interior_point.cpp +0 -0
  121. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/optimization/solver/newton.cpp +0 -0
  122. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/src/optimization/solver/sqp.cpp +0 -0
  123. {sleipnirgroup_jormungandr-0.6.6.dev17 → sleipnirgroup_jormungandr-0.6.6.dev19}/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.dev17
3
+ Version: 0.6.6.dev19
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"
@@ -383,24 +382,6 @@ ExitStatus interior_point(
383
382
  ScopedProfiler inner_iter_profiler{inner_iter_prof};
384
383
  ScopedProfiler feasibility_check_profiler{feasibility_check_prof};
385
384
 
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);
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);
399
- }
400
-
401
- return ExitStatus::LOCALLY_INFEASIBLE;
402
- }
403
-
404
385
  // Check for diverging iterates
405
386
  if (x.template lpNorm<Eigen::Infinity>() > Scalar(1e10) || !x.allFinite() ||
406
387
  s.template lpNorm<Eigen::Infinity>() > Scalar(1e10) || !s.allFinite()) {
@@ -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"
@@ -260,15 +259,6 @@ ExitStatus sqp(const SQPMatrixCallbacks<Scalar>& matrix_callbacks,
260
259
  ScopedProfiler inner_iter_profiler{inner_iter_prof};
261
260
  ScopedProfiler feasibility_check_profiler{feasibility_check_prof};
262
261
 
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);
267
- }
268
-
269
- return ExitStatus::LOCALLY_INFEASIBLE;
270
- }
271
-
272
262
  // Check for diverging iterates
273
263
  if (x.template lpNorm<Eigen::Infinity>() > Scalar(1e10) || !x.allFinite()) {
274
264
  return ExitStatus::DIVERGING_ITERATES;
@@ -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 <=
@@ -110,15 +110,19 @@ void print_too_few_dofs_error(
110
110
  /// @tparam Scalar Scalar type.
111
111
  /// @param c_e The problem's equality constraints cₑ(x) evaluated at the current
112
112
  /// iterate.
113
+ /// @param tolerance Constraint violations at or below this tolerance aren't
114
+ /// printed.
113
115
  template <typename Scalar>
114
116
  void print_c_e_local_infeasibility_error(
115
- const Eigen::Vector<Scalar, Eigen::Dynamic>& c_e) {
117
+ const Eigen::Vector<Scalar, Eigen::Dynamic>& c_e, Scalar tolerance) {
118
+ using std::abs;
119
+
116
120
  slp::println(
117
121
  "The problem is locally infeasible due to violated equality "
118
122
  "constraints.");
119
123
  slp::println("Violated constraints (cₑ(x) = 0) in order of declaration:");
120
124
  for (int row = 0; row < c_e.rows(); ++row) {
121
- if (c_e[row] < Scalar(0)) {
125
+ if (abs(c_e[row]) > tolerance) {
122
126
  slp::println(" {}/{}: {} = 0", row + 1, c_e.rows(), c_e[row]);
123
127
  }
124
128
  }
@@ -133,15 +137,17 @@ void print_c_e_local_infeasibility_error(
133
137
  /// @tparam Scalar Scalar type.
134
138
  /// @param c_i The problem's inequality constraints cᵢ(x) evaluated at the
135
139
  /// current iterate.
140
+ /// @param tolerance Constraint violations at or below this tolerance aren't
141
+ /// printed.
136
142
  template <typename Scalar>
137
143
  void print_c_i_local_infeasibility_error(
138
- const Eigen::Vector<Scalar, Eigen::Dynamic>& c_i) {
144
+ const Eigen::Vector<Scalar, Eigen::Dynamic>& c_i, Scalar tolerance) {
139
145
  slp::println(
140
146
  "The problem is locally infeasible due to violated inequality "
141
147
  "constraints.");
142
148
  slp::println("Violated constraints (cᵢ(x) ≥ 0) in order of declaration:");
143
149
  for (int row = 0; row < c_i.rows(); ++row) {
144
- if (c_i[row] < Scalar(0)) {
150
+ if (c_i[row] < -tolerance) {
145
151
  slp::println(" {}/{}: {} ≥ 0", row + 1, c_i.rows(), c_i[row]);
146
152
  }
147
153
  }
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._sleipnir import *
4
4
 
5
- __version__ = "0.6.6.dev17"
5
+ __version__ = "0.6.6.dev19"
@@ -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