sleipnirgroup-jormungandr 0.6.7.dev22__tar.gz → 0.6.7.dev24__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.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/PKG-INFO +1 -1
  2. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/bounds.hpp +28 -24
  3. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/src/sleipnir/__init__.py +1 -1
  4. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/cart_pole_ocp_test.py +39 -28
  5. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/differential_drive_ocp_test.py +18 -23
  6. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/CMakeLists.txt +0 -0
  7. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/LICENSE.txt +0 -0
  8. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/README.md +0 -0
  9. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/SleipnirConfig.cmake.in +0 -0
  10. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/cmake/BuildTypes.cmake +0 -0
  11. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/cmake/CompilerFlags.cmake +0 -0
  12. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/cmake/Pybind11Mkdoc.cmake +0 -0
  13. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/cmake/SubdirList.cmake +0 -0
  14. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/cmake/arm-none-eabi.cmake +0 -0
  15. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/expression.hpp +0 -0
  16. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/expression_graph.hpp +0 -0
  17. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/expression_type.hpp +0 -0
  18. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/gradient.hpp +0 -0
  19. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/hessian.hpp +0 -0
  20. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/jacobian.hpp +0 -0
  21. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/sleipnir_base.hpp +0 -0
  22. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/slice.hpp +0 -0
  23. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/variable.hpp +0 -0
  24. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/variable_block.hpp +0 -0
  25. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/autodiff/variable_matrix.hpp +0 -0
  26. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/multistart.hpp +0 -0
  27. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/ocp/dynamics_type.hpp +0 -0
  28. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/ocp/timestep_method.hpp +0 -0
  29. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/ocp/transcription_method.hpp +0 -0
  30. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/ocp.hpp +0 -0
  31. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/problem.hpp +0 -0
  32. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/exit_status.hpp +0 -0
  33. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/ipm.hpp +0 -0
  34. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/ipm_matrix_callbacks.hpp +0 -0
  35. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/iteration_info.hpp +0 -0
  36. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/newton.hpp +0 -0
  37. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/newton_matrix_callbacks.hpp +0 -0
  38. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/options.hpp +0 -0
  39. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/sqp.hpp +0 -0
  40. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/sqp_matrix_callbacks.hpp +0 -0
  41. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/all_finite.hpp +0 -0
  42. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/append_as_triplets.hpp +0 -0
  43. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/dense_kkt_solver.hpp +0 -0
  44. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/feasibility_restoration.hpp +0 -0
  45. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/filter.hpp +0 -0
  46. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/fraction_to_the_boundary_rule.hpp +0 -0
  47. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/inertia.hpp +0 -0
  48. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/kkt_error.hpp +0 -0
  49. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/kkt_solver.hpp +0 -0
  50. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp +0 -0
  51. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/problem_scaling.hpp +0 -0
  52. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/sparse_inf_norms.hpp +0 -0
  53. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/optimization/solver/util/sparse_kkt_solver.hpp +0 -0
  54. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/assert.hpp +0 -0
  55. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/concepts.hpp +0 -0
  56. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/empty.hpp +0 -0
  57. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/function_ref.hpp +0 -0
  58. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/intrusive_shared_ptr.hpp +0 -0
  59. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/pool.hpp +0 -0
  60. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/print.hpp +0 -0
  61. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/print_diagnostics.hpp +0 -0
  62. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/profiler.hpp +0 -0
  63. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/scope_exit.hpp +0 -0
  64. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/spy.hpp +0 -0
  65. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/include/sleipnir/util/symbol_exports.hpp +0 -0
  66. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/pyproject.toml +0 -0
  67. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/autodiff/bind_expression_type.cpp +0 -0
  68. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/autodiff/bind_gradient.cpp +0 -0
  69. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/autodiff/bind_hessian.cpp +0 -0
  70. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/autodiff/bind_jacobian.cpp +0 -0
  71. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/autodiff/bind_variable.cpp +0 -0
  72. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/autodiff/bind_variable_block.cpp +0 -0
  73. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/autodiff/bind_variable_matrix.cpp +0 -0
  74. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/binders.hpp +0 -0
  75. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/docstrings.hpp +0 -0
  76. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/for_each_type.hpp +0 -0
  77. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/main.cpp +0 -0
  78. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/bind_equality_constraints.cpp +0 -0
  79. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/bind_inequality_constraints.cpp +0 -0
  80. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/bind_ocp.cpp +0 -0
  81. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/bind_problem.cpp +0 -0
  82. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/ocp/bind_dynamics_type.cpp +0 -0
  83. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/ocp/bind_timestep_method.cpp +0 -0
  84. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/ocp/bind_transcription_method.cpp +0 -0
  85. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/solver/bind_exit_status.cpp +0 -0
  86. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/optimization/solver/bind_iteration_info.cpp +0 -0
  87. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/cpp/try_cast.hpp +0 -0
  88. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/src/sleipnir/autodiff/__init__.py +0 -0
  89. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/src/sleipnir/optimization/__init__.py +0 -0
  90. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/autodiff/gradient_test.py +0 -0
  91. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/autodiff/hessian_test.py +0 -0
  92. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/autodiff/jacobian_test.py +0 -0
  93. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/autodiff/variable_matrix_test.py +0 -0
  94. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/autodiff/variable_test.py +0 -0
  95. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/arm_on_elevator_problem_test.py +0 -0
  96. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/cart_pole_problem_test.py +0 -0
  97. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/cart_pole_util.py +0 -0
  98. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/constraints_test.py +0 -0
  99. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/decision_variable_test.py +0 -0
  100. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/differential_drive_problem_test.py +0 -0
  101. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/differential_drive_util.py +0 -0
  102. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/double_integrator_problem_test.py +0 -0
  103. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/flywheel_ocp_test.py +0 -0
  104. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/flywheel_problem_test.py +0 -0
  105. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/linear_problem_test.py +0 -0
  106. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/multistart_test.py +0 -0
  107. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/near.py +0 -0
  108. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/nonlinear_problem_test.py +0 -0
  109. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/problem_spy_test.py +0 -0
  110. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/quadratic_problem_test.py +0 -0
  111. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/rk4.py +0 -0
  112. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/solver/exit_status_test.py +0 -0
  113. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/python/test/optimization/trivial_problem_test.py +0 -0
  114. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/autodiff/gradient.cpp +0 -0
  115. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/autodiff/hessian.cpp +0 -0
  116. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/autodiff/jacobian.cpp +0 -0
  117. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/autodiff/variable_matrix.cpp +0 -0
  118. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/optimization/ocp.cpp +0 -0
  119. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/optimization/problem.cpp +0 -0
  120. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/optimization/solver/ipm.cpp +0 -0
  121. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/optimization/solver/newton.cpp +0 -0
  122. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/optimization/solver/sqp.cpp +0 -0
  123. {sleipnirgroup_jormungandr-0.6.7.dev22 → sleipnirgroup_jormungandr-0.6.7.dev24}/src/util/pool.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sleipnirgroup-jormungandr
3
- Version: 0.6.7.dev22
3
+ Version: 0.6.7.dev24
4
4
  Summary: Reverse mode autodiff library and NLP solver DSL
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE.txt
@@ -48,27 +48,35 @@ struct Bounds {
48
48
  /// @param inequality_constraints Variables representing the left-hand side of
49
49
  /// cᵢ(decision_variables) ≥ 0.
50
50
  /// @param A_i The Jacobian of inequality_constraints wrt decision_variables,
51
- /// evaluated anywhere, in *row-major* storage; in practice, since we
52
- /// typically store Jacobians column-major, the user of this function must
53
- /// perform a transpose.
51
+ /// evaluated anywhere.
54
52
  template <typename Scalar>
55
- Bounds<Scalar> get_bounds(
56
- std::span<Variable<Scalar>> decision_variables,
57
- std::span<Variable<Scalar>> inequality_constraints,
58
- const Eigen::SparseMatrix<Scalar, Eigen::RowMajor>& A_i) {
59
- // TODO: A blocked, out-of-place transpose should be much faster than
60
- // traversing row major on a column major matrix unless we have few linear
61
- // constraints (using a heuristic to choose between this and staying column
62
- // major based on the number of constraints would be an easy performance
63
- // improvement.)
64
-
53
+ Bounds<Scalar> get_bounds(std::span<Variable<Scalar>> decision_variables,
54
+ std::span<Variable<Scalar>> inequality_constraints,
55
+ const Eigen::SparseMatrix<Scalar>& A_i) {
65
56
  // NB: Casting to long is unspecified if the size of decision_variable.size()
66
57
  // is greater than the max long value, but then we wouldn't be able to fill
67
58
  // A_i correctly anyway.
68
59
  slp_assert(static_cast<Eigen::Index>(decision_variables.size()) ==
69
- A_i.innerSize());
60
+ A_i.cols());
70
61
  slp_assert(static_cast<Eigen::Index>(inequality_constraints.size()) ==
71
- A_i.outerSize());
62
+ A_i.rows());
63
+
64
+ // For each row of A_i, count its structural nonzeros and record the column
65
+ // and value of its most recently visited nonzero. If the count is 1, that's
66
+ // the row's only nonzero; otherwise, the recorded column and value are
67
+ // meaningless, but those rows aren't bound constraints, so they're never
68
+ // read.
69
+ gch::small_vector<int> row_num_nonzeros(A_i.rows(), 0);
70
+ gch::small_vector<int> row_nonzero_col(A_i.rows());
71
+ gch::small_vector<Scalar> row_nonzero_value(A_i.rows());
72
+ for (int col = 0; col < A_i.outerSize(); ++col) {
73
+ for (typename Eigen::SparseMatrix<Scalar>::InnerIterator it{A_i, col}; it;
74
+ ++it) {
75
+ ++row_num_nonzeros[it.row()];
76
+ row_nonzero_col[it.row()] = it.col();
77
+ row_nonzero_value[it.row()] = it.value();
78
+ }
79
+ }
72
80
 
73
81
  // Maps each decision variable's index to the indices of its upper and lower
74
82
  // bounds if they exist, or NO_BOUND if they do not; used only for bookkeeping
@@ -102,10 +110,7 @@ Bounds<Scalar> get_bounds(
102
110
  ExpressionType::LINEAR) {
103
111
  continue;
104
112
  }
105
- const Eigen::SparseVector<Scalar>& row_A_i =
106
- A_i.innerVector(constraint_index);
107
- const auto non_zeros = row_A_i.nonZeros();
108
- if (non_zeros != 1) {
113
+ if (row_num_nonzeros[constraint_index] != 1) {
109
114
  // Constraint is not a bound because either:
110
115
  //
111
116
  // 1. It's in more than one variable
@@ -122,10 +127,9 @@ Bounds<Scalar> get_bounds(
122
127
  // and a ≠ 0. The gradient of c is then aeᵢ (where eᵢ denotes the i-th basis
123
128
  // element), and c(0) = b. If c(x) ≥ 0, then since either a < 0 or a > 0, we
124
129
  // have either x ≤ -b/a or x ≥ -b/a, respectively. ∎
125
- typename Eigen::SparseVector<Scalar>::InnerIterator row_iter(row_A_i);
126
- const auto constraint_coefficient =
127
- row_iter
128
- .value(); // The nonzero value of the j-th constraint's gradient.
130
+ //
131
+ // The nonzero value of the j-th constraint's gradient.
132
+ const auto constraint_coefficient = row_nonzero_value[constraint_index];
129
133
 
130
134
  // The Jacobian's sparsity pattern is structural, so the single stored value
131
135
  // can be zero if the constraint's terms cancel (e.g., x − x + 1 ≥ 0). The
@@ -134,7 +138,7 @@ Bounds<Scalar> get_bounds(
134
138
  continue;
135
139
  }
136
140
 
137
- const auto decision_variable_index = row_iter.index();
141
+ const auto decision_variable_index = row_nonzero_col[constraint_index];
138
142
  const auto decision_variable_value =
139
143
  decision_variables[decision_variable_index].value();
140
144
  Scalar constraint_constant;
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._sleipnir import *
4
4
 
5
- __version__ = "0.6.7.dev22"
5
+ __version__ = "0.6.7.dev24"
@@ -6,7 +6,6 @@ from cart_pole_util import (
6
6
  cart_pole_dynamics_double,
7
7
  cart_pole_dynamics_variable,
8
8
  )
9
- from rk4 import rk4
10
9
  from sleipnir.autodiff import ExpressionType, VariableMatrix
11
10
  from sleipnir.optimization import (
12
11
  OCP,
@@ -86,28 +85,37 @@ def test_cart_pole_ocp():
86
85
  assert X.value(2, 0) == pytest.approx(x_initial[2, 0], abs=1e-8)
87
86
  assert X.value(3, 0) == pytest.approx(x_initial[3, 0], abs=1e-8)
88
87
 
89
- # FIXME: Replay diverges
90
- if 0:
91
- # Verify solution
92
- x = np.zeros((4, 1))
93
- u = np.zeros((1, 1))
94
- for k in range(N):
95
- # Cart position constraints
96
- assert X[0, k] >= 0.0
97
- assert X[0, k] <= d_max
98
-
99
- # Input constraints
100
- assert U[0, k] >= -u_max
101
- assert U[0, k] <= u_max
102
-
103
- # Verify state
104
- assert X.value(0, k) == pytest.approx(x[0, 0], abs=1e-2)
105
- assert X.value(1, k) == pytest.approx(x[1, 0], abs=1e-2)
106
- assert X.value(2, k) == pytest.approx(x[2, 0], abs=1e-2)
107
- assert X.value(3, k) == pytest.approx(x[3, 0], abs=1e-2)
108
-
109
- # Project state forward
110
- x = rk4(cart_pole_dynamics_double, x, u, dt)
88
+ # Verify solution
89
+ for k in range(N):
90
+ # Cart position constraints
91
+ assert X.value(0, k) >= 0.0
92
+ assert X.value(0, k) <= d_max
93
+
94
+ # Input constraints
95
+ assert U.value(0, k) >= -u_max
96
+ assert U.value(0, k) <= u_max
97
+
98
+ # Dynamics constraints
99
+ #
100
+ # Direct collocation constrains the system dynamics at the midpoint of a
101
+ # cubic Hermite spline through each pair of adjacent states.
102
+ f = cart_pole_dynamics_double
103
+ h = problem.dt().value(0, k)
104
+ x_begin = X[:, k : k + 1].value()
105
+ x_end = X[:, k + 1 : k + 2].value()
106
+ u_begin = U[:, k : k + 1].value()
107
+ u_end = U[:, k + 1 : k + 2].value()
108
+
109
+ xdot_begin = f(x_begin, u_begin)
110
+ xdot_end = f(x_end, u_end)
111
+ xdot_c = -3.0 / (2.0 * h) * (x_begin - x_end) - 0.25 * (xdot_begin + xdot_end)
112
+
113
+ x_c = 0.5 * (x_begin + x_end) + h / 8.0 * (xdot_begin - xdot_end)
114
+ u_c = 0.5 * (u_begin + u_end)
115
+
116
+ expected_xdot_c = f(x_c, u_c)
117
+ for row in range(xdot_c.shape[0]):
118
+ assert xdot_c[row, 0] == pytest.approx(expected_xdot_c[row, 0], abs=1e-8)
111
119
 
112
120
  # Verify final state
113
121
  assert X.value(0, N) == pytest.approx(x_final[0, 0], abs=1e-8)
@@ -121,17 +129,20 @@ def test_cart_pole_ocp():
121
129
  "Time (s),Cart position (m),Pole angle (rad),Cart velocity (m/s),Pole angular velocity (rad/s)\n"
122
130
  )
123
131
 
132
+ time = 0.0
124
133
  for k in range(N + 1):
125
134
  f.write(
126
- f"{k * dt},{X.value(0, k)},{X.value(1, k)},{X.value(2, k)},{X.value(3, k)}\n"
135
+ f"{time},{X.value(0, k)},{X.value(1, k)},{X.value(2, k)},{X.value(3, k)}\n"
127
136
  )
128
137
 
138
+ time += problem.dt().value(0, k)
139
+
129
140
  # Log inputs for offline viewing
130
141
  with open("Cart-pole inputs.csv", "w") as f:
131
142
  f.write("Time (s),Cart force (N)\n")
132
143
 
144
+ time = 0.0
133
145
  for k in range(N + 1):
134
- if k < N:
135
- f.write(f"{k * dt},{U.value(0, k)}\n")
136
- else:
137
- f.write(f"{k * dt},0.0\n")
146
+ f.write(f"{time},{U.value(0, k)}\n")
147
+
148
+ time += problem.dt().value(0, k)
@@ -68,29 +68,24 @@ def test_differential_drive_ocp():
68
68
  assert X.value(3, 0) == pytest.approx(x_initial[3, 0], abs=1e-8)
69
69
  assert X.value(4, 0) == pytest.approx(x_initial[4, 0], abs=1e-8)
70
70
 
71
- # FIXME: Replay diverges
72
- if 0:
73
- # Verify solution
74
- x = np.zeros((5, 1))
75
- u = np.zeros((2, 1))
76
- for k in range(N):
77
- u = U[:, k : k + 1].value()
78
-
79
- # Input constraints
80
- assert U[0, k].value() >= -u_max[0]
81
- assert U[0, k].value() <= u_max[0]
82
- assert U[1, k].value() >= -u_max[1]
83
- assert U[1, k].value() <= u_max[1]
84
-
85
- # Verify state
86
- assert X.value(0, k) == pytest.approx(x[0, 0], abs=1e-8)
87
- assert X.value(1, k) == pytest.approx(x[1, 0], abs=1e-8)
88
- assert X.value(2, k) == pytest.approx(x[2, 0], abs=1e-8)
89
- assert X.value(3, k) == pytest.approx(x[3, 0], abs=1e-8)
90
- assert X.value(4, k) == pytest.approx(x[4, 0], abs=1e-8)
91
-
92
- # Project state forward
93
- x = rk4(differential_drive_dynamics_double, x, u, problem.dt().value(0, k))
71
+ # Verify solution
72
+ for k in range(N):
73
+ # Input constraints
74
+ assert U.value(0, k) >= -u_max[0, 0]
75
+ assert U.value(0, k) <= u_max[0, 0]
76
+ assert U.value(1, k) >= -u_max[1, 0]
77
+ assert U.value(1, k) <= u_max[1, 0]
78
+
79
+ # Dynamics constraints
80
+ expected_x_k1 = rk4(
81
+ differential_drive_dynamics_double,
82
+ X[:, k : k + 1].value(),
83
+ U[:, k : k + 1].value(),
84
+ problem.dt().value(0, k),
85
+ )
86
+ actual_x_k1 = X[:, k + 1 : k + 2].value()
87
+ for row in range(actual_x_k1.shape[0]):
88
+ assert actual_x_k1[row, 0] == pytest.approx(expected_x_k1[row, 0], abs=1e-8)
94
89
 
95
90
  # Verify final state
96
91
  assert X.value(0, N) == pytest.approx(x_final[0, 0], abs=1e-8)