diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml new file mode 100644 index 0000000..5154a70 --- /dev/null +++ b/.github/workflows/build_wheels.yml @@ -0,0 +1,42 @@ +name: Build and Upload Wheels + +on: [push, pull_request] + +jobs: + build_wheels: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker + uses: docker/setup-buildx-action@v1 + + - name: Build and copy wheel + run: | + CONTAINER_ID=$(sudo docker run -d -v $(pwd):/io quay.io/pypa/manylinux2014_x86_64 sleep infinity) + sudo docker exec $CONTAINER_ID /bin/bash -c " + yum install -y epel-release && + yum-config-manager --add-repo=https://download.opensuse.org/repositories/science:/dlr/CentOS_7/ && + yum install -y --nogpgcheck eigen3-devel && + cd /usr/local/include && + curl -L https://github.com/simd-everywhere/simde/archive/refs/heads/master.zip -o simde.zip && + unzip simde.zip && + mv simde-master/simde . && + rm -rf simde.zip simde-master && + cd /io && + /opt/python/cp311-cp311/bin/pip install setuptools wheel --root-user-action=ignore && + /opt/python/cp311-cp311/bin/python setup.py bdist_wheel && + auditwheel repair dist/ismpc-0.1-cp311-cp311-linux_x86_64.whl --plat manylinux2014_x86_64" + sudo docker cp $CONTAINER_ID:/io/wheelhouse/. ./wheelhouse/ + sudo docker stop $CONTAINER_ID + + - name: Upload wheels to PyPI + env: + TWINE_USERNAME: "__token__" + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + run: | + python -m pip install --upgrade twine && + twine upload --verbose wheelhouse/*.whl \ No newline at end of file diff --git a/.gitignore b/.gitignore index c22188f..0e4403e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ __pycache__/ *.pyc *.so dist -dist +wheelhouse # ros2 stuff install/ diff --git a/CMakeLists.txt b/CMakeLists.txt index e9bf75c..1f6adc4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.22) # ============================= PROJECT SETUP =============================================== -project(ismpc_cpp VERSION 0.1 LANGUAGES CXX) -set(ISMPC_CPP_LIBRARY ${PROJECT_NAME}) +project(ismpc VERSION 0.1 LANGUAGES CXX) +set(ISMPC_CPP_LIBRARY ismpc_cpp) +set(ISMPC_PY_LIBRARY ismpc) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -set(PROJECT ismpc_cpp) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -21,12 +21,10 @@ endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/executables") - # ============================================================================================= # ============================ BUILD OPTIONS ================================================== option(BUILD_TESTS "Build tests" OFF) -option(BUILD_PYTHON_BINDINGS "Build python bindings" OFF) option(BUILD_ROS "Build ros package" OFF) option(BUILD_DART "Build with DART" OFF) @@ -41,7 +39,6 @@ endif() message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") - # ============================================================================================= # ============================ UTILITY STUFF ================================================== @@ -63,14 +60,18 @@ configure_file( @ONLY ) - # ============================================================================================= # ============================ EXTERNAL LIBRARIES ============================================= include(FetchContent) # EIGEN3 -set(EIGEN_INCLUDE_DIR /usr/include/eigen3) +FetchContent_Declare( + eigen + GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git + GIT_TAG master +) +FetchContent_MakeAvailable(eigen) # YAML-CPP FetchContent_Declare( @@ -88,18 +89,13 @@ FetchContent_Declare( ) FetchContent_MakeAvailable(proxsuite) -# CASADI -set(CASADI_INCLUDE_DIR /usr/local/include/casadi) -include_directories( - SYSTEM ${CASADI_INCLUDE_DIR} +# NANOBIND +FetchContent_Declare( + nanobind + GIT_REPOSITORY https://github.com/wjakob/nanobind.git + GIT_TAG v2.4.0 ) -set(LIBRARY_DIRS /usr/local/lib) -link_directories(${LIBRARY_DIRS}) -find_library(CASADI_LIBRARY NAMES casadi HINTS ${LIBRARY_DIRS}) -if(CASADI_LIBRARY) - set(LIBCASADI ${CASADI_LIBRARY}) - message(STATUS "Found CasADi libs: ${LIBCASADI}") -endif() +FetchContent_MakeAvailable(nanobind) # DART if(BUILD_DART) @@ -111,6 +107,7 @@ endif() # ============================ ISMPC LIBRARY ================================================== set(CMAKE_POSITION_INDEPENDENT_CODE ON) file(GLOB_RECURSE ISMPC_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) +list(REMOVE_ITEM ISMPC_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/bindings.cpp) add_library(${ISMPC_CPP_LIBRARY} STATIC ${ISMPC_SRCS}) target_include_directories(${ISMPC_CPP_LIBRARY} @@ -119,16 +116,16 @@ target_include_directories(${ISMPC_CPP_LIBRARY} $ $ $ + $ ${DART_INCLUDE_DIRS} - ${EIGEN_INCLUDE_DIR} ) set(ISMPC_CPP_EXTRA_LIBRARIES $ $ $ + $ ${DART_LIBRARIES} - ${LIBCASADI} ) target_link_libraries(${ISMPC_CPP_LIBRARY} PUBLIC ${ISMPC_CPP_EXTRA_LIBRARIES}) @@ -192,10 +189,41 @@ endif() # ============================================================================================= # ============================ PYTHON BINDINGS ================================================= -if(BUILD_PYTHON_BINDINGS) - add_subdirectory(bindings) +if(CMAKE_VERSION VERSION_LESS 3.18) + set(DEV_MODULE Development) +else() + set(DEV_MODULE Development.Module) endif() +find_package(Python 3.11 COMPONENTS Interpreter ${DEV_MODULE} REQUIRED) +execute_process( + COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE nanobind_ROOT +) + +execute_process( + COMMAND ${Python_EXECUTABLE} -c "import sysconfig; print(sysconfig.get_path('purelib'))" + OUTPUT_VARIABLE PYTHON_SITE_PACKAGES + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +include_directories(${Python_INCLUDE_DIRS}) +message(STATUS "Python_EXECUTABLE: ${Python_EXECUTABLE}") +message(STATUS "Python_VERSION: ${Python_VERSION}") +message(STATUS "PYTHON INCLUDE DIRECTORIES" ${Python_INCLUDE_DIRS}) + +nanobind_add_module(${ISMPC_PY_LIBRARY} ${PROJECT_SOURCE_DIR}/src/bindings.cpp) +target_include_directories(${ISMPC_PY_LIBRARY} PUBLIC ${eigen_SOURCE_DIR} ${ISMPC_INCLUDE_DIR}) +target_link_libraries(${ISMPC_PY_LIBRARY} PUBLIC ${ISMPC_CPP_LIBRARY}) + +install( + TARGETS ${ISMPC_PY_LIBRARY} + EXPORT ${ISMPC_PY_LIBRARY}Targets + LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${BINDIR} +) + # ============================================================================================= # =========================== GOOGLE TEST ===================================================== @@ -208,8 +236,4 @@ endif() # ============================ EXECUTABLES ==================================================== add_executable(ismpc_main ${CMAKE_CURRENT_SOURCE_DIR}/src/cppmain.cpp) target_link_libraries(ismpc_main PRIVATE ${ISMPC_CPP_LIBRARY}) - -add_executable(dart_main ${CMAKE_CURRENT_SOURCE_DIR}/src/dartmain.cpp) -target_link_libraries(dart_main PRIVATE ${ISMPC_CPP_LIBRARY}) - # ============================================================================================= diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt deleted file mode 100644 index 96d4c23..0000000 --- a/bindings/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -FetchContent_Declare( - nanobind - GIT_REPOSITORY https://github.com/wjakob/nanobind.git - GIT_TAG v2.4.0 - ) -FetchContent_MakeAvailable(nanobind) - -if(CMAKE_VERSION VERSION_LESS 3.18) -set(DEV_MODULE Development) -else() -set(DEV_MODULE Development.Module) -endif() -find_package(Python 3.11 COMPONENTS Interpreter ${DEV_MODULE} REQUIRED) -include_directories(${Python_INCLUDE_DIRS}) -message(STATUS "Python_EXECUTABLE: ${Python_EXECUTABLE}") -message(STATUS "Python_VERSION: ${Python_VERSION}") -message(STATUS "PYTHON INCLUDE DIRECTORIES" ${Python_INCLUDE_DIRS}) - -nanobind_add_module(ismpc_py ${PROJECT_SOURCE_DIR}/bindings/ismpc_binding.cpp) -target_include_directories(ismpc_py PUBLIC ${eigen_SOURCE_DIR} ${ISMPC_INCLUDE_DIR}) -target_link_libraries(ismpc_py PUBLIC ${ISMPC_CPP_LIBRARY}) diff --git a/config/config.yaml b/config/config.yaml index 1b4ba80..de8197d 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -5,7 +5,7 @@ delta: 0.01 # 83 Hz first_fs_duration: 0.6 # [s] # Duration parameters -N: 1 +N: 1000 P: 1000 C: 100 W: 100 # iterations to wait before starting diff --git a/include/ismpc_cpp/dart/controller.h b/include/ismpc_cpp/dart/controller.h deleted file mode 100644 index 2c79b90..0000000 --- a/include/ismpc_cpp/dart/controller.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include "ismpc_cpp/modules/kalman_filter.h" -#include "ismpc_cpp/dart/simulated_robot.h" -#include "ismpc_cpp/dart/state_provider.h" -#include "ismpc_cpp/modules/casadi_mpc.h" -#include "ismpc_cpp/modules/foot_trajectory_generator.h" -#include "ismpc_cpp/modules/footstep_plan_provider.h" -#include "ismpc_cpp/modules/model_predictive_controller.h" -#include "ismpc_cpp/modules/moving_constraint_provider.h" -#include "ismpc_cpp/representations/footstep_plan.h" -#include "ismpc_cpp/tools/config/config.h" -#include "ismpc_cpp/tools/debug.h" -#include "ismpc_cpp/types/math_types.h" - -namespace ismpc { - -class Controller : public dart::gui::osg::WorldNode { - private: - // walkengine representations - State state; - FootstepPlan plan; - FrameInfo frame_info; - Reference reference; - - // dart representations - SimulatedRobot robot; - dart::simulation::WorldPtr world; - - // modules - FootstepPlanProvider planner; - ModelPredictiveController mpc; - MovingConstraintProvider mc_provider; - FootTrajectoryGenerator ft_generator; - CasadiMPC casadi_mpc; - StateProvider state_provider; - KalmanFilter kalman_filter; - - // Stuff for drawing - dart::dynamics::SimpleFramePtr com, desired_com, zmp; - - /** - * @brief Get a pointer to a ball in world (change its coordinates in draw method) - * - * @param name - * @param color - * @return dart::dynamics::SimpleFramePtr - */ - dart::dynamics::SimpleFramePtr registerBall(const std::string& name, const Vector3& color); - - public: - Controller(dart::simulation::WorldPtr world, dart::dynamics::SkeletonPtr robot); - - /** - * @brief Custom pre step function for the simulation. This is where - * the magic happens. This function is called at every simulation step. - */ - void customPreStep() override; - - /** - * @brief Get the world object - * - * @return dart::simulation::WorldPtr - */ - dart::simulation::WorldPtr get_world(); - - // Time related stuff - Scalar total_elapsed_time = 0; -}; - -} // namespace ismpc diff --git a/include/ismpc_cpp/dart/qp_solver.h b/include/ismpc_cpp/dart/qp_solver.h deleted file mode 100644 index 29dcb90..0000000 --- a/include/ismpc_cpp/dart/qp_solver.h +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include - -#include "ismpc_cpp/types/math_types.h" - -using casadi::MX, casadi::DM; - -namespace ismpc { - -class QPSolver { - public: - QPSolver() = default; - QPSolver(int d); - - void init(const DM& H, const DM& g); - - VectorX solve(); - - private: - int d; - MX H; - MX g; - MX x; - casadi::Opti opti; -}; - -} // namespace ismpc diff --git a/include/ismpc_cpp/dart/simulated_robot.h b/include/ismpc_cpp/dart/simulated_robot.h deleted file mode 100644 index 86fa6c6..0000000 --- a/include/ismpc_cpp/dart/simulated_robot.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include -#include - -#include "dart/dart.hpp" -#include "ismpc_cpp/dart/qp_solver.h" -#include "ismpc_cpp/representations/frame_info.h" -#include "ismpc_cpp/representations/state.h" -#include "ismpc_cpp/tools/config/config.h" -#include "ismpc_cpp/tools/config/robot_config.h" -#include "ismpc_cpp/tools/debug.h" -#include "ismpc_cpp/tools/math/rotation_matrix.h" -#include "ismpc_cpp/tools/proxsuite.h" -#include "ismpc_cpp/types/body_parts.h" -#include "ismpc_cpp/types/math_types.h" -#include "ismpc_cpp/types/support_phase.h" -#include "ismpc_cpp/types/tail_type.h" - -namespace ismpc { - -struct SimulatedRobot { - VectorX initial_configuration; - Matrix joint_selection; - - // State inside dart simulator (d stands for dart) - dart::dynamics::SkeletonPtr skeleton; - dart::dynamics::BodyNode* d_base; - dart::dynamics::BodyNode* d_torso; - dart::dynamics::BodyNode* d_left_foot; - dart::dynamics::BodyNode* d_right_foot; - - // Utility functions - VectorX getJointRequest(const State& desired); - void setInitialConfiguration(); - - ~SimulatedRobot() = default; - SimulatedRobot(dart::dynamics::SkeletonPtr skeleton); - - QP qp; - - Scalar total_ik_duration = 0.0; -}; - -} // namespace ismpc diff --git a/include/ismpc_cpp/dart/state_provider.h b/include/ismpc_cpp/dart/state_provider.h deleted file mode 100644 index 8f866b3..0000000 --- a/include/ismpc_cpp/dart/state_provider.h +++ /dev/null @@ -1,20 +0,0 @@ -#include "ismpc_cpp/dart/simulated_robot.h" -#include "ismpc_cpp/tools/math/rotation_matrix.h" - -namespace ismpc { - -/** - * @brief This class is responsible for providing the state of the robot. - * Namely, compute the lip state. - */ -class StateProvider { - private: - const SimulatedRobot& robot; - - public: - StateProvider(const SimulatedRobot& robot); - - void update(State& state); -}; - -} // namespace ismpc diff --git a/include/ismpc_cpp/ismpc.h b/include/ismpc_cpp/ismpc.h index fcb12a6..342e47b 100644 --- a/include/ismpc_cpp/ismpc.h +++ b/include/ismpc_cpp/ismpc.h @@ -2,6 +2,7 @@ #include "ismpc_cpp/modules/foot_trajectory_generator.h" #include "ismpc_cpp/modules/footstep_plan_provider.h" +#include "ismpc_cpp/modules/kalman_filter.h" #include "ismpc_cpp/modules/model_predictive_controller.h" #include "ismpc_cpp/modules/moving_constraint_provider.h" #include "ismpc_cpp/modules/reference_provider.h" diff --git a/include/ismpc_cpp/modules/casadi_mpc.h b/include/ismpc_cpp/modules/casadi_mpc.h deleted file mode 100644 index c49d072..0000000 --- a/include/ismpc_cpp/modules/casadi_mpc.h +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include -#include - -#include "ismpc_cpp/dart/simulated_robot.h" -#include "ismpc_cpp/representations/footstep_plan.h" -#include "ismpc_cpp/representations/frame_info.h" -#include "ismpc_cpp/representations/state.h" -#include "ismpc_cpp/tools/config/config.h" -#include "ismpc_cpp/tools/proxsuite.h" -#include "ismpc_cpp/types/math_types.h" -#include "ismpc_cpp/types/optimization.h" - -namespace ismpc { -/** - * @brief Model Predictive Control class - * - * This class implements a Model Predictive Control (MPC) algorithm to generate - * a control trajectory of the robot's CoM. The CoM trajectory is generated by - * solving an optimization problem that minimizes a cost function subject to - * constraints on the robot's dynamics and the environment.In input, the MPC - * module needs the current state of the robot and the desired footsteps. - */ -class CasadiMPC { - private: - const FrameInfo& frame_info; - const State& state; - const FootstepPlan& plan; - - // Parameters - const int numC = Config::C; // number of control points - const int numP = Config::P; // number of planning points - const Scalar delta = Config::delta; - const Scalar eta = RobotConfig::eta; - const Scalar dxz = RobotConfig::dxz; - const Scalar dyz = RobotConfig::dyz; - const Scalar zmp_vx_max = RobotConfig::zmp_vx_max; - const Scalar zmp_vy_max = RobotConfig::zmp_vy_max; - const TailType tail_type = Config::tail_type; - - // Lip Model - casadi::DM A = casadi::DM({{0, 1, 0}, {eta * eta, 0, -eta* eta}, {0, 0, 0}}); - casadi::DM B = casadi::DM({0, 0, 1}); - - // Optimization related stuff - casadi::Slice all = casadi::Slice(); - casadi::Slice first_half = casadi::Slice(0, 3); - casadi::Slice second_half = casadi::Slice(3, 6); - casadi::Slice all_but_first = casadi::Slice(1, numC + 1); - casadi::MX cost; - casadi::DM x; - casadi::Opti opti; - int d; // number of primal variables - casadi::MX X, U; // decision variables - casadi::MX x0_param, zmp_x_param, zmp_y_param; // parameters - - int fs_index = 0; - - // time related stuff - std::chrono::high_resolution_clock::time_point start, end; - - /** - * Lip Model - */ - casadi::MX f(const casadi::MX& x, const casadi::MX& u) const; - - public: - CasadiMPC(const FrameInfo& frame_info, const State& state, const FootstepPlan& plan); - - /** - * @brief Update the MPC module - * Inside this function, the MPC module solves the optimization problem, - * generates and saves the control trajectory. The control trajectory is - * made of the zmp velocities. Practically, this function modifies the field - * state.desired_state of the robot. - */ - void update(State& state); - - Scalar total_mpc_qp_duration = 0.0; - Scalar total_mpc_preprocessing_duration = 0.0; - Scalar total_mpc_postprocessing_duration = 0.0; -}; - -} // namespace ismpc diff --git a/include/ismpc_cpp/tools/proxsuite.h b/include/ismpc_cpp/tools/proxsuite.h index f5ce5a1..2926ec9 100644 --- a/include/ismpc_cpp/tools/proxsuite.h +++ b/include/ismpc_cpp/tools/proxsuite.h @@ -2,13 +2,9 @@ #include #include - -#include "proxsuite/proxqp/sparse/fwd.hpp" -#include "proxsuite/proxqp/status.hpp" +#include using proxsuite::proxqp::InitialGuessStatus; using proxsuite::proxqp::dense::isize; using proxsuite::proxqp::dense::QP; -using proxsuite::proxqp::QPSolverOutput::PROXQP_MAX_ITER_REACHED; -using proxsuite::proxqp::QPSolverOutput::PROXQP_SOLVED; using std::nullopt; diff --git a/pixi.lock b/pixi.lock index a38e89e..0809642 100644 --- a/pixi.lock +++ b/pixi.lock @@ -13,17 +13,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ampl-asl-1.0.0-h5888daf_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/assimp-5.4.3-h8943939_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/auditwheel-6.2.0-pyha804496_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bashlex-0.18-py311h38be061_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bullet-cpp-3.25-h6dcdc2f_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cibuildwheel-2.21.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/collada-dom-2.5.0-h6e3624d_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/console_bridge-1.0.2-h924138e_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py311hafd3f86_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cvxopt-1.3.2-py311he0106dc_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda @@ -31,6 +44,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/daqp-0.6.0-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dartpy-6.15.0-py311h4e686b6_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dsdp-5.8-hd9d9efa_1203.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/ecos-2.0.14-py311h9f3472d_1.conda @@ -38,6 +53,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fcl-0.7.0-h543440a_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-h03ad30a_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-11.0.2-h434a139_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -57,11 +73,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gsl-2.7-he838d99_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.2.0-h4bba637_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imgui-1.91.6-h633a208_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ipopt-3.14.17-h59d4785_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda @@ -138,6 +165,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/librbio-4.3.4-ss783_h2377355.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libscotch-7.0.6-h4914014_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.1-ss783_h5a7e440.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-ss783_hae1ff0d.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspral-2024.05.08-h2b245be_4.conda @@ -159,10 +187,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.6-h024ca30_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.0-py311h38be061_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py311h2b939e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mumps-include-5.7.3-ha770c72_6.conda @@ -172,6 +203,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.20-py311h9e33e62_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlopt-2.9.0-py311h40a09b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/octomap-1.10.0-h84d6215_0.conda @@ -186,17 +218,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/proxsuite-0.6.7-py311hd18a35c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-2.13.6-pyh1ec8472_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-2.13.6-pyh415d2e4_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-stubgen-2.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyelftools-0.31-py311h38be061_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.5.0-py311h9ecbd09_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.1-py311h9053184_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.0-he550d4f_1_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qdldl-python-0.1.7.post5-py311h7db5c69_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qpoases-3.2.1-py311h9428811_3.conda @@ -204,9 +246,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.1-h588cce1_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/quadprog-0.1.13-py311hd18a35c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py311hc1ac118_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scs-3.2.7.post2-default_py311he11e7d9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.30.10-h63c27ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py311h38be061_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/simde-0.8.2-h84d6215_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda @@ -217,11 +265,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/urdfdom-4.0.1-h7fd8c06_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/urdfdom_headers-1.1.2-h84d6215_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda @@ -249,21 +302,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.3-hbcc6ac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.3-hbcc6ac9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.3-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz - pypi: https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/51/ef3c391a84e7fbd7bdba37a9689d0269083eb3f4685d9729bdcdcea8bc48/auditwheel_symbols-0.1.13-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/f7/86d933ec31f00450f513ef110fa9c0e5da4c6e2c992933a35c8d8fe7d01f/catkin_pkg-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/03/95738a68ade2358e5a4d63a2fd8e7ed9ad911001cfabbbb33a7f81343945/debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/55/a513de61cafe6bd70c064a5b714dc084120fe8f90a5ba51fbc5cfe42fc13/glfw-2.8.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38.p39.p310.p311.p312.p313-none-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl @@ -276,20 +331,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/48/00e31747821d3fc56faddd00a4725454d1e694a8b67d715cf20f531506a5/PyOpenGL-3.1.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -381,6 +431,69 @@ packages: purls: [] size: 71042 timestamp: 1660065501192 +- conda: https://conda.anaconda.org/conda-forge/noarch/auditwheel-6.2.0-pyha804496_1.conda + sha256: cce3ef04212f8917202badd74366edb429b123781ef30d4cd9913677326f16aa + md5: 3823e5b1f4750725a7706c29b05964da + depends: + - __linux + - packaging >=20.9 + - pyelftools >=0.24 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/auditwheel?source=hash-mapping + size: 41079 + timestamp: 1736690708705 +- pypi: https://files.pythonhosted.org/packages/0f/51/ef3c391a84e7fbd7bdba37a9689d0269083eb3f4685d9729bdcdcea8bc48/auditwheel_symbols-0.1.13-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl + name: auditwheel-symbols + version: 0.1.13 + sha256: 2a97e4bdeb2681f8d4d327d1356bfb8a7ba9344d5a0e4136afdd278c408bb04e +- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 + md5: 767d508c1a67e02ae8f50e44cacfadb2 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7069 + timestamp: 1733218168786 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + sha256: a0f41db6d7580cec3c850e5d1b82cb03197dd49a3179b1cee59c62cd2c761b36 + md5: df837d654933488220b454c6a3b0fad6 + depends: + - backports + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/backports-tarfile?source=hash-mapping + size: 32786 + timestamp: 1733325872620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bashlex-0.18-py311h38be061_2.conda + sha256: 8506869ffbea6d330204fdf37e6ba010bf59fe29079f04915453159db558b561 + md5: c503e69a0fbf92155147da1f3e9bd9c2 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: GPL-3.0-only + license_family: GPL + purls: + - pkg:pypi/bashlex?source=hash-mapping + size: 161942 + timestamp: 1725526548332 +- conda: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 + sha256: e3f867b5be7837366e989df8f6e64f94ec180676fea3494285ee873f24921156 + md5: 586272349d7bef5b1ef527b56dca73cb + depends: + - python >=3.5 + license: MIT + license_family: MIT + purls: + - pkg:pypi/bracex?source=hash-mapping + size: 14045 + timestamp: 1636190617443 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b md5: 98514fe74548d768907ce7a13f680e8f @@ -408,6 +521,23 @@ packages: purls: [] size: 18881 timestamp: 1725267688731 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda + sha256: 949913bbd1f74d1af202d3e4bff2e0a4e792ec00271dc4dd08641d4221aa2e12 + md5: d21daab070d76490cb39a8f1d1729d79 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 350367 + timestamp: 1725267768486 - conda: https://conda.anaconda.org/conda-forge/linux-64/bullet-cpp-3.25-h6dcdc2f_3.conda sha256: c6ef3620170c67170ecb583f3b88ea802d975c137e362ea695074f2eeb2f59b6 md5: 91c3cd073f8e7f94213467fc4f16e4e0 @@ -498,6 +628,91 @@ packages: - flake8-quotes ; extra == 'test' - pytest ; extra == 'test' requires_python: '>=3.6' +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + sha256: 048c16a9cbcb1fbad02083414d3bc7c1d0eea4b39aee6aa6bf8d1d5089ca8bad + md5: 6feb87357ecd66733be3279f16a8c400 + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 161642 + timestamp: 1734380604767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda + sha256: bc47aa39c8254e9e487b8bcd74cfa3b4a3de3648869eb1a0b89905986b668e35 + md5: 55553ecd5328336368db611f350b7039 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 302115 + timestamp: 1725560701719 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/cibuildwheel-2.21.3-pyhd8ed1ab_0.conda + sha256: d29fbf7860f8e49b1491b0a6db22ab27643a9622b37d519bc5416e94e3d76daa + md5: 540e8b1b512f115390df8775abc595f9 + depends: + - bashlex + - bracex + - click + - filelock + - packaging >=21.0 + - platformdirs + - pygithub + - python >=3.7 + - pyyaml + - requests + - rich >=9.6 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/cibuildwheel?source=hash-mapping + size: 91166 + timestamp: 1728504274383 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py311h9ecbd09_0.conda + sha256: 77b0f83acee81f90d6caf961334f0a560379eb0fc23dd8157ee22cb18ba0b3f4 + md5: e677422fa3118f3027040def9168ca99 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.0.0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cmarkgfm?source=hash-mapping + size: 141391 + timestamp: 1732193340749 - conda: https://conda.anaconda.org/conda-forge/linux-64/collada-dom-2.5.0-h6e3624d_10.conda sha256: 1405fa40ff7ebb1e31ea9704ab37edd598ffd020acf284141dafd221e13ec5f7 md5: 4c4329e86a370df367fe6b0c4e0e3c07 @@ -561,6 +776,24 @@ packages: - pkg:pypi/contourpy?source=hash-mapping size: 278209 timestamp: 1731428493722 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-44.0.0-py311hafd3f86_0.conda + sha256: 6f0e961f6b54021c8b34cdd9014fcdb437aaf8752b14835ae9e7fdf50b594767 + md5: ad3ad28ff320b79d182f3cab3e1d9bd2 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.12 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - __glibc >=2.17 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=hash-mapping + size: 1577410 + timestamp: 1732746127051 - conda: https://conda.anaconda.org/conda-forge/linux-64/cvxopt-1.3.2-py311he0106dc_3.conda sha256: 38a63e220f8213d423a7d27513247b556349d42eee6160e77596be1a653fc646 md5: fce71b44613f984637c900fe83ab58b4 @@ -694,11 +927,28 @@ packages: version: 5.1.1 sha256: b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - name: docutils - version: 0.21.2 - sha256: dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 - requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + sha256: a20ebf2c9b02a6eb32412ceb5c4cffaae49417db7e75414a76417538293a9402 + md5: eaef2e94d5bd76f758545d172c1fda67 + depends: + - python >=3.9 + - wrapt <2,>=1.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/deprecated?source=hash-mapping + size: 14297 + timestamp: 1733662697343 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + sha256: fa5966bb1718bbf6967a85075e30e4547901410cc7cb7b16daf68942e9a94823 + md5: 24c1ca34138ee57de72a943237cde4cc + depends: + - python >=3.9 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + purls: + - pkg:pypi/docutils?source=hash-mapping + size: 402700 + timestamp: 1733217860944 - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda sha256: 9eee491a73b67fd64379cf715f85f8681568ebc1f02f9e11b4c50d46a3323544 md5: c2f83a5ddadadcdb08fe05863295ee97 @@ -874,6 +1124,16 @@ packages: purls: [] size: 2075171 timestamp: 1717757963922 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + sha256: 18dca6e2194732df7ebf824abaefe999e4765ebe8e8a061269406ab88fc418b9 + md5: d692e9ba6f92dc51484bf3477e36ce7c + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17441 + timestamp: 1733240909987 - conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-h03ad30a_4.conda sha256: ca0d4d6f33fed9112ba0a4792d612a9cf560c0fd2ca7d570e117665c0cbdc1f8 md5: 51d161a95c4777e01fa16893e6f25cb7 @@ -1214,6 +1474,19 @@ packages: purls: [] size: 3376423 timestamp: 1626369596591 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + sha256: 843ddad410c370672a8250470697027618f104153612439076d4d7b91eeb7b5c + md5: 825927dc7b0f287ef8d4d0011bb113b1 + depends: + - hpack >=4.0,<5 + - hyperframe >=6.0,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 52000 + timestamp: 1733298867359 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.2.0-h4bba637_0.conda sha256: 94426eca8c60b43f57beb3338d3298dda09452c7a42314bbbb4ebfa552542a84 md5: 9e38e86167e8b1ea0094747d12944ce4 @@ -1251,6 +1524,28 @@ packages: purls: [] size: 3950601 timestamp: 1733003331788 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + sha256: ec89b7e5b8aa2f0219f666084446e1fb7b54545861e9caa892acb24d125761b5 + md5: 2aa5ff7fa34a81b9196532c84c10d865 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 29412 + timestamp: 1733299296857 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda + sha256: e91c6ef09d076e1d9a02819cd00fa7ee18ecf30cdd667605c853980216584d1b + md5: 566e75c90c1d0c8c459eb0ad9833dc7a + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17239 + timestamp: 1733298862681 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e md5: 8b189310083baabfb622af68fd9d3ae3 @@ -1263,6 +1558,17 @@ packages: purls: [] size: 12129203 timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 - conda: https://conda.anaconda.org/conda-forge/linux-64/imgui-1.91.6-h633a208_1.conda sha256: 13b1b4ff1ee08ec90cd4da2e4cc8f7e30627096bca1a02c98828520d6cb2beed md5: a7fdefd1b0990cbdc83e30b31efd5bf2 @@ -1279,27 +1585,32 @@ packages: purls: [] size: 803237 timestamp: 1734892685767 -- pypi: https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl - name: importlib-resources - version: 6.5.2 - sha256: 789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec - requires_dist: - - zipp>=3.1.0 ; python_full_version < '3.10' - - pytest>=6,!=8.1.* ; extra == 'test' - - zipp>=3.17 ; extra == 'test' - - jaraco-test>=5.4 ; extra == 'test' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - pytest-enabler>=2.2 ; extra == 'enabler' - - pytest-mypy ; extra == 'type' - requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 + md5: 315607a3030ad5d5227e76e0733798ff + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 28623 + timestamp: 1733223207185 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + size: 33781 + timestamp: 1736252433366 - conda: https://conda.anaconda.org/conda-forge/linux-64/ipopt-3.14.17-h59d4785_0.conda sha256: e13728d611c18ba8f82af9a301cba0d40aa7fd10b16687001dc36ee8bbd10baa md5: f399793ae8915f22c8f679a479286d6c @@ -1410,6 +1721,42 @@ packages: - ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole] ; extra == 'all' - ipython[test,test-extra] ; extra == 'all' requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + sha256: 3d16a0fa55a29fe723c918a979b2ee927eb0bf9616381cdfd26fa9ea2b649546 + md5: ade6b25a6136661dadd1a43e4350b10b + depends: + - more-itertools + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jaraco-classes?source=hash-mapping + size: 12109 + timestamp: 1733326001034 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + sha256: bfaba92cd33a0ae2488ab64a1d4e062bcf52b26a71f88292c62386ccac4789d7 + md5: bcc023a32ea1c44a790bbf1eae473486 + depends: + - backports.tarfile + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jaraco-context?source=hash-mapping + size: 12483 + timestamp: 1733382698758 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.1.0-pyhd8ed1ab_0.conda + sha256: 61da3e37149da5c8479c21571eaec61cc4a41678ee872dcb2ff399c30878dddb + md5: eb257d223050a5a27f5fdf5c9debc8ec + depends: + - more-itertools + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jaraco-functools?source=hash-mapping + size: 15545 + timestamp: 1733746481844 - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl name: jedi version: 0.19.2 @@ -1450,6 +1797,17 @@ packages: - docopt ; extra == 'testing' - pytest<9.0.0 ; extra == 'testing' requires_python: '>=3.6' +- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + sha256: 16639759b811866d63315fe1391f6fb45f5478b823972f4d3d9f0392b7dd80b8 + md5: 9800ad1699b42612478755a2d26c722d + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jeepney?source=hash-mapping + size: 36895 + timestamp: 1649085298891 - pypi: https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl name: jupyter-client version: 8.6.3 @@ -1498,6 +1856,25 @@ packages: - pytest-timeout ; extra == 'test' - pytest<8 ; extra == 'test' requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + sha256: b6f57c17cf098022c32fe64e85e9615d427a611c48a5947cdfc357490210a124 + md5: cdd58ab99c214b55d56099108a914282 + depends: + - __linux + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - jeepney >=0.4.2 + - python >=3.9 + - secretstorage >=3.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/keyring?source=hash-mapping + size: 36985 + timestamp: 1735210286595 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb md5: 30186d27e2c9fa62b45fb1476b7200e3 @@ -2472,6 +2849,15 @@ packages: purls: [] size: 354372 timestamp: 1695747735668 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 - conda: https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.1-ss783_h5a7e440.conda build_number: 2 sha256: 0c1be480cbbc8533c51b11b23411963bae778b51faa96a1a0bfc050d028560eb @@ -2765,6 +3151,18 @@ packages: purls: [] size: 167055 timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + size: 64430 + timestamp: 1733250550053 - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.0-py311h38be061_0.conda sha256: 805102562506abdf78e818944dba09a4e1012b8a9c01955e86f4b781b9ee677f md5: fb6f4ad8b34bb8b85c6b52e9af8133fd @@ -2814,6 +3212,17 @@ packages: requires_dist: - traitlets requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14465 + timestamp: 1733255681319 - pypi: https://files.pythonhosted.org/packages/60/60/60afad3bdd7d828c383e97efe2d774ebad8f41180f13b307ff895f2cb5e9/mediapy-1.2.2-py3-none-any.whl name: mediapy version: 1.2.2 @@ -2855,6 +3264,17 @@ packages: purls: [] size: 124718448 timestamp: 1730231808335 +- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.6.0-pyhd8ed1ab_0.conda + sha256: e017ede184823b12a194d058924ca26e1129975cee1cae47f69d6115c0478b55 + md5: 9b1225d67235df5411dbd2c94a5876b7 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/more-itertools?source=hash-mapping + size: 58739 + timestamp: 1736883940984 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda sha256: f25d2474dd557ca66c6231c8f5ace5af312efde1ba8290a6ea5e1732a4e669c0 md5: 2eeb50cab6652538eee8fc0bc3340c81 @@ -2987,6 +3407,22 @@ packages: version: 1.6.0 sha256: 87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c requires_python: '>=3.5' +- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.20-py311h9e33e62_0.conda + sha256: a3674c36e0a232a40c6a606fb7ccf63e8ae05a24c9d824170daad921b3492576 + md5: 4dc110d53c8f03e9fd9d906e4313fb09 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nh3?source=hash-mapping + size: 637888 + timestamp: 1734483804166 - conda: https://conda.anaconda.org/conda-forge/linux-64/nlopt-2.9.0-py311h40a09b0_0.conda sha256: 168c9915fe68309769819e5755d894ab83d8e05e05dea4f514eb741d646e8de7 md5: 34b8f26073d71efe2c05ea310db83a99 @@ -3240,22 +3676,28 @@ packages: purls: [] size: 381072 timestamp: 1733698987122 -- pypi: https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl - name: platformdirs - version: 4.3.6 - sha256: 73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb - requires_dist: - - furo>=2024.8.6 ; extra == 'docs' - - proselint>=0.14 ; extra == 'docs' - - sphinx-autodoc-typehints>=2.4 ; extra == 'docs' - - sphinx>=8.0.2 ; extra == 'docs' - - appdirs==1.4.4 ; extra == 'test' - - covdefaults>=2.3 ; extra == 'test' - - pytest-cov>=5 ; extra == 'test' - - pytest-mock>=3.14 ; extra == 'test' - - pytest>=8.3.2 ; extra == 'test' - - mypy>=1.11.2 ; extra == 'type' - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.0-pyhd8ed1ab_1.conda + sha256: 588999bbbfd7f68dbfd1836866be888a18fedd348b679b4c410ffe7634378bee + md5: b52da1d59d874c97dcca251757a368b3 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pkginfo?source=hash-mapping + size: 30224 + timestamp: 1733734630555 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 - pypi: https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl name: prompt-toolkit version: 3.0.48 @@ -3385,13 +3827,88 @@ packages: - pkg:pypi/pybind11-stubgen?source=hash-mapping size: 29785 timestamp: 1701070777621 -- pypi: https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl - name: pygments - version: 2.19.1 - sha256: 9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c - requires_dist: - - colorama>=0.4.6 ; extra == 'windows-terminal' - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyelftools-0.31-py311h38be061_1.conda + sha256: 248c2fd22a8fe4468538386a4ad5a16f7a604a183524b39fb85c68d72188bfeb + md5: 7391216e2d5ac363b2d1f32d6b2255e3 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Unlicense + purls: + - pkg:pypi/pyelftools?source=hash-mapping + size: 347174 + timestamp: 1725349276245 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.5.0-pyhd8ed1ab_0.conda + sha256: 50a0239c584ba3beedbbf7498bc8f9368076dbb3b35c23ffbff1ade64e1b8ee4 + md5: e1017f2fc08b01b036153feb5d77b8cb + depends: + - cryptography >=3.4.0 + - deprecated + - pyjwt >=2.4.0 + - pynacl >=1.4.0 + - python >=3.7 + - python-dateutil + - requests >=2.14.0 + - typing-extensions >=4.0.0 + - urllib3 >=1.26.0 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/pygithub?source=hash-mapping + size: 154118 + timestamp: 1730939163197 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b + md5: 232fb4577b6687b2d503ef8e254270c9 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 888600 + timestamp: 1736243563082 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.10.1-pyhd8ed1ab_0.conda + sha256: 158d8911e873e2a339c27768933747bf9c2aec1caa038f1b7b38a011734a956f + md5: 84c5c40ea7c5bbc6243556e5daed20e7 + depends: + - python >=3.9 + constrains: + - cryptography >=3.4.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyjwt?source=hash-mapping + size: 25093 + timestamp: 1732782523102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.5.0-py311h9ecbd09_4.conda + sha256: ce8ba3a3448b6d55a4740b5e826839752976435f0121739565aae5796bcf6dc1 + md5: 522059f3c55e201aa5f189fe5276f83f + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.4.1 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - six + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pynacl?source=hash-mapping + size: 1146219 + timestamp: 1725739406065 - pypi: https://files.pythonhosted.org/packages/99/48/00e31747821d3fc56faddd00a4725454d1e694a8b67d715cf20f531506a5/PyOpenGL-3.1.7-py3-none-any.whl name: pyopengl version: 3.1.7 @@ -3431,6 +3948,18 @@ packages: - pkg:pypi/shiboken6?source=hash-mapping size: 10888342 timestamp: 1734099291991 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.0-he550d4f_1_cpython.conda build_number: 1 sha256: 464f998e406b645ba34771bb53a0a7c2734e855ee78dd021aa4dedfdb65659b7 @@ -3479,11 +4008,21 @@ packages: purls: [] size: 6211 timestamp: 1723823324668 -- pypi: https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pyyaml - version: 6.0.2 - sha256: 3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda + sha256: e721e5ff389a7b2135917c04b27391be3d3382e261bb60a369b1620655365c3d + md5: abeb54d40f439b86f75ea57045ab8496 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 212644 + timestamp: 1725456264282 - pypi: https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl name: pyzmq version: 26.2.0 @@ -3645,6 +4184,75 @@ packages: purls: [] size: 281456 timestamp: 1679532220005 +- conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + md5: c58dd5d147492671866464405364c0f1 + depends: + - cmarkgfm >=0.8.0 + - docutils >=0.21.2 + - nh3 >=0.2.14 + - pygments >=2.5.1 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/readme-renderer?source=hash-mapping + size: 17481 + timestamp: 1734339765256 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 + md5: 66de8645e324fda0ea6ef28c2f99a2ab + depends: + - python >=3.9 + - requests >=2.0.1,<3.0.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests-toolbelt?source=hash-mapping + size: 44285 + timestamp: 1733734886897 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + md5: 43e14f832d7551e5a8910672bfc3d8c6 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/rfc3986?source=hash-mapping + size: 38028 + timestamp: 1733921806657 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 185646 + timestamp: 1733342347277 - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py311hc1ac118_0.conda sha256: a52c01f196a0cd680003c5940a8fa95990a4aafe586edbeb04a09c6d70c2820d md5: d295a28b9b897945739417e8ed818f82 @@ -3703,6 +4311,21 @@ packages: purls: [] size: 1352990 timestamp: 1733624788165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py311h38be061_3.conda + sha256: e7d68675349e80416aa0d4fb8262c2f4a223ef9e6e430704be3f809ea0c34d57 + md5: b7d5a90193f112c78e25befb013dd606 + depends: + - cryptography + - dbus + - jeepney >=0.6 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/secretstorage?source=hash-mapping + size: 32190 + timestamp: 1725915725812 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda sha256: e0778e4f276e9a81b51c56f51ec22a27b4d8fc955abc0be77ad09ca9bea06bb9 md5: 8f28e299c11afdd79e0ec1e279dcdc52 @@ -3859,11 +4482,49 @@ packages: - pytest-mypy-testing ; extra == 'test' - pytest>=7.0,<8.2 ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - name: typing-extensions - version: 4.12.2 - sha256: 04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d - requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.0.1-pyhd8ed1ab_1.conda + sha256: 147fbb407bcac2120e0dbe80621f9526f906ec1980aa4e334bb56ae285948864 + md5: 914c226033f944188d45ead62a1ff355 + depends: + - importlib-metadata >=3.6 + - keyring >=15.1 + - packaging + - pkginfo >=1.8.1 + - python >=3.9 + - readme_renderer >=35.0 + - requests >=2.20 + - requests-toolbelt >=0.8.0,!=0.9.0 + - rfc3986 >=1.4.0 + - rich >=12.0.0 + - urllib3 >=1.26.0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/twine?source=hash-mapping + size: 34322 + timestamp: 1734147761823 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf md5: 8ac3367aafb1cc0a068483c580af8015 @@ -3912,6 +4573,21 @@ packages: purls: [] size: 19201 timestamp: 1726152409175 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda sha256: 0884b2023a32d2620192cf2e2fc6784b8d1e31cf9f137e49e00802d4daf7d1c1 md5: 0a732427643ae5e0486a727927791da1 @@ -3932,6 +4608,20 @@ packages: sha256: 3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 requires_dist: - backports-functools-lru-cache>=1.2.1 ; python_full_version < '3.2' +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py311h9ecbd09_0.conda + sha256: e383de6512e65b5a227e7b0e1a34ffc441484044096a23ca4d3b6eb53a64d261 + md5: c4bb961f5a2020837fe3f7f30fadc2e1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 64880 + timestamp: 1736869605707 - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda sha256: 416aa55d946ce4ab173ab338796564893a2f820e80e04e098ff00c25fb981263 md5: 8637c3e5821654d0edf97e2b0404b443 @@ -4266,31 +4956,27 @@ packages: purls: [] size: 90354 timestamp: 1733407433418 -- pypi: https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl - name: zipp - version: 3.21.0 - sha256: ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931 - requires_dist: - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest-enabler>=2.2 ; extra == 'enabler' - - pytest>=6,!=8.1.* ; extra == 'test' - - jaraco-itertools ; extra == 'test' - - jaraco-functools ; extra == 'test' - - more-itertools ; extra == 'test' - - big-o ; extra == 'test' - - pytest-ignore-flaky ; extra == 'test' - - jaraco-test ; extra == 'test' - - importlib-resources ; python_full_version < '3.9' and extra == 'test' - - pytest-mypy ; extra == 'type' - requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 @@ -4303,6 +4989,23 @@ packages: purls: [] size: 92286 timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda + sha256: a5cf0eef1ffce0d710eb3dffcb07d9d5922d4f7a141abc96f6476b98600f718f + md5: aec590674ba365e50ae83aa2d6e1efae + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 417923 + timestamp: 1725305669690 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b md5: 4d056880988120e29d75bfff282e0f45 diff --git a/pixi.toml b/pixi.toml index 82798af..85daec3 100644 --- a/pixi.toml +++ b/pixi.toml @@ -30,6 +30,9 @@ dartpy = ">=6.15.0,<7" numpy = ">=1.26.4,<2" proxsuite = ">=0.6.7,<0.7" qpsolvers = ">=4.4.0,<5" +cibuildwheel = ">=2.21.3,<3" +twine = ">=6.0.1,<7" +auditwheel = ">=6.2.0,<7" [pypi-dependencies] catkin-pkg = ">=1.0.0, <2" @@ -40,6 +43,7 @@ mediapy = ">=1.2.2, <2" ipykernel = ">=6.29.5, <7" mujoco = ">=3.2.7, <4" scipy = "*" +auditwheel-symbols = ">=0.1.13, <0.2" [activation] env = { LD_LIBRARY_PATH = "$CONDA_PREFIX/lib:$LD_LIBRARY_PATH" } # needed to find libraries from cmake diff --git a/setup.py b/setup.py index b0d930c..1b0f83b 100644 --- a/setup.py +++ b/setup.py @@ -52,21 +52,21 @@ def build_extension(self, ext: CMakeExtension) -> None: subprocess.check_call(["cmake", "--build", ".", "--target", ext.name] + build_args, cwd=build_temp) setup( - name="ismpc_py", + name="ismpc", version="0.1", author="Flavio Maiorana", author_email="97flavio.maiorana@gmail.com", description="Cose", long_description="Altre cose", - ext_modules=[CMakeExtension("ismpc_py", sourcedir=".")], + ext_modules=[CMakeExtension("ismpc", sourcedir=".")], cmdclass={"build_ext": CMakeBuild}, zip_safe=False, extras_require={"test": ["pytest>=6.0"]}, python_requires=">=3.8", - packages=find_packages(where="bindings"), - package_dir={"": "bindings"}, + packages=find_packages(), + package_dir={"": "src"}, package_data={ - "ismpc_py": ["*.pyi"], + "ismpc": ["*.pyi"], }, include_package_data=True, ) diff --git a/simulation/dart/controller.py b/simulation/dart/controller.py index de9b248..80be76c 100644 --- a/simulation/dart/controller.py +++ b/simulation/dart/controller.py @@ -3,13 +3,12 @@ import time from robot import Robot from kinematics import Kinematics -from ismpc_py import FrameInfo, Reference, State, FootstepPlan, SimulatedRobot, RotationMatrix +from ismpc_py import FrameInfo, Reference, State, FootstepPlan, RotationMatrix from ismpc_py import ( FootstepPlanProvider, ModelPredictiveController, FootTrajectoryGenerator, MovingConstraintProvider, - StateProvider, KalmanFilter, CasadiMPC, ) diff --git a/bindings/ismpc_binding.cpp b/src/bindings.cpp similarity index 87% rename from bindings/ismpc_binding.cpp rename to src/bindings.cpp index ad27371..300156f 100644 --- a/bindings/ismpc_binding.cpp +++ b/src/bindings.cpp @@ -5,12 +5,7 @@ #include -#include "ismpc_cpp/dart/simulated_robot.h" -#include "ismpc_cpp/dart/state_provider.h" #include "ismpc_cpp/ismpc.h" -#include "ismpc_cpp/modules/casadi_mpc.h" -#include "ismpc_cpp/modules/footstep_plan_provider.h" -#include "ismpc_cpp/modules/kalman_filter.h" #include "ismpc_cpp/tools/math/rotation_matrix.h" #include "ismpc_cpp/types/lip_state.h" @@ -21,7 +16,7 @@ NB_MAKE_OPAQUE(ismpc::RotationMatrix); namespace ismpc { namespace python { -NB_MODULE(ismpc_py, m) { +NB_MODULE(ismpc, m) { nb::class_(m, "State") .def(nb::init<>()) .def_rw("lip", &State::lip) @@ -57,10 +52,6 @@ NB_MODULE(ismpc_py, m) { .def(nb::init()) .def("update", &FootTrajectoryGenerator::update); - nb::class_(m, "CasadiMPC") - .def(nb::init()) - .def("update", &CasadiMPC::update); - nb::class_(m, "EndEffector") .def(nb::init<>()) .def_rw("pose", &EndEffector::pose) @@ -130,14 +121,6 @@ NB_MODULE(ismpc_py, m) { .def_rw("zmp_vel", &LipState::zmp_vel) .def("__str__", &LipState::toString); - nb::class_(m, "SimulatedRobot") - .def("get_joint_request", &SimulatedRobot::getJointRequest) - .def("set_initial_configuration", &SimulatedRobot::setInitialConfiguration); - - nb::class_(m, "StateProvider") - .def(nb::init()) - .def("update", &StateProvider::update); - nb::class_(m, "KalmanFilter").def(nb::init<>()).def("update", &KalmanFilter::update); }; diff --git a/src/cppmain.cpp b/src/cppmain.cpp index f27941c..7990496 100644 --- a/src/cppmain.cpp +++ b/src/cppmain.cpp @@ -1,7 +1,6 @@ #include #include "ismpc_cpp/ismpc.h" -#include "ismpc_cpp/modules/casadi_mpc.h" #include "ismpc_cpp/modules/foot_trajectory_generator.h" #include "ismpc_cpp/modules/footstep_plan_provider.h" #include "ismpc_cpp/modules/model_predictive_controller.h" @@ -24,7 +23,6 @@ int main() { ismpc::ModelPredictiveController mpc = ismpc::ModelPredictiveController(frame_info, state, plan); ismpc::FootTrajectoryGenerator ft_generator = ismpc::FootTrajectoryGenerator(frame_info, state, plan); ismpc::MovingConstraintProvider mc_provider = ismpc::MovingConstraintProvider(frame_info, state, plan); - ismpc::CasadiMPC casadi_mpc = ismpc::CasadiMPC(frame_info, state, plan); // Timing stuff std::chrono::system_clock::time_point start, end; diff --git a/src/dart/controller.cpp b/src/dart/controller.cpp deleted file mode 100644 index add7548..0000000 --- a/src/dart/controller.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "ismpc_cpp/dart/controller.h" - -namespace ismpc { - -Controller::Controller(const dart::simulation::WorldPtr world, const dart::dynamics::SkeletonPtr skeleton) - : dart::gui::osg::WorldNode(world), - state(), - plan(), - frame_info(), - reference(), - robot(skeleton), - world(world), - planner(frame_info, reference, state, plan), - mpc(frame_info, state, plan), - mc_provider(frame_info, state, plan), - ft_generator(frame_info, state, plan), - casadi_mpc(frame_info, state, plan), - state_provider(robot), - kalman_filter() { - world->setTimeStep(Config::delta); - com = registerBall("com", ismpc::Config::RED); - zmp = registerBall("zmp", ismpc::Config::GREEN); - planner.update(plan); -} - -void Controller::customPreStep() { - auto start = std::chrono::high_resolution_clock::now(); - - std::cout << std::endl << "--------------------------------" << std::endl; - // Update the state of the robot - state_provider.update(state); // Reading sensors - kalman_filter.update(state); // Filtering the state - - // state.lip.zmp_pos = state.desired_lip.zmp_pos; - // state.lip.zmp_vel = state.desired_lip.zmp_vel; - - if (frame_info.k == 0) { - state.footstep.start_pose.translation(0) = state.right_foot.pose.translation(0); - state.footstep.end_pose.translation(0) = state.right_foot.pose.translation(0); - state.desired_right_foot.pose.translation(0) = state.right_foot.pose.translation(0); - } - - std::cout << "CURRENT STATE" << std::endl; - std::cout << "COM POS: " << state.lip.com_pos.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "COM VEL: " << state.lip.com_vel.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "COM ACC: " << state.lip.com_acc.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "ZMP POS: " << state.lip.zmp_pos.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "ZMP VEL: " << state.lip.zmp_vel.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "LFoot Pose: " << state.left_foot.pose.getVector().transpose().format(Config::CleanFmt) - << std::endl; - std::cout << "RFoot Pose: " << state.right_foot.pose.getVector().transpose().format(Config::CleanFmt) - << std::endl; - std::cout << "" << std::endl; - - std::cout << "CURRENT TIME: " << frame_info.tk << std::endl; - std::cout << "CURRENT PLANNED FOOTSTEP: \n" << state.footstep.toString() << std::endl; - std::cout << "MVOING CONSTRAINT X: \n" << plan.zmp_midpoints_x.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "MVOING CONSTRAINT Y: \n" << plan.zmp_midpoints_y.transpose().format(Config::CleanFmt) << std::endl; - - // Step of MPC - mc_provider.update(plan); - mpc.update(state); - ft_generator.update(state); - - std::cout << "DESIRED STATE" << std::endl; - std::cout << "COM POS: " << state.desired_lip.com_pos.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "COM VEL: " << state.desired_lip.com_vel.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "COM ACC: " << state.desired_lip.com_acc.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "ZMP POS: " << state.desired_lip.zmp_pos.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "ZMP VEL: " << state.desired_lip.zmp_vel.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "Left Foot Pose: " << state.desired_left_foot.pose.getVector().transpose().format(Config::CleanFmt) - << std::endl; - std::cout << "Right Foot Pose: " - << state.desired_right_foot.pose.getVector().transpose().format(Config::CleanFmt) << std::endl; - std::cout << "--------------------------------" << std::endl; - - // Setting Desired Torso based on the feet - // Vector3 desired_torso_orientation = - // (state.desired_left_foot.pose.rotation.getRPY() + state.desired_right_foot.pose.rotation.getRPY()) / 2; - // Vector3 desired_torso_ang_vel = (state.desired_left_foot.ang_vel + state.desired_right_foot.ang_vel) / 2; - // Vector3 desired_torso_ang_acc = (state.desired_left_foot.ang_acc + state.desired_right_foot.ang_acc) / 2; - // state.desired_torso.pose.rotation = RotationMatrix(desired_torso_orientation(0), desired_torso_orientation(1), - // desired_torso_orientation(2)); - // state.desired_torso.ang_vel = desired_torso_ang_vel; - // state.desired_torso.ang_acc = desired_torso_ang_acc; - - // Get and send the joint request - VectorX joint_request = robot.getJointRequest(state); - for (size_t i = 0; i < robot.skeleton->getNumDofs() - 6; i++) { - robot.skeleton->setCommand(i + 6, joint_request(i)); - } - - // Update frame info - frame_info.k += 1; - frame_info.tk += Config::delta; - - if (frame_info.k > Config::N) - exit(0); - - auto end = std::chrono::high_resolution_clock::now(); - total_elapsed_time += std::chrono::duration_cast(end - start).count(); - - std::cout << "Average execution time: " << total_elapsed_time / frame_info.k << " microseconds" << std::endl; -} - -dart::simulation::WorldPtr Controller::get_world() { - return world; -} - -dart::dynamics::SimpleFramePtr Controller::registerBall(const std::string& name, const Eigen::Vector3d& color) { - dart::dynamics::SimpleFramePtr ball_frame = std::make_shared( - dart::dynamics::Frame::World(), name, Eigen::Isometry3d::Identity()); - - ball_frame->setShape(std::make_shared(.2 * Eigen::Vector3d::Ones())); - ball_frame->createVisualAspect(); - ball_frame->getVisualAspect()->setColor(color); - world->addSimpleFrame(ball_frame); - - return ball_frame; -} - -} // namespace ismpc diff --git a/src/dart/qp_solver.cpp b/src/dart/qp_solver.cpp deleted file mode 100644 index 45429a6..0000000 --- a/src/dart/qp_solver.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "ismpc_cpp/dart/qp_solver.h" - -namespace ismpc { - -QPSolver::QPSolver(int d) { - this->d = d; - opti = casadi::Opti("conic"); - casadi::Dict options; - options["expand"] = true; - options["print_time"] = false; - opti.solver("proxqp", options); - - // Define decision variables - x = opti.variable(d); - - // Cost function - H = opti.parameter(d, d); - g = opti.parameter(d); - MX cost = 0.5 * MX::mtimes(std::vector{x.T(), H, x}) + MX::mtimes(std::vector{g.T(), x}); - opti.minimize(cost); -} - -void QPSolver::init(const DM& H, const DM& g) { - opti.set_value(this->H, H); - opti.set_value(this->g, g); -}; - -VectorX QPSolver::solve() { - casadi::OptiSol sol = opti.solve(); - - DM x_sol = sol.value(x); - - VectorX x_sol_vec = VectorX::Zero(d); - for (int i = 0; i < d; i++) { - x_sol_vec(i) = x_sol->at(i); - } - - return x_sol_vec; -} - -} // namespace ismpc diff --git a/src/dart/simulated_robot.cpp b/src/dart/simulated_robot.cpp deleted file mode 100644 index d663643..0000000 --- a/src/dart/simulated_robot.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "ismpc_cpp/dart/simulated_robot.h" - -#include -#include - -#include "ismpc_cpp/types/math_types.h" - -namespace ismpc { - -SimulatedRobot::SimulatedRobot(dart::dynamics::SkeletonPtr skeleton) - : skeleton(skeleton), qp(skeleton->getNumDofs(), 0, 0) { - d_left_foot = skeleton->getBodyNode("l_sole"); - d_right_foot = skeleton->getBodyNode("r_sole"); - d_base = skeleton->getBodyNode("body"); - d_torso = skeleton->getBodyNode("torso"); - - setInitialConfiguration(); - initial_configuration = skeleton->getPositions(); - - std::array redundant_dofs = {"NECK_Y", "NECK_P", "R_SHOULDER_P", "R_SHOULDER_R", - "R_SHOULDER_Y", "L_SHOULDER_P", "L_SHOULDER_R", "L_SHOULDER_Y"}; - joint_selection = Matrix::Zero(skeleton->getNumDofs(), skeleton->getNumDofs()); - for (const auto& dof_name : redundant_dofs) { - joint_selection(skeleton->getDof(dof_name)->getIndexInSkeleton(), - skeleton->getDof(dof_name)->getIndexInSkeleton()) = 1; - } -} - -VectorX SimulatedRobot::getJointRequest(const State& state) { - std::cout << "RETRIEVING JOINT REQUEST" << std::endl; - - // Define QP Problem - const int d = skeleton->getNumDofs(); - VectorX qpos = skeleton->getPositions(); // d x 1 - VectorX qvel = skeleton->getVelocities(); // d x 1 - Matrix H = Matrix::Zero(d, d); - VectorX g = VectorX::Zero(d); - Matrix J; - Matrix Jtrans; - Matrix Jdot; - VectorX pos_error; - VectorX vel_error; - VectorX ff; - - // COM cost - J = skeleton->getCOMLinearJacobian(); // 3 x d - Jtrans = J.transpose(); // d x 3 - Jdot = skeleton->getCOMLinearJacobianDeriv(); // 3 x d - pos_error = state.desired_lip.com_pos - state.lip.com_pos; // 3 x 1 - vel_error = state.desired_lip.com_vel - state.lip.com_vel; // 3 x 1 - ff = state.desired_lip.com_acc; // 3 x 1 - H += Jtrans * J; // d x d - g += -Jtrans * (-Jdot * qvel + ff + 5.0 * pos_error + 10.0 * vel_error); // d x 1 - - // Left foot cost - J = skeleton->getJacobian(d_left_foot); // 6 x d - Jtrans = J.transpose(); // d x 6 - Jdot = skeleton->getJacobianClassicDeriv(d_left_foot); // 6 x d - pos_error = state.desired_left_foot.pose.getVector() - state.left_foot.pose.getVector(); // 6 x 1 - std::cout << "Left Foot Pos Error: " << pos_error.transpose().format(Config::CleanFmt) << std::endl; - vel_error = state.desired_left_foot.getVelocity() - state.left_foot.getVelocity(); // 3 x 1 - ff = state.desired_left_foot.getAcceleration(); // 6 x 1 - H += Jtrans * J; // d x d - g += -Jtrans * (-Jdot * qvel + ff + 5.0 * pos_error + 10.0 * vel_error); // d x 1 - - // Right foot cost - J = skeleton->getJacobian(d_right_foot); // 6 x d - Jtrans = J.transpose(); // d x 6 - Jdot = skeleton->getJacobianClassicDeriv(d_right_foot); // 6 x d - pos_error = state.desired_right_foot.pose.getVector() - state.right_foot.pose.getVector(); // 6 x 1 - std::cout << "Right Foot Pos Error: " << pos_error.transpose().format(Config::CleanFmt) << std::endl; - vel_error = state.desired_right_foot.getVelocity() - state.right_foot.getVelocity(); // 3 x 1 - ff = state.desired_right_foot.getAcceleration(); // 6 x 1 - H += Jtrans * J; // d x d - g += -Jtrans * (-Jdot * qvel + ff + 5.0 * pos_error + 10.0 * vel_error); // d x 1 - - // Redundant dofs cost - pos_error = initial_configuration - qpos; // d x 1 - vel_error = -qvel; // d x 1 - H += 1e-2 * joint_selection; // d x d - g += 1e-2 * joint_selection * (10.0 * pos_error + 1.0 * vel_error); // d x 1 - - // Torso cost - J = skeleton->getAngularJacobian(d_torso); // 3 x d - Jtrans = J.transpose(); // d x 3 - Jdot = skeleton->getAngularJacobianDeriv(d_torso); // 3 x d - pos_error = state.desired_torso.pose.rotation.getRPY() - state.desired_torso.pose.rotation.getRPY(); // 3 x 1 - vel_error = state.desired_torso.ang_vel - state.torso.ang_vel; // 3 x 1 - ff = state.desired_torso.ang_acc; - H += Jtrans * J; // d x d - g += Jtrans * (Jdot * qvel - ff - 1. * pos_error - 1. * vel_error); // d x 1 - - // Base cost - J = skeleton->getAngularJacobian(d_base); // 3 x d - Jtrans = J.transpose(); // d x 3 - Jdot = skeleton->getAngularJacobianDeriv(d_base); // 3 x d - pos_error = state.desired_torso.pose.rotation.getRPY() - state.desired_torso.pose.rotation.getRPY(); // 3 x 1 - vel_error = state.desired_torso.ang_vel - state.torso.ang_vel; // 3 x 1 - ff = state.desired_torso.ang_acc; - H += Jtrans * J; // d x d - g += Jtrans * (Jdot * qvel - ff - 1. * pos_error - 1. * vel_error); // d x 1 - - if (!H.allFinite()) { - throw std::runtime_error("H contains NaN or Inf values"); - } - - if (!g.allFinite()) { - throw std::runtime_error("g contains NaN or Inf values"); - } - - qp.update(H, g, nullopt, nullopt, nullopt, nullopt, nullopt); - qp.solve(); - VectorX command = qp.results.x.segment(6, d - 6); - - std::cout << "Joint Request: " << command.transpose() << std::endl; - - return command; -} - -void SimulatedRobot::setInitialConfiguration() { - // right leg - skeleton->setPosition(skeleton->getDof("R_HIP_Y")->getIndexInSkeleton(), 0.0); - skeleton->setPosition(skeleton->getDof("R_HIP_R")->getIndexInSkeleton(), -3 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("R_HIP_P")->getIndexInSkeleton(), -25 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("R_KNEE_P")->getIndexInSkeleton(), 50 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("R_ANKLE_P")->getIndexInSkeleton(), -25 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("R_ANKLE_R")->getIndexInSkeleton(), 3 * M_PI / 180); - - // left leg - skeleton->setPosition(skeleton->getDof("L_HIP_Y")->getIndexInSkeleton(), 0.0); - skeleton->setPosition(skeleton->getDof("L_HIP_R")->getIndexInSkeleton(), 3 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("L_HIP_P")->getIndexInSkeleton(), -25 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("L_KNEE_P")->getIndexInSkeleton(), 50 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("L_ANKLE_P")->getIndexInSkeleton(), -25 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("L_ANKLE_R")->getIndexInSkeleton(), -3 * M_PI / 180); - - // right arm - skeleton->setPosition(skeleton->getDof("R_SHOULDER_P")->getIndexInSkeleton(), 4 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("R_SHOULDER_R")->getIndexInSkeleton(), -8 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("R_SHOULDER_Y")->getIndexInSkeleton(), 0); - skeleton->setPosition(skeleton->getDof("R_ELBOW_P")->getIndexInSkeleton(), -25 * M_PI / 180); - - // left arm - skeleton->setPosition(skeleton->getDof("L_SHOULDER_P")->getIndexInSkeleton(), 4 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("L_SHOULDER_R")->getIndexInSkeleton(), 8 * M_PI / 180); - skeleton->setPosition(skeleton->getDof("L_SHOULDER_Y")->getIndexInSkeleton(), 0); - skeleton->setPosition(skeleton->getDof("L_ELBOW_P")->getIndexInSkeleton(), -25 * M_PI / 180); - - // Set floating base height - Vector3 left_foot_pos = d_left_foot->getTransform().translation(); - Vector3 right_foot_pos = d_right_foot->getTransform().translation(); - skeleton->setPosition(5, -(left_foot_pos(2) + right_foot_pos(2)) / 2.0); -} - -} // namespace ismpc diff --git a/src/dart/state_provider.cpp b/src/dart/state_provider.cpp deleted file mode 100644 index 19d1d2c..0000000 --- a/src/dart/state_provider.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "ismpc_cpp/dart/state_provider.h" - -namespace ismpc { - -StateProvider::StateProvider(const SimulatedRobot& robot) : robot(robot) {} - -void StateProvider::update(State& state) { - // Update the com of the robot - state.lip.com_pos = robot.skeleton->getCOM(); - state.lip.com_vel = robot.skeleton->getCOMLinearVelocity(); - state.lip.com_acc = robot.skeleton->getCOMLinearAcceleration(); - - // Left foot - Eigen::Isometry3d l_foot_transform = robot.d_left_foot->getWorldTransform(); - state.left_foot.pose.translation = l_foot_transform.translation(); - state.left_foot.pose.euler = l_foot_transform.rotation().eulerAngles(0, 1, 2); - state.left_foot.pose.rotation = RotationMatrix(l_foot_transform.rotation().matrix()); - state.left_foot.lin_vel = robot.d_left_foot->getLinearVelocity(); - - // Right foot - Eigen::Isometry3d r_foot_transform = robot.d_right_foot->getWorldTransform(); - state.right_foot.pose.translation = r_foot_transform.translation(); - state.right_foot.pose.euler = r_foot_transform.rotation().eulerAngles(0, 1, 2); - state.right_foot.pose.rotation = RotationMatrix(r_foot_transform.rotation().matrix()); - state.right_foot.lin_vel = robot.d_right_foot->getLinearVelocity(); - - // Update the ZMP - bool left_contact = false; - bool right_contact = false; - Eigen::VectorXd grf_L = robot.d_left_foot->getConstraintImpulse(); - Eigen::VectorXd grf_R = robot.d_right_foot->getConstraintImpulse(); - Eigen::Vector3d left_cop, right_cop; - - if (abs(grf_L[5]) > 0.1) { - left_cop << -grf_L(1) / grf_L(5), grf_L(0) / grf_L(5), 0.0; - left_cop = robot.d_left_foot->getWorldTransform().translation() + - robot.d_left_foot->getWorldTransform().rotation() * left_cop; - left_contact = true; - } - - if (abs(grf_R[5]) > 0.1) { - right_cop << -grf_R(1) / grf_R(5), grf_R(0) / grf_R(5), 0.0; - right_cop = robot.d_right_foot->getWorldTransform().translation() + - robot.d_right_foot->getWorldTransform().rotation() * right_cop; - right_contact = true; - } - - if (left_contact && right_contact) { - state.lip.zmp_pos = - Eigen::Vector3d((left_cop(0) * grf_L[5] + right_cop(0) * grf_R[5]) / (grf_L[5] + grf_R[5]), - (left_cop(1) * grf_L[5] + right_cop(1) * grf_R[5]) / (grf_L[5] + grf_R[5]), 0.0); - } else if (left_contact) { - state.lip.zmp_pos = Eigen::Vector3d(left_cop(0), left_cop(1), 0.0); - } else if (right_contact) { - state.lip.zmp_pos = Eigen::Vector3d(right_cop(0), right_cop(1), 0.0); - } -} - -} // namespace ismpc diff --git a/src/dartmain.cpp b/src/dartmain.cpp deleted file mode 100644 index 47e4a39..0000000 --- a/src/dartmain.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "ismpc_cpp/dart/controller.h" -#include "ismpc_cpp/dart/simulated_robot.h" -#include "ismpc_cpp/tools/config/config.h" - -int main() { - dart::simulation::WorldPtr world(new dart::simulation::World); - - dart::utils::DartLoader::Options options; - dart::utils::DartLoader urdfLoader(options); - options.mDefaultInertia = - dart::dynamics::Inertia(1e-8, Eigen::Vector3d::Zero(), 1e-10 * Eigen::Matrix3d::Identity()); - auto robot = urdfLoader.parseSkeleton(realpath("simulation/dart/hrp4/urdf/hrp4.urdf", NULL)); - auto ground = urdfLoader.parseSkeleton(realpath("simulation/dart/hrp4/urdf/ground.urdf", NULL)); - world->addSkeleton(ground); - world->addSkeleton(robot); - world->setGravity(Eigen::Vector3d(0.0, 0.0, -9.81)); - world->setTimeStep(ismpc::Config::delta); - - for (auto* bn : robot->getBodyNodes()) { - if (bn->getMass() == 0.0) { - bn->setMass(1e-8); - bn->setInertia(options.mDefaultInertia); - } - } - - // set joint actuator type - for (size_t i = 0; i < robot->getNumJoints(); i++) { - size_t dim = robot->getJoint(i)->getNumDofs(); - if (dim == 6) { - robot->getJoint(i)->setActuatorType(dart::dynamics::Joint::PASSIVE); - } - if (dim == 1) { - robot->getJoint(i)->setActuatorType(dart::dynamics::Joint::ACCELERATION); - } - } - - // Wrap a WorldNode around the world and robot - osg::ref_ptr node = new ismpc::Controller(world, robot); - node->setNumStepsPerCycle(1); - - // Create a viewer and set it up with the WorldNode - dart::gui::osg::ImGuiViewer viewer; - viewer.addWorldNode(node); - - // Set the dimensions for the window - viewer.setUpViewInWindow(0, 0, 1280, 720); - if (ismpc::Config::save_log) { - std::filesystem::create_directories("videos/dart"); - viewer.record("videos/dart", "frame"); - } - - // Set the window name - viewer.realize(); - osgViewer::Viewer::Windows windows; - viewer.getWindows(windows); - windows.front()->setWindowName("Intrinsincally Stable Model Predictive Control"); - - // Adjust the viewpoint of the Viewer - viewer.getCameraManipulator()->setHomePosition(::osg::Vec3d(5, -1, 1.5), ::osg::Vec3d(1, 0, 0.5), - ::osg::Vec3d(0, 0, 1)); - - // We need to re-dirty the CameraManipulator by passing it into the viewer - // again, so that the viewer knows to update its HomePosition setting - viewer.setCameraManipulator(viewer.getCameraManipulator()); - - // Run the simulation! - viewer.run(); -} diff --git a/src/modules/casadi_mpc.cpp b/src/modules/casadi_mpc.cpp deleted file mode 100644 index 2ae12d4..0000000 --- a/src/modules/casadi_mpc.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "ismpc_cpp/modules/casadi_mpc.h" - -#include -#include - -namespace ismpc { - -CasadiMPC::CasadiMPC(const FrameInfo& frame_info, const State& state, const FootstepPlan& plan) - : frame_info(frame_info), state(state), plan(plan) { - opti = casadi::Opti("conic"); - casadi::Dict options; - casadi::Dict solver_options; - options["expand"] = true; - options["print_time"] = false; - solver_options["max_iter"] = 1000; - opti.solver("proxqp", options, solver_options); - - X = opti.variable(6, numC + 1); - U = opti.variable(2, numC); - - x0_param = opti.parameter(6); - zmp_x_param = opti.parameter(numC); - zmp_y_param = opti.parameter(numC); - - opti.subject_to(X(all, 0) == x0_param); - for (int i = 0; i < numC; i++) { - opti.subject_to(X(all, i + 1) == X(all, i) + delta * f(X(all, i), U(all, i))); - } - - cost = casadi::MX::sumsqr(U(0, all)) + casadi::MX::sumsqr(U(1, all)) + - 100 * casadi::MX::sumsqr(X(2, all_but_first).T() - zmp_x_param) + - 100 * casadi::MX::sumsqr(X(5, all_but_first).T() - zmp_y_param); - - opti.subject_to(X(2, all_but_first).T() <= zmp_x_param + dxz / 2); - opti.subject_to(X(2, all_but_first).T() >= zmp_x_param - dxz / 2); - opti.subject_to(X(5, all_but_first).T() <= zmp_y_param + dyz / 2); - opti.subject_to(X(5, all_but_first).T() >= zmp_y_param - dyz / 2); - - opti.subject_to(X(1, 0) + std::pow(eta, 3) * (X(0, 0) - X(2, 0)) == - X(1, numC) + std::pow(eta, 3) * (X(0, numC) - X(2, numC))); - opti.subject_to(X(4, 0) + std::pow(eta, 3) * (X(3, 0) - X(5, 0)) == - X(4, numC) + std::pow(eta, 3) * (X(3, numC) - X(5, numC))); - - opti.minimize(cost); -} - -void CasadiMPC::update(State& state) { - VectorX x0 = state.lip.getState(); - for (int i = 0; i < 6; i++) { - opti.set_value(x0_param(i), x0(i)); - } - - VectorX zmp_x = plan.zmp_midpoints_x; - VectorX zmp_y = plan.zmp_midpoints_y; - - std::cout << "ZMP_X: " << zmp_x.transpose().format(Config::CleanFmt) << std::endl; - std::cout << "ZMP_Y: " << zmp_y.transpose().format(Config::CleanFmt) << std::endl; - - for (int i = 0; i < numC; i++) { - opti.set_value(zmp_x_param(i), zmp_x(i)); - opti.set_value(zmp_y_param(i), zmp_y(i)); - } - - casadi::OptiSol sol = opti.solve(); - opti.set_initial(X, sol.value(X)); - opti.set_initial(U, sol.value(U)); - - std::vector x_sol = sol.value(X(all, 1)).get_elements(); - std::vector u_sol = sol.value(U(all, 0)).get_elements(); - - state.desired_lip.com_pos << x_sol[0], x_sol[3], 0.75; - state.desired_lip.com_vel << x_sol[1], x_sol[4], 0.0; - state.desired_lip.zmp_pos << x_sol[2], x_sol[5], 0.0; - state.desired_lip.zmp_vel << u_sol[0], u_sol[1], 0.0; - VectorX com_acc = (eta * eta) * (state.desired_lip.com_pos - state.desired_lip.zmp_pos); - state.desired_lip.com_acc << com_acc(0), com_acc(1), 0.0; - - state.lip_history.push_back(state.lip); - state.left_foot_history.push_back(state.left_foot); - state.right_foot_history.push_back(state.right_foot); - - // =============== FOOTSTEP UPDATE ================== - - // Switch support foot when the double support phase ends - if (frame_info.tk >= state.footstep.end && state.support_phase == SupportPhase::DOUBLE) { - state.fs_history.push_back(state.footstep); - state.footstep = plan.footsteps[fs_index]; - fs_index++; - } - - // Update the support phase info - if (frame_info.tk >= state.footstep.ds_start) - state.support_phase = SupportPhase::DOUBLE; - else - state.support_phase = SupportPhase::SINGLE; - // ==================================================== -} - -casadi::MX CasadiMPC::f(const casadi::MX& x, const casadi::MX& u) const { - casadi::MX x_next = casadi::MX::mtimes(A, x(first_half)) + casadi::MX::mtimes(B, u(0)); - casadi::MX y_next = casadi::MX::mtimes(A, x(second_half)) + casadi::MX::mtimes(B, u(1)); - return casadi::MX::vertcat({x_next, y_next}); -} - -} // namespace ismpc diff --git a/src/modules/foot_trajectory_generator.cpp b/src/modules/foot_trajectory_generator.cpp index a841593..d44bdb3 100644 --- a/src/modules/foot_trajectory_generator.cpp +++ b/src/modules/foot_trajectory_generator.cpp @@ -31,10 +31,11 @@ void FootTrajectoryGenerator::update(State& state) { Scalar desired_theta = start_theta + (end_theta - start_theta) * cubic(time_in_step); swing_foot.pose = Pose3(RotationMatrix::aroundZ(desired_theta), Vector3(desired_pos(0), desired_pos(1), 0)); swing_foot.pose.euler = Vector3(0, 0, desired_theta); - + // Linear Velocity with cubic polynomial interpolation swing_foot.lin_vel.segment(0, 2) = (end_pos - start_pos) * cubic_dot(time_in_step) / ss_duration; - swing_foot.lin_acc.segment(0, 2) = (end_pos - start_pos) * cubic_ddot(time_in_step) / (std::pow(ss_duration, 2)); + swing_foot.lin_acc.segment(0, 2) = + (end_pos - start_pos) * cubic_ddot(time_in_step) / (std::pow(ss_duration, 2)); // Height with quartic polynomial interpolation swing_foot.pose.translation(2) = step_height * quartic(time_in_step); swing_foot.lin_vel(2) = step_height * quartic_dot(time_in_step) / ss_duration; @@ -42,7 +43,8 @@ void FootTrajectoryGenerator::update(State& state) { // Angular Velocity with cubic polynomial interpolation swing_foot.ang_vel = Vector3(0, 0, (end_theta - start_theta) * cubic_dot(time_in_step) / ss_duration); - swing_foot.ang_acc = Vector3(0, 0, (end_theta - start_theta) * cubic_ddot(time_in_step) / (std::pow(ss_duration, 2))); + swing_foot.ang_acc = + Vector3(0, 0, (end_theta - start_theta) * cubic_ddot(time_in_step) / (std::pow(ss_duration, 2))); } state.setDesiredSwingFoot(swing_foot); diff --git a/src/modules/footstep_plan_provider.cpp b/src/modules/footstep_plan_provider.cpp index ba47456..c67392e 100644 --- a/src/modules/footstep_plan_provider.cpp +++ b/src/modules/footstep_plan_provider.cpp @@ -74,7 +74,7 @@ void FootstepPlanProvider::computeThetaSequence() { theta_qp.work.timer.stop(); total_planner_qp_duration += theta_qp.work.timer.elapsed().user; - if (theta_qp.results.info.status != PROXQP_SOLVED) { + if (theta_qp.results.info.status != proxsuite::proxqp::QPSolverOutput::PROXQP_SOLVED) { throw std::runtime_error("Theta QP solver failed to find a solution."); } @@ -103,7 +103,7 @@ void FootstepPlanProvider::computePositionSequence() { position_qp.work.timer.stop(); total_planner_qp_duration += position_qp.work.timer.elapsed().user; - if (position_qp.results.info.status != PROXQP_SOLVED) { + if (position_qp.results.info.status != proxsuite::proxqp::QPSolverOutput::PROXQP_SOLVED) { throw std::runtime_error("Theta QP solver failed to find a solution."); } diff --git a/src/types/ismpc_qp.cpp b/src/types/ismpc_qp.cpp index 89bed08..f5ba99a 100644 --- a/src/types/ismpc_qp.cpp +++ b/src/types/ismpc_qp.cpp @@ -91,7 +91,7 @@ bool IsmpcQp::solve() { zmp_constraint.u); qp.solve(); - if (qp.results.info.status != PROXQP_SOLVED) { + if (qp.results.info.status != proxsuite::proxqp::QPSolverOutput::PROXQP_SOLVED) { std::cout << "QP solver failed to find a solution." << std::endl; return false; }