sleipnirgroup-jormungandr 0.6.7.dev13__tar.gz → 0.6.7.dev15__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (122) hide show
  1. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/CMakeLists.txt +3 -0
  2. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/PKG-INFO +1 -1
  3. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/expression.hpp +177 -75
  4. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/variable.hpp +26 -1
  5. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/docstrings.hpp +19 -0
  6. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/src/sleipnir/__init__.py +1 -1
  7. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/LICENSE.txt +0 -0
  8. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/README.md +0 -0
  9. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/SleipnirConfig.cmake.in +0 -0
  10. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/cmake/BuildTypes.cmake +0 -0
  11. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/cmake/CompilerFlags.cmake +0 -0
  12. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/cmake/Pybind11Mkdoc.cmake +0 -0
  13. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/cmake/SubdirList.cmake +0 -0
  14. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/cmake/arm-none-eabi.cmake +0 -0
  15. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/expression_graph.hpp +0 -0
  16. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/expression_type.hpp +0 -0
  17. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/gradient.hpp +0 -0
  18. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/hessian.hpp +0 -0
  19. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/jacobian.hpp +0 -0
  20. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/sleipnir_base.hpp +0 -0
  21. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/slice.hpp +0 -0
  22. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/variable_block.hpp +0 -0
  23. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/autodiff/variable_matrix.hpp +0 -0
  24. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/multistart.hpp +0 -0
  25. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/ocp/dynamics_type.hpp +0 -0
  26. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/ocp/timestep_method.hpp +0 -0
  27. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/ocp/transcription_method.hpp +0 -0
  28. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/ocp.hpp +0 -0
  29. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/problem.hpp +0 -0
  30. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/exit_status.hpp +0 -0
  31. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/ipm.hpp +0 -0
  32. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/ipm_matrix_callbacks.hpp +0 -0
  33. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/iteration_info.hpp +0 -0
  34. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/newton.hpp +0 -0
  35. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/newton_matrix_callbacks.hpp +0 -0
  36. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/options.hpp +0 -0
  37. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/sqp.hpp +0 -0
  38. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/sqp_matrix_callbacks.hpp +0 -0
  39. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/all_finite.hpp +0 -0
  40. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/append_as_triplets.hpp +0 -0
  41. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/bounds.hpp +0 -0
  42. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/dense_kkt_solver.hpp +0 -0
  43. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/feasibility_restoration.hpp +0 -0
  44. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/filter.hpp +0 -0
  45. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/fraction_to_the_boundary_rule.hpp +0 -0
  46. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/inertia.hpp +0 -0
  47. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/kkt_error.hpp +0 -0
  48. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/kkt_solver.hpp +0 -0
  49. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/lagrange_multiplier_estimate.hpp +0 -0
  50. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/problem_scaling.hpp +0 -0
  51. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/sparse_inf_norms.hpp +0 -0
  52. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/optimization/solver/util/sparse_kkt_solver.hpp +0 -0
  53. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/assert.hpp +0 -0
  54. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/concepts.hpp +0 -0
  55. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/empty.hpp +0 -0
  56. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/function_ref.hpp +0 -0
  57. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/intrusive_shared_ptr.hpp +0 -0
  58. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/pool.hpp +0 -0
  59. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/print.hpp +0 -0
  60. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/print_diagnostics.hpp +0 -0
  61. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/profiler.hpp +0 -0
  62. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/scope_exit.hpp +0 -0
  63. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/spy.hpp +0 -0
  64. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/include/sleipnir/util/symbol_exports.hpp +0 -0
  65. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/pyproject.toml +0 -0
  66. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/autodiff/bind_expression_type.cpp +0 -0
  67. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/autodiff/bind_gradient.cpp +0 -0
  68. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/autodiff/bind_hessian.cpp +0 -0
  69. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/autodiff/bind_jacobian.cpp +0 -0
  70. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/autodiff/bind_variable.cpp +0 -0
  71. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/autodiff/bind_variable_block.cpp +0 -0
  72. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/autodiff/bind_variable_matrix.cpp +0 -0
  73. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/binders.hpp +0 -0
  74. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/for_each_type.hpp +0 -0
  75. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/main.cpp +0 -0
  76. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/bind_equality_constraints.cpp +0 -0
  77. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/bind_inequality_constraints.cpp +0 -0
  78. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/bind_ocp.cpp +0 -0
  79. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/bind_problem.cpp +0 -0
  80. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/ocp/bind_dynamics_type.cpp +0 -0
  81. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/ocp/bind_timestep_method.cpp +0 -0
  82. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/ocp/bind_transcription_method.cpp +0 -0
  83. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/solver/bind_exit_status.cpp +0 -0
  84. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/optimization/solver/bind_iteration_info.cpp +0 -0
  85. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/cpp/try_cast.hpp +0 -0
  86. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/src/sleipnir/autodiff/__init__.py +0 -0
  87. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/src/sleipnir/optimization/__init__.py +0 -0
  88. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/autodiff/gradient_test.py +0 -0
  89. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/autodiff/hessian_test.py +0 -0
  90. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/autodiff/jacobian_test.py +0 -0
  91. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/autodiff/variable_matrix_test.py +0 -0
  92. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/autodiff/variable_test.py +0 -0
  93. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/arm_on_elevator_problem_test.py +0 -0
  94. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/cart_pole_ocp_test.py +0 -0
  95. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/cart_pole_problem_test.py +0 -0
  96. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/cart_pole_util.py +0 -0
  97. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/constraints_test.py +0 -0
  98. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/decision_variable_test.py +0 -0
  99. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/differential_drive_ocp_test.py +0 -0
  100. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/differential_drive_problem_test.py +0 -0
  101. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/differential_drive_util.py +0 -0
  102. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/double_integrator_problem_test.py +0 -0
  103. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/flywheel_ocp_test.py +0 -0
  104. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/flywheel_problem_test.py +0 -0
  105. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/linear_problem_test.py +0 -0
  106. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/multistart_test.py +0 -0
  107. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/nonlinear_problem_test.py +0 -0
  108. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/problem_spy_test.py +0 -0
  109. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/quadratic_problem_test.py +0 -0
  110. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/rk4.py +0 -0
  111. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/solver/exit_status_test.py +0 -0
  112. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/python/test/optimization/trivial_problem_test.py +0 -0
  113. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/autodiff/gradient.cpp +0 -0
  114. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/autodiff/hessian.cpp +0 -0
  115. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/autodiff/jacobian.cpp +0 -0
  116. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/autodiff/variable_matrix.cpp +0 -0
  117. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/optimization/ocp.cpp +0 -0
  118. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/optimization/problem.cpp +0 -0
  119. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/optimization/solver/ipm.cpp +0 -0
  120. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/optimization/solver/newton.cpp +0 -0
  121. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/optimization/solver/sqp.cpp +0 -0
  122. {sleipnirgroup_jormungandr-0.6.7.dev13 → sleipnirgroup_jormungandr-0.6.7.dev15}/src/util/pool.cpp +0 -0
@@ -111,6 +111,9 @@ if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING AND NOT CMAKE_CROSSCOMPILING)
111
111
  SYSTEM
112
112
  )
113
113
  FetchContent_MakeAvailable(Catch2)
114
+
115
+ # Enable StringMaker<std::string_view>
116
+ target_compile_features(Catch2 PRIVATE cxx_std_23)
114
117
  endif()
115
118
 
116
119
  install(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sleipnirgroup-jormungandr
3
- Version: 0.6.7.dev13
3
+ Version: 0.6.7.dev15
4
4
  Summary: Reverse mode autodiff library and NLP solver DSL
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE.txt
@@ -9,6 +9,7 @@
9
9
  #include <memory>
10
10
  #include <numbers>
11
11
  #include <string_view>
12
+ #include <type_traits>
12
13
  #include <utility>
13
14
 
14
15
  #include <gch/small_vector.hpp>
@@ -1396,11 +1397,11 @@ template <typename Scalar>
1396
1397
  ExpressionPtr<Scalar> hypot(const ExpressionPtr<Scalar>& x,
1397
1398
  const ExpressionPtr<Scalar>& y);
1398
1399
 
1399
- /// Derived expression type for hypot().
1400
+ /// Derived expression type for hypot() with two arguments.
1400
1401
  ///
1401
1402
  /// @tparam Scalar Scalar type.
1402
1403
  template <typename Scalar>
1403
- struct HypotExpression final : Expression<Scalar> {
1404
+ struct Hypot2Expression final : Expression<Scalar> {
1404
1405
  /// Binary operator's left operand.
1405
1406
  ExpressionPtr<Scalar> x;
1406
1407
 
@@ -1411,7 +1412,7 @@ struct HypotExpression final : Expression<Scalar> {
1411
1412
  ///
1412
1413
  /// @param x Binary operator's left operand.
1413
1414
  /// @param y Binary operator's right operand.
1414
- constexpr HypotExpression(ExpressionPtr<Scalar> x, ExpressionPtr<Scalar> y)
1415
+ constexpr Hypot2Expression(ExpressionPtr<Scalar> x, ExpressionPtr<Scalar> y)
1415
1416
  : x{std::move(x)}, y{std::move(y)} {}
1416
1417
 
1417
1418
  void visit_args(
@@ -1430,32 +1431,16 @@ struct HypotExpression final : Expression<Scalar> {
1430
1431
  std::string_view name() const override { return "hypot"; }
1431
1432
 
1432
1433
  void accumulate_adjoints() const override {
1433
- x->adj += grad_l();
1434
- y->adj += grad_r();
1435
- }
1436
-
1437
- void accumulate_adjoints_expr() const override {
1438
- x->adj_expr += grad_expr_l();
1439
- y->adj_expr += grad_expr_r();
1440
- }
1441
-
1442
- private:
1443
- Scalar grad_l() const {
1444
- using std::hypot;
1445
- return this->adj * x->val / hypot(x->val, y->val);
1446
- }
1447
-
1448
- Scalar grad_r() const {
1449
1434
  using std::hypot;
1450
- return this->adj * y->val / hypot(x->val, y->val);
1451
- }
1452
-
1453
- ExpressionPtr<Scalar> grad_expr_l() const {
1454
- return this->adj_expr * x / hypot(x, y);
1435
+ Scalar norm = hypot(x->val, y->val);
1436
+ x->adj += this->adj * x->val / norm;
1437
+ y->adj += this->adj * y->val / norm;
1455
1438
  }
1456
1439
 
1457
- ExpressionPtr<Scalar> grad_expr_r() const {
1458
- return this->adj_expr * y / hypot(x, y);
1440
+ void accumulate_adjoints_expr() const override {
1441
+ auto norm = hypot(x, y);
1442
+ x->adj_expr += this->adj_expr * x / norm;
1443
+ y->adj_expr += this->adj_expr * y / norm;
1459
1444
  }
1460
1445
  };
1461
1446
 
@@ -1482,89 +1467,210 @@ ExpressionPtr<Scalar> hypot(const ExpressionPtr<Scalar>& x,
1482
1467
  return constant_ptr(hypot(x->val, y->val));
1483
1468
  }
1484
1469
 
1485
- return make_expression_ptr<HypotExpression<Scalar>>(x, y);
1470
+ return make_expression_ptr<Hypot2Expression<Scalar>>(x, y);
1486
1471
  }
1487
1472
 
1488
- /// Derived expression type for is_nonnegative().
1473
+ template <typename Scalar>
1474
+ ExpressionPtr<Scalar> hypot(const ExpressionPtr<Scalar>& x,
1475
+ const ExpressionPtr<Scalar>& y,
1476
+ const ExpressionPtr<Scalar>& z);
1477
+
1478
+ /// Derived expression type for hypot() with three arguments.
1489
1479
  ///
1490
1480
  /// @tparam Scalar Scalar type.
1491
1481
  template <typename Scalar>
1492
- struct IsNonnegativeExpression final : Expression<Scalar> {
1493
- /// Unary operator's operand.
1482
+ struct Hypot3Expression final : Expression<Scalar> {
1483
+ /// Ternary operator's first operand.
1494
1484
  ExpressionPtr<Scalar> x;
1495
1485
 
1496
- /// Constructs an unary expression (an operator with one argument).
1486
+ /// Ternary operator's second operand.
1487
+ ExpressionPtr<Scalar> y;
1488
+
1489
+ /// Ternary operator's third operand.
1490
+ ExpressionPtr<Scalar> z;
1491
+
1492
+ /// Constructs a ternary expression (an operator with three arguments).
1497
1493
  ///
1498
- /// @param x Unary operator's operand.
1499
- explicit constexpr IsNonnegativeExpression(ExpressionPtr<Scalar> x)
1500
- : x{std::move(x)} {}
1494
+ /// @param x Ternary operator's first operand.
1495
+ /// @param y Ternary operator's second operand.
1496
+ /// @param z Ternary operator's third operand.
1497
+ constexpr Hypot3Expression(ExpressionPtr<Scalar> x, ExpressionPtr<Scalar> y,
1498
+ ExpressionPtr<Scalar> z)
1499
+ : x{std::move(x)}, y{std::move(y)}, z{std::move(z)} {}
1501
1500
 
1502
1501
  void visit_args(
1503
1502
  function_ref<void(Expression<Scalar>* arg)> func) const override {
1504
1503
  func(x.get());
1504
+ func(y.get());
1505
+ func(z.get());
1505
1506
  }
1506
1507
 
1507
1508
  Scalar value() const override {
1508
- return x->val >= Scalar(0) ? Scalar(1) : Scalar(0);
1509
+ using std::hypot;
1510
+ return hypot(x->val, y->val, z->val);
1509
1511
  }
1510
1512
 
1511
1513
  ExpressionType type() const override { return ExpressionType::NONLINEAR; }
1512
1514
 
1513
- std::string_view name() const override { return "is nonnegative"; }
1515
+ std::string_view name() const override { return "hypot"; }
1516
+
1517
+ void accumulate_adjoints() const override {
1518
+ using std::hypot;
1519
+ Scalar norm = hypot(x->val, y->val, z->val);
1520
+ x->adj += this->adj * x->val / norm;
1521
+ y->adj += this->adj * y->val / norm;
1522
+ z->adj += this->adj * z->val / norm;
1523
+ }
1524
+
1525
+ void accumulate_adjoints_expr() const override {
1526
+ auto norm = hypot(x, y, z);
1527
+ x->adj_expr += this->adj_expr * x / norm;
1528
+ y->adj_expr += this->adj_expr * y / norm;
1529
+ z->adj_expr += this->adj_expr * z / norm;
1530
+ }
1514
1531
  };
1515
1532
 
1516
- /// Returns one if x is nonnegative and zero otherwise.
1533
+ /// hypot() for Expressions.
1517
1534
  ///
1518
1535
  /// @tparam Scalar Scalar type.
1519
- /// @param x The argument.
1536
+ /// @param x The x argument.
1537
+ /// @param y The y argument.
1538
+ /// @param z The z argument.
1520
1539
  template <typename Scalar>
1521
- ExpressionPtr<Scalar> is_nonnegative(const ExpressionPtr<Scalar>& x) {
1522
- if (x->type() == ExpressionType::CONSTANT) {
1523
- return constant_ptr(x->val >= Scalar(0) ? Scalar(1) : Scalar(0));
1540
+ ExpressionPtr<Scalar> hypot(const ExpressionPtr<Scalar>& x,
1541
+ const ExpressionPtr<Scalar>& y,
1542
+ const ExpressionPtr<Scalar>& z) {
1543
+ using enum ExpressionType;
1544
+ using std::hypot;
1545
+
1546
+ // Prune expression
1547
+ if (x->is_constant(Scalar(0))) {
1548
+ return hypot(y, z);
1549
+ } else if (y->is_constant(Scalar(0))) {
1550
+ return hypot(x, z);
1551
+ } else if (z->is_constant(Scalar(0))) {
1552
+ return hypot(x, y);
1524
1553
  }
1525
1554
 
1526
- return make_expression_ptr<IsNonnegativeExpression<Scalar>>(x);
1555
+ // Evaluate constant
1556
+ if (x->type() == CONSTANT && y->type() == CONSTANT && z->type() == CONSTANT) {
1557
+ return constant_ptr(hypot(x->val, y->val, z->val));
1558
+ }
1559
+
1560
+ return make_expression_ptr<Hypot3Expression<Scalar>>(x, y, z);
1527
1561
  }
1528
1562
 
1529
- /// Derived expression type for is_positive().
1563
+ /// Derived expression type for if_else().
1564
+ ///
1565
+ /// Returns t if cond(a, b) is true, otherwise f.
1530
1566
  ///
1531
1567
  /// @tparam Scalar Scalar type.
1532
1568
  template <typename Scalar>
1533
- struct IsPositiveExpression final : Expression<Scalar> {
1534
- /// Unary operator's operand.
1535
- ExpressionPtr<Scalar> x;
1569
+ struct IfElseExpression final : Expression<Scalar> {
1570
+ /// Condition evaluated on a and b.
1571
+ bool (*cond)(Scalar a, Scalar b);
1536
1572
 
1537
- /// Constructs an unary expression (an operator with one argument).
1573
+ /// The condition's first argument.
1574
+ ExpressionPtr<Scalar> a;
1575
+
1576
+ /// The condition's second argument.
1577
+ ExpressionPtr<Scalar> b;
1578
+
1579
+ /// Value selected when cond(a, b) is true.
1580
+ ExpressionPtr<Scalar> t;
1581
+
1582
+ /// Value selected when cond(a, b) is false.
1583
+ ExpressionPtr<Scalar> f;
1584
+
1585
+ /// Constructs an if-else expression.
1538
1586
  ///
1539
- /// @param x Unary operator's operand.
1540
- explicit constexpr IsPositiveExpression(ExpressionPtr<Scalar> x)
1541
- : x{std::move(x)} {}
1587
+ /// @param cond Condition evaluated on a and b.
1588
+ /// @param a The condition's first argument.
1589
+ /// @param b The condition's second argument.
1590
+ /// @param t Value selected when cond(a, b) is true.
1591
+ /// @param f Value selected when cond(a, b) is false.
1592
+ constexpr IfElseExpression(bool (*cond)(Scalar a, Scalar b),
1593
+ ExpressionPtr<Scalar> a, ExpressionPtr<Scalar> b,
1594
+ ExpressionPtr<Scalar> t, ExpressionPtr<Scalar> f)
1595
+ : cond{cond},
1596
+ a{std::move(a)},
1597
+ b{std::move(b)},
1598
+ t{std::move(t)},
1599
+ f{std::move(f)} {}
1542
1600
 
1543
1601
  void visit_args(
1544
1602
  function_ref<void(Expression<Scalar>* arg)> func) const override {
1545
- func(x.get());
1603
+ func(a.get());
1604
+ func(b.get());
1605
+ func(t.get());
1606
+ func(f.get());
1546
1607
  }
1547
1608
 
1548
1609
  Scalar value() const override {
1549
- return x->val > Scalar(0) ? Scalar(1) : Scalar(0);
1610
+ return cond(a->val, b->val) ? t->val : f->val;
1550
1611
  }
1551
1612
 
1552
1613
  ExpressionType type() const override { return ExpressionType::NONLINEAR; }
1553
1614
 
1554
- std::string_view name() const override { return "is positive"; }
1615
+ std::string_view name() const override { return "if-else"; }
1616
+
1617
+ // a and b have zero gradient, so only t and f accumulate adjoints
1618
+ void accumulate_adjoints() const override {
1619
+ if (cond(a->val, b->val)) {
1620
+ t->adj += this->adj;
1621
+ } else {
1622
+ f->adj += this->adj;
1623
+ }
1624
+ }
1625
+
1626
+ void accumulate_adjoints_expr() const override {
1627
+ t->adj_expr += grad_expr_t();
1628
+ f->adj_expr += grad_expr_f();
1629
+ }
1630
+
1631
+ private:
1632
+ ExpressionPtr<Scalar> grad_expr_t() const {
1633
+ // adjoint if cond(a, b), otherwise 0
1634
+ return if_else(cond, a, b, this->adj_expr, constant_ptr(Scalar(0)));
1635
+ }
1636
+
1637
+ ExpressionPtr<Scalar> grad_expr_f() const {
1638
+ // 0 if cond(a, b), otherwise adjoint
1639
+ return if_else(cond, a, b, constant_ptr(Scalar(0)), this->adj_expr);
1640
+ }
1555
1641
  };
1556
1642
 
1557
- /// Returns one if x is positive and zero otherwise.
1643
+ /// Returns t if cond(a, b) is true, otherwise f.
1558
1644
  ///
1559
1645
  /// @tparam Scalar Scalar type.
1560
- /// @param x The argument.
1646
+ /// @param cond Condition evaluated on a and b.
1647
+ /// @param a The condition's first argument.
1648
+ /// @param b The condition's second argument.
1649
+ /// @param t Value selected when cond(a, b) is true.
1650
+ /// @param f Value selected when cond(a, b) is false.
1561
1651
  template <typename Scalar>
1562
- ExpressionPtr<Scalar> is_positive(const ExpressionPtr<Scalar>& x) {
1563
- if (x->type() == ExpressionType::CONSTANT) {
1564
- return constant_ptr(x->val > Scalar(0) ? Scalar(1) : Scalar(0));
1652
+ ExpressionPtr<Scalar> if_else(
1653
+ std::type_identity_t<bool (*)(Scalar a, Scalar b)> cond,
1654
+ const ExpressionPtr<Scalar>& a, const ExpressionPtr<Scalar>& b,
1655
+ const ExpressionPtr<Scalar>& t, const ExpressionPtr<Scalar>& f) {
1656
+ using enum ExpressionType;
1657
+
1658
+ // Prune expression
1659
+ if (t == f) {
1660
+ // Return t, which both branches currently are
1661
+ return t;
1662
+ } else if (t->type() == CONSTANT && f->type() == CONSTANT &&
1663
+ t->val == f->val) {
1664
+ // Return t, which both branches currently equal
1665
+ return t;
1666
+ }
1667
+
1668
+ // Evaluate constant condition
1669
+ if (a->type() == CONSTANT && b->type() == CONSTANT) {
1670
+ return cond(a->val, b->val) ? t : f;
1565
1671
  }
1566
1672
 
1567
- return make_expression_ptr<IsPositiveExpression<Scalar>>(x);
1673
+ return make_expression_ptr<IfElseExpression<Scalar>>(cond, a, b, t, f);
1568
1674
  }
1569
1675
 
1570
1676
  /// Derived expression type for log().
@@ -1747,17 +1853,15 @@ struct MaxExpression final : Expression<Scalar> {
1747
1853
  Scalar grad_r() const { return a->val >= b->val ? Scalar(0) : this->adj; }
1748
1854
 
1749
1855
  ExpressionPtr<Scalar> grad_expr_l() const {
1750
- // adjoint * (a >= b)
1751
- // adjoint * (a - b >= 0)
1752
- return this->adj_expr * is_nonnegative(a - b);
1856
+ // adjoint if a >= b, otherwise 0
1857
+ return if_else([](Scalar a, Scalar b) { return a >= b; }, a, b,
1858
+ this->adj_expr, constant_ptr(Scalar(0)));
1753
1859
  }
1754
1860
 
1755
1861
  ExpressionPtr<Scalar> grad_expr_r() const {
1756
- // adjoint * !(a >= b)
1757
- // adjoint * (a < b)
1758
- // adjoint * (b > a)
1759
- // adjoint * (b - a > 0)
1760
- return this->adj_expr * is_positive(b - a);
1862
+ // 0 if a >= b, otherwise adjoint
1863
+ return if_else([](Scalar a, Scalar b) { return a >= b; }, a, b,
1864
+ constant_ptr(Scalar(0)), this->adj_expr);
1761
1865
  }
1762
1866
  };
1763
1867
 
@@ -1831,17 +1935,15 @@ struct MinExpression final : Expression<Scalar> {
1831
1935
  Scalar grad_r() const { return a->val <= b->val ? Scalar(0) : this->adj; }
1832
1936
 
1833
1937
  ExpressionPtr<Scalar> grad_expr_l() const {
1834
- // adjoint * (a <= b)
1835
- // adjoint * (b >= a)
1836
- // adjoint * (b - a >= 0)
1837
- return this->adj_expr * is_nonnegative(b - a);
1938
+ // adjoint if a <= b, otherwise 0
1939
+ return if_else([](Scalar a, Scalar b) { return a <= b; }, a, b,
1940
+ this->adj_expr, constant_ptr(Scalar(0)));
1838
1941
  }
1839
1942
 
1840
1943
  ExpressionPtr<Scalar> grad_expr_r() const {
1841
- // adjoint * !(a <= b)
1842
- // adjoint * (a > b)
1843
- // adjoint * (a - b > 0)
1844
- return this->adj_expr * is_positive(a - b);
1944
+ // 0 if a <= b, otherwise adjoint
1945
+ return if_else([](Scalar a, Scalar b) { return a <= b; }, a, b,
1946
+ constant_ptr(Scalar(0)), this->adj_expr);
1845
1947
  }
1846
1948
  };
1847
1949
 
@@ -313,6 +313,11 @@ class Variable : public SleipnirBase {
313
313
  friend Variable<Scalar> hypot(const Variable<Scalar>& x,
314
314
  const Variable<Scalar>& y);
315
315
  template <typename Scalar>
316
+ friend Variable<Scalar> if_else(
317
+ std::type_identity_t<bool (*)(Scalar a, Scalar b)> cond,
318
+ const Variable<Scalar>& a, const Variable<Scalar>& b,
319
+ const Variable<Scalar>& t, const Variable<Scalar>& f);
320
+ template <typename Scalar>
316
321
  friend Variable<Scalar> log(const Variable<Scalar>& x);
317
322
  template <typename Scalar>
318
323
  friend Variable<Scalar> log10(const Variable<Scalar>& x);
@@ -522,6 +527,26 @@ Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y) {
522
527
  return Variable{detail::hypot(x.expr, y.expr)};
523
528
  }
524
529
 
530
+ /// if_else() for Variables.
531
+ ///
532
+ /// Returns t if cond(a, b) is true, otherwise f. The condition is evaluated on
533
+ /// the values of a and b each time the result is evaluated, and the gradient
534
+ /// only flows through the selected branch.
535
+ ///
536
+ /// @tparam Scalar Scalar type.
537
+ /// @param cond Condition evaluated on a and b.
538
+ /// @param a The condition's first argument.
539
+ /// @param b The condition's second argument.
540
+ /// @param t Value selected when cond(a, b) is true.
541
+ /// @param f Value selected when cond(a, b) is false.
542
+ template <typename Scalar>
543
+ Variable<Scalar> if_else(
544
+ std::type_identity_t<bool (*)(Scalar a, Scalar b)> cond,
545
+ const Variable<Scalar>& a, const Variable<Scalar>& b,
546
+ const Variable<Scalar>& t, const Variable<Scalar>& f) {
547
+ return Variable{detail::if_else(cond, a.expr, b.expr, t.expr, f.expr)};
548
+ }
549
+
525
550
  /// log() for Variables.
526
551
  ///
527
552
  /// @tparam Scalar Scalar type.
@@ -708,7 +733,7 @@ Variable<Scalar> tanh(const Variable<Scalar>& x) {
708
733
  template <typename Scalar>
709
734
  Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y,
710
735
  const Variable<Scalar>& z) {
711
- return Variable{sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2))};
736
+ return Variable{detail::hypot(x.expr, y.expr, z.expr)};
712
737
  }
713
738
 
714
739
  // The standard form for equality constraints is c(x) = 0, and the standard form
@@ -2811,6 +2811,25 @@ Template Args:
2811
2811
 
2812
2812
  )doc";
2813
2813
 
2814
+ static const char *mkd_doc_slp_if_else =
2815
+ R"doc(if_else() for Variables.
2816
+
2817
+ Returns t if cond(a, b) is true, otherwise f. The condition is
2818
+ evaluated on the values of a and b each time the result is evaluated,
2819
+ and the gradient only flows through the selected branch.
2820
+
2821
+ Args:
2822
+ cond: Condition evaluated on a and b.
2823
+ a: The condition's first argument.
2824
+ b: The condition's second argument.
2825
+ t: Value selected when cond(a, b) is true.
2826
+ f: Value selected when cond(a, b) is false.
2827
+
2828
+ Template Args:
2829
+ Scalar: Scalar type.
2830
+
2831
+ )doc";
2832
+
2814
2833
  static const char *mkd_doc_slp_log =
2815
2834
  R"doc(log() for Variables.
2816
2835
 
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._sleipnir import *
4
4
 
5
- __version__ = "0.6.7.dev13"
5
+ __version__ = "0.6.7.dev15"