diff --git a/.clang-format b/.clang-format index 4a45c842e..7cb9683ac 100644 --- a/.clang-format +++ b/.clang-format @@ -1,3 +1,3 @@ BasedOnStyle: Google SortIncludes: false -Standard: Cpp11 +Standard: c++17 diff --git a/.gersemirc b/.gersemirc new file mode 100644 index 000000000..f28e5d305 --- /dev/null +++ b/.gersemirc @@ -0,0 +1,3 @@ +definitions: [] +line_length: 100 +indent: 2 diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index b3501224d..4f3e1dd6a 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -64,8 +64,6 @@ jobs: steps: - uses: actions/checkout@v6 - with: - submodules: recursive - uses: actions/cache@v4 with: @@ -105,8 +103,6 @@ jobs: steps: - uses: actions/checkout@v6 - with: - submodules: recursive - uses: prefix-dev/setup-pixi@v0.9.3 env: diff --git a/.github/workflows/reloc.yml b/.github/workflows/reloc.yml index 9bd5ce74e..4caeae6ba 100644 --- a/.github/workflows/reloc.yml +++ b/.github/workflows/reloc.yml @@ -35,8 +35,6 @@ jobs: steps: - uses: actions/checkout@v6 - with: - submodules: recursive - uses: actions/cache@v4 with: @@ -50,7 +48,7 @@ jobs: run: sudo mkdir -p /RELOC/SRC && sudo chown -R $(id -un) /RELOC - name: clone in /RELOC/SRC - run: git -C /RELOC/SRC clone --recursive $(pwd) + run: git -C /RELOC/SRC clone $(pwd) - name: install dependencies run: sudo apt install libboost-all-dev libeigen3-dev python-is-python3 python3-numpy python3-pip python3-scipy ccache diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index 2e577911b..012d7b289 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -42,11 +42,11 @@ jobs: env: # PRERELEASE: true # Fails due to issues in the underlying Docker image BUILDER: colcon + VERBOSE_OUTPUT: true + VERBOSE_TESTS: true runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - with: - submodules: recursive # Run industrial_ci - uses: 'ros-industrial/industrial_ci@eb3ea328ff056aa2435d5b3493e7e2929c310f8e' env: ${{ matrix.env }} diff --git a/.gitignore b/.gitignore index b36d9847d..d3f153efd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,14 @@ +build*/ +install*/ +.pytest_cache/ +.cache/ +.pixi/ +__pycache__/ +Xcode* +*.pyc *~ -*build*/ -# pixi environments -.pixi +*.egg-info +.ruff_cache +.DS_Store +compile_commands.json +cmake-profiling.json \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 2b7a4fe10..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "cmake"] - path = cmake - url = https://github.com/jrl-umi3218/jrl-cmakemodules.git diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0a0313cde..3f33cdbae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,27 +3,27 @@ ci: autofix_prs: false autoupdate_schedule: quarterly repos: +- repo: https://github.com/BlankSpruce/gersemi + rev: 0.24.0 + hooks: + - id: gersemi - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.13.3 + rev: v0.14.8 hooks: - - id: ruff + - id: ruff-check args: - --fix - --exit-non-zero-on-fix - --ignore - UP036 - id: ruff-format -- repo: https://github.com/cheshirekow/cmake-format-precommit - rev: v0.6.13 - hooks: - - id: cmake-format - repo: https://github.com/pappasam/toml-sort rev: v0.24.3 hooks: - id: toml-sort-fix exclude: pixi.toml|dockgen.toml - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v21.1.2 + rev: v21.1.7 hooks: - id: clang-format - repo: https://github.com/pre-commit/pre-commit-hooks diff --git a/CHANGELOG.md b/CHANGELOG.md index 95fcfd9ab..6b8f3e6b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Python version update ([#603](https://github.com/stack-of-tasks/eigenpy/pull/603)): - Project is now tested with Python 3.10 and 3.14 - Python 3.10 is the minimal supported Python version +- Switch to [JRL CMake modules v2](https://github.com/jrl-umi3218/jrl-cmakemodules/pull/798) ([#28](https://github.com/Simple-Robotics/nanoeigenpy/pull/28)) ### Added - Support for Python slice, tuple and list indexing for `std::vector` bindings ([#592](https://github.com/stack-of-tasks/eigenpy/pull/592)) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ca21e2c6..b0fcb6a39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,479 +1,316 @@ -# -# Copyright (c) 2014-2019 CNRS Copyright (c) 2018-2023 INRIA -# +# Copyright 2025-2026 Inria -cmake_minimum_required(VERSION 3.22) +cmake_minimum_required(VERSION 3.22...4.2) -set(PROJECT_NAME eigenpy) -set(PROJECT_DESCRIPTION "Bindings between Numpy and Eigen using Boost.Python") -set(PROJECT_URL "http://github.com/stack-of-tasks/eigenpy") -set(PROJECT_USE_CMAKE_EXPORT TRUE) -set(PROJECT_USE_KEYWORD_LINK_LIBRARIES TRUE) -set(PROJECT_CUSTOM_HEADER_EXTENSION "hpp") -set(PROJECT_COMPATIBILITY_VERSION AnyNewerVersion) -# To enable jrl-cmakemodules compatibility with workspace we must define the two -# following lines -set(PROJECT_AUTO_RUN_FINALIZE FALSE) -set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}) +project( + eigenpy + VERSION 3.12.0 + DESCRIPTION "Bindings between Numpy and Eigen using Boost.Python" + HOMEPAGE_URL "https://github.com/stack-of-tasks/eigenpy" +) -# Check if the submodule cmake have been initialized -set(JRL_CMAKE_MODULES "${CMAKE_CURRENT_LIST_DIR}/cmake") -if(EXISTS "${JRL_CMAKE_MODULES}/base.cmake") - message(STATUS "JRL cmakemodules found in 'cmake/' git submodule") -else() - find_package(jrl-cmakemodules QUIET CONFIG) - if(jrl-cmakemodules_FOUND) - get_property( - JRL_CMAKE_MODULES - TARGET jrl-cmakemodules::jrl-cmakemodules - PROPERTY INTERFACE_INCLUDE_DIRECTORIES) - message(STATUS "JRL cmakemodules found on system at ${JRL_CMAKE_MODULES}") - else() - message(STATUS "JRL cmakemodules not found. Let's fetch it.") - include(FetchContent) - FetchContent_Declare( - "jrl-cmakemodules" - GIT_REPOSITORY "https://github.com/jrl-umi3218/jrl-cmakemodules.git") - FetchContent_MakeAvailable("jrl-cmakemodules") - FetchContent_GetProperties("jrl-cmakemodules" SOURCE_DIR JRL_CMAKE_MODULES) - endif() -endif() - -function(set_standard_output_directory target) - set_target_properties( - ${target} - PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin - LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib - ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) -endfunction() - -# Disable -Werror on Unix for now. -set(CXX_DISABLE_WERROR True) -set(CMAKE_VERBOSE_MAKEFILE True) - -# ---------------------------------------------------- -# --- OPTIONS --------------------------------------- -# Need to be set before including base.cmake -# ---------------------------------------------------- -option(INSTALL_DOCUMENTATION "Generate and install the documentation" OFF) -option(SUFFIX_SO_VERSION "Suffix library name with its version" OFF) -option(BUILD_TESTING_SCIPY - "Build the SciPy tests (scipy should be installed on the machine)" ON) - -# ---------------------------------------------------- -# --- Policy ----------------------------------------- -# CMake Policy setup -# ---------------------------------------------------- -# Policy can be removed when cmake_minimum_required is updated. - -# We also set CMAKE_POLICY_DEFAULT_CMPXXXX because CMake modules can reset -# policy and redefine some macros like `find_dependency` that will not use our -# policy. - -# Use BoostConfig module distributed by boost library instead of using FindBoost -# module distributed by CMake (to remove in 3.30). -if(POLICY CMP0167) - cmake_policy(SET CMP0167 NEW) - set(CMAKE_POLICY_DEFAULT_CMP0167 NEW) -endif() -# install() DESTINATION paths are normalized (to remove in 3.31). -if(POLICY CMP0177) - cmake_policy(SET CMP0177 NEW) - set(CMAKE_POLICY_DEFAULT_CMP0177 NEW) -endif() -include("${JRL_CMAKE_MODULES}/base.cmake") -compute_project_args(PROJECT_ARGS LANGUAGES CXX) -project(${PROJECT_NAME} ${PROJECT_ARGS}) - -include("${JRL_CMAKE_MODULES}/boost.cmake") -include("${JRL_CMAKE_MODULES}/python.cmake") -include("${JRL_CMAKE_MODULES}/ide.cmake") -include("${JRL_CMAKE_MODULES}/apple.cmake") +include(cmake/get-jrl-cmakemodules.cmake) -option(GENERATE_PYTHON_STUBS - "Generate the Python stubs associated to the Python library" OFF) +jrl_configure_defaults() -option(BUILD_WITH_CHOLMOD_SUPPORT "Build EigenPy with the Cholmod support" OFF) +jrl_option( + GENERATE_PYTHON_STUBS + "Generate the Python stubs associated to the Python library" + OFF +) -if(APPLE) - option(BUILD_WITH_ACCELERATE_SUPPORT - "Build EigenPy with the Accelerate support" OFF) -else(APPLE) - set(BUILD_WITH_ACCELERATE_SUPPORT FALSE) -endif(APPLE) +jrl_option( + BUILD_WITH_CHOLMOD_SUPPORT + "Build EigenPy with the Cholmod (LGPL) support. See CHOLMOD/Doc/License.txt for further details." + OFF +) -string(REPLACE "-pedantic" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) +jrl_option(BUILD_WITH_ACCELERATE_SUPPORT + "Build EigenPy with the Accelerate support (Apple only)" OFF +) -# If needed, fix CMake policy for APPLE systems -apply_default_apple_configuration() -check_minimal_cxx_standard(11 ENFORCE) +jrl_option(BUILD_TESTING "Build the EigenPy unit tests" OFF) +jrl_option(BUILD_TESTING_SCIPY "Build the eigenpy unit tests with scipy" OFF) -if(WIN32) - set(LINK copy_if_different) -else(WIN32) - set(LINK create_symlink) -endif(WIN32) - -if(CMAKE_CROSSCOMPILING) - set(PYTHON_COMPONENTS Interpreter NumPy) -else() - set(PYTHON_COMPONENTS Interpreter Development.Module NumPy) -endif() -set(PYTHON_EXPORT_DEPENDENCY ON) -findpython(REQUIRED) - -if(${NUMPY_VERSION} VERSION_LESS "1.16.0") - set(NUMPY_WITH_BROKEN_UFUNC_SUPPORT TRUE) +if(BUILD_WITH_ACCELERATE_SUPPORT) + if(NOT APPLE) + message(WARNING "Accelerate support is only available on APPLE systems") + endif() endif() -if(WIN32) - link_directories(${PYTHON_LIBRARY_DIRS}) - # # Set default Windows build paths SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY - # ${PROJECT_BINARY_DIR}/Bin CACHE PATH "Single directory for all libraries") - # SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin CACHE PATH - # "Single directory for all executables") SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY - # ${PROJECT_BINARY_DIR}/Bin CACHE PATH "Sing$le directory for all archives") -endif(WIN32) - # ---------------------------------------------------- # --- DEPENDENCIES ----------------------------------- # ---------------------------------------------------- -add_project_dependency(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.0.5") +jrl_find_package(Eigen3 CONFIG REQUIRED) -set_boost_default_options() -export_boost_default_options() -find_package(Boost REQUIRED) -search_for_boost_python(REQUIRED) +jrl_find_package(Python 3.8 REQUIRED COMPONENTS Interpreter Development.Module NumPy) +jrl_find_package(Boost CONFIG REQUIRED COMPONENTS python numpy) if(BUILD_WITH_CHOLMOD_SUPPORT) - set(CMAKE_MODULE_PATH ${JRL_CMAKE_MODULES}/find-external/CHOLMOD - ${CMAKE_MODULE_PATH}) - add_project_dependency(CHOLMOD REQUIRED FIND_EXTERNAL "CHOLMOD") - message( - STATUS - "Build with CHOLDOD support (LGPL). See CHOLMOD/Doc/License.txt for further details." - ) - add_definitions(-DEIGENPY_WITH_CHOLMOD_SUPPORT) -endif(BUILD_WITH_CHOLMOD_SUPPORT) + jrl_find_package(CHOLMOD CONFIG REQUIRED) +endif() -if(BUILD_WITH_ACCELERATE_SUPPORT) - if(NOT ${Eigen3_VERSION} VERSION_GREATER_EQUAL "3.4.90") - message( - FATAL_ERROR - "Your version of Eigen is too low. Should be at least 3.4.90. Current version is ${Eigen3_VERSION}." - ) - endif() +if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) + jrl_find_package(Accelerate REQUIRED) +endif() - set(CMAKE_MODULE_PATH ${JRL_CMAKE_MODULES}/find-external/Accelerate - ${CMAKE_MODULE_PATH}) - find_package( - Accelerate REQUIRED # FIND_EXTERNAL "Accelerate" # We don't export yet as - # there might be an issue on AMR64 platforms - ) - message(STATUS "Build with Accelerate support framework.") - add_definitions(-DEIGENPY_WITH_ACCELERATE_SUPPORT) -endif(BUILD_WITH_ACCELERATE_SUPPORT) +if(BUILD_TESTING AND BUILD_TESTING_SCIPY) + jrl_find_package(Scipy REQUIRED) +endif() # ---------------------------------------------------- # --- INCLUDE ---------------------------------------- # ---------------------------------------------------- -set(${PROJECT_NAME}_UTILS_HEADERS - include/eigenpy/utils/scalar-name.hpp - include/eigenpy/utils/is-approx.hpp - include/eigenpy/utils/is-aligned.hpp - include/eigenpy/utils/traits.hpp - include/eigenpy/utils/python-compat.hpp - include/eigenpy/utils/empty-visitor.hpp) - -set(${PROJECT_NAME}_SOLVERS_HEADERS - include/eigenpy/solvers/solvers.hpp - include/eigenpy/solvers/preconditioners.hpp - include/eigenpy/solvers/IterativeSolverBase.hpp - include/eigenpy/solvers/LeastSquaresConjugateGradient.hpp - include/eigenpy/solvers/BiCGSTAB.hpp - include/eigenpy/solvers/MINRES.hpp - include/eigenpy/solvers/ConjugateGradient.hpp - include/eigenpy/solvers/SparseSolverBase.hpp - include/eigenpy/solvers/BasicPreconditioners.hpp - include/eigenpy/solvers/BFGSPreconditioners.hpp - include/eigenpy/solvers/IncompleteCholesky.hpp - include/eigenpy/solvers/IncompleteLUT.hpp) - -set(${PROJECT_NAME}_EIGEN_HEADERS include/eigenpy/eigen/EigenBase.hpp) +set( + eigenpy_HEADERS + # Utils + include/eigenpy/utils/scalar-name.hpp + include/eigenpy/utils/is-approx.hpp + include/eigenpy/utils/is-aligned.hpp + include/eigenpy/utils/traits.hpp + include/eigenpy/utils/python-compat.hpp + include/eigenpy/utils/empty-visitor.hpp + # Solvers + include/eigenpy/solvers/solvers.hpp + include/eigenpy/solvers/preconditioners.hpp + include/eigenpy/solvers/IterativeSolverBase.hpp + include/eigenpy/solvers/LeastSquaresConjugateGradient.hpp + include/eigenpy/solvers/BiCGSTAB.hpp + include/eigenpy/solvers/MINRES.hpp + include/eigenpy/solvers/ConjugateGradient.hpp + include/eigenpy/solvers/SparseSolverBase.hpp + include/eigenpy/solvers/BasicPreconditioners.hpp + include/eigenpy/solvers/BFGSPreconditioners.hpp + include/eigenpy/solvers/IncompleteCholesky.hpp + include/eigenpy/solvers/IncompleteLUT.hpp + # Decompositions + include/eigenpy/decompositions/sparse/SimplicialLLT.hpp + include/eigenpy/decompositions/sparse/SimplicialLDLT.hpp + include/eigenpy/decompositions/sparse/SparseLU.hpp + include/eigenpy/decompositions/sparse/SparseQR.hpp + include/eigenpy/decompositions/sparse/SimplicialCholesky.hpp + include/eigenpy/decompositions/sparse/SparseSolverBase.hpp + include/eigenpy/decompositions/sparse/LDLT.hpp + include/eigenpy/decompositions/sparse/LLT.hpp + include/eigenpy/decompositions/decompositions.hpp + include/eigenpy/decompositions/EigenSolver.hpp + include/eigenpy/decompositions/GeneralizedEigenSolver.hpp + include/eigenpy/decompositions/GeneralizedSelfAdjointEigenSolver.hpp + include/eigenpy/decompositions/HessenbergDecomposition.hpp + include/eigenpy/decompositions/RealQZ.hpp + include/eigenpy/decompositions/Tridiagonalization.hpp + include/eigenpy/decompositions/RealSchur.hpp + include/eigenpy/decompositions/ComplexEigenSolver.hpp + include/eigenpy/decompositions/ComplexSchur.hpp + include/eigenpy/decompositions/FullPivLU.hpp + include/eigenpy/decompositions/PartialPivLU.hpp + include/eigenpy/decompositions/PermutationMatrix.hpp + include/eigenpy/decompositions/LDLT.hpp + include/eigenpy/decompositions/LLT.hpp + include/eigenpy/decompositions/QR.hpp + include/eigenpy/decompositions/HouseholderQR.hpp + include/eigenpy/decompositions/ColPivHouseholderQR.hpp + include/eigenpy/decompositions/CompleteOrthogonalDecomposition.hpp + include/eigenpy/decompositions/FullPivHouseholderQR.hpp + include/eigenpy/decompositions/SelfAdjointEigenSolver.hpp + include/eigenpy/decompositions/SVDBase.hpp + include/eigenpy/decompositions/BDCSVD.hpp + include/eigenpy/decompositions/JacobiSVD.hpp + include/eigenpy/decompositions/minres.hpp + # Core + include/eigenpy/alignment.hpp + include/eigenpy/computation-info.hpp + include/eigenpy/deprecation-policy.hpp + include/eigenpy/eigenpy.hpp + include/eigenpy/exception.hpp + include/eigenpy/scalar-conversion.hpp + include/eigenpy/expose.hpp + include/eigenpy/copyable.hpp + include/eigenpy/details.hpp + include/eigenpy/fwd.hpp + include/eigenpy/eigen-allocator.hpp + include/eigenpy/eigen-to-python.hpp + include/eigenpy/eigen-from-python.hpp + include/eigenpy/eigen-typedef.hpp + include/eigenpy/id.hpp + include/eigenpy/numpy-map.hpp + include/eigenpy/geometry.hpp + include/eigenpy/geometry-conversion.hpp + include/eigenpy/map.hpp + include/eigenpy/memory.hpp + include/eigenpy/numpy.hpp + include/eigenpy/numpy-allocator.hpp + include/eigenpy/numpy-type.hpp + include/eigenpy/registration.hpp + include/eigenpy/registration_class.hpp + include/eigenpy/angle-axis.hpp + include/eigenpy/quaternion.hpp + include/eigenpy/user-type.hpp + include/eigenpy/ufunc.hpp + include/eigenpy/register.hpp + include/eigenpy/std-array.hpp + include/eigenpy/std-map.hpp + include/eigenpy/std-pair.hpp + include/eigenpy/std-vector.hpp + include/eigenpy/optional.hpp + include/eigenpy/pickle-vector.hpp + include/eigenpy/stride.hpp + include/eigenpy/tensor/eigen-from-python.hpp + include/eigenpy/sparse/eigen-from-python.hpp + include/eigenpy/scipy-allocator.hpp + include/eigenpy/scipy-type.hpp + include/eigenpy/variant.hpp + include/eigenpy/std-unique-ptr.hpp + include/eigenpy/swig.hpp + include/eigenpy/type_info.hpp + include/eigenpy/version.hpp +) -set(${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_CHOLMOD_HEADERS +if(BUILD_WITH_CHOLMOD_SUPPORT) + list( + APPEND eigenpy_HEADERS include/eigenpy/decompositions/sparse/cholmod/CholmodBase.hpp include/eigenpy/decompositions/sparse/cholmod/CholmodDecomposition.hpp include/eigenpy/decompositions/sparse/cholmod/CholmodSimplicialLDLT.hpp include/eigenpy/decompositions/sparse/cholmod/CholmodSimplicialLLT.hpp - include/eigenpy/decompositions/sparse/cholmod/CholmodSupernodalLLT.hpp) - -set(${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_ACCELERATE_HEADERS - include/eigenpy/decompositions/sparse/accelerate/Accelerate.hpp) - -set(${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_HEADERS - include/eigenpy/decompositions/sparse/SimplicialLLT.hpp - include/eigenpy/decompositions/sparse/SimplicialLDLT.hpp - include/eigenpy/decompositions/sparse/SparseLU.hpp - include/eigenpy/decompositions/sparse/SparseQR.hpp - include/eigenpy/decompositions/sparse/SimplicialCholesky.hpp - include/eigenpy/decompositions/sparse/SparseSolverBase.hpp - include/eigenpy/decompositions/sparse/LDLT.hpp - include/eigenpy/decompositions/sparse/LLT.hpp) - -if(BUILD_WITH_CHOLMOD_SUPPORT) - list(APPEND ${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_HEADERS - ${${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_CHOLMOD_HEADERS}) -endif(BUILD_WITH_CHOLMOD_SUPPORT) + include/eigenpy/decompositions/sparse/cholmod/CholmodSupernodalLLT.hpp + ) +endif() if(BUILD_WITH_ACCELERATE_SUPPORT) - list(APPEND ${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_HEADERS - ${${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_ACCELERATE_HEADERS}) -endif(BUILD_WITH_ACCELERATE_SUPPORT) - -set(${PROJECT_NAME}_DECOMPOSITIONS_HEADERS - ${${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_HEADERS} - include/eigenpy/decompositions/decompositions.hpp - include/eigenpy/decompositions/EigenSolver.hpp - include/eigenpy/decompositions/GeneralizedEigenSolver.hpp - include/eigenpy/decompositions/GeneralizedSelfAdjointEigenSolver.hpp - include/eigenpy/decompositions/HessenbergDecomposition.hpp - include/eigenpy/decompositions/RealQZ.hpp - include/eigenpy/decompositions/Tridiagonalization.hpp - include/eigenpy/decompositions/RealSchur.hpp - include/eigenpy/decompositions/ComplexEigenSolver.hpp - include/eigenpy/decompositions/ComplexSchur.hpp - include/eigenpy/decompositions/FullPivLU.hpp - include/eigenpy/decompositions/PartialPivLU.hpp - include/eigenpy/decompositions/PermutationMatrix.hpp - include/eigenpy/decompositions/LDLT.hpp - include/eigenpy/decompositions/LLT.hpp - include/eigenpy/decompositions/QR.hpp - include/eigenpy/decompositions/HouseholderQR.hpp - include/eigenpy/decompositions/ColPivHouseholderQR.hpp - include/eigenpy/decompositions/CompleteOrthogonalDecomposition.hpp - include/eigenpy/decompositions/FullPivHouseholderQR.hpp - include/eigenpy/decompositions/SelfAdjointEigenSolver.hpp - include/eigenpy/decompositions/SVDBase.hpp - include/eigenpy/decompositions/BDCSVD.hpp - include/eigenpy/decompositions/JacobiSVD.hpp - include/eigenpy/decompositions/minres.hpp) - -set(${PROJECT_NAME}_HEADERS - ${${PROJECT_NAME}_UTILS_HEADERS} - ${${PROJECT_NAME}_SOLVERS_HEADERS} - ${${PROJECT_NAME}_EIGEN_HEADERS} - ${${PROJECT_NAME}_DECOMPOSITIONS_HEADERS} - include/eigenpy/alignment.hpp - include/eigenpy/computation-info.hpp - include/eigenpy/deprecation-policy.hpp - include/eigenpy/eigenpy.hpp - include/eigenpy/exception.hpp - include/eigenpy/scalar-conversion.hpp - include/eigenpy/expose.hpp - include/eigenpy/copyable.hpp - include/eigenpy/details.hpp - include/eigenpy/fwd.hpp - include/eigenpy/eigen-allocator.hpp - include/eigenpy/eigen-to-python.hpp - include/eigenpy/eigen-from-python.hpp - include/eigenpy/eigen-typedef.hpp - include/eigenpy/id.hpp - include/eigenpy/numpy-map.hpp - include/eigenpy/geometry.hpp - include/eigenpy/geometry-conversion.hpp - include/eigenpy/map.hpp - include/eigenpy/memory.hpp - include/eigenpy/numpy.hpp - include/eigenpy/numpy-allocator.hpp - include/eigenpy/numpy-type.hpp - include/eigenpy/registration.hpp - include/eigenpy/registration_class.hpp - include/eigenpy/angle-axis.hpp - include/eigenpy/quaternion.hpp - include/eigenpy/user-type.hpp - include/eigenpy/ufunc.hpp - include/eigenpy/register.hpp - include/eigenpy/std-array.hpp - include/eigenpy/std-map.hpp - include/eigenpy/std-pair.hpp - include/eigenpy/std-vector.hpp - include/eigenpy/optional.hpp - include/eigenpy/pickle-vector.hpp - include/eigenpy/stride.hpp - include/eigenpy/tensor/eigen-from-python.hpp - include/eigenpy/sparse/eigen-from-python.hpp - include/eigenpy/scipy-allocator.hpp - include/eigenpy/scipy-type.hpp - include/eigenpy/variant.hpp - include/eigenpy/std-unique-ptr.hpp - include/eigenpy/swig.hpp - include/eigenpy/type_info.hpp - include/eigenpy/version.hpp) - -list( - APPEND - ${PROJECT_NAME}_HEADERS - ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/config.hpp - ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/deprecated.hpp - ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/warning.hpp) + list(APPEND eigenpy_HEADERS include/eigenpy/decompositions/sparse/accelerate/Accelerate.hpp) +endif() # ---------------------------------------------------- # --- TARGETS ---------------------------------------- # ---------------------------------------------------- -set(${PROJECT_NAME}_SOLVERS_SOURCES - src/solvers/preconditioners.cpp - src/solvers/solvers.cpp - src/solvers/minres.cpp - src/solvers/bicgstab.cpp - src/solvers/conjugate-gradient.cpp - src/solvers/least-squares-conjugate-gradient.cpp - src/solvers/incomplete-cholesky.cpp - src/solvers/incomplete-lut.cpp) - -set(${PROJECT_NAME}_DECOMPOSITIONS_SOURCES - src/decompositions/decompositions.cpp - src/decompositions/eigen-solver.cpp - src/decompositions/generalized-eigen-solver.cpp - src/decompositions/generalized-self-adjoint-eigen-solver.cpp - src/decompositions/complex-eigen-solver.cpp - src/decompositions/complex-schur.cpp - src/decompositions/llt-solver.cpp - src/decompositions/ldlt-solver.cpp - src/decompositions/bdcsvd-solver.cpp - src/decompositions/jacobisvd-solver.cpp - src/decompositions/fullpivlu-solver.cpp - src/decompositions/hessenberg-decomposition.cpp - src/decompositions/real-qz.cpp - src/decompositions/tridiagonalization.cpp - src/decompositions/real-schur.cpp - src/decompositions/partialpivlu-solver.cpp - src/decompositions/sparse-lu-solver.cpp - src/decompositions/sparse-qr-solver.cpp - src/decompositions/qr-solvers.cpp - src/decompositions/self-adjoint-eigen-solver.cpp - src/decompositions/permutation-matrix.cpp - src/decompositions/simplicial-llt-solver.cpp - src/decompositions/simplicial-ldlt-solver.cpp) - -if(BUILD_WITH_CHOLMOD_SUPPORT) - list(APPEND ${PROJECT_NAME}_DECOMPOSITIONS_SOURCES - src/decompositions/cholmod.cpp) -endif(BUILD_WITH_CHOLMOD_SUPPORT) - -if(BUILD_WITH_ACCELERATE_SUPPORT) - list(APPEND ${PROJECT_NAME}_DECOMPOSITIONS_SOURCES - src/decompositions/accelerate.cpp) -endif(BUILD_WITH_ACCELERATE_SUPPORT) - -set(${PROJECT_NAME}_SOURCES - ${${PROJECT_NAME}_SOLVERS_SOURCES} - ${${PROJECT_NAME}_DECOMPOSITIONS_SOURCES} - src/exception.cpp - src/eigenpy.cpp - src/numpy.cpp - src/numpy-type.cpp - src/matrix-float.cpp - src/matrix-complex-float.cpp - src/matrix-complex-double.cpp - src/register.cpp - src/matrix-double.cpp - src/matrix-long-double.cpp - src/matrix-complex-long-double.cpp - src/matrix-bool.cpp - src/matrix-char.cpp - src/matrix-int8.cpp - src/matrix-uint8.cpp - src/matrix-int16.cpp - src/matrix-uint16.cpp - src/matrix-int32.cpp - src/matrix-uint32.cpp - src/matrix-windows-long.cpp - src/matrix-windows-ulong.cpp - src/matrix-mac-long.cpp - src/matrix-mac-ulong.cpp - src/matrix-int64.cpp - src/matrix-uint64.cpp - src/matrix-linux-long-long.cpp - src/matrix-linux-ulong-long.cpp - src/angle-axis.cpp - src/quaternion.cpp - src/geometry-conversion.cpp - src/scipy-type.cpp - src/std-vector.cpp - src/optional.cpp - src/type_info.cpp - src/version.cpp) +set( + eigenpy_SOURCES + # Solvers + src/solvers/preconditioners.cpp + src/solvers/solvers.cpp + src/solvers/minres.cpp + src/solvers/bicgstab.cpp + src/solvers/conjugate-gradient.cpp + src/solvers/least-squares-conjugate-gradient.cpp + src/solvers/incomplete-cholesky.cpp + src/solvers/incomplete-lut.cpp + # Decompositions + src/decompositions/decompositions.cpp + src/decompositions/eigen-solver.cpp + src/decompositions/generalized-eigen-solver.cpp + src/decompositions/generalized-self-adjoint-eigen-solver.cpp + src/decompositions/complex-eigen-solver.cpp + src/decompositions/complex-schur.cpp + src/decompositions/llt-solver.cpp + src/decompositions/ldlt-solver.cpp + src/decompositions/bdcsvd-solver.cpp + src/decompositions/jacobisvd-solver.cpp + src/decompositions/fullpivlu-solver.cpp + src/decompositions/hessenberg-decomposition.cpp + src/decompositions/real-qz.cpp + src/decompositions/tridiagonalization.cpp + src/decompositions/real-schur.cpp + src/decompositions/partialpivlu-solver.cpp + src/decompositions/sparse-lu-solver.cpp + src/decompositions/sparse-qr-solver.cpp + src/decompositions/qr-solvers.cpp + src/decompositions/self-adjoint-eigen-solver.cpp + src/decompositions/permutation-matrix.cpp + src/decompositions/simplicial-llt-solver.cpp + src/decompositions/simplicial-ldlt-solver.cpp + $<$:src/decompositions/cholmod.cpp> + $<$:src/decompositions/accelerate.cpp> + # Core + src/exception.cpp + src/eigenpy.cpp + src/numpy.cpp + src/numpy-type.cpp + src/matrix-float.cpp + src/matrix-complex-float.cpp + src/matrix-complex-double.cpp + src/register.cpp + src/matrix-double.cpp + src/matrix-long-double.cpp + src/matrix-complex-long-double.cpp + src/matrix-bool.cpp + src/matrix-char.cpp + src/matrix-int8.cpp + src/matrix-uint8.cpp + src/matrix-int16.cpp + src/matrix-uint16.cpp + src/matrix-int32.cpp + src/matrix-uint32.cpp + src/matrix-windows-long.cpp + src/matrix-windows-ulong.cpp + src/matrix-mac-long.cpp + src/matrix-mac-ulong.cpp + src/matrix-int64.cpp + src/matrix-uint64.cpp + src/matrix-linux-long-long.cpp + src/matrix-linux-ulong-long.cpp + src/angle-axis.cpp + src/quaternion.cpp + src/geometry-conversion.cpp + src/scipy-type.cpp + src/std-vector.cpp + src/optional.cpp + src/type_info.cpp + src/version.cpp +) + +add_library(eigenpy SHARED ${eigenpy_SOURCES} ${eigenpy_HEADERS}) +add_library(eigenpy::eigenpy ALIAS eigenpy) +jrl_target_enforce_msvc_conformance(eigenpy PRIVATE) +target_compile_features(eigenpy PUBLIC cxx_std_17) + +set_target_properties(eigenpy PROPERTIES VERSION ${PROJECT_VERSION}) + +jrl_target_generate_config_header(eigenpy PUBLIC) +jrl_target_generate_warning_header(eigenpy PUBLIC) +jrl_target_generate_deprecated_header(eigenpy PUBLIC) -add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} - ${${PROJECT_NAME}_HEADERS}) -add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) -set_standard_output_directory(${PROJECT_NAME}) target_include_directories( - ${PROJECT_NAME} SYSTEM - PUBLIC $ - $ - $) - -modernize_target_link_libraries( - ${PROJECT_NAME} - SCOPE + eigenpy PUBLIC - TARGETS - Eigen3::Eigen - INCLUDE_DIRS - ${EIGEN3_INCLUDE_DIR}) + $ + $ +) -modernize_target_link_libraries( - ${PROJECT_NAME} - SCOPE +target_link_libraries( + eigenpy PUBLIC - TARGETS - Python${PYTHON_VERSION_MAJOR}::NumPy - INCLUDE_DIRS - ${NUMPY_INCLUDE_DIRS} - ${PYTHON_INCLUDE_DIR}) - -# Links against CholMod -if(BUILD_WITH_CHOLMOD_SUPPORT) - modernize_target_link_libraries(${PROJECT_NAME} SCOPE PUBLIC TARGETS - CHOLMOD::CHOLMOD) -endif(BUILD_WITH_CHOLMOD_SUPPORT) - -# Links against accelerate -if(BUILD_WITH_ACCELERATE_SUPPORT) - # modernize_target_link_libraries(${PROJECT_NAME} SCOPE PUBLIC TARGETS - # Accelerate) - target_link_libraries(${PROJECT_NAME} PRIVATE "-framework accelerate") -endif(BUILD_WITH_ACCELERATE_SUPPORT) + Eigen3::Eigen + Python::Module + Python::NumPy + Boost::python + Boost::numpy + $<$:SuiteSparse::CHOLMOD> + $<$:Accelerate> +) + +target_compile_definitions( + eigenpy + PUBLIC + $<$:EIGENPY_WITH_CHOLMOD_SUPPORT> + $<$:EIGENPY_WITH_ACCELERATE_SUPPORT> +) if(SUFFIX_SO_VERSION) - set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION}) -endif(SUFFIX_SO_VERSION) + set_target_properties(eigenpy PROPERTIES SOVERSION ${PROJECT_VERSION}) +endif() -if(NOT WIN32) - target_compile_options( - ${PROJECT_NAME} PRIVATE $<$:-bigobj -MP> - "-Wno-conversion") -else() - target_compile_options(${PROJECT_NAME} - PRIVATE $<$:-bigobj -MP>) - target_compile_definitions(${PROJECT_NAME} PUBLIC "HAVE_SNPRINTF") +if(CXX_COMPILER_ID STREQUAL "GNU" OR CXX_COMPILER_ID STREQUAL "Clang") + target_compile_options(eigenpy PRIVATE -Wno-conversion) endif() -target_link_boost_python(${PROJECT_NAME} PUBLIC) -install( - TARGETS ${PROJECT_NAME} - EXPORT ${TARGETS_EXPORT_NAME} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - INCLUDES - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +jrl_target_headers(eigenpy PUBLIC HEADERS ${eigenpy_HEADERS} BASE_DIRS include) -add_header_group(${PROJECT_NAME}_HEADERS) -add_source_group(${PROJECT_NAME}_SOURCES) +# ---------------------------------------------------- +# --- EXPORT ----------------------------------------- +# ---------------------------------------------------- +jrl_add_export_component(TARGETS eigenpy NAME eigenpy) +jrl_export_package() # ---------------------------------------------------- # --- PYTHON LIBRARY --------------------------------- @@ -483,11 +320,13 @@ add_subdirectory(python) # ---------------------------------------------------- # --- UNIT TEST -------------------------------------- # ---------------------------------------------------- -add_subdirectory(unittest) - -pkg_config_append_libs(${PROJECT_NAME}) -pkg_config_append_cflags("-I${PYTHON_INCLUDE_DIRS}") -pkg_config_append_cflags("-I${NUMPY_INCLUDE_DIRS}") -pkg_config_append_boost_libs(${BOOST_COMPONENTS}) +if(BUILD_TESTING) + enable_testing() + add_subdirectory(unittest) +endif() -setup_project_finalize() +# ---------------------------------------------------- +# --- SUMMARIES -------------------------------------- +# ---------------------------------------------------- +jrl_print_dependencies_summary() +jrl_print_options_summary() diff --git a/cmake b/cmake deleted file mode 160000 index 34ded94e5..000000000 --- a/cmake +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 34ded94e5d33ce56746abb4898b4ccc6dc69bfe8 diff --git a/cmake/get-jrl-cmakemodules.cmake b/cmake/get-jrl-cmakemodules.cmake new file mode 100644 index 000000000..61db6b6d4 --- /dev/null +++ b/cmake/get-jrl-cmakemodules.cmake @@ -0,0 +1,50 @@ +# Get jrl-cmakemodules package + +# Upstream (https://github.com/jrl-umi3218/jrl-cmakemodules), the new v2 version is located in a subfolder, +# We need to set this variable to bypass the v1 and load the v2. +set( + JRL_CMAKEMODULES_USE_V2 + ON + CACHE BOOL + "Use jrl-cmakemodules v2 on https://github.com/jrl-umi3218/jrl-cmakemodules" +) + +# Option 1: pass -DJRL_CMAKEMODULES_SOURCE_DIR=... to cmake command line +if(JRL_CMAKEMODULES_SOURCE_DIR) + message( + DEBUG + "JRL_CMAKEMODULES_SOURCE_DIR variable set, adding jrl-cmakemodules from source directory: ${JRL_CMAKEMODULES_SOURCE_DIR}" + ) + add_subdirectory(${JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) + return() +endif() + +# Option 2: use JRL_CMAKEMODULES_SOURCE_DIR environment variable (pixi might unset it, prefer option 1) +if(ENV{JRL_CMAKEMODULES_SOURCE_DIR}) + message( + DEBUG + "JRL_CMAKEMODULES_SOURCE_DIR environement variable set, adding jrl-cmakemodules from source directory: ${JRL_CMAKEMODULES_SOURCE_DIR}" + ) + add_subdirectory(${JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) + return() +endif() + +# Try to look for the installed package +message(DEBUG "Looking for jrl-cmakemodules package...") +find_package(jrl-cmakemodules 2.0.0 CONFIG QUIET) + +# If we have the package, we are done. +if(jrl-cmakemodules_FOUND) + message(DEBUG "Found jrl-cmakemodules package.") + return() +endif() + +# Fallback to FetchContent if not found +message(DEBUG "Fetching jrl-cmakemodules using FetchContent...") +include(FetchContent) +FetchContent_Declare( + jrl-cmakemodules + GIT_REPOSITORY https://github.com/ahoarau/jrl-cmakemodules + GIT_TAG jrl-next +) +FetchContent_MakeAvailable(jrl-cmakemodules) diff --git a/docker/ubuntu/Dockerfile b/docker/ubuntu/Dockerfile index 1cce334ee..8cab024d7 100644 --- a/docker/ubuntu/Dockerfile +++ b/docker/ubuntu/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get update -y && DEBIAN_FRONTEND=noninteractive apt-get install -qqy \ python3-numpy WORKDIR /src -RUN git clone --recursive -j2 -b devel https://github.com/stack-of-tasks/eigenpy +RUN git clone -j2 -b devel https://github.com/stack-of-tasks/eigenpy ENV CTEST_OUTPUT_ON_FAILURE=ON ENV CTEST_PROGRESS_OUTPUT=ON diff --git a/include/eigenpy/fwd.hpp b/include/eigenpy/fwd.hpp index 9111ebafc..c9d7afe99 100644 --- a/include/eigenpy/fwd.hpp +++ b/include/eigenpy/fwd.hpp @@ -25,8 +25,6 @@ #define EIGENPY_WITH_CXX11_SUPPORT #endif -#define EIGENPY_STRING_LITERAL(string) #string -#define EIGENPY_STRINGIZE(string) EIGENPY_STRING_LITERAL(string) #define _EIGENPY_PPCAT(A, B) A##B #define EIGENPY_PPCAT(A, B) _EIGENPY_PPCAT(A, B) #define EIGENPY_STRINGCAT(A, B) A B @@ -201,7 +199,7 @@ namespace literals { /// /// Using-declare this operator or do `using namespace eigenpy::literals`. Then /// `bp::arg("matrix")` can be replaced by the literal `"matrix"_a`. -inline boost::python::arg operator"" _a(const char* name, std::size_t) { +inline boost::python::arg operator""_a(const char* name, std::size_t) { return boost::python::arg(name); } } // namespace literals diff --git a/pixi.lock b/pixi.lock index 933a1b80b..6a46c947f 100644 --- a/pixi.lock +++ b/pixi.lock @@ -34,11 +34,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -113,11 +113,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py314h1f4fa51_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py314h680a79a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py314h1f4fa51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py314h680a79a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_1.conda @@ -195,11 +195,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_1.conda @@ -260,11 +260,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -341,11 +341,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-h456b2da_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda @@ -439,11 +439,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libamd-3.3.3-ha5840a7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py314h1f4fa51_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py314h680a79a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py314h1f4fa51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py314h680a79a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbtf-2.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcamd-3.3.3-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda @@ -540,11 +540,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libamd-3.3.3-h5087772_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbtf-2.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcamd-3.3.3-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda @@ -625,11 +625,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libamd-3.3.3-h60129d2_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbtf-2.3.2-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcamd-3.3.3-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda @@ -713,11 +713,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libamd-3.3.3-h60129d2_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbtf-2.3.2-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcamd-3.3.3-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda @@ -814,11 +814,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-h456b2da_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py310hc563356_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py310hb70c0da_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py310hc563356_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py310hb70c0da_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda @@ -912,11 +912,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libamd-3.3.3-ha5840a7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py310hbe5637a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py310hbc2035d_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py310hbe5637a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py310hbc2035d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbtf-2.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcamd-3.3.3-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda @@ -1012,11 +1012,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libamd-3.3.3-h5087772_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py310h8ab71b0_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py310hcc36a09_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py310h8ab71b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py310hcc36a09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbtf-2.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcamd-3.3.3-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda @@ -1096,11 +1096,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libamd-3.3.3-h60129d2_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py310hfb7dd09_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py310habd11ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py310hfb7dd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py310habd11ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbtf-2.3.2-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcamd-3.3.3-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda @@ -1195,11 +1195,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-h456b2da_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda @@ -1293,11 +1293,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libamd-3.3.3-ha5840a7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py314h1f4fa51_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py314h680a79a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py314h1f4fa51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py314h680a79a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbtf-2.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcamd-3.3.3-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda @@ -1394,11 +1394,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libamd-3.3.3-h5087772_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbtf-2.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcamd-3.3.3-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda @@ -1479,11 +1479,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libamd-3.3.3-h60129d2_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbtf-2.3.2-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcamd-3.3.3-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda @@ -1582,11 +1582,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.7-default_h99862b1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda @@ -1672,11 +1672,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -1751,11 +1751,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py314h1f4fa51_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py314h680a79a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py314h1f4fa51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py314h680a79a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_1.conda @@ -1833,11 +1833,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_1.conda @@ -1898,11 +1898,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -1982,11 +1982,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -2076,11 +2076,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py314h1f4fa51_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py314h680a79a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py314h1f4fa51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py314h680a79a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_1.conda @@ -2173,11 +2173,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_1.conda @@ -2253,11 +2253,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -2344,11 +2344,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libamd-3.3.3-h456b2da_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcamd-3.3.3-hf02c80a_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda @@ -2443,11 +2443,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libamd-3.3.3-ha5840a7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py314h1f4fa51_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py314h680a79a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py314h1f4fa51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py314h680a79a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbtf-2.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcamd-3.3.3-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda @@ -2545,11 +2545,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libamd-3.3.3-h5087772_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbtf-2.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcamd-3.3.3-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda @@ -2631,11 +2631,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libamd-3.3.3-h60129d2_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbtf-2.3.2-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcamd-3.3.3-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda @@ -2730,11 +2730,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py310hc563356_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py310hb70c0da_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py310hc563356_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py310hb70c0da_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -2809,11 +2809,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_h466f870_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py310hbe5637a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py310hbc2035d_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py310hbe5637a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py310hbc2035d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_hc369343_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_1.conda @@ -2890,11 +2890,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_h6922315_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py310h8ab71b0_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py310hcc36a09_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py310h8ab71b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py310hcc36a09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_h73dfc95_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_1.conda @@ -2954,11 +2954,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/git-2.52.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py310hfb7dd09_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py310habd11ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py310hfb7dd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py310habd11ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -3017,11 +3017,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -3068,11 +3068,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py313hdff0fa9_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py313h81e2733_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py313hdff0fa9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py313h81e2733_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda @@ -3116,11 +3116,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda @@ -3161,11 +3161,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/eigen-3.4.0-h477610d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -4117,15 +4117,15 @@ packages: depends: - scipy >=1.10.0 - eigen >=3.4.0 - - libboost-devel >=1.80.0,<1.90.0 - - libboost-python-devel >=1.80.0,<1.90.0 + - libboost-devel >=1.80.0 + - libboost-python-devel >=1.80.0 - libcxx >=21 - - libboost >=1.89.0,<1.90.0a0 - - libboost-python >=1.89.0,<1.90.0a0 + - libboost >=1.90.0,<1.91.0a0 + - libboost-python >=1.90.0,<1.91.0a0 - numpy >=1.23,<3 - python_abi 3.13.* *_cp313 input: - hash: 3d3da76fc7a05ccb5fc86ec4d8fafed854cf78eb5f18bbc05830105136f6feaf + hash: 8a419aadd36db122e9c3e7f2175898e5832a03078ddae07763c955b4e581e12e globs: [] - conda: . name: eigenpy @@ -4138,17 +4138,17 @@ packages: depends: - scipy >=1.10.0 - eigen >=3.4.0 - - libboost-devel >=1.80.0,<1.90.0 - - libboost-python-devel >=1.80.0,<1.90.0 + - libboost-devel >=1.80.0 + - libboost-python-devel >=1.80.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - ucrt >=10.0.20348.0 - - libboost >=1.89.0,<1.90.0a0 - - libboost-python >=1.89.0,<1.90.0a0 + - libboost >=1.90.0,<1.91.0a0 + - libboost-python >=1.90.0,<1.91.0a0 - numpy >=1.23,<3 - python_abi 3.14.* *_cp314 input: - hash: 3d3da76fc7a05ccb5fc86ec4d8fafed854cf78eb5f18bbc05830105136f6feaf + hash: 8a419aadd36db122e9c3e7f2175898e5832a03078ddae07763c955b4e581e12e globs: [] - conda: . name: eigenpy @@ -4160,15 +4160,15 @@ packages: depends: - scipy >=1.10.0 - eigen >=3.4.0 - - libboost-devel >=1.80.0,<1.90.0 - - libboost-python-devel >=1.80.0,<1.90.0 + - libboost-devel >=1.80.0 + - libboost-python-devel >=1.80.0 - libcxx >=21 - - libboost >=1.89.0,<1.90.0a0 - - libboost-python >=1.89.0,<1.90.0a0 + - libboost >=1.90.0,<1.91.0a0 + - libboost-python >=1.90.0,<1.91.0a0 - numpy >=1.23,<3 - python_abi 3.14.* *_cp314 input: - hash: 3d3da76fc7a05ccb5fc86ec4d8fafed854cf78eb5f18bbc05830105136f6feaf + hash: 8a419aadd36db122e9c3e7f2175898e5832a03078ddae07763c955b4e581e12e globs: [] - conda: . name: eigenpy @@ -4180,16 +4180,16 @@ packages: depends: - scipy >=1.10.0 - eigen >=3.4.0 - - libboost-devel >=1.80.0,<1.90.0 - - libboost-python-devel >=1.80.0,<1.90.0 + - libboost-devel >=1.80.0 + - libboost-python-devel >=1.80.0 - libstdcxx >=15 - libgcc >=15 - - libboost >=1.89.0,<1.90.0a0 - - libboost-python >=1.89.0,<1.90.0a0 + - libboost >=1.90.0,<1.91.0a0 + - libboost-python >=1.90.0,<1.91.0a0 - numpy >=1.23,<3 - python_abi 3.14.* *_cp314 input: - hash: 3d3da76fc7a05ccb5fc86ec4d8fafed854cf78eb5f18bbc05830105136f6feaf + hash: 8a419aadd36db122e9c3e7f2175898e5832a03078ddae07763c955b4e581e12e globs: [] - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.1-pyhd8ed1ab_0.conda sha256: 8028582d956ab76424f6845fa1bdf5cb3e629477dd44157ca30d45e06d8a9c7c @@ -4664,9 +4664,9 @@ packages: license_family: BSD size: 67438 timestamp: 1765819100043 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.89.0-hed09d94_3.conda - sha256: 68394df8cb4f861fde0d9fd13ff1c9fc4051463f5eca287f47fe210d8bf1ef99 - md5: 9c1d0f6e4bd58415ebc63aa6b89c6654 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-hed09d94_0.conda + sha256: 80fa05e909f07ef0e76728b17562d3595407221d186af5b0d76a7c2c9af45bd7 + md5: 9914b8257d59aa5029244f40684e06e7 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -4679,11 +4679,11 @@ packages: constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 3223697 - timestamp: 1763012922489 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.89.0-hf9ddd82_3.conda - sha256: a4e4f183866f1553d1ca3341d3247c6c40d9648de7b09a693126769812a24452 - md5: 92d0bba249e75dcda5efa2b2fdcab81e + size: 3223002 + timestamp: 1765415462169 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.90.0-hf9ddd82_0.conda + sha256: d9abc3a453c5401f83b70c14cf014714652cae4b9d11f864e0a7bbaaf554d691 + md5: 1ac11feb9e3497d1946767d93630029f depends: - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 @@ -4695,11 +4695,11 @@ packages: constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 2256139 - timestamp: 1763014861031 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.89.0-h18cd856_3.conda - sha256: ad12f77a00b631e5fdf0b6def3377c157922a44d8dd7dd8b9127c873873898c2 - md5: ad6231ddbb5b91481a2dc763e4a4f11f + size: 2386625 + timestamp: 1765416121399 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.90.0-h18cd856_0.conda + sha256: 609db9d104282c0062ff58e2269083437c96d32910194d0b66bd5da378dd3d12 + md5: 8302b8e03aa5b36edca92ebe7ea6239a depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 @@ -4711,11 +4711,11 @@ packages: constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 2040068 - timestamp: 1763015157604 -- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.89.0-h9dfe17d_3.conda - sha256: 0bdd80e3e1aab10d4817ef74e3114fb7afc4411bdfb70029bc8403bc92759e88 - md5: bd081a2a5f71abbd1a519e50826742fd + size: 2146498 + timestamp: 1765416021865 +- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.90.0-h9dfe17d_0.conda + sha256: 1ec37a0c792ae4677e2c505ebebe82ce73485aa8138d61330fa7bc55d5c123bb + md5: f3226a319244b71dd31499a2719ec67a depends: - bzip2 >=1.0.8,<2.0a0 - libiconv >=1.18,<2.0a0 @@ -4726,93 +4726,93 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 constrains: - - __win >=10 - boost-cpp <0.0a0 + - __win >=10 license: BSL-1.0 - size: 2505957 - timestamp: 1763014402716 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.89.0-hfcd1e18_3.conda - sha256: 40741c6638289100f869d5281e790eed32b87a51216586b3b867476f29df73bd - md5: 88ec69f511d2638bc5c5f96b4f52d779 - depends: - - libboost 1.89.0 hed09d94_3 - - libboost-headers 1.89.0 ha770c72_3 + size: 2501610 + timestamp: 1765416371804 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.90.0-hfcd1e18_0.conda + sha256: 846be1b19c9e6d148985175f4539cc79d5546c0e78d13e55245651302da20314 + md5: e11d3ad679c84a8d2f41dd5cd8f85cda + depends: + - libboost 1.90.0 hed09d94_0 + - libboost-headers 1.90.0 ha770c72_0 constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 38392 - timestamp: 1763013020121 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.89.0-h7a7523a_3.conda - sha256: ce0ad3c6c1d5a4c81952060126dde0dca604d18dbe93ca5caff456598b924fd1 - md5: b86e06d39c91a978372148b2c01c717a - depends: - - libboost 1.89.0 hf9ddd82_3 - - libboost-headers 1.89.0 h694c41f_3 + size: 38677 + timestamp: 1765415632744 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.90.0-h7a7523a_0.conda + sha256: e22d6db0f77f8a20d618ad6d55dd967c331ac6d9097d16f67d68e2b62dd29cfe + md5: 30210b657b29f6924b93e669b10a01da + depends: + - libboost 1.90.0 hf9ddd82_0 + - libboost-headers 1.90.0 h694c41f_0 constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 39725 - timestamp: 1763015114600 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.89.0-hf450f58_3.conda - sha256: 361d8443af7e62801b4b439cc301cef13f9c00d77baf66b431c245083b020230 - md5: aa2906acf9866fc62839dc0f00db62a2 - depends: - - libboost 1.89.0 h18cd856_3 - - libboost-headers 1.89.0 hce30654_3 + size: 39848 + timestamp: 1765416280641 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.90.0-hf450f58_0.conda + sha256: 66400192db91b5c6b4a293211d355ce5be7625e15c124552b6cd285fafded4ee + md5: de71df0c1ac069658828c955714f7fca + depends: + - libboost 1.90.0 h18cd856_0 + - libboost-headers 1.90.0 hce30654_0 constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 38669 - timestamp: 1763015353583 -- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.89.0-h1c1089f_3.conda - sha256: ce9dc0ae1ad2a490e7a8c294ab6cb85ada3d48d36564f8519d132653b7de6dcf - md5: 7db845719634306e91809b36289ce03f - depends: - - libboost 1.89.0 h9dfe17d_3 - - libboost-headers 1.89.0 h57928b3_3 + size: 38585 + timestamp: 1765416176235 +- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-devel-1.90.0-h1c1089f_0.conda + sha256: 0f615d1dc861b224c0cf1e94ba2dd2dcf2e3dfebe691f97aa7c72e78ff5fb25c + md5: ad6d4e3f6608e5bbf2d8d59a3b21740e + depends: + - libboost 1.90.0 h9dfe17d_0 + - libboost-headers 1.90.0 h57928b3_0 constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 41477 - timestamp: 1763014591100 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.89.0-ha770c72_3.conda - sha256: 0720a747b51953b6ffcb1d3c5af766a6e34d3b7c4f0f1160d414951ba3f0d343 - md5: e8913467ec252af573eb66b4b46dd023 + size: 40136 + timestamp: 1765416612282 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.90.0-ha770c72_0.conda + sha256: a6ad66850bbc55d5a17119c4391511f24c18f1e277a22332af8a69c96d81df0f + md5: d53c6c5c4e3b387bbb62e314a55c6bc3 constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 14494859 - timestamp: 1763012937547 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.89.0-h694c41f_3.conda - sha256: 3c7006c099dc45bf27c2bad3742e158525b934c118c3ab4f6ca336f77bd69834 - md5: e51c9a0d0eccdfceabb560fdb188b928 + size: 14673568 + timestamp: 1765415484171 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.90.0-h694c41f_0.conda + sha256: b0c96c49bb8467fb07220ba797d671f4966ea95baae308f5923c64082cddb9a5 + md5: 11358a1350ebc080809522fd51f2fd9f constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 14632384 - timestamp: 1763014915673 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.89.0-hce30654_3.conda - sha256: f8a440340ee7641ef1d60e0480bf0fc8ae895631c1242816b798c07ed0cf994c - md5: 3a6a7a35d2501dd269fb1da2fb0d7d5b + size: 14741557 + timestamp: 1765416154624 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.90.0-hce30654_0.conda + sha256: 5b6e8185f8197a130eb9c10433d46c9e45028a9f9d0ade176b0502d20365ebce + md5: f0c6f19030475ae8c5efe72a154a67ea constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 14675191 - timestamp: 1763015199104 -- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.89.0-h57928b3_3.conda - sha256: 4d93e7b933f8dd23f9085e2cbfa96fcdcd45176f9d95b914139ecf95a866f53a - md5: a210974ad34d132f01c6f7dc8ef2f25b + size: 14756665 + timestamp: 1765416053962 +- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-headers-1.90.0-h57928b3_0.conda + sha256: c40b0bfce37b1c74068d108fd92744872ee9913e5aed3934e83727675b7028c0 + md5: a78f81c845d9e803ec7cd0cd037b5353 constrains: - boost-cpp <0.0a0 license: BSL-1.0 - size: 14664131 - timestamp: 1763014457361 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py310hc563356_3.conda - sha256: f7467a70fb885b920f3d0bd01aea85e64663653eeb7f26fe672ddee020c68f5a - md5: 78077117ddb5f72ec4a1caeeca186d4d + size: 14795791 + timestamp: 1765416448111 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py310hc563356_0.conda + sha256: b541de19069437a79d91f50cc5a84ae8a321f7228942d3e43738c52d9180b6ba + md5: ca811ab5f1407125a514bef10d0e168f depends: - __glibc >=2.17,<3.0.a0 - - libboost 1.89.0 hed09d94_3 + - libboost 1.90.0 hed09d94_0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.21,<3 @@ -4822,14 +4822,14 @@ packages: - boost <0.0a0 - py-boost <0.0a0 license: BSL-1.0 - size: 126140 - timestamp: 1763013110889 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.89.0-py314h3a4f467_3.conda - sha256: aa35dd357fc4cce466d144ce6c4b06104361d6a3a3a0a8813e2616cc26bb6fbd - md5: d6c702a738ac840b23ed22c588872c42 + size: 125197 + timestamp: 1765415761286 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314h3a4f467_0.conda + sha256: b24ca23a8b884c20e4c8c037e0c961615ed40865ff5585eea564d065b5e4451d + md5: e92d0b49354024e32c376c97b71561b0 depends: - __glibc >=2.17,<3.0.a0 - - libboost 1.89.0 hed09d94_3 + - libboost 1.90.0 hed09d94_0 - libgcc >=14 - libstdcxx >=14 - numpy >=1.23,<3 @@ -4839,95 +4839,95 @@ packages: - boost <0.0a0 - py-boost <0.0a0 license: BSL-1.0 - size: 131047 - timestamp: 1763013294206 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py310hbe5637a_3.conda - sha256: d7fdb5f01d13d07abbfa72f5616c18b9d930249a7cf7f430f622add873a91bbe - md5: cb1f640a57f7a31ffb4ce18d12602afe + size: 130819 + timestamp: 1765416014348 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py310hbe5637a_0.conda + sha256: c85d692cee41bd827b995c6f60ba5489da2a306df161ec1e6b86266b2ce5cde8 + md5: 9bc250f45c96119c4e77c73a6c69faca depends: - __osx >=10.13 - - libboost 1.89.0 hf9ddd82_3 + - libboost 1.90.0 hf9ddd82_0 - libcxx >=19 - numpy >=1.21,<3 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 105699 - timestamp: 1763015934279 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py313hdff0fa9_3.conda - sha256: bead30f87a11fdc759d17f5e7e9730a2d70ec70a3b666a8c3030895a9fa0b1ab - md5: e070604f4343ef6f09ac714c6daf22e9 + size: 105117 + timestamp: 1765417112356 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py313hdff0fa9_0.conda + sha256: 43fbb0657023b347cf715ebc5ccdb8d58f620fe5a2f385732f3ce70c531a9bda + md5: 052c17f8ca6ae3b330cc8e169f38afd5 depends: - __osx >=10.13 - - libboost 1.89.0 hf9ddd82_3 + - libboost 1.90.0 hf9ddd82_0 - libcxx >=19 - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 106493 - timestamp: 1763015363494 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.89.0-py314h1f4fa51_3.conda - sha256: ce77130d185033d15fe782302e4d6aa40d924ce2206fbf3ff526c7ac927fb4be - md5: ee5d615d0026a6767f0d6fe0c5b5f208 + size: 106311 + timestamp: 1765416916658 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.90.0-py314h1f4fa51_0.conda + sha256: a08ef16b069b461b7baba2b655420a1ee9d3f08f30192f1278613167d6e135fb + md5: aa1d87b1249cfc37b0f1f17b6c7acbce depends: - __osx >=10.13 - - libboost 1.89.0 hf9ddd82_3 + - libboost 1.90.0 hf9ddd82_0 - libcxx >=19 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 107345 - timestamp: 1763015754829 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py310h8ab71b0_3.conda - sha256: 4d5a01af267597194d8937ae4671269c84728f87d0975a90fe7546145112990d - md5: e1e3c594abea04f5061dcfba79ad6816 + size: 107430 + timestamp: 1765416419496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py310h8ab71b0_0.conda + sha256: b74d4ead71c92a92d70d3a4071191f2f354d18da305483c6aa08e06e5c8a4f1d + md5: 9f8c81c161652ff2e0ab1aaa19b83e1c depends: - __osx >=11.0 - - libboost 1.89.0 h18cd856_3 + - libboost 1.90.0 h18cd856_0 - libcxx >=19 - numpy >=1.21,<3 - python >=3.10,<3.11.0a0 - python >=3.10,<3.11.0a0 *_cpython - python_abi 3.10.* *_cp310 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 105274 - timestamp: 1763015558253 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.89.0-py314h0b15719_3.conda - sha256: 9b9a0f4602d32ed2daf84f607c6862e995216c7224f4ef759b45c2dee85c1f2b - md5: da57feb57d5808ee98fc1c0484c15346 + size: 104741 + timestamp: 1765416676375 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.90.0-py314h0b15719_0.conda + sha256: ace0b652db511b365bcc4a60bcfdc4a603d779c1be4699f6084d4a12723aaa0f + md5: 382929048d59d463fd213397c648c860 depends: - __osx >=11.0 - - libboost 1.89.0 h18cd856_3 + - libboost 1.90.0 h18cd856_0 - libcxx >=19 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 106473 - timestamp: 1763016320608 -- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py310hfb7dd09_3.conda - sha256: a0dc8f3d983470e6b9e775451e33e5233bd715f18babdcadb35b41ffaefaff91 - md5: 7d07f80a3e076ff0dc387e8e7eb484cf + size: 106183 + timestamp: 1765416342606 +- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py310hfb7dd09_0.conda + sha256: b54e246d43a1bf21f62915c9c5d295f0f168d61f9c2ca01a44dd5b658cc39b17 + md5: 63dda6d8885b0539e429d203953e20e4 depends: - - libboost 1.89.0 h9dfe17d_3 + - libboost 1.90.0 h9dfe17d_0 - numpy >=1.21,<3 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 @@ -4935,16 +4935,16 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 113225 - timestamp: 1763015426025 -- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.89.0-py314hbac2fa4_3.conda - sha256: e1f089dd7ddb976fe4418e64144cbaeed5e66cbf554082102f4cf3c00521b5c0 - md5: 8355deeb0236551623716b7143d53778 + size: 112503 + timestamp: 1765417172743 +- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-1.90.0-py314hbac2fa4_0.conda + sha256: 457792663b91f4a4bef84da64d1741c6ef908212c5c9a41438b8a93154f7c892 + md5: 416ae9115c1f2953352bdaab54e891f6 depends: - - libboost 1.89.0 h9dfe17d_3 + - libboost 1.90.0 h9dfe17d_0 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -4952,17 +4952,17 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 113381 - timestamp: 1763014938792 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py310hb70c0da_3.conda - sha256: 26d42433d34e9ba74885ddf8d9baa9bf58095ac84080e9a39f6254580a255c75 - md5: cfdc37c2b83365cf7ab62e1cec851faf - depends: - - libboost-devel 1.89.0 hfcd1e18_3 - - libboost-python 1.89.0 py310hc563356_3 + size: 113203 + timestamp: 1765416810590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py310hb70c0da_0.conda + sha256: 53d3356599c87facf990c0c998502fa077bcd5c54f07562f6b27f6e4658e1c05 + md5: b728c82f606e198bd32ca2f54f120b40 + depends: + - libboost-devel 1.90.0 hfcd1e18_0 + - libboost-python 1.90.0 py310hc563356_0 - numpy >=1.21,<3 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 @@ -4970,14 +4970,14 @@ packages: - boost <0.0a0 - py-boost <0.0a0 license: BSL-1.0 - size: 17586 - timestamp: 1763013491773 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.89.0-py314he07d6a8_3.conda - sha256: 198f1d5648752f927960935ad3a5564899957b8cef046958040e965be23f8aac - md5: 885c556b545b25537d239da6a19bcbc7 - depends: - - libboost-devel 1.89.0 hfcd1e18_3 - - libboost-python 1.89.0 py314h3a4f467_3 + size: 17173 + timestamp: 1765416300508 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-devel-1.90.0-py314he07d6a8_0.conda + sha256: 52c3018d0f4f5ff7234cae70b5e4adba11560e04380003937bf0e9e54e9bcab6 + md5: 20a65e6b05749eb8ee62acc770c333cc + depends: + - libboost-devel 1.90.0 hfcd1e18_0 + - libboost-python 1.90.0 py314h3a4f467_0 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -4985,113 +4985,113 @@ packages: - boost <0.0a0 - py-boost <0.0a0 license: BSL-1.0 - size: 17567 - timestamp: 1763013520454 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py310hbc2035d_3.conda - sha256: 212949ad243e903c65c942dda119a6d9d6d30834fd2bb604ebe77441eb02eea6 - md5: af14d5e817bd92ca4360b766ad81d1e8 - depends: - - libboost-devel 1.89.0 h7a7523a_3 - - libboost-python 1.89.0 py310hbe5637a_3 + size: 17167 + timestamp: 1765416361605 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py310hbc2035d_0.conda + sha256: 8dcf1f3f838d5be0313c994175a5c7f8007a66db6b1503bd9cb9870f376b7f03 + md5: 75d13fa1bc74897cc125e7b10df8df3a + depends: + - libboost-devel 1.90.0 h7a7523a_0 + - libboost-python 1.90.0 py310hbe5637a_0 - numpy >=1.21,<3 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 17708 - timestamp: 1763016300782 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py313h81e2733_3.conda - sha256: b152ce1eeedd014f0c0e3a80acf71da94e6f647fa74e52d6cb62b61edfabe949 - md5: f697aa5af3167e2c249c356d06d7d8f1 - depends: - - libboost-devel 1.89.0 h7a7523a_3 - - libboost-python 1.89.0 py313hdff0fa9_3 + size: 17300 + timestamp: 1765417423802 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py313h81e2733_0.conda + sha256: 849dc2af2010cc55cb9a79c40f709281a3bfa14ea324bb8097f5f783412b102f + md5: e5704dfbb11eba3b52488903bfd3a591 + depends: + - libboost-devel 1.90.0 h7a7523a_0 + - libboost-python 1.90.0 py313hdff0fa9_0 - numpy >=1.23,<3 - python >=3.13,<3.14.0a0 - python_abi 3.13.* *_cp313 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 17719 - timestamp: 1763016165716 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.89.0-py314h680a79a_3.conda - sha256: e7e7b1de3fd558b6b01d0eb16e16a7c5c4ed9354db1ea24d916a6e05cdbbde05 - md5: 940e1ac5a1d3fc833cf08189cc8317ee - depends: - - libboost-devel 1.89.0 h7a7523a_3 - - libboost-python 1.89.0 py314h1f4fa51_3 + size: 17298 + timestamp: 1765417360915 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.90.0-py314h680a79a_0.conda + sha256: dce81910513f5261cce7d1fa8f6865b94071b0fabb4e7b3a8d0178e8be91f0cc + md5: 51bf19c7264223cbb90235ebfbb423ad + depends: + - libboost-devel 1.90.0 h7a7523a_0 + - libboost-python 1.90.0 py314h1f4fa51_0 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 17728 - timestamp: 1763016256134 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py310hcc36a09_3.conda - sha256: 724e1ae24fbedb3952fdde03a2f699720336b283c2023aec6abde7192c0333ba - md5: d6ad1fe2445d28ddaa88b2c0adb124ef - depends: - - libboost-devel 1.89.0 hf450f58_3 - - libboost-python 1.89.0 py310h8ab71b0_3 + size: 17323 + timestamp: 1765417178350 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py310hcc36a09_0.conda + sha256: bec5d7f0cc5633a1122210ae93ff9e5c8893ecfe654eab2e02620349ca045236 + md5: f41386af6895a0280aeccd6679bf81ce + depends: + - libboost-devel 1.90.0 hf450f58_0 + - libboost-python 1.90.0 py310h8ab71b0_0 - numpy >=1.21,<3 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 17770 - timestamp: 1763016375846 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.89.0-py314hb99b3d4_3.conda - sha256: 54ce2a584717337304680d5552a3d49e2d51e459a46c27c95128282b72d8c84c - md5: cb2ba61f1867734bdd06a3fec0a243f0 - depends: - - libboost-devel 1.89.0 hf450f58_3 - - libboost-python 1.89.0 py314h0b15719_3 + size: 17455 + timestamp: 1765417309465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.90.0-py314hb99b3d4_0.conda + sha256: 33959cf15f60be5e5005e874b8d87b0899a8d099d1429945828c6f25fefaa904 + md5: d74eed98bcf091abd8e436270bbbb312 + depends: + - libboost-devel 1.90.0 hf450f58_0 + - libboost-python 1.90.0 py314h0b15719_0 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 17747 - timestamp: 1763016577968 -- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py310habd11ae_3.conda - sha256: f7ef2d01fbf368f36e9103748012efc1d8bddaee44ac65c0f8c0654065d9bbc0 - md5: baf8150b7e9d9ca2030719879eac0352 - depends: - - libboost-devel 1.89.0 h1c1089f_3 - - libboost-python 1.89.0 py310hfb7dd09_3 + size: 17463 + timestamp: 1765417212364 +- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py310habd11ae_0.conda + sha256: b1eb9a6312606434b3c0c8bab25097cb83d2c2a184c814106c1a80e13d6f1ab3 + md5: 05b8d96d46f9702749548f94af5e9233 + depends: + - libboost-devel 1.90.0 h1c1089f_0 + - libboost-python 1.90.0 py310hfb7dd09_0 - numpy >=1.21,<3 - python >=3.10,<3.11.0a0 - python_abi 3.10.* *_cp310 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 18334 - timestamp: 1763015652280 -- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.89.0-py314h89c1679_3.conda - sha256: 7f9afc0fa985e3c09e7992e5de7d95bd98587bd5bc883d6e67dc9ddca49f3354 - md5: 50d4ab2daf17342e048019632d3ad198 - depends: - - libboost-devel 1.89.0 h1c1089f_3 - - libboost-python 1.89.0 py314hbac2fa4_3 + size: 17770 + timestamp: 1765417709608 +- conda: https://conda.anaconda.org/conda-forge/win-64/libboost-python-devel-1.90.0-py314h89c1679_0.conda + sha256: be8b3acdf272ba4a1c378280b53012f0ed788b6d28ca13c0a73e6c6774c4828d + md5: 89ba353b0718b19ae85ace322acde4a5 + depends: + - libboost-devel 1.90.0 h1c1089f_0 + - libboost-python 1.90.0 py314hbac2fa4_0 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - - boost <0.0a0 - py-boost <0.0a0 + - boost <0.0a0 license: BSL-1.0 - size: 18364 - timestamp: 1763015526047 + size: 17786 + timestamp: 1765417597950 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbtf-2.3.2-hf02c80a_7100101.conda sha256: fe36f414f48ab87251f02aeef1fcbb6f3929322316842dada0f8142db2710264 md5: 6f4aec52002defbdf3e24eb79e56a209 diff --git a/pixi.toml b/pixi.toml index c38a067d5..6d5151d15 100644 --- a/pixi.toml +++ b/pixi.toml @@ -15,8 +15,8 @@ cxx-compiler = ">=1.7.0" ninja = ">=1.11" pkg-config = ">=0.29.2" git = ">=2.47.0" -libboost-devel = ">=1.80.0,<1.90.0" -libboost-python-devel = ">=1.80.0,<1.90.0" +libboost-devel = ">=1.80.0" +libboost-python-devel = ">=1.80.0" eigen = ">=3.4.0" numpy = ">=1.22.0" python = ">=3.9.0" @@ -38,7 +38,6 @@ extra-args = [ [package.build.target.win-64.config] extra-args = [ - "-DPYTHON_SITELIB=%PREFIX%/Lib/site-packages", "-DGENERATE_PYTHON_STUBS=ON", "-DBUILD_TESTING=OFF", "-DBUILD_TESTING_SCIPY=OFF", @@ -48,8 +47,8 @@ extra-args = [ pkg-config = ">=0.29.2" [package.host-dependencies] -libboost-devel = ">=1.80.0,<1.90.0" -libboost-python-devel = ">=1.80.0,<1.90.0" +libboost-devel = ">=1.80.0" +libboost-python-devel = ">=1.80.0" eigen = ">=3.4.0" numpy = ">=1.22.0" scipy = ">=1.10.0" @@ -58,8 +57,8 @@ python = ">=3.9.0" [package.run-dependencies] scipy = ">=1.10.0" eigen = ">=3.4.0" -libboost-devel = ">=1.80.0,<1.90.0" -libboost-python-devel = ">=1.80.0,<1.90.0" +libboost-devel = ">=1.80.0" +libboost-python-devel = ">=1.80.0" [target.unix.activation] scripts = ["development/scripts/pixi/activation.sh"] @@ -89,19 +88,39 @@ configure = { cmd = [ "build", "-S", ".", - # Don't use standard layout because it's not well implemented on Windows - "-DPYTHON_STANDARD_LAYOUT=OFF", + "-DJRL_CMAKEMODULES_SOURCE_DIR=$JRL_CMAKEMODULES_SOURCE_DIR", + "--profiling-output=cmake-profiling.json", + "--profiling-format=google-trace", "-DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX", "-DCMAKE_BUILD_TYPE=$EIGENPY_BUILD_TYPE", + "-DBUILD_TESTING=ON", + "-DBUILD_TESTING_SCIPY=ON", "-DGENERATE_PYTHON_STUBS=$EIGENPY_PYTHON_STUBS", "-DBUILD_WITH_CHOLMOD_SUPPORT=$EIGENPY_CHOLMOD_SUPPORT", "-DBUILD_WITH_ACCELERATE_SUPPORT=$EIGENPY_ACCELERATE_SUPPORT", ] } -build = { cmd = "cmake --build build --target all", depends-on = ["configure"] } +build = { cmd = "cmake --build build", depends-on = [ + "configure", +] } clean = { cmd = "rm -rf build" } test = { cmd = "ctest --test-dir build --output-on-failure", depends-on = [ "build", ] } +install = { cmd = "cmake --build build --target install", depends-on = [ + "build", +] } +test-packaging = { cmd = [ + "cmake", + "-G", + "Ninja", + "-B", + "build/unittest_packaging", + "-S", + "unittest/packaging/cmake", + "-DCMAKE_PREFIX_PATH=$CONDA_PREFIX", +], depends-on = [ + "install", +] } [feature.lint] dependencies = { pre-commit = ">=3.6.2" } @@ -121,8 +140,6 @@ configure-new-version = { cmd = [ "build_new_version", "-S", ".", - # Don't use standard layout because it's not well implemented on Windows - "-DPYTHON_STANDARD_LAYOUT=OFF", "-DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX", "-DCMAKE_BUILD_TYPE=$EIGENPY_BUILD_TYPE", "-DGENERATE_PYTHON_STUBS=ON", @@ -158,8 +175,8 @@ dependencies = { clangxx = "*", lld = "*" } # Absolute path is needed to avoid using system clang-cl [feature.clang-cl.activation.env] -CC = "%CONDA_PREFIX%\\Library\\bin\\clang-cl" -CXX = "%CONDA_PREFIX%\\Library\\bin\\clang-cl" +CC = "%CONDA_PREFIX%/Library/bin/clang-cl" +CXX = "%CONDA_PREFIX%/Library/bin/clang-cl" # Use clang on GNU/Linux [feature.clang] @@ -173,7 +190,7 @@ cmake = ">=3.22" python = "*" [feature.test-pixi-build.tasks] -test-cmake = "cmake -S unittest/packaging/cmake -B build_test_pixi_build" +test-cmake = "cmake -S unittest/packaging/cmake -B build/test_pixi_build" test-python = "python -c 'import eigenpy'" test = { depends-on = ["test-cmake", "test-python"] } diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 221a5c294..f12d0f211 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,77 +1,33 @@ -# -# Copyright (c) 2014-2023 CNRS INRIA -# - -# --- LIBRARY --- # -set(PYWRAP ${PROJECT_NAME}_pywrap) -set(PYWRAP - ${PYWRAP} - PARENT_SCOPE) - -make_directory("${${PROJECT_NAME}_BINARY_DIR}/python/${PROJECT_NAME}") -include(${JRL_CMAKE_MODULES}/python-helpers.cmake) -include("${JRL_CMAKE_MODULES}/stubs.cmake") - -add_custom_target(${PROJECT_NAME}_python) -set_target_properties(${PROJECT_NAME}_python - PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD True) - -add_library(${PYWRAP} MODULE main.cpp) -add_dependencies(${PROJECT_NAME}_python ${PYWRAP}) -target_link_libraries(${PYWRAP} PUBLIC ${PROJECT_NAME}) - -python_build_get_target(python_build_target) -add_dependencies(${PYWRAP} ${python_build_target}) - -# BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS spews conversion warnings from int to -# long unsigned int. Unfortunately, using literals does not work in a macro. As -# such, this turns them off for the entire wrapper: -if(NOT WIN32) - target_compile_options(${PYWRAP} PRIVATE "-Wno-conversion") -endif() -if(IS_ABSOLUTE ${PYTHON_SITELIB}) - set(ABSOLUTE_PYTHON_SITELIB ${PYTHON_SITELIB}) -else() - set(ABSOLUTE_PYTHON_SITELIB ${CMAKE_INSTALL_PREFIX}/${PYTHON_SITELIB}) -endif() -set(${PYWRAP}_INSTALL_DIR ${ABSOLUTE_PYTHON_SITELIB}/${PROJECT_NAME}) - -set_target_properties( - ${PYWRAP} - PROPERTIES PREFIX "" - SUFFIX ${PYTHON_EXT_SUFFIX} - LIBRARY_OUTPUT_DIRECTORY - "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}" - LIBRARY_OUTPUT_DIRECTORY_ - "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}" - RUNTIME_OUTPUT_DIRECTORY - "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}" - RUNTIME_OUTPUT_DIRECTORY_ - "${PROJECT_BINARY_DIR}/python/${PROJECT_NAME}") - -if(UNIX) - get_relative_rpath(${${PYWRAP}_INSTALL_DIR} ${PYWRAP}_INSTALL_RPATH) - set_target_properties(${PYWRAP} PROPERTIES INSTALL_RPATH - "${${PYWRAP}_INSTALL_RPATH}") -endif() - -install(TARGETS ${PYWRAP} DESTINATION ${${PYWRAP}_INSTALL_DIR}) - -# --- GENERATE STUBS -if(GENERATE_PYTHON_STUBS) - load_stubgen() - - # Set PYWRAP and PROJECT_NAME as stubs dependencies PROJECT_NAME is mandatory - # (even if it's a PYWRAP dependency) to find PROJECT_NAME name DLL on windows - generate_stubs(${CMAKE_CURRENT_BINARY_DIR} ${PROJECT_NAME} - ${ABSOLUTE_PYTHON_SITELIB} ${PYWRAP} ${PROJECT_NAME}) -endif(GENERATE_PYTHON_STUBS) - -# --- INSTALL SCRIPTS -set(PYTHON_FILES __init__.py windows_dll_manager.py) - -foreach(python ${PYTHON_FILES}) - python_build(${PROJECT_NAME} ${python}) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/eigenpy/${python}" - DESTINATION ${${PYWRAP}_INSTALL_DIR}) -endforeach(python) +jrl_boostpy_add_module(eigenpy_pywrap bindings.cpp) +target_link_libraries(eigenpy_pywrap PRIVATE eigenpy) +jrl_target_set_default_compile_options(eigenpy_pywrap PRIVATE) +jrl_target_set_output_directory(eigenpy_pywrap OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages/eigenpy) + +jrl_python_generate_init_py( + eigenpy_pywrap OUTPUT_PATH + ${CMAKE_BINARY_DIR}/lib/site-packages/eigenpy/__init__.py +) + +jrl_boostpy_add_stubs( + eigenpy_pywrap_stubs + MODULE eigenpy.eigenpy_pywrap + OUTPUT ${CMAKE_BINARY_DIR}/lib/site-packages + PYTHON_PATH ${CMAKE_BINARY_DIR}/lib/site-packages + DEPENDS eigenpy_pywrap + VERBOSE +) + +jrl_python_compile_all(DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages/eigenpy) + +jrl_python_compute_install_dir(python_install_dir) +install( + DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages/eigenpy + DESTINATION ${python_install_dir} + FILES_MATCHING + PATTERN "*.py" + PATTERN "*.pyc" + PATTERN "*.pyi" + PATTERN "*.typed" + PATTERN "*.so" + PATTERN "*.pyd" +) diff --git a/python/main.cpp b/python/bindings.cpp similarity index 100% rename from python/main.cpp rename to python/bindings.cpp diff --git a/python/eigenpy/__init__.py b/python/eigenpy/__init__.py deleted file mode 100644 index f143e13a6..000000000 --- a/python/eigenpy/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -# -# Copyright (c) 2017-2021 CNRS INRIA -# - -# On Windows, if eigenpy.dll is not in the same directory than -# the .pyd, it will not be loaded. -# We first try to load eigenpy, then, if it fail and we are on Windows: -# 1. We add all paths inside eigenpy_WINDOWS_DLL_PATH to DllDirectory -# 2. If EIGENPY_WINDOWS_DLL_PATH we add the relative path from the -# package directory to the bin directory to DllDirectory -# This solution is inspired from: -# - https://github.com/PixarAnimationStudios/OpenUSD/pull/1511/files -# - https://stackoverflow.com/questions/65334494/python-c-extension-packaging-dll-along-with-pyd -# More resources on https://github.com/diffpy/pyobjcryst/issues/33 -try: - from .eigenpy_pywrap import * # noqa - from .eigenpy_pywrap import __raw_version__, __version__ -except ImportError: - import platform - - if platform.system() == "Windows": - from .windows_dll_manager import build_directory_manager, get_dll_paths - - with build_directory_manager() as dll_dir_manager: - for p in get_dll_paths(): - dll_dir_manager.add_dll_directory(p) - from .eigenpy_pywrap import * # noqa - from .eigenpy_pywrap import __raw_version__, __version__ # noqa - else: - raise diff --git a/python/eigenpy/windows_dll_manager.py b/python/eigenpy/windows_dll_manager.py deleted file mode 100644 index 54e8631d8..000000000 --- a/python/eigenpy/windows_dll_manager.py +++ /dev/null @@ -1,47 +0,0 @@ -import contextlib -import os - - -def get_dll_paths(): - eigenpy_paths = os.getenv("EIGENPY_WINDOWS_DLL_PATH") - if eigenpy_paths is None: - # From https://peps.python.org/pep-0250/#implementation - # lib/python-version/site-packages/package - RELATIVE_DLL_PATH1 = "..\\..\\..\\..\\bin" - # lib/site-packages/package - RELATIVE_DLL_PATH2 = "..\\..\\..\\bin" - # For unit test - RELATIVE_DLL_PATH3 = "..\\..\\bin" - return [ - os.path.join(os.path.dirname(__file__), RELATIVE_DLL_PATH1), - os.path.join(os.path.dirname(__file__), RELATIVE_DLL_PATH2), - os.path.join(os.path.dirname(__file__), RELATIVE_DLL_PATH3), - ] - else: - return eigenpy_paths.split(os.pathsep) - - -class DllDirectoryManager(contextlib.AbstractContextManager): - """Restore DllDirectory state after importing Python module""" - - def add_dll_directory(self, dll_dir: str): - # add_dll_directory can fail on relative path and non - # existing path. - # Since we don't know all the fail criterion we just ignore - # thrown exception - try: - self.dll_dirs.append(os.add_dll_directory(dll_dir)) - except OSError: - pass - - def __enter__(self): - self.dll_dirs = [] - return self - - def __exit__(self, *exc_details): - for d in self.dll_dirs: - d.close() - - -def build_directory_manager(): - return DllDirectoryManager() diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 130b3e1e2..54a4b6911 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -1,251 +1,3 @@ -# -# Copyright (c) 2014-2019 CNRS Copyright (c) 2018-2024 INRIA -# +add_subdirectory(cpp) -function(ADD_LIB_UNIT_TEST test) - create_ctest_build_tests_target() - set(test_target ${PROJECT_NAME}-${test}) - - if(BUILD_TESTING) - add_library(${test_target} SHARED "${test}.cpp") - else() - add_library(${test_target} SHARED EXCLUDE_FROM_ALL "${test}.cpp") - endif() - set_standard_output_directory(${test_target}) - - target_link_libraries(${test_target} PUBLIC ${PROJECT_NAME}) - set_target_properties( - ${test_target} - PROPERTIES PREFIX "" - LIBRARY_OUTPUT_NAME ${test} - RUNTIME_OUTPUT_NAME ${test}) - - set_target_properties(${test_target} PROPERTIES SUFFIX ${PYTHON_EXT_SUFFIX}) - - add_test( - NAME ${test_target} - COMMAND ${PYTHON_EXECUTABLE} -c "import ${test}" - WORKING_DIRECTORY $) - - add_dependencies(build_tests ${test_target}) - if(NOT BUILD_TESTING) - set_tests_properties(${test_target} PROPERTIES DEPENDS ctest_build_tests) - endif(NOT BUILD_TESTING) -endfunction() - -add_dependencies(build_tests ${PYWRAP}) -add_lib_unit_test(matrix) -add_lib_unit_test(type_info) -add_lib_unit_test(multiple_registration) -if(BUILD_TESTING_SCIPY) - find_scipy() - add_lib_unit_test(sparse_matrix) -endif() -add_lib_unit_test(tensor) -add_lib_unit_test(geometry) -add_lib_unit_test(complex) -add_lib_unit_test(deprecation_policy) -add_lib_unit_test(return_by_ref) -add_lib_unit_test(include) -if(NOT ${EIGEN3_VERSION} VERSION_LESS "3.2.0") - add_lib_unit_test(eigen_ref) -endif() - -if(NOT NUMPY_WITH_BROKEN_UFUNC_SUPPORT) - add_lib_unit_test(user_type) -endif() -add_lib_unit_test(std_vector) -add_lib_unit_test(std_array) -add_lib_unit_test(std_pair) -add_lib_unit_test(std_map) -add_lib_unit_test(user_struct) - -if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98) - add_lib_unit_test(std_unique_ptr) -endif() - -function(add_python_lib_unit_test name source) - set(test_target ${PROJECT_NAME}-${name}) - add_python_unit_test(${test_target} ${source} "lib" "bin") -endfunction() - -function(add_python_eigenpy_lib_unit_test name source) - set(test_target ${PROJECT_NAME}-${name}) - add_python_unit_test(${test_target} ${source} "lib" "bin" "python") - set_tests_properties(${test_target} PROPERTIES DEPENDS ${PYWRAP}) -endfunction() - -function(add_python_eigenpy_unit_test name source) - set(test_target ${PROJECT_NAME}-${name}) - add_python_unit_test(${test_target} ${source} "python") - set_tests_properties(${test_target} PROPERTIES DEPENDS ${PYWRAP}) -endfunction() - -function(config_test test tagname opttype) - set(MODNAME ${test}_${tagname}) - set(TEST_TYPE ${opttype}) - configure_file(${test}.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/${MODNAME}.cpp) - - set(py_file test_${test}_${tagname}.py) - configure_file(python/test_${test}.py.in - ${CMAKE_CURRENT_BINARY_DIR}/python/${py_file}) - add_lib_unit_test(${MODNAME}) - set(PYTHON_TEST_NAME "${PROJECT_NAME}-py-${test}-${tagname}") - add_test(NAME ${PYTHON_TEST_NAME} - COMMAND ${PYTHON_EXECUTABLE} - "${CMAKE_CURRENT_BINARY_DIR}/python/${py_file}") - compute_pythonpath(ENV_VARIABLES "lib" "bin") - set_tests_properties(${PYTHON_TEST_NAME} PROPERTIES ENVIRONMENT - "${ENV_VARIABLES}") -endfunction() - -config_test(variant boost "boost::variant") -if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98) - config_test(variant std "std::variant") -endif() - -config_test(bind_optional boost "boost::optional") -if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98) - config_test(bind_optional std "std::optional") -endif() - -add_lib_unit_test(bind_virtual_factory) - -add_python_lib_unit_test("py-matrix" "unittest/python/test_matrix.py") -add_python_lib_unit_test("py-type-info" "unittest/python/test_type_info.py") -add_python_lib_unit_test("py-multiple-registration" - "unittest/python/test_multiple_registration.py") - -add_python_lib_unit_test("py-tensor" "unittest/python/test_tensor.py") -add_python_lib_unit_test("py-Geometry" "unittest/python/test_Geometry.py") -add_python_lib_unit_test("py-complex" "unittest/python/test_complex.py") -add_python_lib_unit_test("py-deprecation-policy" - "unittest/python/test_deprecation_policy.py") -add_python_lib_unit_test("py-return-by-ref" - "unittest/python/test_return_by_ref.py") -add_python_lib_unit_test("py-eigen-ref" "unittest/python/test_eigen_ref.py") - -if(NOT NUMPY_WITH_BROKEN_UFUNC_SUPPORT) - add_python_lib_unit_test("py-user-type" "unittest/python/test_user_type.py") -endif() - -add_python_eigenpy_lib_unit_test("py-dimensions" - "unittest/python/test_dimensions.py") - -add_python_eigenpy_lib_unit_test("py-version" "unittest/python/test_version.py") - -add_python_eigenpy_lib_unit_test("py-EigenSolver" - "unittest/python/test_EigenSolver.py") - -add_python_eigenpy_lib_unit_test( - "py-GeneralizedEigenSolver" "unittest/python/test_GeneralizedEigenSolver.py") - -add_python_eigenpy_lib_unit_test( - "py-GeneralizedSelfAdjointEigenSolver" - "unittest/python/test_GeneralizedSelfAdjointEigenSolver.py") - -add_python_eigenpy_lib_unit_test("py-ComplexEigenSolver" - "unittest/python/test_ComplexEigenSolver.py") - -add_python_eigenpy_lib_unit_test("py-ComplexSchur" - "unittest/python/test_ComplexSchur.py") - -add_python_eigenpy_lib_unit_test( - "py-SelfAdjointEigenSolver" "unittest/python/test_SelfAdjointEigenSolver.py") - -add_python_eigenpy_lib_unit_test( - "py-HessenbergDecomposition" - "unittest/python/test_HessenbergDecomposition.py") - -add_python_eigenpy_lib_unit_test("py-RealQZ" "unittest/python/test_RealQZ.py") - -add_python_eigenpy_lib_unit_test("py-RealSchur" - "unittest/python/test_RealSchur.py") - -add_python_eigenpy_lib_unit_test("py-Tridiagonalization" - "unittest/python/test_Tridiagonalization.py") - -add_python_eigenpy_lib_unit_test("py-LLT" "unittest/python/test_LLT.py") - -add_python_eigenpy_lib_unit_test("py-LDLT" "unittest/python/test_LDLT.py") - -add_python_eigenpy_lib_unit_test("py-FullPivLU" - "unittest/python/test_FullPivLU.py") - -add_python_eigenpy_lib_unit_test("py-PartialPivLU" - "unittest/python/test_PartialPivLU.py") - -add_python_eigenpy_lib_unit_test("py-id" "unittest/python/test_id.py") - -add_python_eigenpy_lib_unit_test("py-QR" "unittest/python/test_QR.py") - -add_python_eigenpy_lib_unit_test("py-BDCSVD" "unittest/python/test_BDCSVD.py") - -add_python_eigenpy_lib_unit_test("py-JacobiSVD" - "unittest/python/test_JacobiSVD.py") - -if(NOT WIN32) - add_python_eigenpy_lib_unit_test("py-MINRES" "unittest/python/test_MINRES.py") -endif(NOT WIN32) - -add_python_eigenpy_lib_unit_test("py-std-vector" - "unittest/python/test_std_vector.py") - -add_python_lib_unit_test("py-std-array" "unittest/python/test_std_array.py") - -add_python_lib_unit_test("py-std-map" "unittest/python/test_std_map.py") - -add_python_lib_unit_test("py-std-pair" "unittest/python/test_std_pair.py") - -add_python_lib_unit_test("py-user-struct" "unittest/python/test_user_struct.py") - -if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98) - add_python_lib_unit_test("py-std-unique-ptr" - "unittest/python/test_std_unique_ptr.py") -endif() - -add_python_lib_unit_test("py-bind-virtual" - "unittest/python/test_bind_virtual.py") - -if(BUILD_TESTING_SCIPY) - add_python_lib_unit_test("py-sparse-matrix" - "unittest/python/test_sparse_matrix.py") - - add_python_eigenpy_unit_test( - "py-SimplicialLLT" - "unittest/python/decompositions/sparse/test_SimplicialLLT.py") - add_python_eigenpy_unit_test( - "py-SimplicialLDLT" - "unittest/python/decompositions/sparse/test_SimplicialLDLT.py") - add_python_eigenpy_unit_test("py-IncompleteCholesky" - "unittest/python/test_IncompleteCholesky.py") - add_python_eigenpy_unit_test("py-IncompleteLUT" - "unittest/python/test_IncompleteLUT.py") - add_python_eigenpy_unit_test( - "py-SparseLU" "unittest/python/decompositions/sparse/test_SparseLU.py") - add_python_eigenpy_unit_test( - "py-SparseQR" "unittest/python/decompositions/sparse/test_SparseQR.py") - - if(BUILD_WITH_CHOLMOD_SUPPORT) - add_python_eigenpy_unit_test( - "py-CholmodSimplicialLLT" - "unittest/python/decompositions/sparse/cholmod/test_CholmodSimplicialLLT.py" - ) - - add_python_eigenpy_unit_test( - "py-CholmodSimplicialLDLT" - "unittest/python/decompositions/sparse/cholmod/test_CholmodSimplicialLDLT.py" - ) - - add_python_eigenpy_unit_test( - "py-CholmodSupernodalLLT" - "unittest/python/decompositions/sparse/cholmod/test_CholmodSupernodalLLT.py" - ) - endif(BUILD_WITH_CHOLMOD_SUPPORT) - - if(BUILD_WITH_ACCELERATE_SUPPORT) - add_python_eigenpy_unit_test( - "py-Accelerate" - "unittest/python/decompositions/sparse/test_Accelerate.py") - endif(BUILD_WITH_ACCELERATE_SUPPORT) -endif() +add_subdirectory(python) diff --git a/unittest/cpp/.clang-format-ignore b/unittest/cpp/.clang-format-ignore new file mode 100644 index 000000000..f27346cf0 --- /dev/null +++ b/unittest/cpp/.clang-format-ignore @@ -0,0 +1,4 @@ +boost_optional.cpp +boost_variant.cpp +std_variant.cpp +std_optional.cpp \ No newline at end of file diff --git a/unittest/cpp/CMakeLists.txt b/unittest/cpp/CMakeLists.txt new file mode 100644 index 000000000..f2a364ef4 --- /dev/null +++ b/unittest/cpp/CMakeLists.txt @@ -0,0 +1,72 @@ +# Add test that depends on the eigenpy library +# import eigenpy is not authorized in those tests +function(eigenpy_add_test name) + jrl_boostpy_add_module(${name} ${name}.cpp) + target_link_libraries(${name} PRIVATE eigenpy) + jrl_target_set_default_compile_options(${name} PRIVATE) + jrl_target_enforce_msvc_conformance(${name} PRIVATE) + + jrl_target_set_output_directory(${name} OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${name}) + + jrl_python_generate_init_py( + ${name} + OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${name}/__init__.py + ) + + add_test( + NAME "Eigenpy: import ${name}" + COMMAND $ -c "import ${name}" + ) + + set(test_name "Eigenpy: test_${name}.py") + add_test( + NAME ${test_name} + COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/test_${name}.py + ) + set_tests_properties( + ${test_name} + PROPERTIES ENVIRONMENT "PYTHONPATH=$" DEPENDS ${name} + ) +endfunction() + +eigenpy_add_test(matrix) +eigenpy_add_test(type_info) +eigenpy_add_test(multiple_registration) +if(BUILD_TESTING_SCIPY) + eigenpy_add_test(sparse_matrix) +endif() +eigenpy_add_test(tensor) +eigenpy_add_test(geometry) +eigenpy_add_test(complex) +eigenpy_add_test(deprecation_policy) +eigenpy_add_test(return_by_ref) +eigenpy_add_test(include) +eigenpy_add_test(eigen_ref) +eigenpy_add_test(user_type) +eigenpy_add_test(std_vector) +eigenpy_add_test(std_array) +eigenpy_add_test(std_pair) +eigenpy_add_test(std_map) +eigenpy_add_test(user_struct) +eigenpy_add_test(std_unique_ptr) +eigenpy_add_test(virtual_factory) + +set(TEST_TYPE "boost::optional") +set(MODNAME boost_optional) +configure_file(optional.cpp.in ${CMAKE_CURRENT_SOURCE_DIR}/boost_optional.cpp) +eigenpy_add_test(boost_optional) + +set(TEST_TYPE "std::optional") +set(MODNAME std_optional) +configure_file(optional.cpp.in ${CMAKE_CURRENT_SOURCE_DIR}/std_optional.cpp) +eigenpy_add_test(std_optional) + +set(TEST_TYPE "boost::variant") +set(MODNAME boost_variant) +configure_file(variant.cpp.in ${CMAKE_CURRENT_SOURCE_DIR}/boost_variant.cpp) +eigenpy_add_test(boost_variant) + +set(TEST_TYPE "std::variant") +set(MODNAME std_variant) +configure_file(variant.cpp.in ${CMAKE_CURRENT_SOURCE_DIR}/std_variant.cpp) +eigenpy_add_test(std_variant) diff --git a/unittest/cpp/boost_optional.cpp b/unittest/cpp/boost_optional.cpp new file mode 100644 index 000000000..6f4b19619 --- /dev/null +++ b/unittest/cpp/boost_optional.cpp @@ -0,0 +1,81 @@ +/// +/// Copyright (c) 2023 CNRS INRIA +/// + +#include "eigenpy/eigenpy.hpp" +#include "eigenpy/optional.hpp" +#ifdef EIGENPY_WITH_CXX17_SUPPORT +#include +#endif + +#define TEST_TYPE boost::optional +#define OPTIONAL TEST_TYPE + +typedef eigenpy::detail::nullopt_helper none_helper; +static auto OPT_NONE = none_helper::value(); +typedef OPTIONAL opt_dbl; + +struct mystruct { + OPTIONAL a; + opt_dbl b; + OPTIONAL msg{"i am struct"}; + mystruct() : a(OPT_NONE), b(OPT_NONE) {} + mystruct(int a, const opt_dbl &b = OPT_NONE) : a(a), b(b) {} +}; + +OPTIONAL none_if_zero(int i) { + if (i == 0) + return OPT_NONE; + else + return i; +} + +OPTIONAL create_if_true(bool flag, opt_dbl b = OPT_NONE) { + if (flag) { + return mystruct(0, b); + } else { + return OPT_NONE; + } +} + +OPTIONAL random_mat_if_true(bool flag) { + if (flag) + return Eigen::MatrixXd(Eigen::MatrixXd::Random(4, 4)); + else + return OPT_NONE; +} + +BOOST_PYTHON_MODULE(boost_optional) { + using namespace eigenpy; + OptionalConverter::registration(); + OptionalConverter::registration(); + OptionalConverter::registration(); + OptionalConverter::registration(); + OptionalConverter::registration(); + enableEigenPy(); + + bp::class_("mystruct", bp::no_init) + .def(bp::init<>(bp::args("self"))) + .def(bp::init >( + bp::args("self", "a", "b"))) + .add_property( + "a", + bp::make_getter(&mystruct::a, + bp::return_value_policy()), + bp::make_setter(&mystruct::a)) + .add_property( + "b", + bp::make_getter(&mystruct::b, + bp::return_value_policy()), + bp::make_setter(&mystruct::b)) + .add_property( + "msg", + bp::make_getter(&mystruct::msg, + bp::return_value_policy()), + bp::make_setter(&mystruct::msg)); + + bp::def("none_if_zero", none_if_zero, bp::args("i")); + bp::def("create_if_true", create_if_true, + (bp::arg("flag"), bp::arg("b") = OPT_NONE)); + bp::def("random_mat_if_true", random_mat_if_true, bp::args("flag")); +} diff --git a/unittest/cpp/boost_variant.cpp b/unittest/cpp/boost_variant.cpp new file mode 100644 index 000000000..c6569b8e3 --- /dev/null +++ b/unittest/cpp/boost_variant.cpp @@ -0,0 +1,92 @@ +/// @file +/// @copyright Copyright 2024 CNRS INRIA + +#include +#include + +#include +#include + +#define TEST_TYPE boost::variant +#define VARIANT TEST_TYPE + +namespace bp = boost::python; + +struct V1 { + int v; +}; +struct V2 { + char v; +}; +typedef VARIANT MyVariant; + +template +struct MyVariantNoneHelper {}; + +template +struct MyVariantNoneHelper > { + typedef VARIANT type; +}; + +#ifdef EIGENPY_WITH_CXX17_SUPPORT +template +struct MyVariantNoneHelper > { + typedef VARIANT type; +}; +#endif + +typedef typename MyVariantNoneHelper< + VARIANT > >::type + MyVariantFull; + +MyVariant make_variant() { return V1(); } + +MyVariantFull make_variant_full_none() { return MyVariantFull(); } +MyVariantFull make_variant_full_float() { return 3.14; } +MyVariantFull make_variant_full_int() { return 3; } +MyVariantFull make_variant_full_bool() { return false; } +MyVariantFull make_variant_full_str() { return std::string("str"); } +MyVariantFull make_variant_full_complex() { return std::complex(1., 0.); } + +struct VariantHolder { + MyVariant variant; +}; + +struct VariantFullHolder { + MyVariantFull variant; +}; + +BOOST_PYTHON_MODULE(boost_variant) { + using namespace eigenpy; + + enableEigenPy(); + + bp::class_("V1", bp::init<>()).def_readwrite("v", &V1::v); + bp::class_("V2", bp::init<>()).def_readwrite("v", &V2::v); + + typedef eigenpy::VariantConverter Converter; + Converter::registration(); + + bp::def("make_variant", make_variant); + + boost::python::class_("VariantHolder", bp::init<>()) + .add_property("variant", + bp::make_getter(&VariantHolder::variant, + Converter::return_internal_reference()), + bp::make_setter(&VariantHolder::variant)); + + typedef eigenpy::VariantConverter ConverterFull; + ConverterFull::registration(); + bp::def("make_variant_full_none", make_variant_full_none); + bp::def("make_variant_full_float", make_variant_full_float); + bp::def("make_variant_full_int", make_variant_full_int); + bp::def("make_variant_full_bool", make_variant_full_bool); + bp::def("make_variant_full_str", make_variant_full_str); + bp::def("make_variant_full_complex", make_variant_full_complex); + + boost::python::class_("VariantFullHolder", bp::init<>()) + .add_property("variant", + bp::make_getter(&VariantFullHolder::variant, + ConverterFull::return_internal_reference()), + bp::make_setter(&VariantFullHolder::variant)); +} diff --git a/unittest/complex.cpp b/unittest/cpp/complex.cpp similarity index 100% rename from unittest/complex.cpp rename to unittest/cpp/complex.cpp diff --git a/unittest/deprecation_policy.cpp b/unittest/cpp/deprecation_policy.cpp similarity index 100% rename from unittest/deprecation_policy.cpp rename to unittest/cpp/deprecation_policy.cpp diff --git a/unittest/eigen_ref.cpp b/unittest/cpp/eigen_ref.cpp similarity index 100% rename from unittest/eigen_ref.cpp rename to unittest/cpp/eigen_ref.cpp diff --git a/unittest/geometry.cpp b/unittest/cpp/geometry.cpp similarity index 100% rename from unittest/geometry.cpp rename to unittest/cpp/geometry.cpp diff --git a/unittest/include.cpp b/unittest/cpp/include.cpp similarity index 100% rename from unittest/include.cpp rename to unittest/cpp/include.cpp diff --git a/unittest/matrix.cpp b/unittest/cpp/matrix.cpp similarity index 100% rename from unittest/matrix.cpp rename to unittest/cpp/matrix.cpp diff --git a/unittest/multiple_registration.cpp b/unittest/cpp/multiple_registration.cpp similarity index 100% rename from unittest/multiple_registration.cpp rename to unittest/cpp/multiple_registration.cpp diff --git a/unittest/bind_optional.cpp.in b/unittest/cpp/optional.cpp.in similarity index 100% rename from unittest/bind_optional.cpp.in rename to unittest/cpp/optional.cpp.in diff --git a/unittest/return_by_ref.cpp b/unittest/cpp/return_by_ref.cpp similarity index 100% rename from unittest/return_by_ref.cpp rename to unittest/cpp/return_by_ref.cpp diff --git a/unittest/sparse_matrix.cpp b/unittest/cpp/sparse_matrix.cpp similarity index 100% rename from unittest/sparse_matrix.cpp rename to unittest/cpp/sparse_matrix.cpp diff --git a/unittest/std_array.cpp b/unittest/cpp/std_array.cpp similarity index 100% rename from unittest/std_array.cpp rename to unittest/cpp/std_array.cpp diff --git a/unittest/std_map.cpp b/unittest/cpp/std_map.cpp similarity index 100% rename from unittest/std_map.cpp rename to unittest/cpp/std_map.cpp diff --git a/unittest/cpp/std_optional.cpp b/unittest/cpp/std_optional.cpp new file mode 100644 index 000000000..8b02cc5cc --- /dev/null +++ b/unittest/cpp/std_optional.cpp @@ -0,0 +1,81 @@ +/// +/// Copyright (c) 2023 CNRS INRIA +/// + +#include "eigenpy/eigenpy.hpp" +#include "eigenpy/optional.hpp" +#ifdef EIGENPY_WITH_CXX17_SUPPORT +#include +#endif + +#define TEST_TYPE std::optional +#define OPTIONAL TEST_TYPE + +typedef eigenpy::detail::nullopt_helper none_helper; +static auto OPT_NONE = none_helper::value(); +typedef OPTIONAL opt_dbl; + +struct mystruct { + OPTIONAL a; + opt_dbl b; + OPTIONAL msg{"i am struct"}; + mystruct() : a(OPT_NONE), b(OPT_NONE) {} + mystruct(int a, const opt_dbl &b = OPT_NONE) : a(a), b(b) {} +}; + +OPTIONAL none_if_zero(int i) { + if (i == 0) + return OPT_NONE; + else + return i; +} + +OPTIONAL create_if_true(bool flag, opt_dbl b = OPT_NONE) { + if (flag) { + return mystruct(0, b); + } else { + return OPT_NONE; + } +} + +OPTIONAL random_mat_if_true(bool flag) { + if (flag) + return Eigen::MatrixXd(Eigen::MatrixXd::Random(4, 4)); + else + return OPT_NONE; +} + +BOOST_PYTHON_MODULE(std_optional) { + using namespace eigenpy; + OptionalConverter::registration(); + OptionalConverter::registration(); + OptionalConverter::registration(); + OptionalConverter::registration(); + OptionalConverter::registration(); + enableEigenPy(); + + bp::class_("mystruct", bp::no_init) + .def(bp::init<>(bp::args("self"))) + .def(bp::init >( + bp::args("self", "a", "b"))) + .add_property( + "a", + bp::make_getter(&mystruct::a, + bp::return_value_policy()), + bp::make_setter(&mystruct::a)) + .add_property( + "b", + bp::make_getter(&mystruct::b, + bp::return_value_policy()), + bp::make_setter(&mystruct::b)) + .add_property( + "msg", + bp::make_getter(&mystruct::msg, + bp::return_value_policy()), + bp::make_setter(&mystruct::msg)); + + bp::def("none_if_zero", none_if_zero, bp::args("i")); + bp::def("create_if_true", create_if_true, + (bp::arg("flag"), bp::arg("b") = OPT_NONE)); + bp::def("random_mat_if_true", random_mat_if_true, bp::args("flag")); +} diff --git a/unittest/std_pair.cpp b/unittest/cpp/std_pair.cpp similarity index 100% rename from unittest/std_pair.cpp rename to unittest/cpp/std_pair.cpp diff --git a/unittest/std_unique_ptr.cpp b/unittest/cpp/std_unique_ptr.cpp similarity index 100% rename from unittest/std_unique_ptr.cpp rename to unittest/cpp/std_unique_ptr.cpp diff --git a/unittest/cpp/std_variant.cpp b/unittest/cpp/std_variant.cpp new file mode 100644 index 000000000..c94b17e61 --- /dev/null +++ b/unittest/cpp/std_variant.cpp @@ -0,0 +1,92 @@ +/// @file +/// @copyright Copyright 2024 CNRS INRIA + +#include +#include + +#include +#include + +#define TEST_TYPE std::variant +#define VARIANT TEST_TYPE + +namespace bp = boost::python; + +struct V1 { + int v; +}; +struct V2 { + char v; +}; +typedef VARIANT MyVariant; + +template +struct MyVariantNoneHelper {}; + +template +struct MyVariantNoneHelper > { + typedef VARIANT type; +}; + +#ifdef EIGENPY_WITH_CXX17_SUPPORT +template +struct MyVariantNoneHelper > { + typedef VARIANT type; +}; +#endif + +typedef typename MyVariantNoneHelper< + VARIANT > >::type + MyVariantFull; + +MyVariant make_variant() { return V1(); } + +MyVariantFull make_variant_full_none() { return MyVariantFull(); } +MyVariantFull make_variant_full_float() { return 3.14; } +MyVariantFull make_variant_full_int() { return 3; } +MyVariantFull make_variant_full_bool() { return false; } +MyVariantFull make_variant_full_str() { return std::string("str"); } +MyVariantFull make_variant_full_complex() { return std::complex(1., 0.); } + +struct VariantHolder { + MyVariant variant; +}; + +struct VariantFullHolder { + MyVariantFull variant; +}; + +BOOST_PYTHON_MODULE(std_variant) { + using namespace eigenpy; + + enableEigenPy(); + + bp::class_("V1", bp::init<>()).def_readwrite("v", &V1::v); + bp::class_("V2", bp::init<>()).def_readwrite("v", &V2::v); + + typedef eigenpy::VariantConverter Converter; + Converter::registration(); + + bp::def("make_variant", make_variant); + + boost::python::class_("VariantHolder", bp::init<>()) + .add_property("variant", + bp::make_getter(&VariantHolder::variant, + Converter::return_internal_reference()), + bp::make_setter(&VariantHolder::variant)); + + typedef eigenpy::VariantConverter ConverterFull; + ConverterFull::registration(); + bp::def("make_variant_full_none", make_variant_full_none); + bp::def("make_variant_full_float", make_variant_full_float); + bp::def("make_variant_full_int", make_variant_full_int); + bp::def("make_variant_full_bool", make_variant_full_bool); + bp::def("make_variant_full_str", make_variant_full_str); + bp::def("make_variant_full_complex", make_variant_full_complex); + + boost::python::class_("VariantFullHolder", bp::init<>()) + .add_property("variant", + bp::make_getter(&VariantFullHolder::variant, + ConverterFull::return_internal_reference()), + bp::make_setter(&VariantFullHolder::variant)); +} diff --git a/unittest/std_vector.cpp b/unittest/cpp/std_vector.cpp similarity index 84% rename from unittest/std_vector.cpp rename to unittest/cpp/std_vector.cpp index f8deffbf5..3b609cc67 100644 --- a/unittest/std_vector.cpp +++ b/unittest/cpp/std_vector.cpp @@ -63,6 +63,16 @@ BOOST_PYTHON_MODULE(std_vector) { boost::python::vector_indexing_suite>()); exposeStdVectorEigenSpecificType("Mat2d"); + bp::class_>("StdVec_VectorXd") + .def( + boost::python::vector_indexing_suite>()); + exposeStdVectorEigenSpecificType("VectorXd"); + + bp::class_>("StdVec_MatrixXd") + .def( + boost::python::vector_indexing_suite>()); + exposeStdVectorEigenSpecificType("MatrixXd"); + // Test API regression: // Exposing a `std::vector` with documentation doesn't clash with // exposing a `std::vector` with a visitor diff --git a/unittest/tensor.cpp b/unittest/cpp/tensor.cpp similarity index 100% rename from unittest/tensor.cpp rename to unittest/cpp/tensor.cpp diff --git a/unittest/python/test_bind_optional.py.in b/unittest/cpp/test_boost_optional.py similarity index 65% rename from unittest/python/test_bind_optional.py.in rename to unittest/cpp/test_boost_optional.py index bd5e085ec..d8707439e 100644 --- a/unittest/python/test_bind_optional.py.in +++ b/unittest/cpp/test_boost_optional.py @@ -1,11 +1,11 @@ import importlib -bind_optional = importlib.import_module("@MODNAME@") +optional = importlib.import_module("boost_optional") def test_none_if_zero(): - x = bind_optional.none_if_zero(0) - y = bind_optional.none_if_zero(-1) + x = optional.none_if_zero(0) + y = optional.none_if_zero(-1) assert x is None assert y == -1 @@ -13,23 +13,23 @@ def test_none_if_zero(): def test_struct_ctors(): # test struct ctors - struct = bind_optional.mystruct() + struct = optional.mystruct() assert struct.a is None assert struct.b is None assert struct.msg == "i am struct" ## no 2nd arg automatic overload using bp::optional - struct = bind_optional.mystruct(2) + struct = optional.mystruct(2) assert struct.a == 2 assert struct.b is None - struct = bind_optional.mystruct(13, -1.0) + struct = optional.mystruct(13, -1.0) assert struct.a == 13 assert struct.b == -1.0 def test_struct_setters(): - struct = bind_optional.mystruct() + struct = optional.mystruct() struct.a = 1 assert struct.a == 1 @@ -46,17 +46,17 @@ def test_struct_setters(): def test_factory(): - struct = bind_optional.create_if_true(False, None) + struct = optional.create_if_true(False, None) assert struct is None - struct = bind_optional.create_if_true(True, None) + struct = optional.create_if_true(True, None) assert struct.a == 0 assert struct.b is None def test_random_mat(): - M = bind_optional.random_mat_if_true(False) + M = optional.random_mat_if_true(False) assert M is None - M = bind_optional.random_mat_if_true(True) + M = optional.random_mat_if_true(True) assert M.shape == (4, 4) diff --git a/unittest/cpp/test_boost_variant.py b/unittest/cpp/test_boost_variant.py new file mode 100644 index 000000000..f71a8101c --- /dev/null +++ b/unittest/cpp/test_boost_variant.py @@ -0,0 +1,123 @@ +import importlib + +variant_module = importlib.import_module("boost_variant") +V1 = variant_module.V1 +V2 = variant_module.V2 +VariantHolder = variant_module.VariantHolder +VariantFullHolder = variant_module.VariantFullHolder +make_variant = variant_module.make_variant +make_variant_full_none = variant_module.make_variant_full_none +make_variant_full_float = variant_module.make_variant_full_float +make_variant_full_int = variant_module.make_variant_full_int +make_variant_full_bool = variant_module.make_variant_full_bool +make_variant_full_str = variant_module.make_variant_full_str +make_variant_full_complex = variant_module.make_variant_full_complex + +variant = make_variant() +assert isinstance(variant, V1) + +v1 = V1() +v1.v = 10 + +v2 = V2() +v2.v = "c" + +variant_holder = VariantHolder() + +# Test copy from variant alternative V1 to non initialized variant +variant_holder.variant = v1 +assert isinstance(variant_holder.variant, V1) +assert variant_holder.variant.v == v1.v + +# variant_holder.variant is a copy of v1 +variant_holder.variant.v = 11 +assert v1.v != variant_holder.variant.v + +# Test variant_holder.variant return by reference +# v1 reference variant_holder.variant +v1 = variant_holder.variant +variant_holder.variant.v = 100 +assert variant_holder.variant.v == 100 +assert v1.v == 100 +v1.v = 1000 +assert variant_holder.variant.v == 1000 +assert v1.v == 1000 + +# Test with the second alternative type +variant_holder.variant = v2 +assert isinstance(variant_holder.variant, V2) +assert variant_holder.variant.v == v2.v + +# Test variant that hold a None value +v_full = make_variant_full_none() +assert v_full is None + +# Test variant that hold a float value +v_full = make_variant_full_float() +assert v_full == 3.14 +assert isinstance(v_full, float) + +# Test variant that hold a int value +v_full = make_variant_full_int() +assert v_full == 3 +assert isinstance(v_full, int) + +# Test variant that hold a bool value +v_full = make_variant_full_bool() +assert not v_full +assert isinstance(v_full, bool) + +# Test variant that hold a str value +v_full = make_variant_full_str() +assert v_full == "str" +assert isinstance(v_full, str) + +# Test variant that hold a complex value +v_full = make_variant_full_complex() +assert v_full == 1 + 0j +assert isinstance(v_full, complex) + +variant_full_holder = VariantFullHolder() + +# Test None +v_none = variant_full_holder.variant +assert v_none is None +variant_full_holder.variant = None +assert v_none is None + +# Test V1 +v1 = V1() +v1.v = 10 +variant_full_holder.variant = v1 +assert variant_full_holder.variant.v == 10 +assert isinstance(variant_full_holder.variant, V1) +# Test V1 ref +v1 = variant_full_holder.variant +v1.v = 100 +assert variant_full_holder.variant.v == 100 +variant_full_holder.variant = None + +# Test bool +variant_full_holder.variant = True +assert variant_full_holder.variant +assert isinstance(variant_full_holder.variant, bool) + +# Test int +variant_full_holder.variant = 3 +assert variant_full_holder.variant == 3 +assert isinstance(variant_full_holder.variant, int) + +# Test float +variant_full_holder.variant = 3.14 +assert variant_full_holder.variant == 3.14 +assert isinstance(variant_full_holder.variant, float) + +# Test str +variant_full_holder.variant = "str" +assert variant_full_holder.variant == "str" +assert isinstance(variant_full_holder.variant, str) + +# Test complex +variant_full_holder.variant = 1 + 0j +assert variant_full_holder.variant == 1 + 0j +assert isinstance(variant_full_holder.variant, complex) diff --git a/unittest/python/test_complex.py b/unittest/cpp/test_complex.py similarity index 100% rename from unittest/python/test_complex.py rename to unittest/cpp/test_complex.py diff --git a/unittest/python/test_deprecation_policy.py b/unittest/cpp/test_deprecation_policy.py similarity index 100% rename from unittest/python/test_deprecation_policy.py rename to unittest/cpp/test_deprecation_policy.py diff --git a/unittest/python/test_eigen_ref.py b/unittest/cpp/test_eigen_ref.py similarity index 100% rename from unittest/python/test_eigen_ref.py rename to unittest/cpp/test_eigen_ref.py diff --git a/unittest/python/test_Geometry.py b/unittest/cpp/test_geometry.py similarity index 100% rename from unittest/python/test_Geometry.py rename to unittest/cpp/test_geometry.py diff --git a/unittest/cpp/test_include.py b/unittest/cpp/test_include.py new file mode 100644 index 000000000..ddd8375b2 --- /dev/null +++ b/unittest/cpp/test_include.py @@ -0,0 +1,5 @@ +def test_import_include(): + import include + + print(include) + return True diff --git a/unittest/python/test_matrix.py b/unittest/cpp/test_matrix.py similarity index 100% rename from unittest/python/test_matrix.py rename to unittest/cpp/test_matrix.py diff --git a/unittest/python/test_multiple_registration.py b/unittest/cpp/test_multiple_registration.py similarity index 100% rename from unittest/python/test_multiple_registration.py rename to unittest/cpp/test_multiple_registration.py diff --git a/unittest/cpp/test_optional.py.in b/unittest/cpp/test_optional.py.in new file mode 100644 index 000000000..b28e37901 --- /dev/null +++ b/unittest/cpp/test_optional.py.in @@ -0,0 +1,67 @@ +import importlib + +optional = importlib.import_module("@MODNAME@") + + +def test_none_if_zero(): + x = optional.none_if_zero(0) + y = optional.none_if_zero(-1) + assert x is None + assert y == -1 + + +def test_struct_ctors(): + # test struct ctors + + struct = optional.mystruct() + assert struct.a is None + assert struct.b is None + assert struct.msg == "i am struct" + + ## no 2nd arg automatic overload using bp::optional + struct = optional.mystruct(2) + assert struct.a == 2 + assert struct.b is None + + struct = optional.mystruct(13, -1.0) + assert struct.a == 13 + assert struct.b == -1.0 + + +def test_struct_setters(): + struct = optional.mystruct() + struct.a = 1 + assert struct.a == 1 + + struct.b = -3.14 + assert struct.b == -3.14 + + # set to None + struct.a = None + struct.b = None + struct.msg = None + assert struct.a is None + assert struct.b is None + assert struct.msg is None + + +def test_factory(): + struct = optional.create_if_true(False, None) + assert struct is None + struct = optional.create_if_true(True, None) + assert struct.a == 0 + assert struct.b is None + + +def test_random_mat(): + M = optional.random_mat_if_true(False) + assert M is None + M = optional.random_mat_if_true(True) + assert M.shape == (4, 4) + + +test_none_if_zero() +test_struct_ctors() +test_struct_setters() +test_factory() +test_random_mat() diff --git a/unittest/python/test_return_by_ref.py b/unittest/cpp/test_return_by_ref.py similarity index 100% rename from unittest/python/test_return_by_ref.py rename to unittest/cpp/test_return_by_ref.py diff --git a/unittest/python/test_sparse_matrix.py b/unittest/cpp/test_sparse_matrix.py similarity index 100% rename from unittest/python/test_sparse_matrix.py rename to unittest/cpp/test_sparse_matrix.py diff --git a/unittest/python/test_std_array.py b/unittest/cpp/test_std_array.py similarity index 100% rename from unittest/python/test_std_array.py rename to unittest/cpp/test_std_array.py diff --git a/unittest/python/test_std_map.py b/unittest/cpp/test_std_map.py similarity index 100% rename from unittest/python/test_std_map.py rename to unittest/cpp/test_std_map.py diff --git a/unittest/cpp/test_std_optional.py b/unittest/cpp/test_std_optional.py new file mode 100644 index 000000000..a7851cd37 --- /dev/null +++ b/unittest/cpp/test_std_optional.py @@ -0,0 +1,67 @@ +import importlib + +optional = importlib.import_module("std_optional") + + +def test_none_if_zero(): + x = optional.none_if_zero(0) + y = optional.none_if_zero(-1) + assert x is None + assert y == -1 + + +def test_struct_ctors(): + # test struct ctors + + struct = optional.mystruct() + assert struct.a is None + assert struct.b is None + assert struct.msg == "i am struct" + + ## no 2nd arg automatic overload using bp::optional + struct = optional.mystruct(2) + assert struct.a == 2 + assert struct.b is None + + struct = optional.mystruct(13, -1.0) + assert struct.a == 13 + assert struct.b == -1.0 + + +def test_struct_setters(): + struct = optional.mystruct() + struct.a = 1 + assert struct.a == 1 + + struct.b = -3.14 + assert struct.b == -3.14 + + # set to None + struct.a = None + struct.b = None + struct.msg = None + assert struct.a is None + assert struct.b is None + assert struct.msg is None + + +def test_factory(): + struct = optional.create_if_true(False, None) + assert struct is None + struct = optional.create_if_true(True, None) + assert struct.a == 0 + assert struct.b is None + + +def test_random_mat(): + M = optional.random_mat_if_true(False) + assert M is None + M = optional.random_mat_if_true(True) + assert M.shape == (4, 4) + + +test_none_if_zero() +test_struct_ctors() +test_struct_setters() +test_factory() +test_random_mat() diff --git a/unittest/python/test_std_pair.py b/unittest/cpp/test_std_pair.py similarity index 100% rename from unittest/python/test_std_pair.py rename to unittest/cpp/test_std_pair.py diff --git a/unittest/python/test_std_unique_ptr.py b/unittest/cpp/test_std_unique_ptr.py similarity index 100% rename from unittest/python/test_std_unique_ptr.py rename to unittest/cpp/test_std_unique_ptr.py diff --git a/unittest/cpp/test_std_variant.py b/unittest/cpp/test_std_variant.py new file mode 100644 index 000000000..1402eed47 --- /dev/null +++ b/unittest/cpp/test_std_variant.py @@ -0,0 +1,123 @@ +import importlib + +variant_module = importlib.import_module("std_variant") +V1 = variant_module.V1 +V2 = variant_module.V2 +VariantHolder = variant_module.VariantHolder +VariantFullHolder = variant_module.VariantFullHolder +make_variant = variant_module.make_variant +make_variant_full_none = variant_module.make_variant_full_none +make_variant_full_float = variant_module.make_variant_full_float +make_variant_full_int = variant_module.make_variant_full_int +make_variant_full_bool = variant_module.make_variant_full_bool +make_variant_full_str = variant_module.make_variant_full_str +make_variant_full_complex = variant_module.make_variant_full_complex + +variant = make_variant() +assert isinstance(variant, V1) + +v1 = V1() +v1.v = 10 + +v2 = V2() +v2.v = "c" + +variant_holder = VariantHolder() + +# Test copy from variant alternative V1 to non initialized variant +variant_holder.variant = v1 +assert isinstance(variant_holder.variant, V1) +assert variant_holder.variant.v == v1.v + +# variant_holder.variant is a copy of v1 +variant_holder.variant.v = 11 +assert v1.v != variant_holder.variant.v + +# Test variant_holder.variant return by reference +# v1 reference variant_holder.variant +v1 = variant_holder.variant +variant_holder.variant.v = 100 +assert variant_holder.variant.v == 100 +assert v1.v == 100 +v1.v = 1000 +assert variant_holder.variant.v == 1000 +assert v1.v == 1000 + +# Test with the second alternative type +variant_holder.variant = v2 +assert isinstance(variant_holder.variant, V2) +assert variant_holder.variant.v == v2.v + +# Test variant that hold a None value +v_full = make_variant_full_none() +assert v_full is None + +# Test variant that hold a float value +v_full = make_variant_full_float() +assert v_full == 3.14 +assert isinstance(v_full, float) + +# Test variant that hold a int value +v_full = make_variant_full_int() +assert v_full == 3 +assert isinstance(v_full, int) + +# Test variant that hold a bool value +v_full = make_variant_full_bool() +assert not v_full +assert isinstance(v_full, bool) + +# Test variant that hold a str value +v_full = make_variant_full_str() +assert v_full == "str" +assert isinstance(v_full, str) + +# Test variant that hold a complex value +v_full = make_variant_full_complex() +assert v_full == 1 + 0j +assert isinstance(v_full, complex) + +variant_full_holder = VariantFullHolder() + +# Test None +v_none = variant_full_holder.variant +assert v_none is None +variant_full_holder.variant = None +assert v_none is None + +# Test V1 +v1 = V1() +v1.v = 10 +variant_full_holder.variant = v1 +assert variant_full_holder.variant.v == 10 +assert isinstance(variant_full_holder.variant, V1) +# Test V1 ref +v1 = variant_full_holder.variant +v1.v = 100 +assert variant_full_holder.variant.v == 100 +variant_full_holder.variant = None + +# Test bool +variant_full_holder.variant = True +assert variant_full_holder.variant +assert isinstance(variant_full_holder.variant, bool) + +# Test int +variant_full_holder.variant = 3 +assert variant_full_holder.variant == 3 +assert isinstance(variant_full_holder.variant, int) + +# Test float +variant_full_holder.variant = 3.14 +assert variant_full_holder.variant == 3.14 +assert isinstance(variant_full_holder.variant, float) + +# Test str +variant_full_holder.variant = "str" +assert variant_full_holder.variant == "str" +assert isinstance(variant_full_holder.variant, str) + +# Test complex +variant_full_holder.variant = 1 + 0j +assert variant_full_holder.variant == 1 + 0j +assert isinstance(variant_full_holder.variant, complex) diff --git a/unittest/python/test_std_vector.py b/unittest/cpp/test_std_vector.py similarity index 91% rename from unittest/python/test_std_vector.py rename to unittest/cpp/test_std_vector.py index 3af9723cf..b1bd4efbb 100644 --- a/unittest/python/test_std_vector.py +++ b/unittest/cpp/test_std_vector.py @@ -2,14 +2,18 @@ import numpy as np import std_vector -from std_vector import copyStdVector, printVectorOf3x3, printVectorOfMatrix - -import eigenpy +from std_vector import ( + StdVec_MatrixXd, + StdVec_VectorXd, + copyStdVector, + printVectorOf3x3, + printVectorOfMatrix, +) rng = np.random.default_rng(0) l1 = [rng.standard_normal(3), rng.standard_normal(2)] -l2 = eigenpy.StdVec_VectorXd(l1) +l2 = StdVec_VectorXd(l1) l3 = [rng.standard_normal((2, 2)), rng.standard_normal((3, 1))] l3.append(np.asfortranarray(np.eye(2))) l3.append(np.eye(2)) @@ -40,7 +44,7 @@ def checkAllValues(li1, li2): l4_copy = copyStdVector(l4) -assert isinstance(l4_copy, eigenpy.StdVec_MatrixXd) +assert isinstance(l4_copy, StdVec_MatrixXd) assert "StdVec_Mat3d" in printVectorOf3x3.__doc__ printVectorOf3x3(l4) @@ -100,7 +104,7 @@ def checkZero(v): assert np.allclose(l5[0], 0.0) # Test slicing -l6 = eigenpy.StdVec_VectorXd() +l6 = StdVec_VectorXd() for _ in range(4): l6.append(rng.random(3)) checkAllValues(l6[:1], l6.tolist()[:1]) diff --git a/unittest/python/test_tensor.py b/unittest/cpp/test_tensor.py similarity index 100% rename from unittest/python/test_tensor.py rename to unittest/cpp/test_tensor.py diff --git a/unittest/python/test_type_info.py b/unittest/cpp/test_type_info.py similarity index 100% rename from unittest/python/test_type_info.py rename to unittest/cpp/test_type_info.py diff --git a/unittest/python/test_user_struct.py b/unittest/cpp/test_user_struct.py similarity index 100% rename from unittest/python/test_user_struct.py rename to unittest/cpp/test_user_struct.py diff --git a/unittest/python/test_user_type.py b/unittest/cpp/test_user_type.py similarity index 100% rename from unittest/python/test_user_type.py rename to unittest/cpp/test_user_type.py diff --git a/unittest/python/test_variant.py.in b/unittest/cpp/test_variant.py.in similarity index 100% rename from unittest/python/test_variant.py.in rename to unittest/cpp/test_variant.py.in diff --git a/unittest/python/test_bind_virtual.py b/unittest/cpp/test_virtual_factory.py similarity index 98% rename from unittest/python/test_bind_virtual.py rename to unittest/cpp/test_virtual_factory.py index c4b5ef28c..ebea38e36 100644 --- a/unittest/python/test_bind_virtual.py +++ b/unittest/cpp/test_virtual_factory.py @@ -1,4 +1,4 @@ -import bind_virtual_factory as bvf +import virtual_factory as bvf class ImplClass(bvf.MyVirtualClass): diff --git a/unittest/type_info.cpp b/unittest/cpp/type_info.cpp similarity index 100% rename from unittest/type_info.cpp rename to unittest/cpp/type_info.cpp diff --git a/unittest/user_struct.cpp b/unittest/cpp/user_struct.cpp similarity index 100% rename from unittest/user_struct.cpp rename to unittest/cpp/user_struct.cpp diff --git a/unittest/user_type.cpp b/unittest/cpp/user_type.cpp similarity index 99% rename from unittest/user_type.cpp rename to unittest/cpp/user_type.cpp index dee189001..23dbdf1bf 100644 --- a/unittest/user_type.cpp +++ b/unittest/cpp/user_type.cpp @@ -150,7 +150,7 @@ Eigen::Matrix build_matrix(int rows, template void expose_custom_type(const std::string& name) { using namespace Eigen; - using eigenpy::literals::operator"" _a; + using namespace eigenpy::literals; namespace bp = boost::python; typedef CustomType Type; diff --git a/unittest/variant.cpp.in b/unittest/cpp/variant.cpp.in similarity index 100% rename from unittest/variant.cpp.in rename to unittest/cpp/variant.cpp.in diff --git a/unittest/bind_virtual_factory.cpp b/unittest/cpp/virtual_factory.cpp similarity index 99% rename from unittest/bind_virtual_factory.cpp rename to unittest/cpp/virtual_factory.cpp index a2b561d36..00c3096ba 100644 --- a/unittest/bind_virtual_factory.cpp +++ b/unittest/cpp/virtual_factory.cpp @@ -121,7 +121,7 @@ shared_ptr copy_shared(const shared_ptr& d) { return d; } -BOOST_PYTHON_MODULE(bind_virtual_factory) { +BOOST_PYTHON_MODULE(virtual_factory) { assert(std::is_polymorphic::value && "MyVirtualClass should be polymorphic!"); assert(std::is_polymorphic::value && diff --git a/unittest/packaging/cmake/CMakeLists.txt b/unittest/packaging/cmake/CMakeLists.txt index d902aef9b..c6f204c2b 100644 --- a/unittest/packaging/cmake/CMakeLists.txt +++ b/unittest/packaging/cmake/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.22) -project(ExtraLib CXX) -find_package(eigenpy REQUIRED) +project(my_project CXX) +find_package(eigenpy 1.0.0 CONFIG REQUIRED) add_executable(extra_lib extra_lib.cpp) -target_link_libraries(extra_lib PUBLIC eigenpy::eigenpy) +target_link_libraries(extra_lib PRIVATE eigenpy::eigenpy) diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt new file mode 100644 index 000000000..aa497e720 --- /dev/null +++ b/unittest/python/CMakeLists.txt @@ -0,0 +1,77 @@ +# Add test that depends on the python wrapper of eigenpy library +# Those tests can import eigenpy +function(eigenpy_python_add_test name) + set(options) + set(oneValueArgs SCRIPT) + set(multiValueArgs) + cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(arg_SCRIPT) + set(script_path ${arg_SCRIPT}) + else() + set(script_path ${CMAKE_CURRENT_SOURCE_DIR}/test_${name}.py) + endif() + + set(test_name "Eigenpy: test_${name}.py") + add_test(NAME ${test_name} COMMAND $ ${script_path}) + set_tests_properties( + ${test_name} + PROPERTIES ENVIRONMENT PYTHONPATH=$/.. DEPENDS eigenpy_pywrap + ) +endfunction() + +eigenpy_python_add_test(dimensions) +eigenpy_python_add_test(version) +eigenpy_python_add_test(EigenSolver) +eigenpy_python_add_test(GeneralizedEigenSolver) +eigenpy_python_add_test(GeneralizedSelfAdjointEigenSolver) +eigenpy_python_add_test(ComplexEigenSolver) +eigenpy_python_add_test(ComplexSchur) +eigenpy_python_add_test(SelfAdjointEigenSolver) +eigenpy_python_add_test(HessenbergDecomposition) + +eigenpy_python_add_test(RealQZ) +eigenpy_python_add_test(RealSchur) +eigenpy_python_add_test(Tridiagonalization) +eigenpy_python_add_test(LLT) +eigenpy_python_add_test(LDLT) +eigenpy_python_add_test(FullPivLU) +eigenpy_python_add_test(PartialPivLU) +eigenpy_python_add_test(id) +eigenpy_python_add_test(QR) +eigenpy_python_add_test(BDCSVD) +eigenpy_python_add_test(JacobiSVD) + +if(NOT WIN32) + eigenpy_python_add_test(MINRES) +endif() + +if(BUILD_TESTING_SCIPY) + eigenpy_python_add_test(SimplicialLLT SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/test_SimplicialLLT.py) + eigenpy_python_add_test(SimplicialLDLT SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/test_SimplicialLDLT.py) + eigenpy_python_add_test(IncompleteCholesky SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/solvers/test_IncompleteCholesky.py) + eigenpy_python_add_test(IncompleteLUT SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/solvers/test_IncompleteLUT.py) + eigenpy_python_add_test(SparseLU SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/test_SparseLU.py) + eigenpy_python_add_test(SparseQR SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/test_SparseQR.py) + + if(BUILD_WITH_CHOLMOD_SUPPORT) + eigenpy_python_add_test( + CholmodSimplicialLLT + SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/cholmod/test_CholmodSimplicialLLT.py + ) + + eigenpy_python_add_test( + CholmodSimplicialLDLT + SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/cholmod/test_CholmodSimplicialLDLT.py + ) + + eigenpy_python_add_test( + CholmodSupernodalLLT + SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/cholmod/test_CholmodSupernodalLLT.py + ) + endif() + + if(BUILD_WITH_ACCELERATE_SUPPORT) + eigenpy_python_add_test(Accelerate SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/decompositions/sparse/test_Accelerate.py) + endif() +endif() diff --git a/unittest/python/test_IncompleteCholesky.py b/unittest/python/solvers/test_IncompleteCholesky.py similarity index 100% rename from unittest/python/test_IncompleteCholesky.py rename to unittest/python/solvers/test_IncompleteCholesky.py diff --git a/unittest/python/test_IncompleteLUT.py b/unittest/python/solvers/test_IncompleteLUT.py similarity index 100% rename from unittest/python/test_IncompleteLUT.py rename to unittest/python/solvers/test_IncompleteLUT.py diff --git a/unittest/python/test_GeneralizedSelfAdjointEigenSolver.py b/unittest/python/test_GeneralizedSelfAdjointEigenSolver.py index 78ea15564..6d0665dc1 100644 --- a/unittest/python/test_GeneralizedSelfAdjointEigenSolver.py +++ b/unittest/python/test_GeneralizedSelfAdjointEigenSolver.py @@ -66,7 +66,7 @@ def test_generalized_selfadjoint_eigensolver(options): lam = D[i] BAv = BA @ v lam_v = lam * v - assert eigenpy.is_approx(BAv, lam_v, 1e-6) + assert eigenpy.is_approx(BAv, lam_v, 1e-5) _gsaes_compute = gsaes.compute(A, B) _gsaes_compute_options = gsaes.compute(A, B, options) diff --git a/unittest/python/test_version.py b/unittest/python/test_version.py index abbc95601..5de77ab08 100644 --- a/unittest/python/test_version.py +++ b/unittest/python/test_version.py @@ -2,4 +2,3 @@ assert eigenpy.checkVersionAtLeast(0, 0, 0) assert eigenpy.__version__ != "" -assert eigenpy.__raw_version__ != ""