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