From aac26423ce22f8c83818dde8c7bd8257855c482d Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:00:16 +0100 Subject: [PATCH 01/59] cpp: remove unused macros in fwd.hpp --- include/nanoeigenpy/fwd.hpp | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/include/nanoeigenpy/fwd.hpp b/include/nanoeigenpy/fwd.hpp index 9546110a..5ece7c26 100644 --- a/include/nanoeigenpy/fwd.hpp +++ b/include/nanoeigenpy/fwd.hpp @@ -13,37 +13,6 @@ #include #include -#if defined(__clang__) -#define NANOEIGENPY_CLANG_COMPILER -#elif defined(__GNUC__) -#define NANOEIGENPY_GCC_COMPILER -#elif defined(_MSC_VER) -#define NANOEIGENPY_MSVC_COMPILER -#endif - -#if __has_include() -#define NANOEIGENPY_HAS_CHOLMOD -#endif - -#if __has_include() -#define NANOEIGENPY_HAS_ACCELERATE -#endif - -#if (__cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)) -#define NANOEIGENPY_WITH_CXX20_SUPPORT -#endif - -#define NANOEIGENPY_UNUSED_TYPE(Type) (void)(Type*)(NULL) - -#define NANOEIGENPY_MAKE_TYPEDEFS(Type, Options, TypeSuffix, Size, SizeSuffix) \ - /** \ingroup matrixtypedefs */ \ - typedef Eigen::Matrix \ - Matrix##SizeSuffix##TypeSuffix; \ - /** \ingroup matrixtypedefs */ \ - typedef Eigen::Matrix Vector##SizeSuffix##TypeSuffix; \ - /** \ingroup matrixtypedefs */ \ - typedef Eigen::Matrix RowVector##SizeSuffix##TypeSuffix; - namespace nanoeigenpy { namespace nb = nanobind; } // namespace nanoeigenpy From 3b964356582bdba85ddbe7e8a95c969c9cc9270b Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:01:01 +0100 Subject: [PATCH 02/59] cpp: add dependency headers wrt a compile def --- include/nanoeigenpy/fwd.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/nanoeigenpy/fwd.hpp b/include/nanoeigenpy/fwd.hpp index 5ece7c26..3a08d4e1 100644 --- a/include/nanoeigenpy/fwd.hpp +++ b/include/nanoeigenpy/fwd.hpp @@ -7,6 +7,16 @@ #include "nanoeigenpy/utils/helpers.hpp" #include +#ifdef NANOEIGENPY_HAS_CHOLMOD +#include +#include +#endif + +#ifdef NANOEIGENPY_HAS_ACCELERATE +#include +#include +#endif + #include #include #include From 7fcecffc757820dfcf82dd0b509601cecf465fb2 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:01:26 +0100 Subject: [PATCH 03/59] cpp: merge internal.h into module.cpp --- src/internal.h | 9 --------- src/module.cpp | 8 +++++++- 2 files changed, 7 insertions(+), 10 deletions(-) delete mode 100644 src/internal.h diff --git a/src/internal.h b/src/internal.h deleted file mode 100644 index ea9cbe97..00000000 --- a/src/internal.h +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -namespace nb = nanobind; - -using Scalar = double; -static constexpr int Options = Eigen::ColMajor; -using Matrix = Eigen::Matrix; -using Vector = Eigen::Matrix; diff --git a/src/module.cpp b/src/module.cpp index f482f250..3ba5ac94 100644 --- a/src/module.cpp +++ b/src/module.cpp @@ -2,13 +2,19 @@ #include +#include "nanoeigenpy/fwd.hpp" #include "nanoeigenpy/decompositions.hpp" #include "nanoeigenpy/geometry.hpp" #include "nanoeigenpy/solvers.hpp" #include "nanoeigenpy/constants.hpp" #include "nanoeigenpy/utils/is-approx.hpp" -#include "./internal.h" +namespace nb = nanobind; + +using Scalar = double; +static constexpr int Options = Eigen::ColMajor; +using Matrix = Eigen::Matrix; +using Vector = Eigen::Matrix; using namespace nanoeigenpy; From 0acd559ba227857e8bb908513656bf73182324cf Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:02:29 +0100 Subject: [PATCH 04/59] python: migrate tests to pytest solves https://github.com/Simple-Robotics/nanoeigenpy/issues/2 --- tests/test_accelerate.py | 22 +- tests/test_cholmod_simplicial_ldlt.py | 31 +- tests/test_cholmod_simplicial_llt.py | 31 +- tests/test_cholmod_supernodal_llt.py | 31 +- tests/test_complex_eigen_solver.py | 50 +- tests/test_complex_schur.py | 72 +- tests/test_eigen_solver.py | 54 +- tests/test_full_piv_lu.py | 214 ++-- tests/test_generalized_eigen_solver.py | 76 +- tests/test_geometry.py | 1383 ++++++++++++----------- tests/test_hessenberg_decomposition.py | 136 +-- tests/test_import_extension.py | 5 + tests/test_incomplete_cholesky.py | 135 +-- tests/test_incomplete_lut.py | 94 +- tests/test_jacobi_svd.py | 6 - tests/test_ldlt.py | 188 +-- tests/test_llt.py | 116 +- tests/test_partial_piv_lu.py | 122 +- tests/test_permutation_matrix.py | 86 +- tests/test_qr.py | 196 ++-- tests/test_real_qz.py | 70 +- tests/test_real_schur.py | 67 +- tests/test_self_adjoint_eigen_solver.py | 24 +- tests/test_simplicial_llt.py | 86 +- tests/test_sparse_lu.py | 120 +- tests/test_sparse_qr.py | 140 +-- tests/test_tridiagonalization.py | 201 ++-- 27 files changed, 1904 insertions(+), 1852 deletions(-) create mode 100644 tests/test_import_extension.py diff --git a/tests/test_accelerate.py b/tests/test_accelerate.py index d21d46db..f02eebdb 100644 --- a/tests/test_accelerate.py +++ b/tests/test_accelerate.py @@ -1,11 +1,23 @@ import nanoeigenpy import numpy as np from scipy.sparse import csc_matrix +import pytest rng = np.random.default_rng() -def test(SolverType: type): +@pytest.mark.parametrize( + "SolverType", + [ + nanoeigenpy.AccelerateLLT, + nanoeigenpy.AccelerateLDLT, + nanoeigenpy.AccelerateLDLTUnpivoted, + nanoeigenpy.AccelerateLDLTSBK, + nanoeigenpy.AccelerateLDLTTPP, + nanoeigenpy.AccelerateQR, + ], +) +def test_accelerate_solver(SolverType): dim = 100 A = rng.random((dim, dim)) A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) @@ -25,11 +37,3 @@ def test(SolverType: type): llt.analyzePattern(A) llt.factorize(A) - - -test(nanoeigenpy.AccelerateLLT) -test(nanoeigenpy.AccelerateLDLT) -test(nanoeigenpy.AccelerateLDLTUnpivoted) -test(nanoeigenpy.AccelerateLDLTSBK) -test(nanoeigenpy.AccelerateLDLTTPP) -test(nanoeigenpy.AccelerateQR) diff --git a/tests/test_cholmod_simplicial_ldlt.py b/tests/test_cholmod_simplicial_ldlt.py index cb1b0500..35324679 100644 --- a/tests/test_cholmod_simplicial_ldlt.py +++ b/tests/test_cholmod_simplicial_ldlt.py @@ -1,24 +1,25 @@ +import nanoeigenpy import numpy as np from scipy.sparse import csc_matrix -import nanoeigenpy -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) +def test_cholmod_simplicial_ldlt(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) -A = csc_matrix(A) + A = csc_matrix(A) -llt = nanoeigenpy.CholmodSimplicialLDLT(A) + llt = nanoeigenpy.CholmodSimplicialLDLT(A) -assert llt.info() == nanoeigenpy.ComputationInfo.Success + assert llt.info() == nanoeigenpy.ComputationInfo.Success -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = llt.solve(B) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = llt.solve(B) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) -llt.analyzePattern(A) -llt.factorize(A) + llt.analyzePattern(A) + llt.factorize(A) diff --git a/tests/test_cholmod_simplicial_llt.py b/tests/test_cholmod_simplicial_llt.py index 763cfaab..2b8137c3 100644 --- a/tests/test_cholmod_simplicial_llt.py +++ b/tests/test_cholmod_simplicial_llt.py @@ -1,25 +1,26 @@ +import nanoeigenpy import numpy as np from scipy.sparse import csc_matrix -import nanoeigenpy -dim = 100 -rng = np.random.default_rng() +def test_cholmod_simplicial_llt(): + dim = 100 + rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) -A = csc_matrix(A) + A = csc_matrix(A) -llt = nanoeigenpy.CholmodSimplicialLLT(A) + llt = nanoeigenpy.CholmodSimplicialLLT(A) -assert llt.info() == nanoeigenpy.ComputationInfo.Success + assert llt.info() == nanoeigenpy.ComputationInfo.Success -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = llt.solve(B) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = llt.solve(B) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) -llt.analyzePattern(A) -llt.factorize(A) + llt.analyzePattern(A) + llt.factorize(A) diff --git a/tests/test_cholmod_supernodal_llt.py b/tests/test_cholmod_supernodal_llt.py index 15de556f..c938531a 100644 --- a/tests/test_cholmod_supernodal_llt.py +++ b/tests/test_cholmod_supernodal_llt.py @@ -1,25 +1,26 @@ +import nanoeigenpy import numpy as np from scipy.sparse import csc_matrix -import nanoeigenpy -dim = 100 -rng = np.random.default_rng() +def test_cholmod_supernodal_llt(): + dim = 100 + rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) -A = csc_matrix(A) + A = csc_matrix(A) -llt = nanoeigenpy.CholmodSupernodalLLT(A) + llt = nanoeigenpy.CholmodSupernodalLLT(A) -assert llt.info() == nanoeigenpy.ComputationInfo.Success + assert llt.info() == nanoeigenpy.ComputationInfo.Success -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = llt.solve(B) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = llt.solve(B) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) -llt.analyzePattern(A) -llt.factorize(A) + llt.analyzePattern(A) + llt.factorize(A) diff --git a/tests/test_complex_eigen_solver.py b/tests/test_complex_eigen_solver.py index df6527a4..3b3d85ae 100644 --- a/tests/test_complex_eigen_solver.py +++ b/tests/test_complex_eigen_solver.py @@ -1,32 +1,34 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -es = nanoeigenpy.ComplexEigenSolver(A) -assert es.info() == nanoeigenpy.ComputationInfo.Success +def test_complex_eigen_solver(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) -V = es.eigenvectors() -D = es.eigenvalues() -assert V.shape == (dim, dim) -assert D.shape == (dim,) + es = nanoeigenpy.ComplexEigenSolver(A) + assert es.info() == nanoeigenpy.ComputationInfo.Success -AV = A @ V -VD = V @ np.diag(D) -assert nanoeigenpy.is_approx(AV.real, VD.real) -assert nanoeigenpy.is_approx(AV.imag, VD.imag) + V = es.eigenvectors() + D = es.eigenvalues() + assert V.shape == (dim, dim) + assert D.shape == (dim,) -trace_A = np.trace(A) -trace_D = np.sum(D) -assert abs(trace_A - trace_D.real) < 1e-10 -assert abs(trace_D.imag) < 1e-10 + AV = A @ V + VD = V @ np.diag(D) + assert nanoeigenpy.is_approx(AV.real, VD.real) + assert nanoeigenpy.is_approx(AV.imag, VD.imag) -ces5 = nanoeigenpy.ComplexEigenSolver(A) -ces6 = nanoeigenpy.ComplexEigenSolver(A) -id5 = ces5.id() -id6 = ces6.id() -assert id5 != id6 -assert id5 == ces5.id() -assert id6 == ces6.id() + trace_A = np.trace(A) + trace_D = np.sum(D) + assert abs(trace_A - trace_D.real) < 1e-10 + assert abs(trace_D.imag) < 1e-10 + + ces5 = nanoeigenpy.ComplexEigenSolver(A) + ces6 = nanoeigenpy.ComplexEigenSolver(A) + id5 = ces5.id() + id6 = ces6.id() + assert id5 != id6 + assert id5 == ces5.id() + assert id6 == ces6.id() diff --git a/tests/test_complex_schur.py b/tests/test_complex_schur.py index da1acb94..55a671b0 100644 --- a/tests/test_complex_schur.py +++ b/tests/test_complex_schur.py @@ -1,49 +1,51 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -cs = nanoeigenpy.ComplexSchur(A) -assert cs.info() == nanoeigenpy.ComputationInfo.Success +def test_complex_schur(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) -U = cs.matrixU() -T = cs.matrixT() + cs = nanoeigenpy.ComplexSchur(A) + assert cs.info() == nanoeigenpy.ComputationInfo.Success -A_complex = A.astype(complex) -assert nanoeigenpy.is_approx(A_complex, U @ T @ U.conj().T) -assert nanoeigenpy.is_approx(U @ U.conj().T, np.eye(dim)) + U = cs.matrixU() + T = cs.matrixT() -for row in range(1, dim): - for col in range(row): - assert abs(T[row, col]) < 1e-12 + A_complex = A.astype(complex) + assert nanoeigenpy.is_approx(A_complex, U @ T @ U.conj().T) + assert nanoeigenpy.is_approx(U @ U.conj().T, np.eye(dim)) -A_triangular = np.triu(A) -cs_triangular = nanoeigenpy.ComplexSchur(dim) -cs_triangular.setMaxIterations(1) -result_triangular = cs_triangular.compute(A_triangular) -assert result_triangular.info() == nanoeigenpy.ComputationInfo.Success + for row in range(1, dim): + for col in range(row): + assert abs(T[row, col]) < 1e-12 -T_triangular = cs_triangular.matrixT() -U_triangular = cs_triangular.matrixU() + A_triangular = np.triu(A) + cs_triangular = nanoeigenpy.ComplexSchur(dim) + cs_triangular.setMaxIterations(1) + result_triangular = cs_triangular.compute(A_triangular) + assert result_triangular.info() == nanoeigenpy.ComputationInfo.Success -A_triangular_complex = A_triangular.astype(complex) -assert nanoeigenpy.is_approx(T_triangular, A_triangular_complex) -assert nanoeigenpy.is_approx(U_triangular, np.eye(dim, dtype=complex)) + T_triangular = cs_triangular.matrixT() + U_triangular = cs_triangular.matrixU() -hess = nanoeigenpy.HessenbergDecomposition(A) -H = hess.matrixH() -Q_hess = hess.matrixQ() + A_triangular_complex = A_triangular.astype(complex) + assert nanoeigenpy.is_approx(T_triangular, A_triangular_complex) + assert nanoeigenpy.is_approx(U_triangular, np.eye(dim, dtype=complex)) -cs_from_hess = nanoeigenpy.ComplexSchur(dim) -result_from_hess = cs_from_hess.computeFromHessenberg(H, Q_hess, True) -assert result_from_hess.info() == nanoeigenpy.ComputationInfo.Success + hess = nanoeigenpy.HessenbergDecomposition(A) + H = hess.matrixH() + Q_hess = hess.matrixQ() -T_from_hess = cs_from_hess.matrixT() -U_from_hess = cs_from_hess.matrixU() + cs_from_hess = nanoeigenpy.ComplexSchur(dim) + result_from_hess = cs_from_hess.computeFromHessenberg(H, Q_hess, True) + assert result_from_hess.info() == nanoeigenpy.ComputationInfo.Success -A_complex = A.astype(complex) -assert nanoeigenpy.is_approx( - A_complex, U_from_hess @ T_from_hess @ U_from_hess.conj().T -) + T_from_hess = cs_from_hess.matrixT() + U_from_hess = cs_from_hess.matrixU() + + A_complex = A.astype(complex) + assert nanoeigenpy.is_approx( + A_complex, U_from_hess @ T_from_hess @ U_from_hess.conj().T + ) diff --git a/tests/test_eigen_solver.py b/tests/test_eigen_solver.py index 27a9594c..38f82339 100644 --- a/tests/test_eigen_solver.py +++ b/tests/test_eigen_solver.py @@ -1,40 +1,42 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) +def test_eigen_solver(): + dim = 100 + rng = np.random.default_rng() -es = nanoeigenpy.EigenSolver() -es = nanoeigenpy.EigenSolver(dim) -es = nanoeigenpy.EigenSolver(A) -assert es.info() == nanoeigenpy.ComputationInfo.Success + A = rng.random((dim, dim)) -V = es.eigenvectors() -D = es.eigenvalues() + es = nanoeigenpy.EigenSolver() + es = nanoeigenpy.EigenSolver(dim) + es = nanoeigenpy.EigenSolver(A) + assert es.info() == nanoeigenpy.ComputationInfo.Success -assert nanoeigenpy.is_approx(A.dot(V).real, V.dot(np.diag(D)).real) -assert nanoeigenpy.is_approx(A.dot(V).imag, V.dot(np.diag(D)).imag) + V = es.eigenvectors() + D = es.eigenvalues() -es1 = nanoeigenpy.EigenSolver() -es2 = nanoeigenpy.EigenSolver() + assert nanoeigenpy.is_approx(A.dot(V).real, V.dot(np.diag(D)).real) + assert nanoeigenpy.is_approx(A.dot(V).imag, V.dot(np.diag(D)).imag) -id1 = es1.id() -id2 = es2.id() + es1 = nanoeigenpy.EigenSolver() + es2 = nanoeigenpy.EigenSolver() -assert id1 != id2 -assert id1 == es1.id() -assert id2 == es2.id() + id1 = es1.id() + id2 = es2.id() -dim_constructor = 3 + assert id1 != id2 + assert id1 == es1.id() + assert id2 == es2.id() -es3 = nanoeigenpy.EigenSolver(dim_constructor) -es4 = nanoeigenpy.EigenSolver(dim_constructor) + dim_constructor = 3 -id3 = es3.id() -id4 = es4.id() + es3 = nanoeigenpy.EigenSolver(dim_constructor) + es4 = nanoeigenpy.EigenSolver(dim_constructor) -assert id3 != id4 -assert id3 == es3.id() -assert id4 == es4.id() + id3 = es3.id() + id4 = es4.id() + + assert id3 != id4 + assert id3 == es3.id() + assert id4 == es4.id() diff --git a/tests/test_full_piv_lu.py b/tests/test_full_piv_lu.py index 94e5dccd..25b1c0e9 100644 --- a/tests/test_full_piv_lu.py +++ b/tests/test_full_piv_lu.py @@ -1,109 +1,111 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) -fullpivlu = nanoeigenpy.FullPivLU(A) - -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = fullpivlu.solve(B) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) - -x = rng.random(dim) -b = A.dot(x) -x_est = fullpivlu.solve(b) -assert nanoeigenpy.is_approx(x, x_est) -assert nanoeigenpy.is_approx(A.dot(x_est), b) - -rows = fullpivlu.rows() -cols = fullpivlu.cols() -assert cols == dim -assert rows == dim - -fullpivlu_compute = fullpivlu.compute(A) -A_reconstructed = fullpivlu.reconstructedMatrix() -assert nanoeigenpy.is_approx(A_reconstructed, A) - -nonzeropivots = fullpivlu.nonzeroPivots() -maxpivot = fullpivlu.maxPivot() -assert nonzeropivots == dim -assert maxpivot > 0 - -LU = fullpivlu.matrixLU() -P_perm = fullpivlu.permutationP() -Q_perm = fullpivlu.permutationQ() -P = P_perm.toDenseMatrix() -Q = Q_perm.toDenseMatrix() - -U = np.triu(LU) -L = np.eye(dim) + np.tril(LU, -1) -assert nanoeigenpy.is_approx(P @ A @ Q, L @ U) - -rank = fullpivlu.rank() -dimkernel = fullpivlu.dimensionOfKernel() -injective = fullpivlu.isInjective() -surjective = fullpivlu.isSurjective() -invertible = fullpivlu.isInvertible() -assert rank == dim -assert dimkernel == 0 -assert injective -assert surjective -assert invertible - -kernel = fullpivlu.kernel() -image = fullpivlu.image(A) -assert kernel.shape[1] == 1 -assert nanoeigenpy.is_approx(A @ kernel, np.zeros((dim, 1))) -assert image.shape[1] == rank - -inverse = fullpivlu.inverse() -assert nanoeigenpy.is_approx(A @ inverse, np.eye(dim)) -assert nanoeigenpy.is_approx(inverse @ A, np.eye(dim)) - -rcond = fullpivlu.rcond() -determinant = fullpivlu.determinant() -det_numpy = np.linalg.det(A) -assert rcond > 0 -assert abs(determinant - det_numpy) / abs(det_numpy) < 1e-10 - -fullpivlu.setThreshold() -default_threshold = fullpivlu.threshold() -fullpivlu.setThreshold(1e-8) -assert fullpivlu.threshold() == 1e-8 - -P_inv = P_perm.inverse().toDenseMatrix() -Q_inv = Q_perm.inverse().toDenseMatrix() -assert nanoeigenpy.is_approx(P @ P_inv, np.eye(dim)) -assert nanoeigenpy.is_approx(Q @ Q_inv, np.eye(dim)) -assert nanoeigenpy.is_approx(P_inv @ P, np.eye(dim)) -assert nanoeigenpy.is_approx(Q_inv @ Q, np.eye(dim)) - -rows_rect = 4 -cols_rect = 6 -A_rect = rng.random((rows_rect, cols_rect)) -fullpivlu_rect = nanoeigenpy.FullPivLU(A_rect) -assert fullpivlu_rect.rows() == rows_rect -assert fullpivlu_rect.cols() == cols_rect -rank_rect = fullpivlu_rect.rank() -assert rank_rect <= min(rows_rect, cols_rect) -assert fullpivlu_rect.dimensionOfKernel() == cols_rect - rank_rect - -decomp1 = nanoeigenpy.FullPivLU() -decomp2 = nanoeigenpy.FullPivLU() -id1 = decomp1.id() -id2 = decomp2.id() -assert id1 != id2 -assert id1 == decomp1.id() -assert id2 == decomp2.id() - -decomp3 = nanoeigenpy.FullPivLU(dim, dim) -decomp4 = nanoeigenpy.FullPivLU(dim, dim) -id3 = decomp3.id() -id4 = decomp4.id() -assert id3 != id4 -assert id3 == decomp3.id() -assert id4 == decomp4.id() + +def test_full_piv_lu(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) + fullpivlu = nanoeigenpy.FullPivLU(A) + + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = fullpivlu.solve(B) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) + + x = rng.random(dim) + b = A.dot(x) + x_est = fullpivlu.solve(b) + assert nanoeigenpy.is_approx(x, x_est) + assert nanoeigenpy.is_approx(A.dot(x_est), b) + + rows = fullpivlu.rows() + cols = fullpivlu.cols() + assert cols == dim + assert rows == dim + + fullpivlu_compute = fullpivlu.compute(A) # noqa + A_reconstructed = fullpivlu.reconstructedMatrix() + assert nanoeigenpy.is_approx(A_reconstructed, A) + + nonzeropivots = fullpivlu.nonzeroPivots() + maxpivot = fullpivlu.maxPivot() + assert nonzeropivots == dim + assert maxpivot > 0 + + LU = fullpivlu.matrixLU() + P_perm = fullpivlu.permutationP() + Q_perm = fullpivlu.permutationQ() + P = P_perm.toDenseMatrix() + Q = Q_perm.toDenseMatrix() + + U = np.triu(LU) + L = np.eye(dim) + np.tril(LU, -1) + assert nanoeigenpy.is_approx(P @ A @ Q, L @ U) + + rank = fullpivlu.rank() + dimkernel = fullpivlu.dimensionOfKernel() + injective = fullpivlu.isInjective() + surjective = fullpivlu.isSurjective() + invertible = fullpivlu.isInvertible() + assert rank == dim + assert dimkernel == 0 + assert injective + assert surjective + assert invertible + + kernel = fullpivlu.kernel() + image = fullpivlu.image(A) + assert kernel.shape[1] == 1 + assert nanoeigenpy.is_approx(A @ kernel, np.zeros((dim, 1))) + assert image.shape[1] == rank + + inverse = fullpivlu.inverse() + assert nanoeigenpy.is_approx(A @ inverse, np.eye(dim)) + assert nanoeigenpy.is_approx(inverse @ A, np.eye(dim)) + + rcond = fullpivlu.rcond() + determinant = fullpivlu.determinant() + det_numpy = np.linalg.det(A) + assert rcond > 0 + assert abs(determinant - det_numpy) / abs(det_numpy) < 1e-10 + + fullpivlu.setThreshold() + default_threshold = fullpivlu.threshold() # noqa + fullpivlu.setThreshold(1e-8) + assert fullpivlu.threshold() == 1e-8 + + P_inv = P_perm.inverse().toDenseMatrix() + Q_inv = Q_perm.inverse().toDenseMatrix() + assert nanoeigenpy.is_approx(P @ P_inv, np.eye(dim)) + assert nanoeigenpy.is_approx(Q @ Q_inv, np.eye(dim)) + assert nanoeigenpy.is_approx(P_inv @ P, np.eye(dim)) + assert nanoeigenpy.is_approx(Q_inv @ Q, np.eye(dim)) + + rows_rect = 4 + cols_rect = 6 + A_rect = rng.random((rows_rect, cols_rect)) + fullpivlu_rect = nanoeigenpy.FullPivLU(A_rect) + assert fullpivlu_rect.rows() == rows_rect + assert fullpivlu_rect.cols() == cols_rect + rank_rect = fullpivlu_rect.rank() + assert rank_rect <= min(rows_rect, cols_rect) + assert fullpivlu_rect.dimensionOfKernel() == cols_rect - rank_rect + + decomp1 = nanoeigenpy.FullPivLU() + decomp2 = nanoeigenpy.FullPivLU() + id1 = decomp1.id() + id2 = decomp2.id() + assert id1 != id2 + assert id1 == decomp1.id() + assert id2 == decomp2.id() + + decomp3 = nanoeigenpy.FullPivLU(dim, dim) + decomp4 = nanoeigenpy.FullPivLU(dim, dim) + id3 = decomp3.id() + id4 = decomp4.id() + assert id3 != id4 + assert id3 == decomp3.id() + assert id4 == decomp4.id() diff --git a/tests/test_generalized_eigen_solver.py b/tests/test_generalized_eigen_solver.py index 4be542c0..2bf2c016 100644 --- a/tests/test_generalized_eigen_solver.py +++ b/tests/test_generalized_eigen_solver.py @@ -1,40 +1,42 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -B = rng.random((dim, dim)) -B = (B + B.T) * 0.5 + np.diag(10.0 + rng.random(dim)) - -ges_matrices = nanoeigenpy.GeneralizedEigenSolver(A, B) -assert ges_matrices.info() == nanoeigenpy.ComputationInfo.Success - -alphas = ges_matrices.alphas() -betas = ges_matrices.betas() -eigenvectors = ges_matrices.eigenvectors() -eigenvalues = ges_matrices.eigenvalues() - -for k in range(dim): - v = eigenvectors[:, k] - lambda_k = eigenvalues[k] - - Av = A @ v - lambda_Bv = lambda_k * (B @ v) - assert nanoeigenpy.is_approx(Av.real, lambda_Bv.real, 1e-6) - assert nanoeigenpy.is_approx(Av.imag, lambda_Bv.imag, 1e-6) - -for k in range(dim): - v = eigenvectors[:, k] - alpha = alphas[k] - beta = betas[k] - - alpha_Bv = alpha * (B @ v) - beta_Av = beta * (A @ v) - assert nanoeigenpy.is_approx(alpha_Bv.real, beta_Av.real, 1e-6) - assert nanoeigenpy.is_approx(alpha_Bv.imag, beta_Av.imag, 1e-6) - -for k in range(dim): - if abs(betas[k]) > 1e-12: - expected_eigenvalue = alphas[k] / betas[k] - assert abs(eigenvalues[k] - expected_eigenvalue) < 1e-12 + +def test_generalized_eigen_solver(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) + B = rng.random((dim, dim)) + B = (B + B.T) * 0.5 + np.diag(10.0 + rng.random(dim)) + + ges_matrices = nanoeigenpy.GeneralizedEigenSolver(A, B) + assert ges_matrices.info() == nanoeigenpy.ComputationInfo.Success + + alphas = ges_matrices.alphas() + betas = ges_matrices.betas() + eigenvectors = ges_matrices.eigenvectors() + eigenvalues = ges_matrices.eigenvalues() + + for k in range(dim): + v = eigenvectors[:, k] + lambda_k = eigenvalues[k] + + Av = A @ v + lambda_Bv = lambda_k * (B @ v) + assert nanoeigenpy.is_approx(Av.real, lambda_Bv.real, 1e-6) + assert nanoeigenpy.is_approx(Av.imag, lambda_Bv.imag, 1e-6) + + for k in range(dim): + v = eigenvectors[:, k] + alpha = alphas[k] + beta = betas[k] + + alpha_Bv = alpha * (B @ v) + beta_Av = beta * (A @ v) + assert nanoeigenpy.is_approx(alpha_Bv.real, beta_Av.real, 1e-6) + assert nanoeigenpy.is_approx(alpha_Bv.imag, beta_Av.imag, 1e-6) + + for k in range(dim): + if abs(betas[k]) > 1e-12: + expected_eigenvalue = alphas[k] / betas[k] + assert abs(eigenvalues[k] - expected_eigenvalue) < 1e-12 diff --git a/tests/test_geometry.py b/tests/test_geometry.py index 1fe48abe..7097178f 100644 --- a/tests/test_geometry.py +++ b/tests/test_geometry.py @@ -1,7 +1,7 @@ -import numpy as np -from numpy import cos import nanoeigenpy import quaternion +import numpy as np +from numpy import cos verbose = True @@ -14,692 +14,699 @@ def isapprox(a, b, epsilon=1e-6): return abs(a - b) < epsilon -# --- Quaternion --------------------------------------------------------------- -verbose and print("[Quaternion] Coefficient initialisation") -q = nanoeigenpy.Quaternion(1, 2, 3, 4) -q.normalize() -assert isapprox(np.linalg.norm(q.coeffs()), q.norm()) -assert isapprox(np.linalg.norm(q.coeffs()), 1) - -verbose and print("[Quaternion] Coefficient-vector initialisation") -v = np.array([0.5, -0.5, 0.5, 0.5]) -for k in range(10000): - qv = nanoeigenpy.Quaternion(v) -assert isapprox(qv.coeffs(), v) - -verbose and print("[Quaternion] AngleAxis initialisation") -r = nanoeigenpy.AngleAxis(q) -q2 = nanoeigenpy.Quaternion(r) -assert q == q -assert isapprox(q.coeffs(), q2.coeffs()) -assert q2.isApprox(q2) -assert q2.isApprox(q2, 1e-2) - -Rq = q.matrix() -Rr = r.matrix() -assert isapprox(Rq.dot(Rq.T), np.eye(3)) -assert isapprox(Rr, Rq) - -verbose and print("[Quaternion] Rotation Matrix initialisation") -qR = nanoeigenpy.Quaternion(Rr) -assert q.isApprox(qR) -assert isapprox(q.coeffs(), qR.coeffs()) - -assert isapprox(qR[3], 1.0 / np.sqrt(30)) -try: - qR[5] - print("Error, this message should not appear.") -except IndexError as e: +def test_geometry(): + # --- Quaternion --------------------------------------------------------------- + verbose and print("[Quaternion] Coefficient initialisation") + q = nanoeigenpy.Quaternion(1, 2, 3, 4) + q.normalize() + assert isapprox(np.linalg.norm(q.coeffs()), q.norm()) + assert isapprox(np.linalg.norm(q.coeffs()), 1) + + verbose and print("[Quaternion] Coefficient-vector initialisation") + v = np.array([0.5, -0.5, 0.5, 0.5]) + for k in range(10000): + qv = nanoeigenpy.Quaternion(v) + assert isapprox(qv.coeffs(), v) + + verbose and print("[Quaternion] AngleAxis initialisation") + r = nanoeigenpy.AngleAxis(q) + q2 = nanoeigenpy.Quaternion(r) + assert q == q + assert isapprox(q.coeffs(), q2.coeffs()) + assert q2.isApprox(q2) + assert q2.isApprox(q2, 1e-2) + + Rq = q.matrix() + Rr = r.matrix() + assert isapprox(Rq.dot(Rq.T), np.eye(3)) + assert isapprox(Rr, Rq) + + verbose and print("[Quaternion] Rotation Matrix initialisation") + qR = nanoeigenpy.Quaternion(Rr) + assert q.isApprox(qR) + assert isapprox(q.coeffs(), qR.coeffs()) + + assert isapprox(qR[3], 1.0 / np.sqrt(30)) + try: + qR[5] + print("Error, this message should not appear.") + except IndexError as e: + if verbose: + print("As expected, caught exception: ", e) + + x = quaternion.X(q) + assert x.a == q + + # --- Angle Vector ------------------------------------------------ + r = nanoeigenpy.AngleAxis(0.1, np.array([1, 0, 0], np.double)) if verbose: - print("As expected, caught exception: ", e) - -x = quaternion.X(q) -assert x.a == q - -# --- Angle Vector ------------------------------------------------ -r = nanoeigenpy.AngleAxis(0.1, np.array([1, 0, 0], np.double)) -if verbose: - print("Rx(.1) = \n\n", r.matrix(), "\n") -assert isapprox(r.matrix()[2, 2], cos(r.angle)) -assert isapprox(r.axis, np.array([1.0, 0, 0])) -assert isapprox(r.angle, 0.1) -assert r.isApprox(r) -assert r.isApprox(r, 1e-2) - -r.axis = np.array([0, 1, 0], np.double).T -assert isapprox(r.matrix()[0, 0], cos(r.angle)) - -ri = r.inverse() -assert isapprox(ri.angle, -0.1) - -R = r.matrix() -r2 = nanoeigenpy.AngleAxis(np.dot(R, R)) -assert isapprox(r2.angle, r.angle * 2) - -# --- Hyperplane ------------------------------------------------ -verbose and print("[Hyperplane] Normal and point construction") -n = np.array([1.0, 0.0]) -p = np.array([2.0, 3.0]) -h = nanoeigenpy.Hyperplane(n, p) -assert isapprox(h.normal(), n) -assert isapprox(h.absDistance(p), 0.0) -assert h.dim() == 2 - -verbose and print("[Hyperplane] Normal and distance construction") -d = -np.dot(n, p) -h2 = nanoeigenpy.Hyperplane(n, d) -assert isapprox(h.coeffs(), h2.coeffs()) -assert isapprox(h2.offset(), d) - -verbose and print("[Hyperplane] Through two points") -p1 = np.array([0.0, 0.0]) -p2 = np.array([1.0, 1.0]) -h3 = nanoeigenpy.Hyperplane.Through(p1, p2) -assert isapprox(h3.absDistance(p1), 0.0) -assert isapprox(h3.absDistance(p2), 0.0) -assert isapprox(np.linalg.norm(h3.normal()), 1.0) - -verbose and print("[Hyperplane] Through three points") -p1_3d = np.array([1.0, 0.0, 0.0]) -p2_3d = np.array([0.0, 1.0, 0.0]) -p3_3d = np.array([0.0, 0.0, 1.0]) -h4 = nanoeigenpy.Hyperplane.Through(p1_3d, p2_3d, p3_3d) -assert isapprox(h4.absDistance(p1_3d), 0.0) -assert isapprox(h4.absDistance(p2_3d), 0.0) -assert isapprox(h4.absDistance(p3_3d), 0.0) -assert isapprox(np.linalg.norm(h4.normal()), 1.0) -assert h4.dim() == 3 - -verbose and print("[Hyperplane] Distance calculations") -test_point = np.array([1.0, 0.0]) -signed_dist = h3.signedDistance(test_point) -abs_dist = h3.absDistance(test_point) -assert isapprox(abs_dist, abs(signed_dist)) - -verbose and print("[Hyperplane] Projection") -proj = h3.projection(test_point) -assert isapprox(h3.absDistance(proj), 0.0) - -verbose and print("[Hyperplane] Normalization") -h_copy = nanoeigenpy.Hyperplane(np.array([2.0, 0.0]), np.array([1.0, 0.0])) -h_copy.normalize() -assert isapprox(np.linalg.norm(h_copy.normal()), 1.0) - -verbose and print("[Hyperplane] Line intersection") -h_line1 = nanoeigenpy.Hyperplane(np.array([1.0, 0.0]), 0.0) -h_line2 = nanoeigenpy.Hyperplane(np.array([0.0, 1.0]), 0.0) -intersection = h_line1.intersection(h_line2) -assert isapprox(intersection, np.array([0.0, 0.0])) - -verbose and print("[Hyperplane] isApprox") -h5 = nanoeigenpy.Hyperplane(h) -assert h.isApprox(h5) -assert h.isApprox(h5, 1e-12) - -# --- ParametrizedLine ------------------------------------------------ -verbose and print("[ParametrizedLine] Origin and direction construction") -origin = np.array([1.0, 2.0]) -direction = np.array([1.0, 0.0]) -line = nanoeigenpy.ParametrizedLine(origin, direction) -assert isapprox(line.origin(), origin) -assert isapprox(line.direction(), direction) -assert line.dim() == 2 - -verbose and print("[ParametrizedLine] Default constructor") -line_default = nanoeigenpy.ParametrizedLine() -assert line_default.dim() == 0 - -verbose and print("[ParametrizedLine] Dimension constructor") -line_3d = nanoeigenpy.ParametrizedLine(3) -assert line_3d.dim() == 3 - -verbose and print("[ParametrizedLine] Copy constructor") -line_copy = nanoeigenpy.ParametrizedLine(line) -assert isapprox(line_copy.origin(), line.origin()) -assert isapprox(line_copy.direction(), line.direction()) - -verbose and print("[ParametrizedLine] Construction from 2D hyperplane") -h_2d = nanoeigenpy.Hyperplane(np.array([1.0, 0.0]), 0.0) -line_from_h = nanoeigenpy.ParametrizedLine(h_2d) -assert line_from_h.dim() == 2 -assert isapprox(line_from_h.origin(), np.array([0.0, 0.0])) -assert isapprox(line_from_h.direction(), np.array([0.0, 1.0])) - -verbose and print("[ParametrizedLine] 3D hyperplane should fail") -h_3d = nanoeigenpy.Hyperplane(np.array([1.0, 0.0, 0.0]), 0.0) -try: - line_fail = nanoeigenpy.ParametrizedLine(h_3d) - print("Error, this message should not appear.") -except ValueError as e: - if verbose: - print("As expected, caught exception:", e) - -verbose and print("[ParametrizedLine] Distance calculations") -test_point = np.array([1.0, 0.0]) -line_x_axis = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([1.0, 0.0])) -distance = line_x_axis.distance(test_point) -squared_distance = line_x_axis.squaredDistance(test_point) -assert isapprox(distance, 0.0) -assert isapprox(squared_distance, 0.0) - -off_line_point = np.array([1.0, 1.0]) -distance_off = line_x_axis.distance(off_line_point) -squared_distance_off = line_x_axis.squaredDistance(off_line_point) -assert isapprox(distance_off, 1.0) -assert isapprox(squared_distance_off, 1.0) -assert isapprox(distance_off * distance_off, squared_distance_off) - -verbose and print("[ParametrizedLine] Projection") -projection = line_x_axis.projection(off_line_point) -assert isapprox(projection, np.array([1.0, 0.0])) -assert isapprox(line_x_axis.distance(projection), 0.0) - -verbose and print("[ParametrizedLine] Intersection with hyperplane") -line_diagonal = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([1.0, 1.0])) -h_vertical = nanoeigenpy.Hyperplane(np.array([1.0, 0.0]), -1.0) - -intersection_param = line_diagonal.intersectionParameter(h_vertical) -assert isapprox(intersection_param, 1.0) - -intersection_param_old = line_diagonal.intersection(h_vertical) -assert isapprox(intersection_param_old, intersection_param) - -intersection_point = line_diagonal.intersectionPoint(h_vertical) -expected_intersection = np.array([1.0, 1.0]) -assert isapprox(intersection_point, expected_intersection) -assert isapprox(h_vertical.absDistance(intersection_point), 0.0) - -verbose and print("[ParametrizedLine] isApprox") -line1 = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([1.0, 0.0])) -line2 = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([1.0, 0.0])) -line3 = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([0.0, 1.0])) -assert line1.isApprox(line2) -assert line1.isApprox(line2, 1e-12) -assert not line1.isApprox(line3) - -verbose and print("[ParametrizedLine] Parallel lines") -line_parallel1 = nanoeigenpy.ParametrizedLine( - np.array([0.0, 0.0]), np.array([1.0, 0.0]) -) -line_parallel2 = nanoeigenpy.ParametrizedLine( - np.array([0.0, 1.0]), np.array([1.0, 0.0]) -) -assert not line_parallel1.isApprox(line_parallel2) - -test_points = [np.array([i, 0.0]) for i in range(5)] -distances = [line_parallel2.distance(p) for p in test_points] -for d in distances: - assert isapprox(d, 1.0) - -verbose and print("[ParametrizedLine] Through two points") -p0 = np.array([0.0, 0.0]) -p1 = np.array([1.0, 1.0]) -line_through = nanoeigenpy.ParametrizedLine.Through(p0, p1) -direction = line_through.direction() -expected_dir = (p1 - p0) / np.linalg.norm(p1 - p0) -assert isapprox(line_through.origin(), p0) -assert isapprox(np.linalg.norm(direction), 1.0) -assert isapprox(direction, expected_dir) - -# --- Rotation2D ------------------------------------------------ -verbose and print("[Rotation2D] Default constructor") -r_default = nanoeigenpy.Rotation2D() -assert isapprox(r_default.angle, 0.0) - -verbose and print("[Rotation2D] Angle constructor") -angle = np.pi / 4 -r_angle = nanoeigenpy.Rotation2D(angle) -assert isapprox(r_angle.angle, angle) - -verbose and print("[Rotation2D] Copy constructor") -r_copy = nanoeigenpy.Rotation2D(r_angle) -assert isapprox(r_copy.angle, r_angle.angle) -assert r_copy == r_angle - -verbose and print("[Rotation2D] Matrix constructor") -theta = np.pi / 6 -rotation_matrix = np.array( - [[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]] -) -r_matrix = nanoeigenpy.Rotation2D(rotation_matrix) -assert isapprox(r_matrix.angle, theta) - -verbose and print("[Rotation2D] Angle property") -r_prop = nanoeigenpy.Rotation2D() -new_angle = np.pi / 3 -r_prop.angle = new_angle -assert isapprox(r_prop.angle, new_angle) - -verbose and print("[Rotation2D] smallestPositiveAngle") -r_negative = nanoeigenpy.Rotation2D(-np.pi / 4) -positive_angle = r_negative.smallestPositiveAngle() -assert positive_angle >= 0.0 -assert positive_angle < 2 * np.pi -assert isapprox(positive_angle, 7 * np.pi / 4) - -verbose and print("[Rotation2D] smallestAngle") -r_large = nanoeigenpy.Rotation2D(3 * np.pi) -smallest_angle = r_large.smallestAngle() -assert smallest_angle >= -np.pi -assert smallest_angle <= np.pi -assert isapprox(smallest_angle, np.pi) - -verbose and print("[Rotation2D] Identity") -r_identity = nanoeigenpy.Rotation2D.Identity() -assert isapprox(r_identity.angle, 0.0) - -verbose and print("[Rotation2D] fromRotationMatrix") -r_from_matrix = nanoeigenpy.Rotation2D() -theta2 = np.pi / 2 -matrix2 = np.array( - [[np.cos(theta2), -np.sin(theta2)], [np.sin(theta2), np.cos(theta2)]] -) -r_from_matrix.fromRotationMatrix(matrix2) -assert isapprox(r_from_matrix.angle, theta2) - -verbose and print("[Rotation2D] Rotation composition") -r1 = nanoeigenpy.Rotation2D(np.pi / 4) -r2 = nanoeigenpy.Rotation2D(np.pi / 6) -r_composed = r1 * r2 -expected_angle = np.pi / 4 + np.pi / 6 -assert isapprox(r_composed.angle, expected_angle) - -verbose and print("[Rotation2D] In-place multiplication") -r_inplace = nanoeigenpy.Rotation2D(np.pi / 4) -original_angle = r_inplace.angle -r_inplace *= nanoeigenpy.Rotation2D(np.pi / 6) -assert isapprox(r_inplace.angle, original_angle + np.pi / 6) - -verbose and print("[Rotation2D] Vector rotation") -r_90 = nanoeigenpy.Rotation2D(np.pi / 2) -vec = np.array([1.0, 0.0]) -rotated_vec = r_90 * vec -expected_vec = np.array([0.0, 1.0]) -assert isapprox(rotated_vec, expected_vec) - -vec2 = np.array([1.0, 1.0]) -r_45 = nanoeigenpy.Rotation2D(np.pi / 4) -rotated_vec2 = r_45 * vec2 -expected_vec2 = np.array([0.0, np.sqrt(2)]) -assert isapprox(rotated_vec2, expected_vec2) - -verbose and print("[Rotation2D] Equality operators") -r_eq1 = nanoeigenpy.Rotation2D(np.pi / 3) -r_eq2 = nanoeigenpy.Rotation2D(np.pi / 3) -r_eq3 = nanoeigenpy.Rotation2D(np.pi / 4) - -assert r_eq1 == r_eq2 -assert not (r_eq1 == r_eq3) -assert r_eq1 != r_eq3 -assert not (r_eq1 != r_eq2) - -verbose and print("[Rotation2D] Periodic angles") -r_period1 = nanoeigenpy.Rotation2D(0.0) -r_period2 = nanoeigenpy.Rotation2D(2 * np.pi) -verbose and print("[Rotation2D] isApprox") -r_approx1 = nanoeigenpy.Rotation2D(np.pi / 4) -r_approx2 = nanoeigenpy.Rotation2D(np.pi / 4 + 1e-15) -r_approx3 = nanoeigenpy.Rotation2D(np.pi / 3) - -assert r_approx1.isApprox(r_approx2) -assert r_approx1.isApprox(r_approx2, 1e-12) -assert not r_approx1.isApprox(r_approx3) - -verbose and print("[Rotation2D] slerp") -r_start = nanoeigenpy.Rotation2D(0.0) -r_end = nanoeigenpy.Rotation2D(np.pi / 2) -r_middle = r_start.slerp(0.5, r_end) -assert isapprox(r_middle.angle, np.pi / 4) - -r_slerp_0 = r_start.slerp(0.0, r_end) -r_slerp_1 = r_start.slerp(1.0, r_end) -assert isapprox(r_slerp_0.angle, r_start.angle) -assert isapprox(r_slerp_1.angle, r_end.angle) - -verbose and print("[Rotation2D] Inverse rotation") -try: - r_original = nanoeigenpy.Rotation2D(np.pi / 3) - r_inverse = r_original.inverse() - assert isapprox(r_inverse.angle, -np.pi / 3) - - r_identity_test = r_original * r_inverse - assert isapprox(r_identity_test.angle, 0.0, 1e-12) -except AttributeError: - if verbose: - print("inverse() method not exposed or not available") - -verbose and print("[Rotation2D] Matrix conversion") -try: - r_matrix_test = nanoeigenpy.Rotation2D(np.pi / 6) - matrix = r_matrix_test.matrix() - - assert matrix.shape == (2, 2) - assert isapprox(matrix @ matrix.T, np.eye(2)) - assert isapprox(np.linalg.det(matrix), 1.0) - - expected_matrix = np.array( - [ - [np.cos(np.pi / 6), -np.sin(np.pi / 6)], - [np.sin(np.pi / 6), np.cos(np.pi / 6)], - ] + print("Rx(.1) = \n\n", r.matrix(), "\n") + assert isapprox(r.matrix()[2, 2], cos(r.angle)) + assert isapprox(r.axis, np.array([1.0, 0, 0])) + assert isapprox(r.angle, 0.1) + assert r.isApprox(r) + assert r.isApprox(r, 1e-2) + + r.axis = np.array([0, 1, 0], np.double).T + assert isapprox(r.matrix()[0, 0], cos(r.angle)) + + ri = r.inverse() + assert isapprox(ri.angle, -0.1) + + R = r.matrix() + r2 = nanoeigenpy.AngleAxis(np.dot(R, R)) + assert isapprox(r2.angle, r.angle * 2) + + # --- Hyperplane ------------------------------------------------ + verbose and print("[Hyperplane] Normal and point construction") + n = np.array([1.0, 0.0]) + p = np.array([2.0, 3.0]) + h = nanoeigenpy.Hyperplane(n, p) + assert isapprox(h.normal(), n) + assert isapprox(h.absDistance(p), 0.0) + assert h.dim() == 2 + + verbose and print("[Hyperplane] Normal and distance construction") + d = -np.dot(n, p) + h2 = nanoeigenpy.Hyperplane(n, d) + assert isapprox(h.coeffs(), h2.coeffs()) + assert isapprox(h2.offset(), d) + + verbose and print("[Hyperplane] Through two points") + p1 = np.array([0.0, 0.0]) + p2 = np.array([1.0, 1.0]) + h3 = nanoeigenpy.Hyperplane.Through(p1, p2) + assert isapprox(h3.absDistance(p1), 0.0) + assert isapprox(h3.absDistance(p2), 0.0) + assert isapprox(np.linalg.norm(h3.normal()), 1.0) + + verbose and print("[Hyperplane] Through three points") + p1_3d = np.array([1.0, 0.0, 0.0]) + p2_3d = np.array([0.0, 1.0, 0.0]) + p3_3d = np.array([0.0, 0.0, 1.0]) + h4 = nanoeigenpy.Hyperplane.Through(p1_3d, p2_3d, p3_3d) + assert isapprox(h4.absDistance(p1_3d), 0.0) + assert isapprox(h4.absDistance(p2_3d), 0.0) + assert isapprox(h4.absDistance(p3_3d), 0.0) + assert isapprox(np.linalg.norm(h4.normal()), 1.0) + assert h4.dim() == 3 + + verbose and print("[Hyperplane] Distance calculations") + test_point = np.array([1.0, 0.0]) + signed_dist = h3.signedDistance(test_point) + abs_dist = h3.absDistance(test_point) + assert isapprox(abs_dist, abs(signed_dist)) + + verbose and print("[Hyperplane] Projection") + proj = h3.projection(test_point) + assert isapprox(h3.absDistance(proj), 0.0) + + verbose and print("[Hyperplane] Normalization") + h_copy = nanoeigenpy.Hyperplane(np.array([2.0, 0.0]), np.array([1.0, 0.0])) + h_copy.normalize() + assert isapprox(np.linalg.norm(h_copy.normal()), 1.0) + + verbose and print("[Hyperplane] Line intersection") + h_line1 = nanoeigenpy.Hyperplane(np.array([1.0, 0.0]), 0.0) + h_line2 = nanoeigenpy.Hyperplane(np.array([0.0, 1.0]), 0.0) + intersection = h_line1.intersection(h_line2) + assert isapprox(intersection, np.array([0.0, 0.0])) + + verbose and print("[Hyperplane] isApprox") + h5 = nanoeigenpy.Hyperplane(h) + assert h.isApprox(h5) + assert h.isApprox(h5, 1e-12) + + # --- ParametrizedLine ------------------------------------------------ + verbose and print("[ParametrizedLine] Origin and direction construction") + origin = np.array([1.0, 2.0]) + direction = np.array([1.0, 0.0]) + line = nanoeigenpy.ParametrizedLine(origin, direction) + assert isapprox(line.origin(), origin) + assert isapprox(line.direction(), direction) + assert line.dim() == 2 + + verbose and print("[ParametrizedLine] Default constructor") + line_default = nanoeigenpy.ParametrizedLine() + assert line_default.dim() == 0 + + verbose and print("[ParametrizedLine] Dimension constructor") + line_3d = nanoeigenpy.ParametrizedLine(3) + assert line_3d.dim() == 3 + + verbose and print("[ParametrizedLine] Copy constructor") + line_copy = nanoeigenpy.ParametrizedLine(line) + assert isapprox(line_copy.origin(), line.origin()) + assert isapprox(line_copy.direction(), line.direction()) + + verbose and print("[ParametrizedLine] Construction from 2D hyperplane") + h_2d = nanoeigenpy.Hyperplane(np.array([1.0, 0.0]), 0.0) + line_from_h = nanoeigenpy.ParametrizedLine(h_2d) + assert line_from_h.dim() == 2 + assert isapprox(line_from_h.origin(), np.array([0.0, 0.0])) + assert isapprox(line_from_h.direction(), np.array([0.0, 1.0])) + + verbose and print("[ParametrizedLine] 3D hyperplane should fail") + h_3d = nanoeigenpy.Hyperplane(np.array([1.0, 0.0, 0.0]), 0.0) + try: + line_fail = nanoeigenpy.ParametrizedLine(h_3d) # noqa + print("Error, this message should not appear.") + except ValueError as e: + if verbose: + print("As expected, caught exception:", e) + + verbose and print("[ParametrizedLine] Distance calculations") + test_point = np.array([1.0, 0.0]) + line_x_axis = nanoeigenpy.ParametrizedLine( + np.array([0.0, 0.0]), np.array([1.0, 0.0]) ) - assert isapprox(matrix, expected_matrix) - -except AttributeError: - if verbose: - print("matrix() method not exposed or not available") - -verbose and print("[Rotation2D] Angle normalization") -r_large_angle = nanoeigenpy.Rotation2D(3 * np.pi) -vec_test = np.array([1.0, 0.0]) -rotated_large = r_large_angle * vec_test -expected_large = np.array([-1.0, 0.0]) -assert isapprox(rotated_large, expected_large) - -# --- UniformScaling ------------------------------------------------ -verbose and print("[UniformScaling] Default constructor") -s_default = nanoeigenpy.UniformScaling() - -verbose and print("[UniformScaling] Factor constructor") -factor = 2.5 -s_factor = nanoeigenpy.UniformScaling(factor) -assert isapprox(s_factor.factor(), factor) - -verbose and print("[UniformScaling] Copy constructor") -s_copy = nanoeigenpy.UniformScaling(s_factor) -assert isapprox(s_copy.factor(), s_factor.factor()) - -verbose and print("[UniformScaling] Factor getter") -s_test = nanoeigenpy.UniformScaling(3.0) -assert isapprox(s_test.factor(), 3.0) - -verbose and print("[UniformScaling] Inverse scaling") -s_original = nanoeigenpy.UniformScaling(4.0) -s_inverse = s_original.inverse() -assert isapprox(s_inverse.factor(), 1.0 / 4.0) - -s_identity_test = s_original * s_inverse -assert isapprox(s_identity_test.factor(), 1.0) - -verbose and print("[UniformScaling] Concatenation of scalings") -s1 = nanoeigenpy.UniformScaling(2.0) -s2 = nanoeigenpy.UniformScaling(3.0) -s_combined = s1 * s2 -assert isapprox(s_combined.factor(), 6.0) - -verbose and print("[UniformScaling] Multiplication with matrix") -s_scale = nanoeigenpy.UniformScaling(2.0) -matrix = np.array([[1.0, 2.0], [3.0, 4.0]]) -scaled_matrix = s_scale * matrix -expected_matrix = matrix * 2.0 -assert isapprox(scaled_matrix, expected_matrix) - -identity = np.eye(3) -s_identity_scale = nanoeigenpy.UniformScaling(5.0) -scaled_identity = s_identity_scale * identity -expected_identity = identity * 5.0 -assert isapprox(scaled_identity, expected_identity) - -verbose and print("[UniformScaling] Multiplication with AngleAxis") -try: - angle_axis = nanoeigenpy.AngleAxis(np.pi / 4, np.array([0.0, 0.0, 1.0])) - s_with_rotation = nanoeigenpy.UniformScaling(2.0) - result_rotation = s_with_rotation * angle_axis - - assert result_rotation.shape == (3, 3) - det = np.linalg.det(result_rotation) - assert isapprox(det, 2.0**3) - -except (AttributeError, NameError): - if verbose: - print("AngleAxis class not available or not exposed") - -verbose and print("[UniformScaling] Multiplication with Quaternion") -try: - quat = nanoeigenpy.Quaternion(1, 0, 0, 0) - s_with_quat = nanoeigenpy.UniformScaling(3.0) - result_quat = s_with_quat * quat - - assert result_quat.shape == (3, 3) - expected_scaled_identity = np.eye(3) * 3.0 - assert isapprox(result_quat, expected_scaled_identity) - -except (AttributeError, NameError): - if verbose: - print("Quaternion class not available or not exposed") - -verbose and print("[UniformScaling] Multiplication with Rotation2D") -try: - rotation_2d = nanoeigenpy.Rotation2D(np.pi / 4) - s_with_rot2d = nanoeigenpy.UniformScaling(2.0) - result_rot2d = s_with_rot2d * rotation_2d - - assert result_rot2d.shape == (2, 2) - det_2d = np.linalg.det(result_rot2d) - assert isapprox(det_2d, 2.0**2) - -except (AttributeError, NameError): - if verbose: - print("Rotation2D class not available or not exposed") - -verbose and print("[UniformScaling] isApprox") -s_approx1 = nanoeigenpy.UniformScaling(2.0) -s_approx2 = nanoeigenpy.UniformScaling(2.0 + 1e-15) -s_approx3 = nanoeigenpy.UniformScaling(3.0) - -assert s_approx1.isApprox(s_approx2) -assert s_approx1.isApprox(s_approx2, 1e-12) -assert not s_approx1.isApprox(s_approx3) - -verbose and print("[UniformScaling] Edge cases") -s_zero = nanoeigenpy.UniformScaling(0.0) -assert isapprox(s_zero.factor(), 0.0) -try: - s_zero_inverse = s_zero.inverse() - if verbose: - print("Zero scaling inverse:", s_zero_inverse.factor()) -except Exception as e: - if verbose: - print("Zero scaling inverse threw exception (expected):", type(e).__name__) - -s_negative = nanoeigenpy.UniformScaling(-2.0) -assert isapprox(s_negative.factor(), -2.0) -s_negative_inverse = s_negative.inverse() -assert isapprox(s_negative_inverse.factor(), -0.5) - -s_small = nanoeigenpy.UniformScaling(1e-10) -s_small_inverse = s_small.inverse() -assert isapprox(s_small_inverse.factor(), 1e10) - -verbose and print("[UniformScaling] Chain operations") -s_chain1 = nanoeigenpy.UniformScaling(2.0) -s_chain2 = nanoeigenpy.UniformScaling(3.0) -s_chain3 = nanoeigenpy.UniformScaling(4.0) - -left_assoc = (s_chain1 * s_chain2) * s_chain3 -right_assoc = s_chain1 * (s_chain2 * s_chain3) -assert isapprox(left_assoc.factor(), right_assoc.factor()) -assert isapprox(left_assoc.factor(), 24.0) - -verbose and print("[UniformScaling] Vector scaling") -s_vector = nanoeigenpy.UniformScaling(2.0) -vector = np.array([[1.0], [2.0], [3.0]]) -identity_3x3 = np.eye(3) -scaled_identity = s_vector * identity_3x3 -scaled_vector = scaled_identity @ vector -expected_vector = vector * 2.0 -assert isapprox(scaled_vector, expected_vector) - -# --- Translation ------------------------------------------------ -verbose and print("[Translation] Default constructor") -t_default = nanoeigenpy.Translation() - -verbose and print("[Translation] 2D constructor with vector") -t_2d = nanoeigenpy.Translation(np.array([1.0, 2.0])) -assert isapprox(t_2d.x, 1.0) -assert isapprox(t_2d.y, 2.0) - -verbose and print("[Translation] 3D constructor with vector") -t_3d = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) -assert isapprox(t_3d.x, 1.0) -assert isapprox(t_3d.y, 2.0) -assert isapprox(t_3d.z, 3.0) - -verbose and print("[Translation] Vector constructor") -vector = np.array([1.5, 2.5, 3.5]) -t_vector = nanoeigenpy.Translation(vector) -assert isapprox(t_vector.x, 1.5) -assert isapprox(t_vector.y, 2.5) -assert isapprox(t_vector.z, 3.5) - -verbose and print("[Translation] Copy constructor") -t_copy = nanoeigenpy.Translation(t_3d) -assert isapprox(t_copy.x, t_3d.x) -assert isapprox(t_copy.y, t_3d.y) -assert isapprox(t_copy.z, t_3d.z) - -verbose and print("[Translation] Property setters") -t_test = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) -t_test.x = 10.0 -t_test.y = 20.0 -t_test.z = 30.0 -assert isapprox(t_test.x, 10.0) -assert isapprox(t_test.y, 20.0) -assert isapprox(t_test.z, 30.0) - -verbose and print("[Translation] Vector and translation getters") -vector_result = t_test.vector() -translation_result = t_test.translation() -assert isapprox(vector_result[0], 10.0) -assert isapprox(translation_result[0], 10.0) - -verbose and print("[Translation] Inverse") -t_original = nanoeigenpy.Translation(np.array([2.0, 3.0, 4.0])) -t_inverse = t_original.inverse() -assert isapprox(t_inverse.x, -2.0) -assert isapprox(t_inverse.y, -3.0) -assert isapprox(t_inverse.z, -4.0) - -verbose and print("[Translation] Concatenation") -t1 = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) -t2 = nanoeigenpy.Translation(np.array([4.0, 5.0, 6.0])) -t_combined = t1 * t2 -assert isapprox(t_combined.x, 5.0) -assert isapprox(t_combined.y, 7.0) -assert isapprox(t_combined.z, 9.0) - -verbose and print("[Translation] isApprox") -t_approx1 = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) -t_approx2 = nanoeigenpy.Translation(np.array([1.0 + 1e-15, 2.0 + 1e-15, 3.0 + 1e-15])) -t_approx3 = nanoeigenpy.Translation(np.array([1.1, 2.1, 3.1])) -assert t_approx1.isApprox(t_approx2) -assert t_approx1.isApprox(t_approx2, 1e-12) -assert not t_approx1.isApprox(t_approx3) - -# --- JacobiRotation --------------------------------------------------------------- -verbose and print("[JacobiRotation] Default constructor") -j = nanoeigenpy.JacobiRotation() -assert hasattr(j, "c") -assert hasattr(j, "s") - -verbose and print("[JacobiRotation] Cosine-sine constructor") -c_val = 0.8 -s_val = 0.6 -j = nanoeigenpy.JacobiRotation(c_val, s_val) -assert isapprox(j.c, c_val) -assert isapprox(j.s, s_val) - -verbose and print("[JacobiRotation] Property access") -j.c = 0.8 -j.s = 0.6 -assert isapprox(j.c, 0.8) -assert isapprox(j.s, 0.6) -norm_squared = j.c**2 + j.s**2 -assert isapprox(norm_squared, 1.0, 1e-12) - -verbose and print("[JacobiRotation] Multiplication operator") -j1 = nanoeigenpy.JacobiRotation(0.8, 0.6) -j2 = nanoeigenpy.JacobiRotation(0.6, 0.8) -j_mult = j1 * j2 -assert hasattr(j_mult, "c") -assert hasattr(j_mult, "s") -norm_mult = j_mult.c**2 + j_mult.s**2 -assert isapprox(norm_mult, 1.0, 1e-12) - -verbose and print("[JacobiRotation] Transpose") -j = nanoeigenpy.JacobiRotation(0.8, 0.6) -j_t = j.transpose() -assert isapprox(j_t.c, j.c) -assert isapprox(j_t.s, -j.s) - -verbose and print("[JacobiRotation] Adjoint") -j = nanoeigenpy.JacobiRotation(0.8, 0.6) -j_adj = j.adjoint() -assert isapprox(j_adj.c, j.c) -assert isapprox(j_adj.s, -j.s) - -verbose and print("[JacobiRotation] Identity property") -j = nanoeigenpy.JacobiRotation(0.8, 0.6) -j_t = j.transpose() -identity = j * j_t -assert isapprox(identity.c, 1.0, 1e-12) -assert isapprox(identity.s, 0.0, 1e-12) - -verbose and print("[JacobiRotation] makeJacobi from scalars") -j = nanoeigenpy.JacobiRotation() -x, z = 4.0, 1.0 -y = 2.0 -result = j.makeJacobi(x, y, z) -assert isinstance(result, bool) -norm_after = j.c**2 + j.s**2 -assert isapprox(norm_after, 1.0, 1e-12) - -verbose and print("[JacobiRotation] makeJacobi from matrix") -M = np.array([[4.0, 2.0, 1.0], [2.0, 3.0, 0.5], [1.0, 0.5, 1.0]]) -j = nanoeigenpy.JacobiRotation() -result = j.makeJacobi(M, 0, 1) -assert isinstance(result, bool) -norm_matrix = j.c**2 + j.s**2 -assert isapprox(norm_matrix, 1.0, 1e-12) - -verbose and print("[JacobiRotation] makeGivens basic") -j = nanoeigenpy.JacobiRotation() -p_val = 3.0 -q_val = 4.0 -j.makeGivens(p_val, q_val) -norm_givens = j.c**2 + j.s**2 -assert isapprox(norm_givens, 1.0, 1e-12) - -verbose and print("[JacobiRotation] makeGivens with r parameter") -j = nanoeigenpy.JacobiRotation() -p_val = 3.0 -q_val = 4.0 -r_container = np.array([0.0]) -j.makeGivens(p_val, q_val, r_container.ctypes.data) -expected_r = np.sqrt(p_val**2 + q_val**2) - -verbose and print("[JacobiRotation] Edge cases") -j_zero = nanoeigenpy.JacobiRotation(1.0, 0.0) -assert isapprox(j_zero.c, 1.0) -assert isapprox(j_zero.s, 0.0) - -j_90 = nanoeigenpy.JacobiRotation(0.0, 1.0) -assert isapprox(j_90.c, 0.0) -assert isapprox(j_90.s, 1.0) - -j = nanoeigenpy.JacobiRotation() -j.makeGivens(5.0, 0.0) -assert isapprox(abs(j.c), 1.0) -assert isapprox(j.s, 0.0) - -j.makeGivens(0.0, 5.0) -assert isapprox(j.c, 0.0) -assert isapprox(abs(j.s), 1.0) - -verbose and print("[JacobiRotation] makeJacobi small off-diagonal") -j = nanoeigenpy.JacobiRotation() -result = j.makeJacobi(1.0, 1e-15, 2.0) -assert isinstance(result, bool) -if not result: - assert isapprox(j.c, 1.0) + distance = line_x_axis.distance(test_point) + squared_distance = line_x_axis.squaredDistance(test_point) + assert isapprox(distance, 0.0) + assert isapprox(squared_distance, 0.0) + + off_line_point = np.array([1.0, 1.0]) + distance_off = line_x_axis.distance(off_line_point) + squared_distance_off = line_x_axis.squaredDistance(off_line_point) + assert isapprox(distance_off, 1.0) + assert isapprox(squared_distance_off, 1.0) + assert isapprox(distance_off * distance_off, squared_distance_off) + + verbose and print("[ParametrizedLine] Projection") + projection = line_x_axis.projection(off_line_point) + assert isapprox(projection, np.array([1.0, 0.0])) + assert isapprox(line_x_axis.distance(projection), 0.0) + + verbose and print("[ParametrizedLine] Intersection with hyperplane") + line_diagonal = nanoeigenpy.ParametrizedLine( + np.array([0.0, 0.0]), np.array([1.0, 1.0]) + ) + h_vertical = nanoeigenpy.Hyperplane(np.array([1.0, 0.0]), -1.0) + + intersection_param = line_diagonal.intersectionParameter(h_vertical) + assert isapprox(intersection_param, 1.0) + + intersection_param_old = line_diagonal.intersection(h_vertical) + assert isapprox(intersection_param_old, intersection_param) + + intersection_point = line_diagonal.intersectionPoint(h_vertical) + expected_intersection = np.array([1.0, 1.0]) + assert isapprox(intersection_point, expected_intersection) + assert isapprox(h_vertical.absDistance(intersection_point), 0.0) + + verbose and print("[ParametrizedLine] isApprox") + line1 = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([1.0, 0.0])) + line2 = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([1.0, 0.0])) + line3 = nanoeigenpy.ParametrizedLine(np.array([0.0, 0.0]), np.array([0.0, 1.0])) + assert line1.isApprox(line2) + assert line1.isApprox(line2, 1e-12) + assert not line1.isApprox(line3) + + verbose and print("[ParametrizedLine] Parallel lines") + line_parallel1 = nanoeigenpy.ParametrizedLine( + np.array([0.0, 0.0]), np.array([1.0, 0.0]) + ) + line_parallel2 = nanoeigenpy.ParametrizedLine( + np.array([0.0, 1.0]), np.array([1.0, 0.0]) + ) + assert not line_parallel1.isApprox(line_parallel2) + + test_points = [np.array([i, 0.0]) for i in range(5)] + distances = [line_parallel2.distance(p) for p in test_points] + for d in distances: + assert isapprox(d, 1.0) + + verbose and print("[ParametrizedLine] Through two points") + p0 = np.array([0.0, 0.0]) + p1 = np.array([1.0, 1.0]) + line_through = nanoeigenpy.ParametrizedLine.Through(p0, p1) + direction = line_through.direction() + expected_dir = (p1 - p0) / np.linalg.norm(p1 - p0) + assert isapprox(line_through.origin(), p0) + assert isapprox(np.linalg.norm(direction), 1.0) + assert isapprox(direction, expected_dir) + + # --- Rotation2D ------------------------------------------------ + verbose and print("[Rotation2D] Default constructor") + r_default = nanoeigenpy.Rotation2D() + assert isapprox(r_default.angle, 0.0) + + verbose and print("[Rotation2D] Angle constructor") + angle = np.pi / 4 + r_angle = nanoeigenpy.Rotation2D(angle) + assert isapprox(r_angle.angle, angle) + + verbose and print("[Rotation2D] Copy constructor") + r_copy = nanoeigenpy.Rotation2D(r_angle) + assert isapprox(r_copy.angle, r_angle.angle) + assert r_copy == r_angle + + verbose and print("[Rotation2D] Matrix constructor") + theta = np.pi / 6 + rotation_matrix = np.array( + [[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]] + ) + r_matrix = nanoeigenpy.Rotation2D(rotation_matrix) + assert isapprox(r_matrix.angle, theta) + + verbose and print("[Rotation2D] Angle property") + r_prop = nanoeigenpy.Rotation2D() + new_angle = np.pi / 3 + r_prop.angle = new_angle + assert isapprox(r_prop.angle, new_angle) + + verbose and print("[Rotation2D] smallestPositiveAngle") + r_negative = nanoeigenpy.Rotation2D(-np.pi / 4) + positive_angle = r_negative.smallestPositiveAngle() + assert positive_angle >= 0.0 + assert positive_angle < 2 * np.pi + assert isapprox(positive_angle, 7 * np.pi / 4) + + verbose and print("[Rotation2D] smallestAngle") + r_large = nanoeigenpy.Rotation2D(3 * np.pi) + smallest_angle = r_large.smallestAngle() + assert smallest_angle >= -np.pi + assert smallest_angle <= np.pi + assert isapprox(smallest_angle, np.pi) + + verbose and print("[Rotation2D] Identity") + r_identity = nanoeigenpy.Rotation2D.Identity() + assert isapprox(r_identity.angle, 0.0) + + verbose and print("[Rotation2D] fromRotationMatrix") + r_from_matrix = nanoeigenpy.Rotation2D() + theta2 = np.pi / 2 + matrix2 = np.array( + [[np.cos(theta2), -np.sin(theta2)], [np.sin(theta2), np.cos(theta2)]] + ) + r_from_matrix.fromRotationMatrix(matrix2) + assert isapprox(r_from_matrix.angle, theta2) + + verbose and print("[Rotation2D] Rotation composition") + r1 = nanoeigenpy.Rotation2D(np.pi / 4) + r2 = nanoeigenpy.Rotation2D(np.pi / 6) + r_composed = r1 * r2 + expected_angle = np.pi / 4 + np.pi / 6 + assert isapprox(r_composed.angle, expected_angle) + + verbose and print("[Rotation2D] In-place multiplication") + r_inplace = nanoeigenpy.Rotation2D(np.pi / 4) + original_angle = r_inplace.angle + r_inplace *= nanoeigenpy.Rotation2D(np.pi / 6) + assert isapprox(r_inplace.angle, original_angle + np.pi / 6) + + verbose and print("[Rotation2D] Vector rotation") + r_90 = nanoeigenpy.Rotation2D(np.pi / 2) + vec = np.array([1.0, 0.0]) + rotated_vec = r_90 * vec + expected_vec = np.array([0.0, 1.0]) + assert isapprox(rotated_vec, expected_vec) + + vec2 = np.array([1.0, 1.0]) + r_45 = nanoeigenpy.Rotation2D(np.pi / 4) + rotated_vec2 = r_45 * vec2 + expected_vec2 = np.array([0.0, np.sqrt(2)]) + assert isapprox(rotated_vec2, expected_vec2) + + verbose and print("[Rotation2D] Equality operators") + r_eq1 = nanoeigenpy.Rotation2D(np.pi / 3) + r_eq2 = nanoeigenpy.Rotation2D(np.pi / 3) + r_eq3 = nanoeigenpy.Rotation2D(np.pi / 4) + + assert r_eq1 == r_eq2 + assert not (r_eq1 == r_eq3) + assert r_eq1 != r_eq3 + assert not (r_eq1 != r_eq2) + + verbose and print("[Rotation2D] Periodic angles") + r_period1 = nanoeigenpy.Rotation2D(0.0) # noqa + r_period2 = nanoeigenpy.Rotation2D(2 * np.pi) # noqa + verbose and print("[Rotation2D] isApprox") + r_approx1 = nanoeigenpy.Rotation2D(np.pi / 4) + r_approx2 = nanoeigenpy.Rotation2D(np.pi / 4 + 1e-15) + r_approx3 = nanoeigenpy.Rotation2D(np.pi / 3) + + assert r_approx1.isApprox(r_approx2) + assert r_approx1.isApprox(r_approx2, 1e-12) + assert not r_approx1.isApprox(r_approx3) + + verbose and print("[Rotation2D] slerp") + r_start = nanoeigenpy.Rotation2D(0.0) + r_end = nanoeigenpy.Rotation2D(np.pi / 2) + r_middle = r_start.slerp(0.5, r_end) + assert isapprox(r_middle.angle, np.pi / 4) + + r_slerp_0 = r_start.slerp(0.0, r_end) + r_slerp_1 = r_start.slerp(1.0, r_end) + assert isapprox(r_slerp_0.angle, r_start.angle) + assert isapprox(r_slerp_1.angle, r_end.angle) + + verbose and print("[Rotation2D] Inverse rotation") + try: + r_original = nanoeigenpy.Rotation2D(np.pi / 3) + r_inverse = r_original.inverse() + assert isapprox(r_inverse.angle, -np.pi / 3) + + r_identity_test = r_original * r_inverse + assert isapprox(r_identity_test.angle, 0.0, 1e-12) + except AttributeError: + if verbose: + print("inverse() method not exposed or not available") + + verbose and print("[Rotation2D] Matrix conversion") + try: + r_matrix_test = nanoeigenpy.Rotation2D(np.pi / 6) + matrix = r_matrix_test.matrix() + + assert matrix.shape == (2, 2) + assert isapprox(matrix @ matrix.T, np.eye(2)) + assert isapprox(np.linalg.det(matrix), 1.0) + + expected_matrix = np.array( + [ + [np.cos(np.pi / 6), -np.sin(np.pi / 6)], + [np.sin(np.pi / 6), np.cos(np.pi / 6)], + ] + ) + assert isapprox(matrix, expected_matrix) + + except AttributeError: + if verbose: + print("matrix() method not exposed or not available") + + verbose and print("[Rotation2D] Angle normalization") + r_large_angle = nanoeigenpy.Rotation2D(3 * np.pi) + vec_test = np.array([1.0, 0.0]) + rotated_large = r_large_angle * vec_test + expected_large = np.array([-1.0, 0.0]) + assert isapprox(rotated_large, expected_large) + + # --- UniformScaling ------------------------------------------------ + verbose and print("[UniformScaling] Default constructor") + s_default = nanoeigenpy.UniformScaling() # noqa + + verbose and print("[UniformScaling] Factor constructor") + factor = 2.5 + s_factor = nanoeigenpy.UniformScaling(factor) + assert isapprox(s_factor.factor(), factor) + + verbose and print("[UniformScaling] Copy constructor") + s_copy = nanoeigenpy.UniformScaling(s_factor) + assert isapprox(s_copy.factor(), s_factor.factor()) + + verbose and print("[UniformScaling] Factor getter") + s_test = nanoeigenpy.UniformScaling(3.0) + assert isapprox(s_test.factor(), 3.0) + + verbose and print("[UniformScaling] Inverse scaling") + s_original = nanoeigenpy.UniformScaling(4.0) + s_inverse = s_original.inverse() + assert isapprox(s_inverse.factor(), 1.0 / 4.0) + + s_identity_test = s_original * s_inverse + assert isapprox(s_identity_test.factor(), 1.0) + + verbose and print("[UniformScaling] Concatenation of scalings") + s1 = nanoeigenpy.UniformScaling(2.0) + s2 = nanoeigenpy.UniformScaling(3.0) + s_combined = s1 * s2 + assert isapprox(s_combined.factor(), 6.0) + + verbose and print("[UniformScaling] Multiplication with matrix") + s_scale = nanoeigenpy.UniformScaling(2.0) + matrix = np.array([[1.0, 2.0], [3.0, 4.0]]) + scaled_matrix = s_scale * matrix + expected_matrix = matrix * 2.0 + assert isapprox(scaled_matrix, expected_matrix) + + identity = np.eye(3) + s_identity_scale = nanoeigenpy.UniformScaling(5.0) + scaled_identity = s_identity_scale * identity + expected_identity = identity * 5.0 + assert isapprox(scaled_identity, expected_identity) + + verbose and print("[UniformScaling] Multiplication with AngleAxis") + try: + angle_axis = nanoeigenpy.AngleAxis(np.pi / 4, np.array([0.0, 0.0, 1.0])) + s_with_rotation = nanoeigenpy.UniformScaling(2.0) + result_rotation = s_with_rotation * angle_axis + + assert result_rotation.shape == (3, 3) + det = np.linalg.det(result_rotation) + assert isapprox(det, 2.0**3) + + except (AttributeError, NameError): + if verbose: + print("AngleAxis class not available or not exposed") + + verbose and print("[UniformScaling] Multiplication with Quaternion") + try: + quat = nanoeigenpy.Quaternion(1, 0, 0, 0) + s_with_quat = nanoeigenpy.UniformScaling(3.0) + result_quat = s_with_quat * quat + + assert result_quat.shape == (3, 3) + expected_scaled_identity = np.eye(3) * 3.0 + assert isapprox(result_quat, expected_scaled_identity) + + except (AttributeError, NameError): + if verbose: + print("Quaternion class not available or not exposed") + + verbose and print("[UniformScaling] Multiplication with Rotation2D") + try: + rotation_2d = nanoeigenpy.Rotation2D(np.pi / 4) + s_with_rot2d = nanoeigenpy.UniformScaling(2.0) + result_rot2d = s_with_rot2d * rotation_2d + + assert result_rot2d.shape == (2, 2) + det_2d = np.linalg.det(result_rot2d) + assert isapprox(det_2d, 2.0**2) + + except (AttributeError, NameError): + if verbose: + print("Rotation2D class not available or not exposed") + + verbose and print("[UniformScaling] isApprox") + s_approx1 = nanoeigenpy.UniformScaling(2.0) + s_approx2 = nanoeigenpy.UniformScaling(2.0 + 1e-15) + s_approx3 = nanoeigenpy.UniformScaling(3.0) + + assert s_approx1.isApprox(s_approx2) + assert s_approx1.isApprox(s_approx2, 1e-12) + assert not s_approx1.isApprox(s_approx3) + + verbose and print("[UniformScaling] Edge cases") + s_zero = nanoeigenpy.UniformScaling(0.0) + assert isapprox(s_zero.factor(), 0.0) + try: + s_zero_inverse = s_zero.inverse() + if verbose: + print("Zero scaling inverse:", s_zero_inverse.factor()) + except Exception as e: + if verbose: + print("Zero scaling inverse threw exception (expected):", type(e).__name__) + + s_negative = nanoeigenpy.UniformScaling(-2.0) + assert isapprox(s_negative.factor(), -2.0) + s_negative_inverse = s_negative.inverse() + assert isapprox(s_negative_inverse.factor(), -0.5) + + s_small = nanoeigenpy.UniformScaling(1e-10) + s_small_inverse = s_small.inverse() + assert isapprox(s_small_inverse.factor(), 1e10) + + verbose and print("[UniformScaling] Chain operations") + s_chain1 = nanoeigenpy.UniformScaling(2.0) + s_chain2 = nanoeigenpy.UniformScaling(3.0) + s_chain3 = nanoeigenpy.UniformScaling(4.0) + + left_assoc = (s_chain1 * s_chain2) * s_chain3 + right_assoc = s_chain1 * (s_chain2 * s_chain3) + assert isapprox(left_assoc.factor(), right_assoc.factor()) + assert isapprox(left_assoc.factor(), 24.0) + + verbose and print("[UniformScaling] Vector scaling") + s_vector = nanoeigenpy.UniformScaling(2.0) + vector = np.array([[1.0], [2.0], [3.0]]) + identity_3x3 = np.eye(3) + scaled_identity = s_vector * identity_3x3 + scaled_vector = scaled_identity @ vector + expected_vector = vector * 2.0 + assert isapprox(scaled_vector, expected_vector) + + # --- Translation ------------------------------------------------ + verbose and print("[Translation] Default constructor") + t_default = nanoeigenpy.Translation() # noqa + + verbose and print("[Translation] 2D constructor with vector") + t_2d = nanoeigenpy.Translation(np.array([1.0, 2.0])) + assert isapprox(t_2d.x, 1.0) + assert isapprox(t_2d.y, 2.0) + + verbose and print("[Translation] 3D constructor with vector") + t_3d = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) + assert isapprox(t_3d.x, 1.0) + assert isapprox(t_3d.y, 2.0) + assert isapprox(t_3d.z, 3.0) + + verbose and print("[Translation] Vector constructor") + vector = np.array([1.5, 2.5, 3.5]) + t_vector = nanoeigenpy.Translation(vector) + assert isapprox(t_vector.x, 1.5) + assert isapprox(t_vector.y, 2.5) + assert isapprox(t_vector.z, 3.5) + + verbose and print("[Translation] Copy constructor") + t_copy = nanoeigenpy.Translation(t_3d) + assert isapprox(t_copy.x, t_3d.x) + assert isapprox(t_copy.y, t_3d.y) + assert isapprox(t_copy.z, t_3d.z) + + verbose and print("[Translation] Property setters") + t_test = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) + t_test.x = 10.0 + t_test.y = 20.0 + t_test.z = 30.0 + assert isapprox(t_test.x, 10.0) + assert isapprox(t_test.y, 20.0) + assert isapprox(t_test.z, 30.0) + + verbose and print("[Translation] Vector and translation getters") + vector_result = t_test.vector() + translation_result = t_test.translation() + assert isapprox(vector_result[0], 10.0) + assert isapprox(translation_result[0], 10.0) + + verbose and print("[Translation] Inverse") + t_original = nanoeigenpy.Translation(np.array([2.0, 3.0, 4.0])) + t_inverse = t_original.inverse() + assert isapprox(t_inverse.x, -2.0) + assert isapprox(t_inverse.y, -3.0) + assert isapprox(t_inverse.z, -4.0) + + verbose and print("[Translation] Concatenation") + t1 = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) + t2 = nanoeigenpy.Translation(np.array([4.0, 5.0, 6.0])) + t_combined = t1 * t2 + assert isapprox(t_combined.x, 5.0) + assert isapprox(t_combined.y, 7.0) + assert isapprox(t_combined.z, 9.0) + + verbose and print("[Translation] isApprox") + t_approx1 = nanoeigenpy.Translation(np.array([1.0, 2.0, 3.0])) + t_approx2 = nanoeigenpy.Translation( + np.array([1.0 + 1e-15, 2.0 + 1e-15, 3.0 + 1e-15]) + ) + t_approx3 = nanoeigenpy.Translation(np.array([1.1, 2.1, 3.1])) + assert t_approx1.isApprox(t_approx2) + assert t_approx1.isApprox(t_approx2, 1e-12) + assert not t_approx1.isApprox(t_approx3) + + # --- JacobiRotation --------------------------------------------------------------- + verbose and print("[JacobiRotation] Default constructor") + j = nanoeigenpy.JacobiRotation() + assert hasattr(j, "c") + assert hasattr(j, "s") + + verbose and print("[JacobiRotation] Cosine-sine constructor") + c_val = 0.8 + s_val = 0.6 + j = nanoeigenpy.JacobiRotation(c_val, s_val) + assert isapprox(j.c, c_val) + assert isapprox(j.s, s_val) + + verbose and print("[JacobiRotation] Property access") + j.c = 0.8 + j.s = 0.6 + assert isapprox(j.c, 0.8) + assert isapprox(j.s, 0.6) + norm_squared = j.c**2 + j.s**2 + assert isapprox(norm_squared, 1.0, 1e-12) + + verbose and print("[JacobiRotation] Multiplication operator") + j1 = nanoeigenpy.JacobiRotation(0.8, 0.6) + j2 = nanoeigenpy.JacobiRotation(0.6, 0.8) + j_mult = j1 * j2 + assert hasattr(j_mult, "c") + assert hasattr(j_mult, "s") + norm_mult = j_mult.c**2 + j_mult.s**2 + assert isapprox(norm_mult, 1.0, 1e-12) + + verbose and print("[JacobiRotation] Transpose") + j = nanoeigenpy.JacobiRotation(0.8, 0.6) + j_t = j.transpose() + assert isapprox(j_t.c, j.c) + assert isapprox(j_t.s, -j.s) + + verbose and print("[JacobiRotation] Adjoint") + j = nanoeigenpy.JacobiRotation(0.8, 0.6) + j_adj = j.adjoint() + assert isapprox(j_adj.c, j.c) + assert isapprox(j_adj.s, -j.s) + + verbose and print("[JacobiRotation] Identity property") + j = nanoeigenpy.JacobiRotation(0.8, 0.6) + j_t = j.transpose() + identity = j * j_t + assert isapprox(identity.c, 1.0, 1e-12) + assert isapprox(identity.s, 0.0, 1e-12) + + verbose and print("[JacobiRotation] makeJacobi from scalars") + j = nanoeigenpy.JacobiRotation() + x, z = 4.0, 1.0 + y = 2.0 + result = j.makeJacobi(x, y, z) + assert isinstance(result, bool) + norm_after = j.c**2 + j.s**2 + assert isapprox(norm_after, 1.0, 1e-12) + + verbose and print("[JacobiRotation] makeJacobi from matrix") + M = np.array([[4.0, 2.0, 1.0], [2.0, 3.0, 0.5], [1.0, 0.5, 1.0]]) + j = nanoeigenpy.JacobiRotation() + result = j.makeJacobi(M, 0, 1) + assert isinstance(result, bool) + norm_matrix = j.c**2 + j.s**2 + assert isapprox(norm_matrix, 1.0, 1e-12) + + verbose and print("[JacobiRotation] makeGivens basic") + j = nanoeigenpy.JacobiRotation() + p_val = 3.0 + q_val = 4.0 + j.makeGivens(p_val, q_val) + norm_givens = j.c**2 + j.s**2 + assert isapprox(norm_givens, 1.0, 1e-12) + + verbose and print("[JacobiRotation] makeGivens with r parameter") + j = nanoeigenpy.JacobiRotation() + p_val = 3.0 + q_val = 4.0 + r_container = np.array([0.0]) + j.makeGivens(p_val, q_val, r_container.ctypes.data) + expected_r = np.sqrt(p_val**2 + q_val**2) # noqa + + verbose and print("[JacobiRotation] Edge cases") + j_zero = nanoeigenpy.JacobiRotation(1.0, 0.0) + assert isapprox(j_zero.c, 1.0) + assert isapprox(j_zero.s, 0.0) + + j_90 = nanoeigenpy.JacobiRotation(0.0, 1.0) + assert isapprox(j_90.c, 0.0) + assert isapprox(j_90.s, 1.0) + + j = nanoeigenpy.JacobiRotation() + j.makeGivens(5.0, 0.0) + assert isapprox(abs(j.c), 1.0) assert isapprox(j.s, 0.0) + + j.makeGivens(0.0, 5.0) + assert isapprox(j.c, 0.0) + assert isapprox(abs(j.s), 1.0) + + verbose and print("[JacobiRotation] makeJacobi small off-diagonal") + j = nanoeigenpy.JacobiRotation() + result = j.makeJacobi(1.0, 1e-15, 2.0) + assert isinstance(result, bool) + if not result: + assert isapprox(j.c, 1.0) + assert isapprox(j.s, 0.0) diff --git a/tests/test_hessenberg_decomposition.py b/tests/test_hessenberg_decomposition.py index 9a098027..a82d8d80 100644 --- a/tests/test_hessenberg_decomposition.py +++ b/tests/test_hessenberg_decomposition.py @@ -1,70 +1,72 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) - -hess = nanoeigenpy.HessenbergDecomposition(A) - -Q = hess.matrixQ() -H = hess.matrixH() - -if np.iscomplexobj(A): - A_reconstructed = Q @ H @ Q.conj().T -else: - A_reconstructed = Q @ H @ Q.T -assert nanoeigenpy.is_approx(A, A_reconstructed) - -for row in range(2, dim): - for col in range(row - 1): - assert abs(H[row, col]) < 1e-12 - -if np.iscomplexobj(Q): - QQ_conj = Q @ Q.conj().T -else: - QQ_conj = Q @ Q.T -assert nanoeigenpy.is_approx(QQ_conj, np.eye(dim)) - -A_test = rng.random((dim, dim)) -hess1 = nanoeigenpy.HessenbergDecomposition(dim) -hess1.compute(A_test) -hess2 = nanoeigenpy.HessenbergDecomposition(A_test) - -H1 = hess1.matrixH() -H2 = hess2.matrixH() -Q1 = hess1.matrixQ() -Q2 = hess2.matrixQ() - -assert nanoeigenpy.is_approx(H1, H2) -assert nanoeigenpy.is_approx(Q1, Q2) - -hCoeffs = hess.householderCoefficients() -packed = hess.packedMatrix() - -assert hCoeffs.shape == (dim - 1,) -assert packed.shape == (dim, dim) - -for i in range(dim): - for j in range(i - 1, dim): - if j >= 0: - assert abs(H[i, j] - packed[i, j]) < 1e-12 - -hess_default = nanoeigenpy.HessenbergDecomposition(dim) -hess_matrix = nanoeigenpy.HessenbergDecomposition(A) - -hess1_id = nanoeigenpy.HessenbergDecomposition(dim) -hess2_id = nanoeigenpy.HessenbergDecomposition(dim) -id1 = hess1_id.id() -id2 = hess2_id.id() -assert id1 != id2 -assert id1 == hess1_id.id() -assert id2 == hess2_id.id() - -hess3_id = nanoeigenpy.HessenbergDecomposition(A) -hess4_id = nanoeigenpy.HessenbergDecomposition(A) -id3 = hess3_id.id() -id4 = hess4_id.id() -assert id3 != id4 -assert id3 == hess3_id.id() -assert id4 == hess4_id.id() + +def test_hessenberg_decomposition(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) + + hess = nanoeigenpy.HessenbergDecomposition(A) + + Q = hess.matrixQ() + H = hess.matrixH() + + if np.iscomplexobj(A): + A_reconstructed = Q @ H @ Q.conj().T + else: + A_reconstructed = Q @ H @ Q.T + assert nanoeigenpy.is_approx(A, A_reconstructed) + + for row in range(2, dim): + for col in range(row - 1): + assert abs(H[row, col]) < 1e-12 + + if np.iscomplexobj(Q): + QQ_conj = Q @ Q.conj().T + else: + QQ_conj = Q @ Q.T + assert nanoeigenpy.is_approx(QQ_conj, np.eye(dim)) + + A_test = rng.random((dim, dim)) + hess1 = nanoeigenpy.HessenbergDecomposition(dim) + hess1.compute(A_test) + hess2 = nanoeigenpy.HessenbergDecomposition(A_test) + + H1 = hess1.matrixH() + H2 = hess2.matrixH() + Q1 = hess1.matrixQ() + Q2 = hess2.matrixQ() + + assert nanoeigenpy.is_approx(H1, H2) + assert nanoeigenpy.is_approx(Q1, Q2) + + hCoeffs = hess.householderCoefficients() + packed = hess.packedMatrix() + + assert hCoeffs.shape == (dim - 1,) + assert packed.shape == (dim, dim) + + for i in range(dim): + for j in range(i - 1, dim): + if j >= 0: + assert abs(H[i, j] - packed[i, j]) < 1e-12 + + hess_default = nanoeigenpy.HessenbergDecomposition(dim) # noqa + hess_matrix = nanoeigenpy.HessenbergDecomposition(A) # noqa + + hess1_id = nanoeigenpy.HessenbergDecomposition(dim) + hess2_id = nanoeigenpy.HessenbergDecomposition(dim) + id1 = hess1_id.id() + id2 = hess2_id.id() + assert id1 != id2 + assert id1 == hess1_id.id() + assert id2 == hess2_id.id() + + hess3_id = nanoeigenpy.HessenbergDecomposition(A) + hess4_id = nanoeigenpy.HessenbergDecomposition(A) + id3 = hess3_id.id() + id4 = hess4_id.id() + assert id3 != id4 + assert id3 == hess3_id.id() + assert id4 == hess4_id.id() diff --git a/tests/test_import_extension.py b/tests/test_import_extension.py new file mode 100644 index 00000000..56b01bb2 --- /dev/null +++ b/tests/test_import_extension.py @@ -0,0 +1,5 @@ +import nanoeigenpy + + +def test_import_nanoeigenpy(): + assert hasattr(nanoeigenpy, "EigenSolver") diff --git a/tests/test_incomplete_cholesky.py b/tests/test_incomplete_cholesky.py index 01f4f11f..3bd74b04 100644 --- a/tests/test_incomplete_cholesky.py +++ b/tests/test_incomplete_cholesky.py @@ -1,71 +1,72 @@ +import nanoeigenpy import numpy as np from scipy.sparse import csc_matrix -import nanoeigenpy -dim = 100 -rng = np.random.default_rng() - -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(5.0 + rng.random(dim)) -A = csc_matrix(A) - -ichol = nanoeigenpy.solvers.IncompleteCholesky(A) -assert ichol.info() == nanoeigenpy.ComputationInfo.Success -assert ichol.rows() == dim -assert ichol.cols() == dim - -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = ichol.solve(B) -assert isinstance(X_est, np.ndarray) -residual = np.linalg.norm(B - A.dot(X_est)) / np.linalg.norm(B) -assert residual < 0.1 - -x = rng.random(dim) -b = A.dot(x) -x_est = ichol.solve(b) -assert isinstance(x_est, np.ndarray) -residual = np.linalg.norm(b - A.dot(x_est)) / np.linalg.norm(b) -assert residual < 0.1 - -X_sparse = csc_matrix(rng.random((dim, 10))) -B_sparse = A.dot(X_sparse).tocsc() -if not B_sparse.has_sorted_indices: - B_sparse.sort_indices() -X_est_sparse = ichol.solve(B_sparse) -assert isinstance(X_est_sparse, csc_matrix) - -ichol.analyzePattern(A) -ichol.factorize(A) -ichol.compute(A) -assert ichol.info() == nanoeigenpy.ComputationInfo.Success - -L = ichol.matrixL() -S_diag = ichol.scalingS() -perm = ichol.permutationP() -P = perm.toDenseMatrix() - -assert isinstance(L, csc_matrix) -assert isinstance(S_diag, np.ndarray) -assert L.shape == (dim, dim) -assert S_diag.shape == (dim,) - -L_dense = L.toarray() -upper_part = np.triu(L_dense, k=1) -assert np.allclose(upper_part, 0, atol=1e-12) - -assert np.all(S_diag > 0) - -S = csc_matrix((S_diag, (range(dim), range(dim))), shape=(dim, dim)) - -PA = P @ A -PAP = PA @ P.T -SPAP = S @ PAP -SPAPS = SPAP @ S - -LLT = L @ L.T - -diff = SPAPS - LLT -relative_error = np.linalg.norm(diff.data) / np.linalg.norm(SPAPS.data) -assert relative_error < 0.5 +def test_incomplete_cholesky(): + dim = 100 + rng = np.random.default_rng() + + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(5.0 + rng.random(dim)) + A = csc_matrix(A) + + ichol = nanoeigenpy.solvers.IncompleteCholesky(A) + assert ichol.info() == nanoeigenpy.ComputationInfo.Success + assert ichol.rows() == dim + assert ichol.cols() == dim + + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = ichol.solve(B) + assert isinstance(X_est, np.ndarray) + residual = np.linalg.norm(B - A.dot(X_est)) / np.linalg.norm(B) + assert residual < 0.1 + + x = rng.random(dim) + b = A.dot(x) + x_est = ichol.solve(b) + assert isinstance(x_est, np.ndarray) + residual = np.linalg.norm(b - A.dot(x_est)) / np.linalg.norm(b) + assert residual < 0.1 + + X_sparse = csc_matrix(rng.random((dim, 10))) + B_sparse = A.dot(X_sparse).tocsc() + if not B_sparse.has_sorted_indices: + B_sparse.sort_indices() + X_est_sparse = ichol.solve(B_sparse) + assert isinstance(X_est_sparse, csc_matrix) + + ichol.analyzePattern(A) + ichol.factorize(A) + ichol.compute(A) + assert ichol.info() == nanoeigenpy.ComputationInfo.Success + + L = ichol.matrixL() + S_diag = ichol.scalingS() + perm = ichol.permutationP() + P = perm.toDenseMatrix() + + assert isinstance(L, csc_matrix) + assert isinstance(S_diag, np.ndarray) + assert L.shape == (dim, dim) + assert S_diag.shape == (dim,) + + L_dense = L.toarray() + upper_part = np.triu(L_dense, k=1) + assert np.allclose(upper_part, 0, atol=1e-12) + + assert np.all(S_diag > 0) + + S = csc_matrix((S_diag, (range(dim), range(dim))), shape=(dim, dim)) + + PA = P @ A + PAP = PA @ P.T + SPAP = S @ PAP + SPAPS = SPAP @ S + + LLT = L @ L.T + + diff = SPAPS - LLT + relative_error = np.linalg.norm(diff.data) / np.linalg.norm(SPAPS.data) + assert relative_error < 0.5 diff --git a/tests/test_incomplete_lut.py b/tests/test_incomplete_lut.py index 4405e937..16afeb22 100644 --- a/tests/test_incomplete_lut.py +++ b/tests/test_incomplete_lut.py @@ -1,49 +1,51 @@ +import nanoeigenpy import numpy as np from scipy.sparse import csc_matrix -import nanoeigenpy -dim = 100 -rng = np.random.default_rng() - -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(5.0 + rng.random(dim)) -A = csc_matrix(A) - -ilut = nanoeigenpy.solvers.IncompleteLUT(A) -assert ilut.info() == nanoeigenpy.ComputationInfo.Success -assert ilut.rows() == dim -assert ilut.cols() == dim - -X = rng.random((dim, 100)) -B = A.dot(X) -X_est = ilut.solve(B) -assert isinstance(X_est, np.ndarray) -residual = np.linalg.norm(B - A.dot(X_est)) / np.linalg.norm(B) -assert residual < 0.1 - -x = rng.random(dim) -b = A.dot(x) -x_est = ilut.solve(b) -assert isinstance(x_est, np.ndarray) -residual = np.linalg.norm(b - A.dot(x_est)) / np.linalg.norm(b) -assert residual < 0.1 - -X_sparse = csc_matrix(rng.random((dim, 10))) -B_sparse = A.dot(X_sparse).tocsc() -if not B_sparse.has_sorted_indices: - B_sparse.sort_indices() -X_est_sparse = ilut.solve(B_sparse) -assert isinstance(X_est_sparse, csc_matrix) - -ilut.analyzePattern(A) -ilut.factorize(A) -assert ilut.info() == nanoeigenpy.ComputationInfo.Success - -ilut_params = nanoeigenpy.solvers.IncompleteLUT(A, 1e-4, 15) -assert ilut_params.info() == nanoeigenpy.ComputationInfo.Success - -ilut_set = nanoeigenpy.solvers.IncompleteLUT() -ilut_set.setDroptol(1e-3) -ilut_set.setFillfactor(20) -ilut_set.compute(A) -assert ilut_set.info() == nanoeigenpy.ComputationInfo.Success + +def test_incomplete_lut(): + dim = 100 + rng = np.random.default_rng() + + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(5.0 + rng.random(dim)) + A = csc_matrix(A) + + ilut = nanoeigenpy.solvers.IncompleteLUT(A) + assert ilut.info() == nanoeigenpy.ComputationInfo.Success + assert ilut.rows() == dim + assert ilut.cols() == dim + + X = rng.random((dim, 100)) + B = A.dot(X) + X_est = ilut.solve(B) + assert isinstance(X_est, np.ndarray) + residual = np.linalg.norm(B - A.dot(X_est)) / np.linalg.norm(B) + assert residual < 0.1 + + x = rng.random(dim) + b = A.dot(x) + x_est = ilut.solve(b) + assert isinstance(x_est, np.ndarray) + residual = np.linalg.norm(b - A.dot(x_est)) / np.linalg.norm(b) + assert residual < 0.1 + + X_sparse = csc_matrix(rng.random((dim, 10))) + B_sparse = A.dot(X_sparse).tocsc() + if not B_sparse.has_sorted_indices: + B_sparse.sort_indices() + X_est_sparse = ilut.solve(B_sparse) + assert isinstance(X_est_sparse, csc_matrix) + + ilut.analyzePattern(A) + ilut.factorize(A) + assert ilut.info() == nanoeigenpy.ComputationInfo.Success + + ilut_params = nanoeigenpy.solvers.IncompleteLUT(A, 1e-4, 15) + assert ilut_params.info() == nanoeigenpy.ComputationInfo.Success + + ilut_set = nanoeigenpy.solvers.IncompleteLUT() + ilut_set.setDroptol(1e-3) + ilut_set.setFillfactor(20) + ilut_set.compute(A) + assert ilut_set.info() == nanoeigenpy.ComputationInfo.Success diff --git a/tests/test_jacobi_svd.py b/tests/test_jacobi_svd.py index 8d0f0666..dd14c39e 100644 --- a/tests/test_jacobi_svd.py +++ b/tests/test_jacobi_svd.py @@ -111,9 +111,3 @@ def test_jacobi(cls, options): S_matrix = np.diag(S) A_reconstructed = U @ S_matrix @ V.T assert nanoeigenpy.is_approx(A, A_reconstructed) - - -if __name__ == "__main__": - import sys - - sys.exit(pytest.main(sys.argv)) diff --git a/tests/test_ldlt.py b/tests/test_ldlt.py index d8448636..9a2484bf 100644 --- a/tests/test_ldlt.py +++ b/tests/test_ldlt.py @@ -1,96 +1,98 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() - -A_neg = -np.eye(dim) -ldlt_neg = nanoeigenpy.LDLT(A_neg) -assert ldlt_neg.isNegative() -assert not ldlt_neg.isPositive() - -A_pos = np.eye(dim) -ldlt_pos = nanoeigenpy.LDLT(A_pos) -assert ldlt_pos.isPositive() -assert not ldlt_pos.isNegative() - -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) - -ldlt = nanoeigenpy.LDLT(A) -assert ldlt.info() == nanoeigenpy.ComputationInfo.Success - -L = ldlt.matrixL() -D = ldlt.vectorD() -P = ldlt.transpositionsP() -assert nanoeigenpy.is_approx( - np.transpose(P).dot(L.dot(np.diag(D).dot(np.transpose(L).dot(P)))), A -) - -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = ldlt.solve(B) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) - -x = rng.random(dim) -b = A.dot(x) -x_est = ldlt.solve(b) -assert nanoeigenpy.is_approx(x, x_est) -assert nanoeigenpy.is_approx(A.dot(x_est), b) - -A_reconstructed = ldlt.reconstructedMatrix() -assert nanoeigenpy.is_approx(A_reconstructed, A) - -adjoint = ldlt.adjoint() -assert adjoint is ldlt - -A_cond = np.eye(dim) -ldlt_cond = nanoeigenpy.LDLT(A_cond) -estimated_r_cond_num = ldlt_cond.rcond() -assert abs(estimated_r_cond_num - 1) <= 1e-9 - -ldlt_compute = ldlt.compute(A) - -LDLT = ldlt.matrixLDLT() -LDLT_lower_without_diag = np.tril(LDLT, k=-1) -L_lower_without_diag = np.tril(L, k=-1) -assert nanoeigenpy.is_approx(LDLT_lower_without_diag, L_lower_without_diag) - -A_upper_without_diag = np.triu(A, k=1) -LLT_upper_without_diag = np.triu(LDLT, k=1) -assert nanoeigenpy.is_approx(A_upper_without_diag, LLT_upper_without_diag) - -LDLT_diag = np.diagonal(LDLT) -assert nanoeigenpy.is_approx(LDLT_diag, D) - -sigma = 3 -w = np.ones(dim) -ldlt.rankUpdate(w, sigma) -L = ldlt.matrixL() -D = ldlt.vectorD() -P = ldlt.transpositionsP() -A_updated = np.transpose(P).dot(L.dot(np.diag(D).dot(np.transpose(L).dot(P)))) -assert nanoeigenpy.is_approx(A_updated, A + sigma * w * np.transpose(w)) - -ldlt1 = nanoeigenpy.LDLT() -ldlt2 = nanoeigenpy.LDLT() - -id1 = ldlt1.id() -id2 = ldlt2.id() - -assert id1 != id2 -assert id1 == ldlt1.id() -assert id2 == ldlt2.id() - -dim_constructor = 3 - -ldlt3 = nanoeigenpy.LDLT(dim_constructor) -ldlt4 = nanoeigenpy.LDLT(dim_constructor) - -id3 = ldlt3.id() -id4 = ldlt4.id() - -assert id3 != id4 -assert id3 == ldlt3.id() -assert id4 == ldlt4.id() + +def test_ldlt(): + dim = 100 + rng = np.random.default_rng() + + A_neg = -np.eye(dim) + ldlt_neg = nanoeigenpy.LDLT(A_neg) + assert ldlt_neg.isNegative() + assert not ldlt_neg.isPositive() + + A_pos = np.eye(dim) + ldlt_pos = nanoeigenpy.LDLT(A_pos) + assert ldlt_pos.isPositive() + assert not ldlt_pos.isNegative() + + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) + + ldlt = nanoeigenpy.LDLT(A) + assert ldlt.info() == nanoeigenpy.ComputationInfo.Success + + L = ldlt.matrixL() + D = ldlt.vectorD() + P = ldlt.transpositionsP() + assert nanoeigenpy.is_approx( + np.transpose(P).dot(L.dot(np.diag(D).dot(np.transpose(L).dot(P)))), A + ) + + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = ldlt.solve(B) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) + + x = rng.random(dim) + b = A.dot(x) + x_est = ldlt.solve(b) + assert nanoeigenpy.is_approx(x, x_est) + assert nanoeigenpy.is_approx(A.dot(x_est), b) + + A_reconstructed = ldlt.reconstructedMatrix() + assert nanoeigenpy.is_approx(A_reconstructed, A) + + adjoint = ldlt.adjoint() + assert adjoint is ldlt + + A_cond = np.eye(dim) + ldlt_cond = nanoeigenpy.LDLT(A_cond) + estimated_r_cond_num = ldlt_cond.rcond() + assert abs(estimated_r_cond_num - 1) <= 1e-9 + + ldlt_compute = ldlt.compute(A) # noqa + + LDLT = ldlt.matrixLDLT() + LDLT_lower_without_diag = np.tril(LDLT, k=-1) + L_lower_without_diag = np.tril(L, k=-1) + assert nanoeigenpy.is_approx(LDLT_lower_without_diag, L_lower_without_diag) + + A_upper_without_diag = np.triu(A, k=1) + LLT_upper_without_diag = np.triu(LDLT, k=1) + assert nanoeigenpy.is_approx(A_upper_without_diag, LLT_upper_without_diag) + + LDLT_diag = np.diagonal(LDLT) + assert nanoeigenpy.is_approx(LDLT_diag, D) + + sigma = 3 + w = np.ones(dim) + ldlt.rankUpdate(w, sigma) + L = ldlt.matrixL() + D = ldlt.vectorD() + P = ldlt.transpositionsP() + A_updated = np.transpose(P).dot(L.dot(np.diag(D).dot(np.transpose(L).dot(P)))) + assert nanoeigenpy.is_approx(A_updated, A + sigma * w * np.transpose(w)) + + ldlt1 = nanoeigenpy.LDLT() + ldlt2 = nanoeigenpy.LDLT() + + id1 = ldlt1.id() + id2 = ldlt2.id() + + assert id1 != id2 + assert id1 == ldlt1.id() + assert id2 == ldlt2.id() + + dim_constructor = 3 + + ldlt3 = nanoeigenpy.LDLT(dim_constructor) + ldlt4 = nanoeigenpy.LDLT(dim_constructor) + + id3 = ldlt3.id() + id4 = ldlt4.id() + + assert id3 != id4 + assert id3 == ldlt3.id() + assert id4 == ldlt4.id() diff --git a/tests/test_llt.py b/tests/test_llt.py index f2b953d5..dd0e6c96 100644 --- a/tests/test_llt.py +++ b/tests/test_llt.py @@ -1,80 +1,82 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) +def test_llt(): + dim = 100 + rng = np.random.default_rng() -llt = nanoeigenpy.LLT(A) + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) -assert llt.info() == nanoeigenpy.ComputationInfo.Success + llt = nanoeigenpy.LLT(A) -L = llt.matrixL() -assert nanoeigenpy.is_approx(L.dot(np.transpose(L)), A) + assert llt.info() == nanoeigenpy.ComputationInfo.Success -U = llt.matrixU() -LU = L @ U -assert nanoeigenpy.is_approx(LU, A) + L = llt.matrixL() + assert nanoeigenpy.is_approx(L.dot(np.transpose(L)), A) -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = llt.solve(B) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) + U = llt.matrixU() + LU = L @ U + assert nanoeigenpy.is_approx(LU, A) -x = rng.random(dim) -b = A.dot(x) -x_est = llt.solve(b) -assert nanoeigenpy.is_approx(x, x_est) -assert nanoeigenpy.is_approx(A.dot(x_est), b) + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = llt.solve(B) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) -LLT = llt.matrixLLT() -LLT_lower = np.tril(LLT) -assert nanoeigenpy.is_approx(LLT_lower, L) + x = rng.random(dim) + b = A.dot(x) + x_est = llt.solve(b) + assert nanoeigenpy.is_approx(x, x_est) + assert nanoeigenpy.is_approx(A.dot(x_est), b) -A_upper = np.triu(A, k=1) -LLT_upper = np.triu(LLT, k=1) -assert nanoeigenpy.is_approx(A_upper, LLT_upper) + LLT = llt.matrixLLT() + LLT_lower = np.tril(LLT) + assert nanoeigenpy.is_approx(LLT_lower, L) -A_reconstructed = llt.reconstructedMatrix() -assert nanoeigenpy.is_approx(A_reconstructed, A) + A_upper = np.triu(A, k=1) + LLT_upper = np.triu(LLT, k=1) + assert nanoeigenpy.is_approx(A_upper, LLT_upper) -adjoint = llt.adjoint() -assert adjoint is llt + A_reconstructed = llt.reconstructedMatrix() + assert nanoeigenpy.is_approx(A_reconstructed, A) -A_cond = np.eye(dim) -llt_cond = nanoeigenpy.LLT(A_cond) -estimated_r_cond_num = llt_cond.rcond() -assert abs(estimated_r_cond_num - 1) <= 1e-9 + adjoint = llt.adjoint() + assert adjoint is llt -sigma = 3 -w = np.ones(dim) -llt.rankUpdate(w, sigma) -L = llt.matrixL() -U = llt.matrixU() -LU = L @ U -assert nanoeigenpy.is_approx(LU, A + sigma * w * np.transpose(w)) + A_cond = np.eye(dim) + llt_cond = nanoeigenpy.LLT(A_cond) + estimated_r_cond_num = llt_cond.rcond() + assert abs(estimated_r_cond_num - 1) <= 1e-9 -llt1 = nanoeigenpy.LLT() -llt2 = nanoeigenpy.LLT() + sigma = 3 + w = np.ones(dim) + llt.rankUpdate(w, sigma) + L = llt.matrixL() + U = llt.matrixU() + LU = L @ U + assert nanoeigenpy.is_approx(LU, A + sigma * w * np.transpose(w)) -id1 = llt1.id() -id2 = llt2.id() + llt1 = nanoeigenpy.LLT() + llt2 = nanoeigenpy.LLT() -assert id1 != id2 -assert id1 == llt1.id() -assert id2 == llt2.id() + id1 = llt1.id() + id2 = llt2.id() -dim_constructor = 3 + assert id1 != id2 + assert id1 == llt1.id() + assert id2 == llt2.id() -llt3 = nanoeigenpy.LLT(dim_constructor) -llt4 = nanoeigenpy.LLT(dim_constructor) + dim_constructor = 3 -id3 = llt3.id() -id4 = llt4.id() + llt3 = nanoeigenpy.LLT(dim_constructor) + llt4 = nanoeigenpy.LLT(dim_constructor) -assert id3 != id4 -assert id3 == llt3.id() -assert id4 == llt4.id() + id3 = llt3.id() + id4 = llt4.id() + + assert id3 != id4 + assert id3 == llt3.id() + assert id4 == llt4.id() diff --git a/tests/test_partial_piv_lu.py b/tests/test_partial_piv_lu.py index 98554c60..1e6e5ee3 100644 --- a/tests/test_partial_piv_lu.py +++ b/tests/test_partial_piv_lu.py @@ -1,75 +1,77 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) -partialpivlu = nanoeigenpy.PartialPivLU(A) -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = partialpivlu.solve(B) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) +def test_partial_piv_lu(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + np.diag(10.0 + rng.random(dim)) + partialpivlu = nanoeigenpy.PartialPivLU(A) -x = rng.random(dim) -b = A.dot(x) -x_est = partialpivlu.solve(b) -assert nanoeigenpy.is_approx(x, x_est) -assert nanoeigenpy.is_approx(A.dot(x_est), b) + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = partialpivlu.solve(B) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) -rows = partialpivlu.rows() -cols = partialpivlu.cols() -assert cols == dim -assert rows == dim + x = rng.random(dim) + b = A.dot(x) + x_est = partialpivlu.solve(b) + assert nanoeigenpy.is_approx(x, x_est) + assert nanoeigenpy.is_approx(A.dot(x_est), b) -partialpivlu_compute = partialpivlu.compute(A) -A_reconstructed = partialpivlu.reconstructedMatrix() -assert nanoeigenpy.is_approx(A_reconstructed, A) + rows = partialpivlu.rows() + cols = partialpivlu.cols() + assert cols == dim + assert rows == dim -LU = partialpivlu.matrixLU() -P_perm = partialpivlu.permutationP() -P = P_perm.toDenseMatrix() + partialpivlu_compute = partialpivlu.compute(A) # noqa + A_reconstructed = partialpivlu.reconstructedMatrix() + assert nanoeigenpy.is_approx(A_reconstructed, A) -U = np.triu(LU) -L = np.eye(dim) + np.tril(LU, -1) -assert nanoeigenpy.is_approx(P @ A, L @ U) + LU = partialpivlu.matrixLU() + P_perm = partialpivlu.permutationP() + P = P_perm.toDenseMatrix() -inverse = partialpivlu.inverse() -assert nanoeigenpy.is_approx(A @ inverse, np.eye(dim)) -assert nanoeigenpy.is_approx(inverse @ A, np.eye(dim)) + U = np.triu(LU) + L = np.eye(dim) + np.tril(LU, -1) + assert nanoeigenpy.is_approx(P @ A, L @ U) -rcond = partialpivlu.rcond() -determinant = partialpivlu.determinant() -det_numpy = np.linalg.det(A) -assert rcond > 0 -assert abs(determinant - det_numpy) / abs(det_numpy) < 1e-10 + inverse = partialpivlu.inverse() + assert nanoeigenpy.is_approx(A @ inverse, np.eye(dim)) + assert nanoeigenpy.is_approx(inverse @ A, np.eye(dim)) -P_inv = P_perm.inverse().toDenseMatrix() -assert nanoeigenpy.is_approx(P @ P_inv, np.eye(dim)) -assert nanoeigenpy.is_approx(P_inv @ P, np.eye(dim)) + rcond = partialpivlu.rcond() + determinant = partialpivlu.determinant() + det_numpy = np.linalg.det(A) + assert rcond > 0 + assert abs(determinant - det_numpy) / abs(det_numpy) < 1e-10 -decomp1 = nanoeigenpy.PartialPivLU() -decomp2 = nanoeigenpy.PartialPivLU() -id1 = decomp1.id() -id2 = decomp2.id() -assert id1 != id2 -assert id1 == decomp1.id() -assert id2 == decomp2.id() + P_inv = P_perm.inverse().toDenseMatrix() + assert nanoeigenpy.is_approx(P @ P_inv, np.eye(dim)) + assert nanoeigenpy.is_approx(P_inv @ P, np.eye(dim)) -decomp3 = nanoeigenpy.PartialPivLU(dim) -decomp4 = nanoeigenpy.PartialPivLU(dim) -id3 = decomp3.id() -id4 = decomp4.id() -assert id3 != id4 -assert id3 == decomp3.id() -assert id4 == decomp4.id() + decomp1 = nanoeigenpy.PartialPivLU() + decomp2 = nanoeigenpy.PartialPivLU() + id1 = decomp1.id() + id2 = decomp2.id() + assert id1 != id2 + assert id1 == decomp1.id() + assert id2 == decomp2.id() -decomp5 = nanoeigenpy.PartialPivLU(A) -decomp6 = nanoeigenpy.PartialPivLU(A) -id5 = decomp5.id() -id6 = decomp6.id() -assert id5 != id6 -assert id5 == decomp5.id() -assert id6 == decomp6.id() + decomp3 = nanoeigenpy.PartialPivLU(dim) + decomp4 = nanoeigenpy.PartialPivLU(dim) + id3 = decomp3.id() + id4 = decomp4.id() + assert id3 != id4 + assert id3 == decomp3.id() + assert id4 == decomp4.id() + + decomp5 = nanoeigenpy.PartialPivLU(A) + decomp6 = nanoeigenpy.PartialPivLU(A) + id5 = decomp5.id() + id6 = decomp6.id() + assert id5 != id6 + assert id5 == decomp5.id() + assert id6 == decomp6.id() diff --git a/tests/test_permutation_matrix.py b/tests/test_permutation_matrix.py index 29e76f8c..95c74f67 100644 --- a/tests/test_permutation_matrix.py +++ b/tests/test_permutation_matrix.py @@ -1,59 +1,61 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -indices = rng.permutation(dim) -perm = nanoeigenpy.PermutationMatrix(dim) -perm = nanoeigenpy.PermutationMatrix(indices) +def test_permutation_matrix(): + dim = 100 + rng = np.random.default_rng() + indices = rng.permutation(dim) -est_indices = perm.indices() -assert est_indices.all() == indices.all() + perm = nanoeigenpy.PermutationMatrix(dim) + perm = nanoeigenpy.PermutationMatrix(indices) -perm_left = perm.applyTranspositionOnTheLeft(0, 1) -perm_left_right = perm_left.applyTranspositionOnTheRight(0, 1) -assert perm_left_right.indices().all() == perm.indices().all() + est_indices = perm.indices() + assert est_indices.all() == indices.all() -perm.setIdentity() -assert perm.indices().all() == np.arange(dim).all() -dim = dim + 1 -perm.setIdentity(dim) -assert perm.indices().all() == np.arange(dim).all() + perm_left = perm.applyTranspositionOnTheLeft(0, 1) + perm_left_right = perm_left.applyTranspositionOnTheRight(0, 1) + assert perm_left_right.indices().all() == perm.indices().all() -perm.setIdentity() -dense = perm.toDenseMatrix() -assert dense.all() == np.eye(dim).all() + perm.setIdentity() + assert perm.indices().all() == np.arange(dim).all() + dim = dim + 1 + perm.setIdentity(dim) + assert perm.indices().all() == np.arange(dim).all() -perm = nanoeigenpy.PermutationMatrix(np.array([1, 0, 2])) -perm_t = perm.transpose() -dense = perm.toDenseMatrix() -dense_t = perm_t.toDenseMatrix() -assert dense_t.all() == dense.T.all() + perm.setIdentity() + dense = perm.toDenseMatrix() + assert dense.all() == np.eye(dim).all() -perm_inv = perm.inverse() -result = perm * perm_inv -identity = result.toDenseMatrix() -assert identity.all() == np.eye(3).all() + perm = nanoeigenpy.PermutationMatrix(np.array([1, 0, 2])) + perm_t = perm.transpose() + dense = perm.toDenseMatrix() + dense_t = perm_t.toDenseMatrix() + assert dense_t.all() == dense.T.all() -dim_constructor = 3 + perm_inv = perm.inverse() + result = perm * perm_inv + identity = result.toDenseMatrix() + assert identity.all() == np.eye(3).all() -perm1 = nanoeigenpy.PermutationMatrix(dim_constructor) -perm2 = nanoeigenpy.PermutationMatrix(dim_constructor) + dim_constructor = 3 -id1 = perm1.id() -id2 = perm2.id() + perm1 = nanoeigenpy.PermutationMatrix(dim_constructor) + perm2 = nanoeigenpy.PermutationMatrix(dim_constructor) -assert id1 != id2 -assert id1 == perm1.id() -assert id2 == perm2.id() + id1 = perm1.id() + id2 = perm2.id() -es3 = nanoeigenpy.PermutationMatrix(indices) -es4 = nanoeigenpy.PermutationMatrix(indices) + assert id1 != id2 + assert id1 == perm1.id() + assert id2 == perm2.id() -id3 = es3.id() -id4 = es4.id() + es3 = nanoeigenpy.PermutationMatrix(indices) + es4 = nanoeigenpy.PermutationMatrix(indices) -assert id3 != id4 -assert id3 == es3.id() -assert id4 == es4.id() + id3 = es3.id() + id4 = es4.id() + + assert id3 != id4 + assert id3 == es3.id() + assert id4 == es4.id() diff --git a/tests/test_qr.py b/tests/test_qr.py index fa0f194b..5dacbbd4 100644 --- a/tests/test_qr.py +++ b/tests/test_qr.py @@ -1,100 +1,102 @@ import nanoeigenpy import numpy as np -rows = 20 -cols = 100 -rng = np.random.default_rng() - -A = rng.random((rows, cols)) - -householder_qr = nanoeigenpy.HouseholderQR() -householder_qr = nanoeigenpy.HouseholderQR(rows, cols) -householder_qr = nanoeigenpy.HouseholderQR(A) - -householder_qr_eye = nanoeigenpy.HouseholderQR(np.eye(rows, rows)) -X = rng.random((rows, 20)) -assert householder_qr_eye.absDeterminant() == 1.0 -assert householder_qr_eye.logAbsDeterminant() == 0.0 - -Y = householder_qr_eye.solve(X) -assert (X == Y).all() - -x = rng.random(rows) -y = householder_qr_eye.solve(x) -assert (x == y).all() - -fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR() -fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR(rows, cols) -fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR(A) - -fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR(np.eye(rows, rows)) -assert fullpiv_householder_qr.isSurjective() -assert fullpiv_householder_qr.isInjective() -fullpiv_householder_qr.isInvertible() - -X = rng.random((rows, 20)) -assert fullpiv_householder_qr.absDeterminant() == 1.0 -assert fullpiv_householder_qr.logAbsDeterminant() == 0.0 - -Y = fullpiv_householder_qr.solve(X) -assert (X == Y).all() -assert fullpiv_householder_qr.rank() == rows - -x = rng.random(rows) -y = fullpiv_householder_qr.solve(x) -assert (x == y).all() - -fullpiv_householder_qr.setThreshold() -fullpiv_householder_qr.setThreshold(1e-8) -assert fullpiv_householder_qr.threshold() == 1e-8 -assert nanoeigenpy.is_approx(np.eye(rows, rows), fullpiv_householder_qr.inverse()) - -assert fullpiv_householder_qr.maxPivot() == 1.0 -assert fullpiv_householder_qr.nonzeroPivots() == rows -assert fullpiv_householder_qr.dimensionOfKernel() == 0 - -colpiv_householder_qr = nanoeigenpy.ColPivHouseholderQR(A) -assert colpiv_householder_qr.info() == nanoeigenpy.ComputationInfo.Success - -colpiv_householder_qr = nanoeigenpy.ColPivHouseholderQR(np.eye(rows, rows)) -X = rng.random((rows, 20)) -assert colpiv_householder_qr.absDeterminant() == 1.0 -assert colpiv_householder_qr.logAbsDeterminant() == 0.0 - -Y = colpiv_householder_qr.solve(X) -assert (X == Y).all() -assert colpiv_householder_qr.rank() == rows - -colpiv_householder_qr.setThreshold() -colpiv_householder_qr.setThreshold(1e-8) -assert colpiv_householder_qr.threshold() == 1e-8 -assert nanoeigenpy.is_approx(np.eye(rows, rows), colpiv_householder_qr.inverse()) - -assert colpiv_householder_qr.maxPivot() == 1.0 -assert colpiv_householder_qr.nonzeroPivots() == rows -assert colpiv_householder_qr.dimensionOfKernel() == 0 - -cod = nanoeigenpy.CompleteOrthogonalDecomposition(A) -assert cod.info() == nanoeigenpy.ComputationInfo.Success - -cod = nanoeigenpy.CompleteOrthogonalDecomposition(np.eye(rows, rows)) -X = rng.random((rows, 20)) -assert cod.absDeterminant() == 1.0 -assert cod.logAbsDeterminant() == 0.0 - -Y = cod.solve(X) -assert (X == Y).all() -assert cod.rank() == rows - -x = rng.random(rows) -y = cod.solve(x) -assert (x == y).all() - -cod.setThreshold() -cod.setThreshold(1e-8) -assert cod.threshold() == 1e-8 -assert nanoeigenpy.is_approx(np.eye(rows, rows), cod.pseudoInverse()) - -assert cod.maxPivot() == 1.0 -assert cod.nonzeroPivots() == rows -assert cod.dimensionOfKernel() == 0 + +def test_qr(): + rows = 20 + cols = 100 + rng = np.random.default_rng() + + A = rng.random((rows, cols)) + + householder_qr = nanoeigenpy.HouseholderQR() + householder_qr = nanoeigenpy.HouseholderQR(rows, cols) + householder_qr = nanoeigenpy.HouseholderQR(A) # noqa + + householder_qr_eye = nanoeigenpy.HouseholderQR(np.eye(rows, rows)) + X = rng.random((rows, 20)) + assert householder_qr_eye.absDeterminant() == 1.0 + assert householder_qr_eye.logAbsDeterminant() == 0.0 + + Y = householder_qr_eye.solve(X) + assert (X == Y).all() + + x = rng.random(rows) + y = householder_qr_eye.solve(x) + assert (x == y).all() + + fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR() + fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR(rows, cols) + fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR(A) + + fullpiv_householder_qr = nanoeigenpy.FullPivHouseholderQR(np.eye(rows, rows)) + assert fullpiv_householder_qr.isSurjective() + assert fullpiv_householder_qr.isInjective() + fullpiv_householder_qr.isInvertible() + + X = rng.random((rows, 20)) + assert fullpiv_householder_qr.absDeterminant() == 1.0 + assert fullpiv_householder_qr.logAbsDeterminant() == 0.0 + + Y = fullpiv_householder_qr.solve(X) + assert (X == Y).all() + assert fullpiv_householder_qr.rank() == rows + + x = rng.random(rows) + y = fullpiv_householder_qr.solve(x) + assert (x == y).all() + + fullpiv_householder_qr.setThreshold() + fullpiv_householder_qr.setThreshold(1e-8) + assert fullpiv_householder_qr.threshold() == 1e-8 + assert nanoeigenpy.is_approx(np.eye(rows, rows), fullpiv_householder_qr.inverse()) + + assert fullpiv_householder_qr.maxPivot() == 1.0 + assert fullpiv_householder_qr.nonzeroPivots() == rows + assert fullpiv_householder_qr.dimensionOfKernel() == 0 + + colpiv_householder_qr = nanoeigenpy.ColPivHouseholderQR(A) + assert colpiv_householder_qr.info() == nanoeigenpy.ComputationInfo.Success + + colpiv_householder_qr = nanoeigenpy.ColPivHouseholderQR(np.eye(rows, rows)) + X = rng.random((rows, 20)) + assert colpiv_householder_qr.absDeterminant() == 1.0 + assert colpiv_householder_qr.logAbsDeterminant() == 0.0 + + Y = colpiv_householder_qr.solve(X) + assert (X == Y).all() + assert colpiv_householder_qr.rank() == rows + + colpiv_householder_qr.setThreshold() + colpiv_householder_qr.setThreshold(1e-8) + assert colpiv_householder_qr.threshold() == 1e-8 + assert nanoeigenpy.is_approx(np.eye(rows, rows), colpiv_householder_qr.inverse()) + + assert colpiv_householder_qr.maxPivot() == 1.0 + assert colpiv_householder_qr.nonzeroPivots() == rows + assert colpiv_householder_qr.dimensionOfKernel() == 0 + + cod = nanoeigenpy.CompleteOrthogonalDecomposition(A) + assert cod.info() == nanoeigenpy.ComputationInfo.Success + + cod = nanoeigenpy.CompleteOrthogonalDecomposition(np.eye(rows, rows)) + X = rng.random((rows, 20)) + assert cod.absDeterminant() == 1.0 + assert cod.logAbsDeterminant() == 0.0 + + Y = cod.solve(X) + assert (X == Y).all() + assert cod.rank() == rows + + x = rng.random(rows) + y = cod.solve(x) + assert (x == y).all() + + cod.setThreshold() + cod.setThreshold(1e-8) + assert cod.threshold() == 1e-8 + assert nanoeigenpy.is_approx(np.eye(rows, rows), cod.pseudoInverse()) + + assert cod.maxPivot() == 1.0 + assert cod.nonzeroPivots() == rows + assert cod.dimensionOfKernel() == 0 diff --git a/tests/test_real_qz.py b/tests/test_real_qz.py index 088708d9..e778f053 100644 --- a/tests/test_real_qz.py +++ b/tests/test_real_qz.py @@ -1,37 +1,39 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -B = rng.random((dim, dim)) - -realqz = nanoeigenpy.RealQZ(A, B) -assert realqz.info() == nanoeigenpy.ComputationInfo.Success - -Q = realqz.matrixQ() -S = realqz.matrixS() -Z = realqz.matrixZ() -T = realqz.matrixT() - -assert nanoeigenpy.is_approx(A, Q @ S @ Z) -assert nanoeigenpy.is_approx(B, Q @ T @ Z) - -assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim)) -assert nanoeigenpy.is_approx(Z @ Z.T, np.eye(dim)) - -for i in range(dim): - for j in range(i): - assert abs(T[i, j]) < 1e-12 - -for i in range(dim): - for j in range(i - 1): - assert abs(S[i, j]) < 1e-12 - -realqz3_id = nanoeigenpy.RealQZ(A, B) -realqz4_id = nanoeigenpy.RealQZ(A, B) -id3 = realqz3_id.id() -id4 = realqz4_id.id() -assert id3 != id4 -assert id3 == realqz3_id.id() -assert id4 == realqz4_id.id() + +def test_real_qz(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) + B = rng.random((dim, dim)) + + realqz = nanoeigenpy.RealQZ(A, B) + assert realqz.info() == nanoeigenpy.ComputationInfo.Success + + Q = realqz.matrixQ() + S = realqz.matrixS() + Z = realqz.matrixZ() + T = realqz.matrixT() + + assert nanoeigenpy.is_approx(A, Q @ S @ Z) + assert nanoeigenpy.is_approx(B, Q @ T @ Z) + + assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim)) + assert nanoeigenpy.is_approx(Z @ Z.T, np.eye(dim)) + + for i in range(dim): + for j in range(i): + assert abs(T[i, j]) < 1e-12 + + for i in range(dim): + for j in range(i - 1): + assert abs(S[i, j]) < 1e-12 + + realqz3_id = nanoeigenpy.RealQZ(A, B) + realqz4_id = nanoeigenpy.RealQZ(A, B) + id3 = realqz3_id.id() + id4 = realqz4_id.id() + assert id3 != id4 + assert id3 == realqz3_id.id() + assert id4 == realqz4_id.id() diff --git a/tests/test_real_schur.py b/tests/test_real_schur.py index 399675ae..9e9efe7b 100644 --- a/tests/test_real_schur.py +++ b/tests/test_real_schur.py @@ -2,47 +2,50 @@ import numpy as np -def verify_is_quasi_triangular(T): - size = T.shape[0] +def test_real_schur(): + def verify_is_quasi_triangular(T): + size = T.shape[0] - for row in range(2, size): - for col in range(row - 1): - assert abs(T[row, col]) < 1e-12 + for row in range(2, size): + for col in range(row - 1): + assert abs(T[row, col]) < 1e-12 - for row in range(1, size): - if abs(T[row, row - 1]) > 1e-12: - if row < size - 1: - assert abs(T[row + 1, row]) < 1e-12 + for row in range(1, size): + if abs(T[row, row - 1]) > 1e-12: + if row < size - 1: + assert abs(T[row + 1, row]) < 1e-12 - tr = T[row - 1, row - 1] + T[row, row] - det = T[row - 1, row - 1] * T[row, row] - T[row - 1, row] * T[row, row - 1] - assert 4 * det > tr * tr + tr = T[row - 1, row - 1] + T[row, row] + det = ( + T[row - 1, row - 1] * T[row, row] + - T[row - 1, row] * T[row, row - 1] + ) + assert 4 * det > tr * tr + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) + rs = nanoeigenpy.RealSchur(A) + assert rs.info() == nanoeigenpy.ComputationInfo.Success -rs = nanoeigenpy.RealSchur(A) -assert rs.info() == nanoeigenpy.ComputationInfo.Success + U = rs.matrixU() + T = rs.matrixT() -U = rs.matrixU() -T = rs.matrixT() + assert nanoeigenpy.is_approx(A, U @ T @ U.T) + assert nanoeigenpy.is_approx(U @ U.T, np.eye(dim)) -assert nanoeigenpy.is_approx(A, U @ T @ U.T) -assert nanoeigenpy.is_approx(U @ U.T, np.eye(dim)) + verify_is_quasi_triangular(T) -verify_is_quasi_triangular(T) + hess = nanoeigenpy.HessenbergDecomposition(A) + H = hess.matrixH() + Q_hess = hess.matrixQ() -hess = nanoeigenpy.HessenbergDecomposition(A) -H = hess.matrixH() -Q_hess = hess.matrixQ() + rs_from_hess = nanoeigenpy.RealSchur(dim) + result_from_hess = rs_from_hess.computeFromHessenberg(H, Q_hess, True) + assert result_from_hess.info() == nanoeigenpy.ComputationInfo.Success -rs_from_hess = nanoeigenpy.RealSchur(dim) -result_from_hess = rs_from_hess.computeFromHessenberg(H, Q_hess, True) -assert result_from_hess.info() == nanoeigenpy.ComputationInfo.Success + T_from_hess = rs_from_hess.matrixT() + U_from_hess = rs_from_hess.matrixU() -T_from_hess = rs_from_hess.matrixT() -U_from_hess = rs_from_hess.matrixU() - -assert nanoeigenpy.is_approx(A, U_from_hess @ T_from_hess @ U_from_hess.T) + assert nanoeigenpy.is_approx(A, U_from_hess @ T_from_hess @ U_from_hess.T) diff --git a/tests/test_self_adjoint_eigen_solver.py b/tests/test_self_adjoint_eigen_solver.py index d53ed89f..ae03b73b 100644 --- a/tests/test_self_adjoint_eigen_solver.py +++ b/tests/test_self_adjoint_eigen_solver.py @@ -1,20 +1,22 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 +def test_self_adjoint_eigen_solver(): + dim = 100 + rng = np.random.default_rng() -es = nanoeigenpy.SelfAdjointEigenSolver(A) + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 -assert es.info() == nanoeigenpy.ComputationInfo.Success + es = nanoeigenpy.SelfAdjointEigenSolver(A) -V = es.eigenvectors() -D = es.eigenvalues() + assert es.info() == nanoeigenpy.ComputationInfo.Success -AdotV = A @ V -VdotD = V @ np.diag(D) + V = es.eigenvectors() + D = es.eigenvalues() -assert nanoeigenpy.is_approx(AdotV, VdotD, 1e-6) + AdotV = A @ V + VdotD = V @ np.diag(D) + + assert nanoeigenpy.is_approx(AdotV, VdotD, 1e-6) diff --git a/tests/test_simplicial_llt.py b/tests/test_simplicial_llt.py index 12e8d460..d613fb78 100644 --- a/tests/test_simplicial_llt.py +++ b/tests/test_simplicial_llt.py @@ -2,45 +2,47 @@ import numpy as np import scipy.sparse as spa -dim = 100 -rng = np.random.default_rng() - -A_fac = spa.random(dim, dim, density=0.25, random_state=rng) -A = A_fac.T @ A_fac -A += spa.diags(10.0 * rng.standard_normal(dim) ** 2) -A = A.tocsc(True) -A.check_format() - -llt = nanoeigenpy.SimplicialLLT(A) - -assert llt.info() == nanoeigenpy.ComputationInfo.Success - -L = llt.matrixL() -U = llt.matrixU() - -LU = L @ U -perm = llt.permutationP().toDenseMatrix() -perm_inv = llt.permutationP().inverse().toDenseMatrix() -A_perm = perm @ A @ perm_inv -assert nanoeigenpy.is_approx(LU.toarray(), A_perm) - -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = llt.solve(B) -assert isinstance(X_est, np.ndarray) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) - -llt.analyzePattern(A) -llt.factorize(A) - -X_sparse = spa.random(dim, 10, random_state=rng) -B_sparse = A.dot(X_sparse) -B_sparse: spa.csc_matrix = B_sparse.tocsc(True) -if not B_sparse.has_sorted_indices: - B_sparse.sort_indices() - -X_est = llt.solve(B_sparse) -assert isinstance(X_est, spa.csc_matrix) -assert nanoeigenpy.is_approx(X_est.toarray(), X_sparse.toarray()) -assert nanoeigenpy.is_approx(A.dot(X_est.toarray()), B_sparse.toarray()) + +def test_simplicial_llt(): + dim = 100 + rng = np.random.default_rng() + + A_fac = spa.random(dim, dim, density=0.25, random_state=rng) + A = A_fac.T @ A_fac + A += spa.diags(10.0 * rng.standard_normal(dim) ** 2) + A = A.tocsc(True) + A.check_format() + + llt = nanoeigenpy.SimplicialLLT(A) + + assert llt.info() == nanoeigenpy.ComputationInfo.Success + + L = llt.matrixL() + U = llt.matrixU() + + LU = L @ U + perm = llt.permutationP().toDenseMatrix() + perm_inv = llt.permutationP().inverse().toDenseMatrix() + A_perm = perm @ A @ perm_inv + assert nanoeigenpy.is_approx(LU.toarray(), A_perm) + + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = llt.solve(B) + assert isinstance(X_est, np.ndarray) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) + + llt.analyzePattern(A) + llt.factorize(A) + + X_sparse = spa.random(dim, 10, random_state=rng) + B_sparse = A.dot(X_sparse) + B_sparse: spa.csc_matrix = B_sparse.tocsc(True) + if not B_sparse.has_sorted_indices: + B_sparse.sort_indices() + + X_est = llt.solve(B_sparse) + assert isinstance(X_est, spa.csc_matrix) + assert nanoeigenpy.is_approx(X_est.toarray(), X_sparse.toarray()) + assert nanoeigenpy.is_approx(A.dot(X_est.toarray()), B_sparse.toarray()) diff --git a/tests/test_sparse_lu.py b/tests/test_sparse_lu.py index 859b1f7b..5c5fa724 100644 --- a/tests/test_sparse_lu.py +++ b/tests/test_sparse_lu.py @@ -2,62 +2,64 @@ import numpy as np import scipy.sparse as spa -dim = 100 -rng = np.random.default_rng() - -A_fac = spa.random(dim, dim, density=0.25, random_state=rng) -A = A_fac.T @ A_fac -A += spa.diags(10.0 * rng.standard_normal(dim) ** 2) -A = A.tocsc(True) -A.check_format() - -splu = nanoeigenpy.SparseLU(A) - -assert splu.info() == nanoeigenpy.ComputationInfo.Success - -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = splu.solve(B) -assert isinstance(X_est, np.ndarray) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) - -splu.analyzePattern(A) -splu.factorize(A) - -X_sparse = spa.random(dim, 10, random_state=rng) -B_sparse = A.dot(X_sparse) -B_sparse: spa.csc_matrix = B_sparse.tocsc(True) -if not B_sparse.has_sorted_indices: - B_sparse.sort_indices() - -X_est = splu.solve(B_sparse) -assert isinstance(X_est, spa.csc_matrix) -assert nanoeigenpy.is_approx(X_est.toarray(), X_sparse.toarray()) -assert nanoeigenpy.is_approx(A.dot(X_est.toarray()), B_sparse.toarray()) - -assert splu.nnzL() > 0 -assert splu.nnzU() > 0 - -L = splu.matrixL() -U = splu.matrixU() - -assert L.rows() == dim -assert L.cols() == dim -assert U.rows() == dim -assert U.cols() == dim - -x_true = rng.random(dim) -b_true = A.dot(x_true) -P_rows_indices = splu.rowsPermutation().indices() -P_cols_indices = splu.colsPermutation().indices() - -b_permuted = b_true[P_rows_indices] -z = b_permuted.copy() -L.solveInPlace(z) -y = z.copy() -U.solveInPlace(y) -x_reconstructed = np.zeros(dim) -x_reconstructed[P_cols_indices] = y - -assert nanoeigenpy.is_approx(x_reconstructed, x_true, 1e-6) + +def test_sparse_lu(): + dim = 100 + rng = np.random.default_rng() + + A_fac = spa.random(dim, dim, density=0.25, random_state=rng) + A = A_fac.T @ A_fac + A += spa.diags(10.0 * rng.standard_normal(dim) ** 2) + A = A.tocsc(True) + A.check_format() + + splu = nanoeigenpy.SparseLU(A) + + assert splu.info() == nanoeigenpy.ComputationInfo.Success + + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = splu.solve(B) + assert isinstance(X_est, np.ndarray) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) + + splu.analyzePattern(A) + splu.factorize(A) + + X_sparse = spa.random(dim, 10, random_state=rng) + B_sparse = A.dot(X_sparse) + B_sparse: spa.csc_matrix = B_sparse.tocsc(True) + if not B_sparse.has_sorted_indices: + B_sparse.sort_indices() + + X_est = splu.solve(B_sparse) + assert isinstance(X_est, spa.csc_matrix) + assert nanoeigenpy.is_approx(X_est.toarray(), X_sparse.toarray()) + assert nanoeigenpy.is_approx(A.dot(X_est.toarray()), B_sparse.toarray()) + + assert splu.nnzL() > 0 + assert splu.nnzU() > 0 + + L = splu.matrixL() + U = splu.matrixU() + + assert L.rows() == dim + assert L.cols() == dim + assert U.rows() == dim + assert U.cols() == dim + + x_true = rng.random(dim) + b_true = A.dot(x_true) + P_rows_indices = splu.rowsPermutation().indices() + P_cols_indices = splu.colsPermutation().indices() + + b_permuted = b_true[P_rows_indices] + z = b_permuted.copy() + L.solveInPlace(z) + y = z.copy() + U.solveInPlace(y) + x_reconstructed = np.zeros(dim) + x_reconstructed[P_cols_indices] = y + + assert nanoeigenpy.is_approx(x_reconstructed, x_true, 1e-6) diff --git a/tests/test_sparse_qr.py b/tests/test_sparse_qr.py index 7a825f8a..9544cf0b 100644 --- a/tests/test_sparse_qr.py +++ b/tests/test_sparse_qr.py @@ -2,72 +2,74 @@ import numpy as np import scipy.sparse as spa -dim = 100 -rng = np.random.default_rng() - -A_fac = spa.random(dim, dim, density=0.25, random_state=rng) -A = A_fac.T @ A_fac -A += spa.diags(10.0 * rng.standard_normal(dim) ** 2) -A = A.tocsc(True) -A.check_format() - -spqr = nanoeigenpy.SparseQR(A) - -assert spqr.info() == nanoeigenpy.ComputationInfo.Success - -X = rng.random((dim, 20)) -B = A.dot(X) -X_est = spqr.solve(B) -assert isinstance(X_est, np.ndarray) -assert nanoeigenpy.is_approx(X, X_est) -assert nanoeigenpy.is_approx(A.dot(X_est), B) - -spqr.analyzePattern(A) -spqr.factorize(A) - -X_sparse = spa.random(dim, 10, random_state=rng) -B_sparse = A.dot(X_sparse) -B_sparse: spa.csc_matrix = B_sparse.tocsc(True) -if not B_sparse.has_sorted_indices: - B_sparse.sort_indices() - -X_est = spqr.solve(B_sparse) -assert isinstance(X_est, spa.csc_matrix) -assert nanoeigenpy.is_approx(X_est.toarray(), X_sparse.toarray()) -assert nanoeigenpy.is_approx(A.dot(X_est.toarray()), B_sparse.toarray()) - -Q = spqr.matrixQ() -R = spqr.matrixR() -P = spqr.colsPermutation() - -assert spqr.matrixQ().rows() == dim -assert spqr.matrixQ().cols() == dim -assert R.shape[0] == dim -assert R.shape[1] == dim -assert P.indices().size == dim - -test_vec = rng.random(dim) -test_matrix = rng.random((dim, 20)) - -Qv = Q @ test_vec -QM = Q @ test_matrix -Qt = Q.transpose() -QtV = Qt @ test_vec -QtM = Qt @ test_matrix - -assert Qv.shape == (dim,) -assert QM.shape == (dim, 20) -assert QtV.shape == (dim,) -assert QtM.shape == (dim, 20) - -Qa_real_mat = Q.adjoint() -QaV = Qa_real_mat @ test_vec -assert nanoeigenpy.is_approx(QtV, QaV) - -A_dense = A.toarray() -P_indices = np.array([P.indices()[i] for i in range(dim)]) -A_permuted = A_dense[:, P_indices] - -QtAP = Qt @ A_permuted -R_dense = spqr.matrixR().toarray() -assert nanoeigenpy.is_approx(QtAP, R_dense) + +def test_sparse_qr(): + dim = 100 + rng = np.random.default_rng() + + A_fac = spa.random(dim, dim, density=0.25, random_state=rng) + A = A_fac.T @ A_fac + A += spa.diags(10.0 * rng.standard_normal(dim) ** 2) + A = A.tocsc(True) + A.check_format() + + spqr = nanoeigenpy.SparseQR(A) + + assert spqr.info() == nanoeigenpy.ComputationInfo.Success + + X = rng.random((dim, 20)) + B = A.dot(X) + X_est = spqr.solve(B) + assert isinstance(X_est, np.ndarray) + assert nanoeigenpy.is_approx(X, X_est) + assert nanoeigenpy.is_approx(A.dot(X_est), B) + + spqr.analyzePattern(A) + spqr.factorize(A) + + X_sparse = spa.random(dim, 10, random_state=rng) + B_sparse = A.dot(X_sparse) + B_sparse: spa.csc_matrix = B_sparse.tocsc(True) + if not B_sparse.has_sorted_indices: + B_sparse.sort_indices() + + X_est = spqr.solve(B_sparse) + assert isinstance(X_est, spa.csc_matrix) + assert nanoeigenpy.is_approx(X_est.toarray(), X_sparse.toarray()) + assert nanoeigenpy.is_approx(A.dot(X_est.toarray()), B_sparse.toarray()) + + Q = spqr.matrixQ() + R = spqr.matrixR() + P = spqr.colsPermutation() + + assert spqr.matrixQ().rows() == dim + assert spqr.matrixQ().cols() == dim + assert R.shape[0] == dim + assert R.shape[1] == dim + assert P.indices().size == dim + + test_vec = rng.random(dim) + test_matrix = rng.random((dim, 20)) + + Qv = Q @ test_vec + QM = Q @ test_matrix + Qt = Q.transpose() + QtV = Qt @ test_vec + QtM = Qt @ test_matrix + + assert Qv.shape == (dim,) + assert QM.shape == (dim, 20) + assert QtV.shape == (dim,) + assert QtM.shape == (dim, 20) + + Qa_real_mat = Q.adjoint() + QaV = Qa_real_mat @ test_vec + assert nanoeigenpy.is_approx(QtV, QaV) + + A_dense = A.toarray() + P_indices = np.array([P.indices()[i] for i in range(dim)]) + A_permuted = A_dense[:, P_indices] + + QtAP = Qt @ A_permuted + R_dense = spqr.matrixR().toarray() + assert nanoeigenpy.is_approx(QtAP, R_dense) diff --git a/tests/test_tridiagonalization.py b/tests/test_tridiagonalization.py index 7b8a2f78..9a6d8b58 100644 --- a/tests/test_tridiagonalization.py +++ b/tests/test_tridiagonalization.py @@ -1,103 +1,104 @@ import nanoeigenpy import numpy as np -dim = 100 -rng = np.random.default_rng() -A = rng.random((dim, dim)) -A = (A + A.T) * 0.5 - -tri = nanoeigenpy.Tridiagonalization(A) - -Q = tri.matrixQ() -T = tri.matrixT() - -assert nanoeigenpy.is_approx(A, Q @ T @ Q.T) -assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim)) - -for i in range(dim): - for j in range(dim): - if abs(i - j) > 1: - assert abs(T[i, j]) < 1e-12 - -assert nanoeigenpy.is_approx(T, T.T) - -diag = tri.diagonal() -sub_diag = tri.subDiagonal() - -for i in range(dim): - assert abs(diag[i] - T[i, i]) < 1e-12 - -for i in range(dim - 1): - assert abs(sub_diag[i] - T[i + 1, i]) < 1e-12 - -A_test = rng.random((dim, dim)) -A_test = (A_test + A_test.T) * 0.5 - -tri1 = nanoeigenpy.Tridiagonalization(dim) -tri1.compute(A_test) -tri2 = nanoeigenpy.Tridiagonalization(A_test) - -Q1 = tri1.matrixQ() -T1 = tri1.matrixT() -Q2 = tri2.matrixQ() -T2 = tri2.matrixT() - -assert nanoeigenpy.is_approx(Q1, Q2) -assert nanoeigenpy.is_approx(T1, T2) - -h_coeffs = tri.householderCoefficients() -packed = tri.packedMatrix() - -assert h_coeffs.shape == (dim - 1,) -assert packed.shape == (dim, dim) - -for i in range(dim): - for j in range(i + 1, dim): - assert abs(packed[i, j] - A[i, j]) < 1e-12 - -for i in range(dim): - assert abs(packed[i, i] - T[i, i]) < 1e-12 - if i < dim - 1: - assert abs(packed[i + 1, i] - T[i + 1, i]) < 1e-12 - -A_diag = np.diag(rng.random(dim)) -tri_diag = nanoeigenpy.Tridiagonalization(A_diag) -Q_diag = tri_diag.matrixQ() -T_diag = tri_diag.matrixT() - -assert nanoeigenpy.is_approx(A_diag, Q_diag @ T_diag @ Q_diag.T) -for i in range(dim): - for j in range(dim): - if i != j: - assert abs(T_diag[i, j]) < 1e-10 - -A_tridiag = np.zeros((dim, dim)) -for i in range(dim): - A_tridiag[i, i] = rng.random() - if i < dim - 1: - val = rng.random() - A_tridiag[i, i + 1] = val - A_tridiag[i + 1, i] = val - -tri_tridiag = nanoeigenpy.Tridiagonalization(A_tridiag) -Q_tridiag = tri_tridiag.matrixQ() -T_tridiag = tri_tridiag.matrixT() - -assert nanoeigenpy.is_approx(A_tridiag, Q_tridiag @ T_tridiag @ Q_tridiag.T) - - -tri1_id = nanoeigenpy.Tridiagonalization(dim) -tri2_id = nanoeigenpy.Tridiagonalization(dim) -id1 = tri1_id.id() -id2 = tri2_id.id() -assert id1 != id2 -assert id1 == tri1_id.id() -assert id2 == tri2_id.id() - -tri3_id = nanoeigenpy.Tridiagonalization(A) -tri4_id = nanoeigenpy.Tridiagonalization(A) -id3 = tri3_id.id() -id4 = tri4_id.id() -assert id3 != id4 -assert id3 == tri3_id.id() -assert id4 == tri4_id.id() + +def test_tridiagonalization(): + dim = 100 + rng = np.random.default_rng() + A = rng.random((dim, dim)) + A = (A + A.T) * 0.5 + + tri = nanoeigenpy.Tridiagonalization(A) + + Q = tri.matrixQ() + T = tri.matrixT() + + assert nanoeigenpy.is_approx(A, Q @ T @ Q.T) + assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim)) + + for i in range(dim): + for j in range(dim): + if abs(i - j) > 1: + assert abs(T[i, j]) < 1e-12 + + assert nanoeigenpy.is_approx(T, T.T) + + diag = tri.diagonal() + sub_diag = tri.subDiagonal() + + for i in range(dim): + assert abs(diag[i] - T[i, i]) < 1e-12 + + for i in range(dim - 1): + assert abs(sub_diag[i] - T[i + 1, i]) < 1e-12 + + A_test = rng.random((dim, dim)) + A_test = (A_test + A_test.T) * 0.5 + + tri1 = nanoeigenpy.Tridiagonalization(dim) + tri1.compute(A_test) + tri2 = nanoeigenpy.Tridiagonalization(A_test) + + Q1 = tri1.matrixQ() + T1 = tri1.matrixT() + Q2 = tri2.matrixQ() + T2 = tri2.matrixT() + + assert nanoeigenpy.is_approx(Q1, Q2) + assert nanoeigenpy.is_approx(T1, T2) + + h_coeffs = tri.householderCoefficients() + packed = tri.packedMatrix() + + assert h_coeffs.shape == (dim - 1,) + assert packed.shape == (dim, dim) + + for i in range(dim): + for j in range(i + 1, dim): + assert abs(packed[i, j] - A[i, j]) < 1e-12 + + for i in range(dim): + assert abs(packed[i, i] - T[i, i]) < 1e-12 + if i < dim - 1: + assert abs(packed[i + 1, i] - T[i + 1, i]) < 1e-12 + + A_diag = np.diag(rng.random(dim)) + tri_diag = nanoeigenpy.Tridiagonalization(A_diag) + Q_diag = tri_diag.matrixQ() + T_diag = tri_diag.matrixT() + + assert nanoeigenpy.is_approx(A_diag, Q_diag @ T_diag @ Q_diag.T) + for i in range(dim): + for j in range(dim): + if i != j: + assert abs(T_diag[i, j]) < 1e-10 + + A_tridiag = np.zeros((dim, dim)) + for i in range(dim): + A_tridiag[i, i] = rng.random() + if i < dim - 1: + val = rng.random() + A_tridiag[i, i + 1] = val + A_tridiag[i + 1, i] = val + + tri_tridiag = nanoeigenpy.Tridiagonalization(A_tridiag) + Q_tridiag = tri_tridiag.matrixQ() + T_tridiag = tri_tridiag.matrixT() + + assert nanoeigenpy.is_approx(A_tridiag, Q_tridiag @ T_tridiag @ Q_tridiag.T) + + tri1_id = nanoeigenpy.Tridiagonalization(dim) + tri2_id = nanoeigenpy.Tridiagonalization(dim) + id1 = tri1_id.id() + id2 = tri2_id.id() + assert id1 != id2 + assert id1 == tri1_id.id() + assert id2 == tri2_id.id() + + tri3_id = nanoeigenpy.Tridiagonalization(A) + tri4_id = nanoeigenpy.Tridiagonalization(A) + id3 = tri3_id.id() + id4 = tri4_id.id() + assert id3 != id4 + assert id3 == tri3_id.id() + assert id4 == tri4_id.id() From 85b432d41ce863181b9f17c0c3664681210dc3f6 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:02:53 +0100 Subject: [PATCH 05/59] gersemi: update config gersemirc: put back gersemi definitions no chance observed in this repo. Its for future proofness. --- .gersemirc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gersemirc b/.gersemirc index f2f71ebc..ebecb14c 100644 --- a/.gersemirc +++ b/.gersemirc @@ -1,4 +1,4 @@ -definitions: [./CMakeLists.txt, ./cmake, ./tests] -line_length: 80 +definitions: [./CMakeLists.txt, ./tests] +line_length: 100 indent: 2 warn_about_unknown_commands: false From 03c5f974eb60e8fa6660766f018bf508388a39c6 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:03:47 +0100 Subject: [PATCH 06/59] pixi.toml: we can use forward slash in windows --- pixi.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pixi.toml b/pixi.toml index 23adff29..22fbe57c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -146,8 +146,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] From e1f07a3bf01bb0eecf6e7bbde541a2e40cec41fc Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:04:24 +0100 Subject: [PATCH 07/59] pixi.toml: add install and test commands --- pixi.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 22fbe57c..8f69eac7 100644 --- a/pixi.toml +++ b/pixi.toml @@ -86,8 +86,12 @@ configure = { cmd = [ "-DBUILD_WITH_CHOLMOD_SUPPORT=$NANOEIGENPY_CHOLMOD_SUPPORT", "-DBUILD_WITH_ACCELERATE_SUPPORT=$NANOEIGENPY_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" } +install = { cmd = "cmake --install build", depends-on = ["build"] } +test = { cmd = "ctest --output-on-failure --test-dir build", depends-on = [ + "build", +] } [feature.eigen3.dependencies] eigen = "3.4.*" From 4dd68ec5b50312c9860a4f1b919c8284a8d73ad4 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:04:46 +0100 Subject: [PATCH 08/59] pixi.toml: add explicit testing, and build type --- pixi.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pixi.toml b/pixi.toml index 8f69eac7..ebfb8e4c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -81,7 +81,12 @@ configure = { cmd = [ "build", "-S", ".", + "-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=Release", + "-DBUILD_TESTING=ON", "-DCMAKE_BUILD_TYPE=$NANOEIGENPY_BUILD_TYPE", "-DBUILD_WITH_CHOLMOD_SUPPORT=$NANOEIGENPY_CHOLMOD_SUPPORT", "-DBUILD_WITH_ACCELERATE_SUPPORT=$NANOEIGENPY_ACCELERATE_SUPPORT", From e56602327f5e0c43c2d5a2a89860dfeb154f3f32 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:06:37 +0100 Subject: [PATCH 09/59] git: remove submodules --- .github/workflows/macos-linux-windows-pixi.yml | 2 -- .github/workflows/ros_ci.yml | 2 -- .gitmodules | 6 ------ cmake | 1 - ext/nanobind | 1 - 5 files changed, 12 deletions(-) delete mode 100644 .gitmodules delete mode 160000 cmake delete mode 160000 ext/nanobind diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index f0006b5b..a326f3fa 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -55,8 +55,6 @@ jobs: steps: - uses: actions/checkout@v6 - with: - submodules: recursive - uses: actions/cache@v5 with: diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index 14ea4e18..b3b21f88 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -34,8 +34,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - with: - submodules: recursive # Run industrial_ci - uses: 'ros-industrial/industrial_ci@0f4bd2d1b926eac95fd6bc5bd1fcb3051a6e927d' env: ${{ matrix.env }} diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 955a435d..00000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "cmake"] - path = cmake - url = https://github.com/jrl-umi3218/jrl-cmakemodules.git -[submodule "ext/nanobind"] - path = ext/nanobind - url = https://github.com/wjakob/nanobind diff --git a/cmake b/cmake deleted file mode 160000 index e2df2bb1..00000000 --- a/cmake +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e2df2bb1552848e7660d992cdc6102f70ff8c1dc diff --git a/ext/nanobind b/ext/nanobind deleted file mode 160000 index 879bca48..00000000 --- a/ext/nanobind +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 879bca4869664bdc1446ee7f160ffe3c7028cd7a From 4ecce4d55cb67193b3d0999a6c0939076ab4e2da Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:03:05 +0100 Subject: [PATCH 10/59] gitignore: ignore more stuff ignore nix result ignore conda generated files --- .gitignore | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 36de0b59..6aaa80bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,16 @@ build*/ +install*/ +.pytest_cache/ .cache/ -__pycache__ -.pytest_cache - -# pixi environments -.pixi +.pixi/ +__pycache__/ +Xcode* +*.pyc +*~ *.egg-info +.ruff_cache +.DS_Store +compile_commands.json +cmake-profiling.json +result +*.conda From d52c268aaf5e6a4bc702848bfbc27f756b96694d Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:06:56 +0100 Subject: [PATCH 11/59] cmake: refactor CMake files with JRL CMake Modules v2 use set_property for multiline env fetch jrl-cmakemodules if not found, tmp solution --- CMakeLists.txt | 389 ++++++++++++++++++++----------------------- tests/CMakeLists.txt | 151 ++++++----------- 2 files changed, 235 insertions(+), 305 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index af1a6e35..237ff4fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,247 +1,226 @@ -# -# Copyright 2025 INRIA -# +cmake_minimum_required(VERSION 3.22...4.2) -cmake_minimum_required(VERSION 3.22) - -set(PROJECT_NAME nanoeigenpy) -set(PROJECT_URL https://github.com/Simple-Robotics/nanoeigenpy) -set( - PROJECT_DESCRIPTION - "A support library for bindings between Eigen in C++ and Python, based on nanobind" +project( + nanoeigenpy + VERSION 0.12.0 + DESCRIPTION "A support library for bindings between Eigen in C++ and Python, based on nanobind" + HOMEPAGE_URL "https://github.com/Simple-Robotics/nanoeigenpy" ) -set(PROJECT_CUSTOM_HEADER_EXTENSION "hpp") -set(PROJECT_USE_CMAKE_EXPORT True) - -# 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}) - -# 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") + +set(JRL_CMAKEMODULES_USE_V2 ON CACHE BOOL "Use jrl-cmakemodules v2") +if(JRL_CMAKEMODULES_SOURCE_DIR) + message(STATUS "Using jrl-cmakemodules from source directory: ${JRL_CMAKEMODULES_SOURCE_DIR}") + add_subdirectory(${JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) 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}") - elseif(${CMAKE_VERSION} VERSION_LESS "3.14.0") - message( - FATAL_ERROR - "\nCan't find jrl-cmakemodules. Please either:\n" - " - use git submodule: 'git submodule update --init'\n" - " - or install https://github.com/jrl-umi3218/jrl-cmakemodules\n" - " - or upgrade your CMake version to >= 3.14 to allow automatic fetching\n" - ) - else() - message(STATUS "JRL cmakemodules not found. Let's fetch it.") + find_package(jrl-cmakemodules 0.2.0 CONFIG QUIET) + if(NOT jrl-cmakemodules_FOUND) + message(STATUS "Fetching jrl-cmakemodules") include(FetchContent) FetchContent_Declare( - "jrl-cmakemodules" - GIT_REPOSITORY "https://github.com/jrl-umi3218/jrl-cmakemodules.git" + jrl-cmakemodules + GIT_REPOSITORY https://github.com/ahoarau/jrl-cmakemodules-v2 + GIT_TAG main ) - FetchContent_MakeAvailable("jrl-cmakemodules") - FetchContent_GetProperties("jrl-cmakemodules" SOURCE_DIR JRL_CMAKE_MODULES) + FetchContent_MakeAvailable(jrl-cmakemodules) endif() endif() -option(INSTALL_DOCUMENTATION "Generate and install the documentation" OFF) +jrl_configure_defaults() + +jrl_option(INSTALL_DOCUMENTATION "Generate and install the documentation" OFF) + +jrl_option(BUILD_WITH_CHOLMOD_SUPPORT + "Build EigenPy with the Cholmod (LGPL) support. See CHOLMOD/Doc/License.txt for further details." OFF +) + +jrl_option(BUILD_WITH_ACCELERATE_SUPPORT + "Build EigenPy with the Accelerate support (Apple only)" OFF +) -if(POLICY CMP0167) - cmake_policy(SET CMP0167 NEW) - set(CMAKE_POLICY_DEFAULT_CMP0167 NEW) +if(BUILD_WITH_ACCELERATE_SUPPORT AND NOT APPLE) + message(WARNING "Accelerate support is only available on APPLE systems") endif() -if(POLICY CMP0177) - cmake_policy(SET CMP0177 NEW) - set(CMAKE_POLICY_DEFAULT_CMP0177 NEW) + +jrl_find_package(Eigen3 CONFIG REQUIRED) + +jrl_find_python(3.8 REQUIRED COMPONENTS Interpreter Development.Module) +jrl_find_nanobind(CONFIG REQUIRED) + +if(BUILD_WITH_CHOLMOD_SUPPORT) + jrl_find_package(CHOLMOD CONFIG REQUIRED) endif() -include("${JRL_CMAKE_MODULES}/base.cmake") -COMPUTE_PROJECT_ARGS(PROJECT_ARGS LANGUAGES CXX) -include("${JRL_CMAKE_MODULES}/ide.cmake") -include("${JRL_CMAKE_MODULES}/apple.cmake") -project(${PROJECT_NAME} ${PROJECT_ARGS}) - -string(REPLACE "-pedantic" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) -string(REPLACE "-Wcast-qual" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) -string(REPLACE "-Wconversion" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) - -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) - -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) - set_property( - CACHE CMAKE_BUILD_TYPE - PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo" - ) + +if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) + if(Eigen3_VERSION VERSION_LESS 5.0.0) + message( + FATAL_ERROR + "Accelerate requires Eigen >= 5.0.0 (provided ${Eigen3_VERSION})" + ) + endif() + jrl_find_package(Accelerate REQUIRED) +endif() + +if(BUILD_TESTING) + jrl_find_package(Pytest REQUIRED) endif() -option( - BUILD_WITH_CHOLMOD_SUPPORT - "Build NanoEigenPy with the Cholmod support" - OFF +set( + nanoeigenpy_HEADERS + include/nanoeigenpy/decompositions/sparse/simplicial-cholesky.hpp + include/nanoeigenpy/decompositions/sparse/simplicial-ldlt.hpp + include/nanoeigenpy/decompositions/sparse/simplicial-llt.hpp + include/nanoeigenpy/decompositions/sparse/sparse-lu.hpp + include/nanoeigenpy/decompositions/sparse/sparse-qr.hpp + include/nanoeigenpy/decompositions/sparse/sparse-solver-base.hpp + include/nanoeigenpy/decompositions/bdcsvd.hpp + include/nanoeigenpy/decompositions/col-piv-householder-qr.hpp + include/nanoeigenpy/decompositions/complete-orthogonal-decomposition.hpp + include/nanoeigenpy/decompositions/complex-eigen-solver.hpp + include/nanoeigenpy/decompositions/complex-schur.hpp + include/nanoeigenpy/decompositions/eigen-solver.hpp + include/nanoeigenpy/decompositions/full-piv-householder-qr.hpp + include/nanoeigenpy/decompositions/full-piv-lu.hpp + include/nanoeigenpy/decompositions/generalized-eigen-solver.hpp + include/nanoeigenpy/decompositions/generalized-self-adjoint-eigen-solver.hpp + include/nanoeigenpy/decompositions/hessenberg-decomposition.hpp + include/nanoeigenpy/decompositions/householder-qr.hpp + include/nanoeigenpy/decompositions/jacobi-svd.hpp + include/nanoeigenpy/decompositions/ldlt.hpp + include/nanoeigenpy/decompositions/llt.hpp + include/nanoeigenpy/decompositions/partial-piv-lu.hpp + include/nanoeigenpy/decompositions/permutation-matrix.hpp + include/nanoeigenpy/decompositions/real-qz.hpp + include/nanoeigenpy/decompositions/real-schur.hpp + include/nanoeigenpy/decompositions/self-adjoint-eigen-solver.hpp + include/nanoeigenpy/decompositions/svd-base.hpp + include/nanoeigenpy/decompositions/tridiagonalization.hpp + include/nanoeigenpy/geometry/detail/rotation-base.hpp + include/nanoeigenpy/geometry/angle-axis.hpp + include/nanoeigenpy/geometry/hyperplane.hpp + include/nanoeigenpy/geometry/jacobi-rotation.hpp + include/nanoeigenpy/geometry/parametrized-line.hpp + include/nanoeigenpy/geometry/quaternion.hpp + include/nanoeigenpy/geometry/rotation-2d.hpp + include/nanoeigenpy/geometry/scaling.hpp + include/nanoeigenpy/geometry/translation.hpp + include/nanoeigenpy/solvers/basic-preconditioners.hpp + include/nanoeigenpy/solvers/bfgs-preconditioners.hpp + include/nanoeigenpy/solvers/bicgstab.hpp + include/nanoeigenpy/solvers/conjugate-gradient.hpp + include/nanoeigenpy/solvers/incomplete-cholesky.hpp + include/nanoeigenpy/solvers/incomplete-lut.hpp + include/nanoeigenpy/solvers/iterative-solver-base.hpp + include/nanoeigenpy/solvers/least-squares-conjugate-gradient.hpp + include/nanoeigenpy/solvers/minres.hpp + include/nanoeigenpy/utils/helpers.hpp + include/nanoeigenpy/utils/is-approx.hpp + include/nanoeigenpy/constants.hpp + include/nanoeigenpy/decompositions.hpp + include/nanoeigenpy/eigen-base.hpp + include/nanoeigenpy/fwd.hpp + include/nanoeigenpy/geometry.hpp + include/nanoeigenpy/id.hpp + include/nanoeigenpy/nanoeigenpy.hpp + include/nanoeigenpy/solvers.hpp ) -if(APPLE) - option( - BUILD_WITH_ACCELERATE_SUPPORT - "Build EigenPy with the Accelerate support" - OFF +if(BUILD_WITH_CHOLMOD_SUPPORT) + list( + APPEND + nanoeigenpy_HEADERS + include/nanoeigenpy/decompositions/sparse/cholmod/cholmod-base.hpp + include/nanoeigenpy/decompositions/sparse/cholmod/cholmod-decomposition.hpp + include/nanoeigenpy/decompositions/sparse/cholmod/cholmod-simplicial-ldlt.hpp + include/nanoeigenpy/decompositions/sparse/cholmod/cholmod-simplicial-llt.hpp + include/nanoeigenpy/decompositions/sparse/cholmod/cholmod-supernodal-llt.hpp ) -endif(APPLE) - -# Find dependencies -ADD_PROJECT_DEPENDENCY(Eigen3 REQUIRED PKG_CONFIG_REQUIRES "eigen3 >= 3.3.1") - -find_package(Python REQUIRED COMPONENTS Interpreter Development) -# On Windows Python_SITELIB contains \ that can create installation issues -if(WIN32) - string(REPLACE "\\" "/" Python_SITELIB "${Python_SITELIB}") endif() -# Detect the installed nanobind package and import it into CMake -execute_process( - COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE nanobind_ROOT -) -find_package(nanobind 2.5.0 CONFIG) -if(NOT nanobind_FOUND) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ext/nanobind) +if(BUILD_WITH_ACCELERATE_SUPPORT) + list( + APPEND + nanoeigenpy_HEADERS + include/nanoeigenpy/decompositions/sparse/accelerate/accelerate.hpp + ) endif() -# Setup main targets -file( - GLOB_RECURSE ${PROJECT_NAME}_HEADERS - CONFIGURE_DEPENDS - include/nanoeigenpy/*.hpp -) +# ----------------------------------------------------------------------- # add_library(nanoeigenpy_headers INTERFACE) +add_library(nanoeigenpy::nanoeigenpy_headers ALIAS nanoeigenpy_headers) +target_compile_features(nanoeigenpy_headers INTERFACE cxx_std_17) + target_include_directories( nanoeigenpy_headers INTERFACE - $ - $ $ + $ ) -target_link_libraries(nanoeigenpy_headers INTERFACE Eigen3::Eigen) -set(${PROJECT_NAME}_SOURCES src/module.cpp) -nanobind_add_module(nanoeigenpy NB_STATIC NB_SUPPRESS_WARNINGS ${nanoeigenpy_SOURCES} ${nanoeigenpy_HEADERS}) -target_link_libraries(nanoeigenpy PRIVATE nanoeigenpy_headers) +set(nanoeigenpy_SOURCES src/module.cpp) + +nanobind_add_module(nanoeigenpy + NB_STATIC LTO NB_SUPPRESS_WARNINGS + ${nanoeigenpy_SOURCES} + ${nanoeigenpy_HEADERS} +) +jrl_target_set_output_directory(nanoeigenpy OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages) + +jrl_target_enforce_msvc_conformance(nanoeigenpy PRIVATE) +jrl_target_generate_config_header(nanoeigenpy PRIVATE VERSION ${PROJECT_VERSION}) +jrl_target_generate_warning_header(nanoeigenpy PRIVATE) +jrl_target_generate_deprecated_header(nanoeigenpy PRIVATE) + +target_link_libraries(nanoeigenpy PRIVATE nanoeigenpy_headers Eigen3::Eigen) -# Cholmod 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 CHOLMOD support (LGPL). See CHOLMOD/Doc/License.txt for further details." - ) - file( - GLOB ${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_CHOLMOD_HEADERS - include/nanoeigenpy/decompositions/sparse/cholmod/*.hpp - ) - list( - APPEND - ${PROJECT_NAME}_HEADERS - ${${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_CHOLMOD_HEADERS} - ) - target_link_libraries(nanoeigenpy PRIVATE CHOLMOD::CHOLMOD) -else() - list( - FILTER ${PROJECT_NAME}_HEADERS - EXCLUDE - REGEX "include/nanoeigenpy/decompositions/sparse/cholmod/.*" - ) -endif(BUILD_WITH_CHOLMOD_SUPPORT) + target_link_libraries(nanoeigenpy PRIVATE SuiteSparse::CHOLMOD) + target_compile_definitions(nanoeigenpy PRIVATE NANOEIGENPY_HAS_CHOLMOD) +endif() -# Apple accelerate -if(BUILD_WITH_ACCELERATE_SUPPORT) - if(NOT ${EIGEN_VERSION_NUMBER} VERSION_GREATER_EQUAL "5.0.0") - message( - FATAL_ERROR - "Your version of Eigen is too low. Should be at least 5.0.0. Current version is ${EIGEN_VERSION_NUMBER}." - ) - else() - message( - STATUS - "Building with Accelerate support - Eigen version detected ${EIGEN_VERSION_NUMBER}" - ) - endif() +if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) + target_link_libraries(nanoeigenpy PRIVATE Accelerate::Accelerate) + target_compile_definitions(nanoeigenpy PRIVATE NANOEIGENPY_HAS_ACCELERATE) +endif() - set( - CMAKE_MODULE_PATH - ${JRL_CMAKE_MODULES}/find-external/Accelerate - ${CMAKE_MODULE_PATH} - ) - find_package(Accelerate REQUIRED) - message(STATUS "Build with Accelerate support framework.") - target_link_libraries(nanoeigenpy PRIVATE Accelerate) - target_compile_definitions( - nanoeigenpy_headers - INTERFACE -DNANOEIGENPY_WITH_ACCELERATE_SUPPORT - ) - file( - GLOB ${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_ACCELERATE_HEADERS - include/nanoeigenpy/decompositions/sparse/accelerate/*.hpp - ) - list( - APPEND - ${PROJECT_NAME}_HEADERS - ${${PROJECT_NAME}_DECOMPOSITIONS_SPARSE_ACCELERATE_HEADERS} - ) -else() - list( - FILTER ${PROJECT_NAME}_HEADERS - EXCLUDE - REGEX "include/nanoeigenpy/decompositions/sparse/accelerate/.*" +if(nanobind_add_stub) + nanobind_add_stub( + nanoeigenpy_stub + VERBOSE + MODULE nanoeigenpy + OUTPUT ${CMAKE_BINARY_DIR}/lib/site-packages/nanoeigenpy.pyi + PYTHON_PATH $ + DEPENDS nanoeigenpy ) -endif(BUILD_WITH_ACCELERATE_SUPPORT) - -if(BUILD_TESTING) - add_subdirectory(tests) endif() -nanobind_add_stub( - nanoeigenpy_stub - INSTALL_TIME - VERBOSE - MODULE nanoeigenpy - OUTPUT ${Python_SITELIB}/nanoeigenpy.pyi - PYTHON_PATH $ -) +jrl_python_compile_all(DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages) -# Install targets +jrl_python_compute_install_dir(python_install_dir) install( - TARGETS ${PROJECT_NAME}_headers - 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} + DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages + DESTINATION ${python_install_dir} + FILES_MATCHING + PATTERN "*.py" + PATTERN "*.pyc" + PATTERN "*.typed" + PATTERN "*.so" + PATTERN "*.pyd" ) - -install( - TARGETS ${PROJECT_NAME} - EXPORT ${TARGETS_EXPORT_NAME} - LIBRARY DESTINATION ${Python_SITELIB} +# ------------------------------------------------------------------------ # +jrl_target_headers(nanoeigenpy_headers INTERFACE + HEADERS ${nanoeigenpy_HEADERS} + BASE_DIRS include ) -ADD_HEADER_GROUP(${PROJECT_NAME}_HEADERS) -ADD_SOURCE_GROUP(${PROJECT_NAME}_SOURCES) +jrl_add_export_component(NAME nanoeigenpy_headers TARGETS nanoeigenpy_headers) +jrl_export_package() + +# ------------------------------------------------------------------------ # +if(BUILD_TESTING) + enable_testing() + add_subdirectory(tests) +endif() -SETUP_PROJECT_FINALIZE() +jrl_print_dependencies_summary() +jrl_print_options_summary() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 18cfe812..6a7ce4aa 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,108 +1,59 @@ -# Copyright 2025 INRIA - -# Create a shared nanobind library for testing -set(NANOBIND_TESTING_TARGET nanobind-testing) -nanobind_build_library(${NANOBIND_TESTING_TARGET} SHARED) - -# On Win32, shared DLL libs are sent to RUNTIME_OUTPUT_DIRECTORY, *but* -# we really need to send it to the lib dir so -if(WIN32) - set_target_properties( - ${NANOBIND_TESTING_TARGET} - PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib - ) -endif() - -# Add a C++ extension module for tests -function(add_tests_cpp_extension name) - set(filename ${name}.cpp) - add_library(${name} MODULE ${filename}) - target_link_libraries( - ${name} - PRIVATE ${NANOBIND_TESTING_TARGET} nanoeigenpy_headers - ) - # Use nanobind low-level interface to set properties - nanobind_set_visibility(${name}) - nanobind_strip(${name}) - nanobind_extension(${name}) - nanobind_compile_options(${name}) - nanobind_link_options(${name}) - - add_dependencies(build_tests ${name}) +nanobind_add_module(quaternion + NB_STATIC LTO NB_SUPPRESS_WARNINGS + quaternion.cpp +) +target_link_libraries(quaternion PRIVATE Eigen3::Eigen) +jrl_target_set_output_directory(quaternion OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test-quaternion) +# gersemi: off +function(nanoeigenpy_add_test name) + set(test_name "nanoeigenpy: ${name}") add_test( - NAME "${PROJECT_NAME}-import-${name}" - COMMAND ${Python_EXECUTABLE} -c "import ${name}" - WORKING_DIRECTORY $ + NAME ${test_name} + COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/test_${name}.py + ) + set_property( + TEST ${test_name} + PROPERTY ENVIRONMENT_MODIFICATION + "PYTHONPATH=path_list_prepend:$" + "PYTHONPATH=path_list_prepend:$" ) endfunction() - -# Add Python test module -function(add_tests_py_module name) - set(filename tests/${name}.py) - set(test_target "${PROJECT_NAME}-${name}") - string(REPLACE "_" "-" test_target ${test_target}) - set(PYTHON_EXECUTABLE ${Python_EXECUTABLE}) - ADD_PYTHON_UNIT_TEST(${test_target} ${filename} "lib") - unset(PYTHON_EXECUTABLE) - set_tests_properties(${test_target} PROPERTIES DEPENDS nanoeigenpy) -endfunction() - -add_dependencies(build_tests nanoeigenpy) - -add_test( - NAME "${PROJECT_NAME}-import-extension" - COMMAND ${Python_EXECUTABLE} -c "import ${PROJECT_NAME}" - WORKING_DIRECTORY $ -) - -add_tests_cpp_extension(quaternion) - -set( - TEST_NAMES - test_eigen_solver - test_complex_eigen_solver - test_generalized_eigen_solver - test_self_adjoint_eigen_solver - test_generalized_self_adjoint_eigen_solver - test_real_schur - test_complex_schur - test_hessenberg_decomposition - test_real_qz - test_tridiagonalization - test_bdcsvd - test_jacobi_svd - test_full_piv_lu - test_partial_piv_lu - test_ldlt - test_llt - test_qr - test_simplicial_llt - test_sparse_lu - test_sparse_qr - test_geometry - test_iterative_solvers - test_permutation_matrix - test_incomplete_lut - test_incomplete_cholesky -) +# gersemi: on + +nanoeigenpy_add_test(bdcsvd) +nanoeigenpy_add_test(complex_eigen_solver) +nanoeigenpy_add_test(complex_schur) +nanoeigenpy_add_test(eigen_solver) +nanoeigenpy_add_test(full_piv_lu) +nanoeigenpy_add_test(generalized_eigen_solver) +nanoeigenpy_add_test(generalized_self_adjoint_eigen_solver) +nanoeigenpy_add_test(geometry) +nanoeigenpy_add_test(hessenberg_decomposition) +nanoeigenpy_add_test(import_extension) +nanoeigenpy_add_test(incomplete_cholesky) +nanoeigenpy_add_test(incomplete_lut) +nanoeigenpy_add_test(iterative_solvers) +nanoeigenpy_add_test(jacobi_svd) +nanoeigenpy_add_test(ldlt) +nanoeigenpy_add_test(llt) +nanoeigenpy_add_test(partial_piv_lu) +nanoeigenpy_add_test(permutation_matrix) +nanoeigenpy_add_test(qr) +nanoeigenpy_add_test(real_qz) +nanoeigenpy_add_test(real_schur) +nanoeigenpy_add_test(self_adjoint_eigen_solver) +nanoeigenpy_add_test(simplicial_llt) +nanoeigenpy_add_test(sparse_lu) +nanoeigenpy_add_test(sparse_qr) +nanoeigenpy_add_test(tridiagonalization) if(BUILD_WITH_CHOLMOD_SUPPORT) - list( - APPEND - TEST_NAMES - test_cholmod_simplicial_ldlt - test_cholmod_simplicial_llt - test_cholmod_supernodal_llt - ) -endif(BUILD_WITH_CHOLMOD_SUPPORT) - -foreach(test_name ${TEST_NAMES}) - message(STATUS "Adding Python test ${test_name}") - add_tests_py_module(${test_name}) -endforeach() + nanoeigenpy_add_test(cholmod_simplicial_ldlt) + nanoeigenpy_add_test(cholmod_simplicial_llt) + nanoeigenpy_add_test(cholmod_supernodal_llt) +endif() if(BUILD_WITH_ACCELERATE_SUPPORT) - message(STATUS "Adding Python test test_accelerate") - add_tests_py_module(test_accelerate) -endif(BUILD_WITH_ACCELERATE_SUPPORT) + nanoeigenpy_add_test(accelerate) +endif() From 22b35cdfbb10462a2b84af49afd5e7ba73feac56 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Fri, 12 Dec 2025 11:37:53 +0100 Subject: [PATCH 12/59] cmake: intregrate get-jrl-cmakemodules.cmake --- CMakeLists.txt | 18 +----------- cmake/get-jrl-cmakemodules.cmake | 50 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 cmake/get-jrl-cmakemodules.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 237ff4fd..294c2b16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,23 +7,7 @@ project( HOMEPAGE_URL "https://github.com/Simple-Robotics/nanoeigenpy" ) -set(JRL_CMAKEMODULES_USE_V2 ON CACHE BOOL "Use jrl-cmakemodules v2") -if(JRL_CMAKEMODULES_SOURCE_DIR) - message(STATUS "Using jrl-cmakemodules from source directory: ${JRL_CMAKEMODULES_SOURCE_DIR}") - add_subdirectory(${JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) -else() - find_package(jrl-cmakemodules 0.2.0 CONFIG QUIET) - if(NOT jrl-cmakemodules_FOUND) - message(STATUS "Fetching jrl-cmakemodules") - include(FetchContent) - FetchContent_Declare( - jrl-cmakemodules - GIT_REPOSITORY https://github.com/ahoarau/jrl-cmakemodules-v2 - GIT_TAG main - ) - FetchContent_MakeAvailable(jrl-cmakemodules) - endif() -endif() +include(cmake/get-jrl-cmakemodules.cmake) jrl_configure_defaults() diff --git a/cmake/get-jrl-cmakemodules.cmake b/cmake/get-jrl-cmakemodules.cmake new file mode 100644 index 00000000..db152345 --- /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 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-v2 + GIT_TAG main +) +FetchContent_MakeAvailable(jrl-cmakemodules) From 1f84e6d38afcca4de5dc0fef5ce4a7fbcece9987 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:53:31 +0100 Subject: [PATCH 13/59] cmake: format tests/CMakeLists.txt (remove gersemi off/on) add missing COMMAND to check if command is available add a check for the python module name inside the lib no need to compile python files, we don't have any include stubs pyi files in installation --- CMakeLists.txt | 10 ++++++---- tests/CMakeLists.txt | 5 ++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 294c2b16..c0d5dede 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,7 @@ jrl_target_enforce_msvc_conformance(nanoeigenpy PRIVATE) jrl_target_generate_config_header(nanoeigenpy PRIVATE VERSION ${PROJECT_VERSION}) jrl_target_generate_warning_header(nanoeigenpy PRIVATE) jrl_target_generate_deprecated_header(nanoeigenpy PRIVATE) +jrl_check_python_module_name(nanoeigenpy) target_link_libraries(nanoeigenpy PRIVATE nanoeigenpy_headers Eigen3::Eigen) @@ -167,7 +168,7 @@ if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) target_compile_definitions(nanoeigenpy PRIVATE NANOEIGENPY_HAS_ACCELERATE) endif() -if(nanobind_add_stub) +if(COMMAND nanobind_add_stub) nanobind_add_stub( nanoeigenpy_stub VERBOSE @@ -178,15 +179,16 @@ if(nanobind_add_stub) ) endif() -jrl_python_compile_all(DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages) - jrl_python_compute_install_dir(python_install_dir) +# NOTE: install the whole binary dir, we need the "/" at the end to copy the content. +# In a next version, we might install in a nanoeigenpy directory, which contains all the files. install( - DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages + DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages/ DESTINATION ${python_install_dir} FILES_MATCHING PATTERN "*.py" PATTERN "*.pyc" + PATTERN "*.pyi" PATTERN "*.typed" PATTERN "*.so" PATTERN "*.pyd" diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6a7ce4aa..06b5446a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -5,7 +5,6 @@ nanobind_add_module(quaternion target_link_libraries(quaternion PRIVATE Eigen3::Eigen) jrl_target_set_output_directory(quaternion OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test-quaternion) -# gersemi: off function(nanoeigenpy_add_test name) set(test_name "nanoeigenpy: ${name}") add_test( @@ -14,12 +13,12 @@ function(nanoeigenpy_add_test name) ) set_property( TEST ${test_name} - PROPERTY ENVIRONMENT_MODIFICATION + PROPERTY + ENVIRONMENT_MODIFICATION "PYTHONPATH=path_list_prepend:$" "PYTHONPATH=path_list_prepend:$" ) endfunction() -# gersemi: on nanoeigenpy_add_test(bdcsvd) nanoeigenpy_add_test(complex_eigen_solver) From b4635a6958cba64fb109acfb5a87a39e4bb572fc Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:46:59 +0100 Subject: [PATCH 14/59] cmake: update jrl url to point to fork --- cmake/get-jrl-cmakemodules.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/get-jrl-cmakemodules.cmake b/cmake/get-jrl-cmakemodules.cmake index db152345..fe3343a8 100644 --- a/cmake/get-jrl-cmakemodules.cmake +++ b/cmake/get-jrl-cmakemodules.cmake @@ -44,7 +44,7 @@ message(DEBUG "Fetching jrl-cmakemodules using FetchContent...") include(FetchContent) FetchContent_Declare( jrl-cmakemodules - GIT_REPOSITORY https://github.com/ahoarau/jrl-cmakemodules-v2 - GIT_TAG main + GIT_REPOSITORY https://github.com/ahoarau/jrl-cmakemodules + GIT_TAG jrl-next ) FetchContent_MakeAvailable(jrl-cmakemodules) From 4132db5737d40967f849719e550afa8951083e31 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 16 Dec 2025 15:16:36 +0100 Subject: [PATCH 15/59] cmake: require jrl-cmakemodules version 2.0.0 --- cmake/get-jrl-cmakemodules.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/get-jrl-cmakemodules.cmake b/cmake/get-jrl-cmakemodules.cmake index fe3343a8..61db6b6d 100644 --- a/cmake/get-jrl-cmakemodules.cmake +++ b/cmake/get-jrl-cmakemodules.cmake @@ -31,7 +31,7 @@ endif() # Try to look for the installed package message(DEBUG "Looking for jrl-cmakemodules package...") -find_package(jrl-cmakemodules CONFIG QUIET) +find_package(jrl-cmakemodules 2.0.0 CONFIG QUIET) # If we have the package, we are done. if(jrl-cmakemodules_FOUND) From 9bf4ed332a6d4027e1b84b77fb1537651dfbf64c Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:42:50 +0100 Subject: [PATCH 16/59] cmake: rename test dir --- tests/packaging/{pixi_build => cmake}/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) rename tests/packaging/{pixi_build => cmake}/CMakeLists.txt (61%) diff --git a/tests/packaging/pixi_build/CMakeLists.txt b/tests/packaging/cmake/CMakeLists.txt similarity index 61% rename from tests/packaging/pixi_build/CMakeLists.txt rename to tests/packaging/cmake/CMakeLists.txt index 46e4847d..69713663 100644 --- a/tests/packaging/pixi_build/CMakeLists.txt +++ b/tests/packaging/cmake/CMakeLists.txt @@ -1,3 +1,4 @@ cmake_minimum_required(VERSION 3.22) project(test_pixi_build) find_package(nanoeigenpy REQUIRED) +message(STATUS "nanoeigenpy found: ${nanoeigenpy_VERSION}") From 406f6db73000dd315c5af65b532cb65e011d2033 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 18 Dec 2025 13:37:44 +0100 Subject: [PATCH 17/59] cmake: require at least nanobind 2.5.0 on ubuntu 24.04 the nanobind-dev package brind an old incompatible version 1.9.2-1 fallback to fetchcontent if nanobind 2.5.0 is not found. we mimic the upstream behavior, but using fetchcontent instead of submodules --- CMakeLists.txt | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c0d5dede..0a4dff6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,21 @@ endif() jrl_find_package(Eigen3 CONFIG REQUIRED) jrl_find_python(3.8 REQUIRED COMPONENTS Interpreter Development.Module) -jrl_find_nanobind(CONFIG REQUIRED) +jrl_find_nanobind(2.5.0 CONFIG QUIET) + +# On Ubuntu 24.04, the nanobind-dev package ships nanobind 1.9.2. +# We require >=2.5.0 for nanobind_add_stub, +# NB_SUPPRESS_WARNINGS, and visitor pattern (c++) +if(NOT nanobind_FOUND) + include(FetchContent) + FetchContent_Declare( + nanobind + GIT_REPOSITORY https://github.com/wjakob/nanobind.git + GIT_TAG v2.10.1 + GIT_SHALLOW True + ) + FetchContent_MakeAvailable(nanobind) +endif() if(BUILD_WITH_CHOLMOD_SUPPORT) jrl_find_package(CHOLMOD CONFIG REQUIRED) @@ -168,16 +182,14 @@ if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) target_compile_definitions(nanoeigenpy PRIVATE NANOEIGENPY_HAS_ACCELERATE) endif() -if(COMMAND nanobind_add_stub) - nanobind_add_stub( - nanoeigenpy_stub - VERBOSE - MODULE nanoeigenpy - OUTPUT ${CMAKE_BINARY_DIR}/lib/site-packages/nanoeigenpy.pyi - PYTHON_PATH $ - DEPENDS nanoeigenpy - ) -endif() +nanobind_add_stub( + nanoeigenpy_stub + VERBOSE + MODULE nanoeigenpy + OUTPUT ${CMAKE_BINARY_DIR}/lib/site-packages/nanoeigenpy.pyi + PYTHON_PATH $ + DEPENDS nanoeigenpy +) jrl_python_compute_install_dir(python_install_dir) # NOTE: install the whole binary dir, we need the "/" at the end to copy the content. From 0dd495daa659c2164ba36807c58a5a6686a2ab73 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Fri, 19 Dec 2025 13:51:57 +0100 Subject: [PATCH 18/59] cmake: change message verbosity to STATUS and fix env case look for version >=1.1.2 of the jrl we havent updated the version number yet --- cmake/get-jrl-cmakemodules.cmake | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cmake/get-jrl-cmakemodules.cmake b/cmake/get-jrl-cmakemodules.cmake index 61db6b6d..1a0a5a02 100644 --- a/cmake/get-jrl-cmakemodules.cmake +++ b/cmake/get-jrl-cmakemodules.cmake @@ -12,7 +12,7 @@ set( # Option 1: pass -DJRL_CMAKEMODULES_SOURCE_DIR=... to cmake command line if(JRL_CMAKEMODULES_SOURCE_DIR) message( - DEBUG + STATUS "JRL_CMAKEMODULES_SOURCE_DIR variable set, adding jrl-cmakemodules from source directory: ${JRL_CMAKEMODULES_SOURCE_DIR}" ) add_subdirectory(${JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) @@ -22,25 +22,25 @@ 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}" + STATUS + "JRL_CMAKEMODULES_SOURCE_DIR environement variable set, adding jrl-cmakemodules from source directory: $ENV{JRL_CMAKEMODULES_SOURCE_DIR}" ) - add_subdirectory(${JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) + add_subdirectory($ENV{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) +# Option 3: Try to look for the installed package +message(STATUS "Looking for jrl-cmakemodules (version: >=1.1.2) package...") +find_package(jrl-cmakemodules 1.1.2 CONFIG QUIET) -# If we have the package, we are done. +# If we have the package, we are done here. if(jrl-cmakemodules_FOUND) - message(DEBUG "Found jrl-cmakemodules package.") + message(STATUS "Found jrl-cmakemodules (version: ${jrl-cmakemodules_VERSION}) package.") return() endif() -# Fallback to FetchContent if not found -message(DEBUG "Fetching jrl-cmakemodules using FetchContent...") +# Option 4: Fallback to FetchContent +message(STATUS "Fetching jrl-cmakemodules using FetchContent...") include(FetchContent) FetchContent_Declare( jrl-cmakemodules From 557c54ec4f4da007e519f5ae33955a828e78674f Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 18 Dec 2025 14:58:37 +0100 Subject: [PATCH 19/59] cmake: add debug messages to explain what we do with nanobind if we apt install nanobind-dev on ubuntu 24, we get nanobind 1.9.1, which does not ship version from the config file require python 3.11 for stubs generation ROS Humble not supported use VERSION_GREATER_EQUAL and use correct python var add BUILD_TESTING so it appears in the summary --- CMakeLists.txt | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a4dff6e..04e35a2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,8 @@ include(cmake/get-jrl-cmakemodules.cmake) jrl_configure_defaults() +jrl_option(BUILD_TESTING "Build the tests" OFF) + jrl_option(INSTALL_DOCUMENTATION "Generate and install the documentation" OFF) jrl_option(BUILD_WITH_CHOLMOD_SUPPORT @@ -30,15 +32,27 @@ jrl_find_package(Eigen3 CONFIG REQUIRED) jrl_find_python(3.8 REQUIRED COMPONENTS Interpreter Development.Module) jrl_find_nanobind(2.5.0 CONFIG QUIET) +if(nanobind_ROOT AND NOT nanobind_FOUND) + message(WARNING "nanobind found at ${nanobind_ROOT} but too old") +endif() + # On Ubuntu 24.04, the nanobind-dev package ships nanobind 1.9.2. # We require >=2.5.0 for nanobind_add_stub, # NB_SUPPRESS_WARNINGS, and visitor pattern (c++) if(NOT nanobind_FOUND) + set(nanobind_GIT_REPOSITORY "https://github.com/wjakob/nanobind.git") + set(nanobind_GIT_TAG "v2.10.1") + + message( + STATUS + "nanobind: fallback to FetchContent from ${nanobind_GIT_REPOSITORY} (tag: ${nanobind_GIT_TAG})" + ) + include(FetchContent) FetchContent_Declare( nanobind - GIT_REPOSITORY https://github.com/wjakob/nanobind.git - GIT_TAG v2.10.1 + GIT_REPOSITORY ${nanobind_GIT_REPOSITORY} + GIT_TAG ${nanobind_GIT_TAG} GIT_SHALLOW True ) FetchContent_MakeAvailable(nanobind) @@ -182,14 +196,18 @@ if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) target_compile_definitions(nanoeigenpy PRIVATE NANOEIGENPY_HAS_ACCELERATE) endif() -nanobind_add_stub( - nanoeigenpy_stub - VERBOSE - MODULE nanoeigenpy - OUTPUT ${CMAKE_BINARY_DIR}/lib/site-packages/nanoeigenpy.pyi - PYTHON_PATH $ - DEPENDS nanoeigenpy -) +# Stub generation requires typing-extensions +# ROS Humble ships an incompatible typing-extensions with python3.10 +if(Python_VERSION VERSION_GREATER_EQUAL 3.11.0) + nanobind_add_stub( + nanoeigenpy_stub + VERBOSE + MODULE nanoeigenpy + OUTPUT ${CMAKE_BINARY_DIR}/lib/site-packages/nanoeigenpy.pyi + PYTHON_PATH $ + DEPENDS nanoeigenpy + ) +endif() jrl_python_compute_install_dir(python_install_dir) # NOTE: install the whole binary dir, we need the "/" at the end to copy the content. From 863add8c1c15ba0ac66b3f0fc931950d31dada75 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 16 Dec 2025 23:17:37 +0100 Subject: [PATCH 20/59] ci: add debug and verbose output to ros ci --- .github/workflows/ros_ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index b3b21f88..a55e503d 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -31,6 +31,9 @@ jobs: env: # PRERELEASE: true # Fails due to issues in the underlying Docker image BUILDER: colcon + VERBOSE_OUTPUT: true + VERBOSE_TESTS: true + DEBUG_BASH: true runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 From 5e49170f859c3faf496405251555f32a02c34888 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 18 Dec 2025 20:46:43 +0100 Subject: [PATCH 21/59] ci: use the commands defined in pixi.toml disabling cache for testing --- .../workflows/macos-linux-windows-pixi.yml | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index a326f3fa..5f21b0a3 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -71,48 +71,49 @@ jobs: run: | pixi run -e ${{ matrix.environment }} ccache -z - - name: Build nanoeigenpy [MacOS/Linux/Windows] + - name: Configure nanoeigenpy [MacOS/Linux/Windows] env: NANOEIGENPY_BUILD_TYPE: ${{ matrix.build_type }} + run: | + pixi run -e ${{ matrix.environment }} configure + + - name: Build nanoeigenpy [MacOS/Linux/Windows] run: | pixi run -e ${{ matrix.environment }} build - name: Test nanoeigenpy [MacOS/Linux/Windows] run: | - pixi run -e ${{ matrix.environment }} ctest --test-dir build --output-on-failure + pixi run -e ${{ matrix.environment }} test - name: Install nanoeigenpy [MacOS/Linux/Windows] run: | - pixi run -e ${{ matrix.environment }} cmake --build build --target install + pixi run -e ${{ matrix.environment }} install - name: Show ccache statistics [MacOS/Linux/Windows] run: | pixi run -e ${{ matrix.environment }} ccache -sv - # nanoeigenpy-pixi-build: - # name: Pixi build - ${{ matrix.os }} - # runs-on: ${{ matrix.os }} + nanoeigenpy-pixi-build: + name: Pixi build - ${{ matrix.os }} + runs-on: ${{ matrix.os }} - # strategy: - # fail-fast: false - # matrix: - # os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest] + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest] - # steps: - # - uses: actions/checkout@v6 - # with: - # submodules: recursive + steps: + - uses: actions/checkout@v6 # - uses: prefix-dev/setup-pixi@v0.9.5 # env: # CMAKE_BUILD_PARALLEL_LEVEL: 2 # with: - # cache: true # environments: test-pixi-build - # - name: Test package [MacOS/Linux/Windows] - # run: | - # pixi run -e test-pixi-build test + - name: Test package [MacOS/Linux/Windows] + run: | + pixi run -e test-pixi-build test check: if: always() From 1f56aaeacc3e14b0aa36fa0e363a95417288267c Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Sat, 13 Dec 2025 15:39:55 +0100 Subject: [PATCH 22/59] pixi.toml: add pytest --- pixi.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pixi.toml b/pixi.toml index ebfb8e4c..273fc6c0 100644 --- a/pixi.toml +++ b/pixi.toml @@ -47,6 +47,7 @@ python = ">=3.10" eigen = ">=3.4" numpy = ">=1.22" scipy = ">=1.10.0" +pytest = ">=9.0.2,<10" # nanobind need to use OSX SDK >= 10.13. # But default version setup by rattler is 10.9 From 1408cd51bd1da7fac12129a871ac7dd0abec0285 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:33:15 +0100 Subject: [PATCH 23/59] pixi.toml: remove extra cmake lines in configure task --- pixi.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pixi.toml b/pixi.toml index 273fc6c0..8558e3ca 100644 --- a/pixi.toml +++ b/pixi.toml @@ -83,10 +83,7 @@ configure = { cmd = [ "-S", ".", "-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=Release", "-DBUILD_TESTING=ON", "-DCMAKE_BUILD_TYPE=$NANOEIGENPY_BUILD_TYPE", "-DBUILD_WITH_CHOLMOD_SUPPORT=$NANOEIGENPY_CHOLMOD_SUPPORT", From 0cab651989d5d9b7090ac0ef74a176db0f9f813f Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:43:28 +0100 Subject: [PATCH 24/59] pixi.toml: add test packaging pixi.toml: remove duplicated nanoeigenpy --- pixi.toml | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/pixi.toml b/pixi.toml index 8558e3ca..b17f23b0 100644 --- a/pixi.toml +++ b/pixi.toml @@ -96,6 +96,29 @@ test = { cmd = "ctest --output-on-failure --test-dir build", depends-on = [ "build", ] } +test-import-python = { depends-on = [ + "install", +], cmd = [ + "python", + "-c", + "import nanoeigenpy; print(nanoeigenpy.__version__)", +] } +_test-packaging-configure = { cmd = [ + "cmake", + "-G", + "Ninja", + "-S", + "tests/packaging/cmake", + "-B", + "build/test-packaging", +], depends-on = [ + "install", +] } +_test-packaging-build = { cmd = "cmake --build build/test-packaging", depends-on = [ + "_test-packaging-configure", +] } +test-packaging = { depends-on = ["_test-packaging-build"] } + [feature.eigen3.dependencies] eigen = "3.4.*" @@ -162,13 +185,13 @@ platforms = ["linux-64"] activation = { scripts = ["development/scripts/pixi/activation_clang.sh"] } dependencies = { clangxx = "*", lld = "*" } -# [feature.test-pixi-build] -# dependencies = { nanoeigenpy = { path = "." }, cmake = ">=3.22", python = "*" } +[feature.test-pixi-build] +dependencies = { nanoeigenpy = { path = "." }, cmake = ">=3.22", python = "*", cxx-compiler = "*" } -# [feature.test-pixi-build.tasks] -# test-cmake = "cmake -S tests/packaging/pixi_build -B build_test_pixi_build" -# test-python = "python -c 'import nanoeigenpy'" -# test = { depends-on = ["test-cmake", "test-python"] } +[feature.test-pixi-build.tasks] +test-cmake = "cmake -S tests/packaging/cmake -B build/test_pixi_build" +test-python = "python -c 'import nanoeigenpy; print(nanoeigenpy.__version__)'" +test = { depends-on = ["test-cmake", "test-python"] } [environments] default = { features = ["test", "python-latest"], solve-group = "py-latest" } From e6db39e2a7ef94ccbd2598075391bcc71354ee51 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Fri, 19 Dec 2025 15:27:35 +0100 Subject: [PATCH 25/59] pixi.toml: override python install dir on windows Otherwise the lib is install in %PREFIX%/Library/Lib/site-packages/nanoeigenpy.pyd But we need %PREFIX%/Lib/site-packages/nanoeigenpy.pyd --- pixi.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pixi.toml b/pixi.toml index b17f23b0..24c3b2ec 100644 --- a/pixi.toml +++ b/pixi.toml @@ -22,6 +22,12 @@ extra-args = [ "-DBUILD_WITH_ACCELERATE_SUPPORT=OFF", ] +# Override python install dir for Conda on Windows +[package.build.target.win-64.config] +extra-args = [ + "-Dnanoeigenpy_PYTHON_INSTALL_DIR=%PREFIX%/Lib/site-packages", +] + [package.host-dependencies] nanobind = ">=2.5.0" python = ">=3.10" From 0aa7f265ff50b8031519ccbd8cbbba23a911502d Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:56:46 +0100 Subject: [PATCH 26/59] changelog: update with jrl v2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40722d15..81f49783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Python version update ([#25](https://github.com/Simple-Robotics/nanoeigenpy/pull/25)): - 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)) +- Remove submodules: archives can now be used +- `c++17` is now required +- Migrate python tests to pytest ### Added - Add pixi-build support ([#25](https://github.com/Simple-Robotics/nanoeigenpy/pull/25)) From d1099aa7855a6d57359b51104ff21963677ab687 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:11:06 +0100 Subject: [PATCH 27/59] ci: temporarly disable nix job --- .github/workflows/nix.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 1dc45e03..57bd6aac 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -10,6 +10,9 @@ on: jobs: nix: + # ⚠️ temporarly disable the Nix job for https://github.com/Simple-Robotics/nanoeigenpy/pull/40 ⚠️ + if: false + runs-on: "${{ matrix.os }}-latest" strategy: matrix: From 60e4ca1eee44fa5766c0cc1ef67c590c1260ae52 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:12:28 +0100 Subject: [PATCH 28/59] gitignore: ignore ruff cache --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6aaa80bd..86d7b592 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ Xcode* *.pyc *~ *.egg-info -.ruff_cache +.ruff_cache/ .DS_Store compile_commands.json cmake-profiling.json From d8a76970e17740b499c16b8452ae6b2636f758f9 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:15:06 +0100 Subject: [PATCH 29/59] ci: disable nix job check --- .github/workflows/nix.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 57bd6aac..92a32e32 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -28,7 +28,10 @@ jobs: - run: nix build -L ".#nanoeigenpy${{ matrix.eigen }}" check: - if: always() + # ⚠️ temporarly disable the Nix job for https://github.com/Simple-Robotics/nanoeigenpy/pull/40 ⚠️ + if: false + # if: always() + name: check-macos-linux-nix needs: From 03430582fb44dc014e60fdca8e8c4c07da45bde7 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:46:30 +0100 Subject: [PATCH 30/59] cmake: add check for the quaternion test module --- tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 06b5446a..4ffd82ec 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,6 +2,7 @@ nanobind_add_module(quaternion NB_STATIC LTO NB_SUPPRESS_WARNINGS quaternion.cpp ) +jrl_check_python_module_name(quaternion) target_link_libraries(quaternion PRIVATE Eigen3::Eigen) jrl_target_set_output_directory(quaternion OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test-quaternion) From 93f58710edad1dc71fc2d191f46cb1eeb2f05c33 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 18:04:01 +0100 Subject: [PATCH 31/59] cmake: add inria copyright --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 04e35a2d..59b508c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,5 @@ +# Copyright 2025-2026 Inria + cmake_minimum_required(VERSION 3.22...4.2) project( From bf679b7597762bb5893607fbc18b976da3e52377 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 5 Jan 2026 18:04:41 +0100 Subject: [PATCH 32/59] cmake: remove cmake version range we only need the minimum version to be set to enable the correct policies --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59b508c3..aa712360 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ # Copyright 2025-2026 Inria -cmake_minimum_required(VERSION 3.22...4.2) +cmake_minimum_required(VERSION 3.22) project( nanoeigenpy From e4a3980d3042c84822e818814ee43f0c5b7306f6 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 07:28:20 +0100 Subject: [PATCH 33/59] cmake: update nanobind GIT_TAG to v2.10.2 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aa712360..a32320a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,7 +43,7 @@ endif() # NB_SUPPRESS_WARNINGS, and visitor pattern (c++) if(NOT nanobind_FOUND) set(nanobind_GIT_REPOSITORY "https://github.com/wjakob/nanobind.git") - set(nanobind_GIT_TAG "v2.10.1") + set(nanobind_GIT_TAG "v2.10.2") message( STATUS From 55ebe64443ebc8bb08d318b09bd70eadadbe20c5 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 07:33:53 +0100 Subject: [PATCH 34/59] ci: remove warning by passing the explicit arguments to env --- .github/workflows/ros_ci.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index a55e503d..f72f93cd 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -31,15 +31,13 @@ jobs: env: # PRERELEASE: true # Fails due to issues in the underlying Docker image BUILDER: colcon + ROS_DISTRO: ${{ matrix.env.ROS_DISTRO }} VERBOSE_OUTPUT: true VERBOSE_TESTS: true - DEBUG_BASH: true runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - # Run industrial_ci - - uses: 'ros-industrial/industrial_ci@0f4bd2d1b926eac95fd6bc5bd1fcb3051a6e927d' - env: ${{ matrix.env }} + - uses: 'ros-industrial/industrial_ci@ba2a3d0f830f8051b356711a8df2fedfc5d256cf' check: if: always() @@ -48,7 +46,7 @@ jobs: needs: - CI - runs-on: Ubuntu-latest + runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed From dccfbf26a5f5fdfdd23340d33a02d4aa9ffd48bd Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 07:44:39 +0100 Subject: [PATCH 35/59] ci: remove explicit cache for pixi --- .github/workflows/macos-linux-windows-pixi.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index 5f21b0a3..03c42957 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -64,7 +64,6 @@ jobs: - uses: prefix-dev/setup-pixi@v0.9.5 with: - cache: true environments: ${{ matrix.environment }} - name: Clear ccache statistics [MacOS/Linux/Windows] From 5d8b59a99e23e313b331327c09283e5277207a14 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 08:33:56 +0100 Subject: [PATCH 36/59] ci: cosmetics on pixi job --- .github/workflows/macos-linux-windows-pixi.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index 03c42957..90e3e656 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -30,12 +30,12 @@ concurrency: cancel-in-progress: true jobs: - nanoeigenpy-pixi: - name: Standard - ${{ matrix.os }} - Env ${{ matrix.environment }} ${{ matrix.build_type }} + pixi: + name: Pixi - Standard - ${{ matrix.os }} - Env ${{ matrix.environment }} ${{ matrix.build_type }} runs-on: ${{ matrix.os }} env: - CCACHE_BASEDIR: "${GITHUB_WORKSPACE}" - CCACHE_DIR: "${GITHUB_WORKSPACE}/.ccache" + CCACHE_BASEDIR: "${{ github.workspace }}" + CCACHE_DIR: "${{ github.workspace }}/.ccache" CCACHE_COMPRESS: true CCACHE_COMPRESSLEVEL: 6 # Since pixi will install a compiler, the compiler mtime will be changed. @@ -58,7 +58,7 @@ jobs: - uses: actions/cache@v5 with: - path: .ccache + path: ${{ env.CCACHE_DIR }} key: ccache-macos-linux-windows-pixi-${{ matrix.os }}-${{ matrix.build_type }}-${{ matrix.environment }}-${{ github.sha }} restore-keys: ccache-macos-linux-windows-pixi-${{ matrix.os }}-${{ matrix.build_type }}-${{ matrix.environment }}- @@ -92,7 +92,7 @@ jobs: run: | pixi run -e ${{ matrix.environment }} ccache -sv - nanoeigenpy-pixi-build: + pixi-build: name: Pixi build - ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -119,9 +119,10 @@ jobs: name: check-macos-linux-windows-pixi needs: - - nanoeigenpy-pixi + - pixi + - pixi-build - runs-on: Ubuntu-latest + runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed From 48190238561f22b83810a7d941cfb27056739f47 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:05:41 +0100 Subject: [PATCH 37/59] ci: rosci enable cache and prerelease --- .github/workflows/ros_ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index f72f93cd..b84ccb53 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -29,11 +29,12 @@ jobs: - {ROS_DISTRO: kilted} - {ROS_DISTRO: rolling} env: - # PRERELEASE: true # Fails due to issues in the underlying Docker image + PRERELEASE: true BUILDER: colcon ROS_DISTRO: ${{ matrix.env.ROS_DISTRO }} VERBOSE_OUTPUT: true VERBOSE_TESTS: true + CCACHE_DIR: ${{ github.workspace }}/.ccache runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 From da70fbb25b1f73b247389638041fcbccab61c1bb Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:30:40 +0100 Subject: [PATCH 38/59] package.xml: nanobind-dev not yet available --- package.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.xml b/package.xml index c06ddd37..b6bc171e 100644 --- a/package.xml +++ b/package.xml @@ -18,7 +18,8 @@ python3-numpy python3-scipy eigen - nanobind-dev + + cmake From 208b7fefe4662317270407e09ef1ddcb34cb4f51 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:32:10 +0100 Subject: [PATCH 39/59] ci: ros ci disable fail fast --- .github/workflows/ros_ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index b84ccb53..d35c83ed 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -22,6 +22,7 @@ concurrency: jobs: CI: strategy: + fail-fast: false matrix: env: - {ROS_DISTRO: humble} From fc0294cb0ba92fef8f33633829f8fc0dc007d8e5 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:52:18 +0100 Subject: [PATCH 40/59] package.xml: add pytest dep --- package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/package.xml b/package.xml index b6bc171e..a8498262 100644 --- a/package.xml +++ b/package.xml @@ -15,6 +15,7 @@ python3 + python3-pytest python3-numpy python3-scipy eigen From 734a62dbe910d701c59db18bb3574ece89d34a07 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:52:30 +0100 Subject: [PATCH 41/59] ci: name the ros jobs --- .github/workflows/ros_ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index d35c83ed..e357a408 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -21,6 +21,7 @@ concurrency: jobs: CI: + name: ROS CI - ${{ matrix.env.ROS_DISTRO }} strategy: fail-fast: false matrix: From dfa9f06e417edba363c18e626e30f8463dc5733b Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:29:48 +0100 Subject: [PATCH 42/59] rosci: configure cache --- .github/workflows/ros_ci.yml | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index e357a408..3d7acca1 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -20,26 +20,41 @@ concurrency: cancel-in-progress: true jobs: - CI: - name: ROS CI - ${{ matrix.env.ROS_DISTRO }} + ros: + name: ROS ${{ matrix.ROS_DISTRO }} - ${{ matrix.os }} strategy: fail-fast: false matrix: - env: - - {ROS_DISTRO: humble} - - {ROS_DISTRO: jazzy} - - {ROS_DISTRO: kilted} - - {ROS_DISTRO: rolling} + include: + # ROS2 Humble Hawksbill (May 2022 - May 2027) + - ROS_DISTRO: humble + os: Ubuntu 22.04 (Jammy) + + # ROS2 Jazzy Jalisco (May 2024 - May 2029) + - ROS_DISTRO: jazzy + os: Ubuntu 24.04 (Noble) + + # ROS2 Kilted Kayu (May 2025 - December 2026) + - ROS_DISTRO: kilted + os: Ubuntu 24.04 (Noble) + + # ROS2 Rolling Ridley + - ROS_DISTRO: rolling + os: Ubuntu 24.04 (Noble) env: PRERELEASE: true - BUILDER: colcon - ROS_DISTRO: ${{ matrix.env.ROS_DISTRO }} VERBOSE_OUTPUT: true VERBOSE_TESTS: true + ROS_DISTRO: ${{ matrix.ROS_DISTRO }} CCACHE_DIR: ${{ github.workspace }}/.ccache runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + - uses: actions/cache@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-${{ matrix.ROS_DISTRO }}-${{github.run_id}} + restore-keys: ccache-${{ matrix.ROS_DISTRO }}- - uses: 'ros-industrial/industrial_ci@ba2a3d0f830f8051b356711a8df2fedfc5d256cf' check: @@ -47,7 +62,7 @@ jobs: name: check-ros-ci needs: - - CI + - ros runs-on: ubuntu-latest From 3c1b09010968274c83dfa87e528795d8ec239749 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Thu, 8 Jan 2026 18:13:00 +0100 Subject: [PATCH 43/59] ci: relax cache availability --- .github/workflows/macos-linux-windows-pixi.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index 90e3e656..bd61ac41 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -1,4 +1,4 @@ -name: CI - MacOS/Linux/Windows via Pixi +name: CI - Pixi (MacOS/Linux/Windows) on: push: @@ -31,7 +31,7 @@ concurrency: jobs: pixi: - name: Pixi - Standard - ${{ matrix.os }} - Env ${{ matrix.environment }} ${{ matrix.build_type }} + name: Pixi - ${{ matrix.os }} - Env ${{ matrix.environment }} ${{ matrix.build_type }} runs-on: ${{ matrix.os }} env: CCACHE_BASEDIR: "${{ github.workspace }}" @@ -59,8 +59,8 @@ jobs: - uses: actions/cache@v5 with: path: ${{ env.CCACHE_DIR }} - key: ccache-macos-linux-windows-pixi-${{ matrix.os }}-${{ matrix.build_type }}-${{ matrix.environment }}-${{ github.sha }} - restore-keys: ccache-macos-linux-windows-pixi-${{ matrix.os }}-${{ matrix.build_type }}-${{ matrix.environment }}- + key: ccache-pixi-${{ matrix.os }}-${{ matrix.build_type }}-${{ github.sha }} + restore-keys: ccache-pixi-${{ matrix.os }}-${{ matrix.build_type }}- - uses: prefix-dev/setup-pixi@v0.9.5 with: From 451f331d1b823fba07400d2bd65156a0710b1e59 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Sat, 10 Jan 2026 15:37:56 +0100 Subject: [PATCH 44/59] cmale: update cmake option docs --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a32320a2..10039f99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,11 +18,11 @@ jrl_option(BUILD_TESTING "Build the tests" OFF) jrl_option(INSTALL_DOCUMENTATION "Generate and install the documentation" OFF) jrl_option(BUILD_WITH_CHOLMOD_SUPPORT - "Build EigenPy with the Cholmod (LGPL) support. See CHOLMOD/Doc/License.txt for further details." OFF + "Build with SparseSuite's Cholmod (LGPL). See CHOLMOD/Doc/License.txt for further details." OFF ) jrl_option(BUILD_WITH_ACCELERATE_SUPPORT - "Build EigenPy with the Accelerate support (Apple only)" OFF + "Build with the Accelerate framework (Apple only)" OFF ) if(BUILD_WITH_ACCELERATE_SUPPORT AND NOT APPLE) From ca1c49074e76817f5224148a3ca8b9783bb23469 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Sat, 10 Jan 2026 15:45:07 +0100 Subject: [PATCH 45/59] changelog: remove the c++17 required. It was always required from nanobind --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81f49783..73dda0c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - 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)) - Remove submodules: archives can now be used -- `c++17` is now required - Migrate python tests to pytest ### Added From c694e63830529226cf794058cacccb1a7917f083 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Sat, 10 Jan 2026 15:57:22 +0100 Subject: [PATCH 46/59] cmake: move dependencies to headers instead of module we now export eigen and cholmod correctly --- CMakeLists.txt | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10039f99..1041f962 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,7 @@ if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) "Accelerate requires Eigen >= 5.0.0 (provided ${Eigen3_VERSION})" ) endif() + jrl_find_package(Accelerate REQUIRED) endif() @@ -171,6 +172,21 @@ target_include_directories( $ ) +target_link_libraries( + nanoeigenpy_headers + INTERFACE + Eigen3::Eigen + $<$:SuiteSparse::CHOLMOD> + $<$:Accelerate::Accelerate> +) + +target_compile_definitions( + nanoeigenpy_headers + INTERFACE + $<$:NANOEIGENPY_HAS_CHOLMOD> + $<$:NANOEIGENPY_HAS_ACCELERATE> +) + set(nanoeigenpy_SOURCES src/module.cpp) nanobind_add_module(nanoeigenpy @@ -186,17 +202,7 @@ jrl_target_generate_warning_header(nanoeigenpy PRIVATE) jrl_target_generate_deprecated_header(nanoeigenpy PRIVATE) jrl_check_python_module_name(nanoeigenpy) -target_link_libraries(nanoeigenpy PRIVATE nanoeigenpy_headers Eigen3::Eigen) - -if(BUILD_WITH_CHOLMOD_SUPPORT) - target_link_libraries(nanoeigenpy PRIVATE SuiteSparse::CHOLMOD) - target_compile_definitions(nanoeigenpy PRIVATE NANOEIGENPY_HAS_CHOLMOD) -endif() - -if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) - target_link_libraries(nanoeigenpy PRIVATE Accelerate::Accelerate) - target_compile_definitions(nanoeigenpy PRIVATE NANOEIGENPY_HAS_ACCELERATE) -endif() +target_link_libraries(nanoeigenpy PUBLIC nanoeigenpy_headers) # Stub generation requires typing-extensions # ROS Humble ships an incompatible typing-extensions with python3.10 From 5fffca74b093abe8a937908c91e5ac2058216eb7 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 13 Jan 2026 08:44:13 +0100 Subject: [PATCH 47/59] cmake: add jrl_generate_ros2_package_files cmake: cosmetic remove cmake: generate ros2 python package files with condiition --- CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1041f962..847885bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -231,7 +231,7 @@ install( PATTERN "*.so" PATTERN "*.pyd" ) -# ------------------------------------------------------------------------ # + jrl_target_headers(nanoeigenpy_headers INTERFACE HEADERS ${nanoeigenpy_HEADERS} BASE_DIRS include @@ -240,11 +240,15 @@ jrl_target_headers(nanoeigenpy_headers INTERFACE jrl_add_export_component(NAME nanoeigenpy_headers TARGETS nanoeigenpy_headers) jrl_export_package() -# ------------------------------------------------------------------------ # if(BUILD_TESTING) enable_testing() add_subdirectory(tests) endif() +jrl_generate_ros2_package_files( + INSTALL_CPP_PACKAGE_FILES [[NOT BUILD_STANDALONE_PYTHON_INTERFACE]] + INSTALL_PYTHON_PACKAGE_FILES [[BUILD_PYTHON_INTERFACE]] +) + jrl_print_dependencies_summary() jrl_print_options_summary() From ad31260ff49d05aaec3d788913a2df2a38e4b5fb Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Sat, 17 Jan 2026 11:46:58 +0100 Subject: [PATCH 48/59] cmake: update jrl_target_generate_header API --- CMakeLists.txt | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 847885bf..039cc519 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,6 +164,19 @@ endif() add_library(nanoeigenpy_headers INTERFACE) add_library(nanoeigenpy::nanoeigenpy_headers ALIAS nanoeigenpy_headers) target_compile_features(nanoeigenpy_headers INTERFACE cxx_std_17) +set_target_properties(nanoeigenpy_headers PROPERTIES VERSION ${PROJECT_VERSION}) + +jrl_target_generate_config_header(nanoeigenpy_headers INTERFACE + LIBRARY_NAME nanoeigenpy +) + +jrl_target_generate_warning_header(nanoeigenpy_headers INTERFACE + LIBRARY_NAME nanoeigenpy +) + +jrl_target_generate_deprecated_header(nanoeigenpy_headers INTERFACE + LIBRARY_NAME nanoeigenpy +) target_include_directories( nanoeigenpy_headers @@ -195,11 +208,7 @@ nanobind_add_module(nanoeigenpy ${nanoeigenpy_HEADERS} ) jrl_target_set_output_directory(nanoeigenpy OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/site-packages) - jrl_target_enforce_msvc_conformance(nanoeigenpy PRIVATE) -jrl_target_generate_config_header(nanoeigenpy PRIVATE VERSION ${PROJECT_VERSION}) -jrl_target_generate_warning_header(nanoeigenpy PRIVATE) -jrl_target_generate_deprecated_header(nanoeigenpy PRIVATE) jrl_check_python_module_name(nanoeigenpy) target_link_libraries(nanoeigenpy PUBLIC nanoeigenpy_headers) From c69e70ad2f12ffdaf58ec9858c61d443d50996fb Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Sat, 17 Jan 2026 12:26:52 +0100 Subject: [PATCH 49/59] ci: display more info before clearing ccache cache --- .github/workflows/macos-linux-windows-pixi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index bd61ac41..555d300f 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -68,7 +68,7 @@ jobs: - name: Clear ccache statistics [MacOS/Linux/Windows] run: | - pixi run -e ${{ matrix.environment }} ccache -z + pixi run -e ${{ matrix.environment }} ccache -svz - name: Configure nanoeigenpy [MacOS/Linux/Windows] env: From 3c22c57646c748a03cffbea438939bfa930b8772 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 9 Feb 2026 16:19:44 +0100 Subject: [PATCH 50/59] rosci: do not use prerelease --- .github/workflows/ros_ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ros_ci.yml b/.github/workflows/ros_ci.yml index 3d7acca1..f09787dc 100644 --- a/.github/workflows/ros_ci.yml +++ b/.github/workflows/ros_ci.yml @@ -42,7 +42,6 @@ jobs: - ROS_DISTRO: rolling os: Ubuntu 24.04 (Noble) env: - PRERELEASE: true VERBOSE_OUTPUT: true VERBOSE_TESTS: true ROS_DISTRO: ${{ matrix.ROS_DISTRO }} From c752c4668ed0565f7b79a5d594e7c0cb7e9cbb46 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Wed, 11 Feb 2026 18:06:46 +0100 Subject: [PATCH 51/59] cmake: update the get-jrl messages --- cmake/get-jrl-cmakemodules.cmake | 47 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/cmake/get-jrl-cmakemodules.cmake b/cmake/get-jrl-cmakemodules.cmake index 1a0a5a02..ab6bc75e 100644 --- a/cmake/get-jrl-cmakemodules.cmake +++ b/cmake/get-jrl-cmakemodules.cmake @@ -1,18 +1,9 @@ # 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( - STATUS + 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) @@ -22,29 +13,37 @@ endif() # Option 2: use JRL_CMAKEMODULES_SOURCE_DIR environment variable (pixi might unset it, prefer option 1) if(ENV{JRL_CMAKEMODULES_SOURCE_DIR}) message( - STATUS - "JRL_CMAKEMODULES_SOURCE_DIR environement variable set, adding jrl-cmakemodules from source directory: $ENV{JRL_CMAKEMODULES_SOURCE_DIR}" + DEBUG + "JRL_CMAKEMODULES_SOURCE_DIR environement variable set, adding jrl-cmakemodules from source directory: ${JRL_CMAKEMODULES_SOURCE_DIR}" ) - add_subdirectory($ENV{JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) + add_subdirectory(${JRL_CMAKEMODULES_SOURCE_DIR} jrl-cmakemodules) return() endif() -# Option 3: Try to look for the installed package -message(STATUS "Looking for jrl-cmakemodules (version: >=1.1.2) package...") +# Try to look for the installed package +message(DEBUG "Looking for jrl-cmakemodules using find_package().") find_package(jrl-cmakemodules 1.1.2 CONFIG QUIET) -# If we have the package, we are done here. +# If we have the package, we are done. if(jrl-cmakemodules_FOUND) - message(STATUS "Found jrl-cmakemodules (version: ${jrl-cmakemodules_VERSION}) package.") + message(DEBUG "Found jrl-cmakemodules package via find_package().") return() +else() + message(DEBUG "jrl-cmakemodules package not found using find_package().") endif() -# Option 4: Fallback to FetchContent -message(STATUS "Fetching jrl-cmakemodules using FetchContent...") -include(FetchContent) -FetchContent_Declare( - jrl-cmakemodules - GIT_REPOSITORY https://github.com/ahoarau/jrl-cmakemodules - GIT_TAG jrl-next +# Fallback to FetchContent if not found +set(JRL_GIT_REPOSITORY "https://github.com/ahoarau/jrl-cmakemodules.git") +set(JRL_GIT_TAG "jrl-next") + +message( + DEBUG + "Fetching jrl-cmakemodules using FetchContent: + GIT_REPOSITORY: ${JRL_GIT_REPOSITORY} + GIT_TAG : ${JRL_GIT_TAG} +" ) + +include(FetchContent) +FetchContent_Declare(jrl-cmakemodules GIT_REPOSITORY ${JRL_GIT_REPOSITORY} GIT_TAG ${JRL_GIT_TAG}) FetchContent_MakeAvailable(jrl-cmakemodules) From 2534c104665a36ac7a2803483f3cd98b2e9202d3 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 16 Feb 2026 07:52:00 +0100 Subject: [PATCH 52/59] cmake: require jrl >=1.2 to get the jrl-v2 --- cmake/get-jrl-cmakemodules.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/get-jrl-cmakemodules.cmake b/cmake/get-jrl-cmakemodules.cmake index ab6bc75e..c23f6b72 100644 --- a/cmake/get-jrl-cmakemodules.cmake +++ b/cmake/get-jrl-cmakemodules.cmake @@ -22,7 +22,7 @@ endif() # Try to look for the installed package message(DEBUG "Looking for jrl-cmakemodules using find_package().") -find_package(jrl-cmakemodules 1.1.2 CONFIG QUIET) +find_package(jrl-cmakemodules 1.2.0 CONFIG QUIET) # If we have the package, we are done. if(jrl-cmakemodules_FOUND) From a172aebe1814b2bd49a3a7751871e866ef78f537 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Mon, 16 Feb 2026 17:38:25 +0100 Subject: [PATCH 53/59] cmake: update python and nanobind min required --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 039cc519..9946d390 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ endif() jrl_find_package(Eigen3 CONFIG REQUIRED) -jrl_find_python(3.8 REQUIRED COMPONENTS Interpreter Development.Module) +jrl_find_python(3.10 REQUIRED COMPONENTS Interpreter Development.Module) jrl_find_nanobind(2.5.0 CONFIG QUIET) if(nanobind_ROOT AND NOT nanobind_FOUND) From 1aecc10975fe2f117afbd1eeab8bd2ada283ead6 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 17 Feb 2026 12:11:54 +0100 Subject: [PATCH 54/59] pixi: remove the custom python install dir for pixi build --- pixi.toml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pixi.toml b/pixi.toml index 24c3b2ec..8080ca89 100644 --- a/pixi.toml +++ b/pixi.toml @@ -14,7 +14,7 @@ name = { workspace = true } version = { workspace = true } [package.build] -backend = { name = "pixi-build-cmake", version = "0.3.*" } +backend = { name = "pixi-build-cmake", version = "*" } [package.build.config] extra-args = [ @@ -22,12 +22,6 @@ extra-args = [ "-DBUILD_WITH_ACCELERATE_SUPPORT=OFF", ] -# Override python install dir for Conda on Windows -[package.build.target.win-64.config] -extra-args = [ - "-Dnanoeigenpy_PYTHON_INSTALL_DIR=%PREFIX%/Lib/site-packages", -] - [package.host-dependencies] nanobind = ">=2.5.0" python = ">=3.10" From 333520eaacaad4ade37522df46ae1cfe08f7bb44 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Fri, 20 Feb 2026 13:48:54 +0100 Subject: [PATCH 55/59] cmake: include project version in config header generation --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9946d390..f3a5acd9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,10 +164,10 @@ endif() add_library(nanoeigenpy_headers INTERFACE) add_library(nanoeigenpy::nanoeigenpy_headers ALIAS nanoeigenpy_headers) target_compile_features(nanoeigenpy_headers INTERFACE cxx_std_17) -set_target_properties(nanoeigenpy_headers PROPERTIES VERSION ${PROJECT_VERSION}) jrl_target_generate_config_header(nanoeigenpy_headers INTERFACE LIBRARY_NAME nanoeigenpy + VERSION ${PROJECT_VERSION} ) jrl_target_generate_warning_header(nanoeigenpy_headers INTERFACE From 63049daad356b10d6b5f523c62b22b2b3e266846 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:31:22 +0100 Subject: [PATCH 56/59] pixi.toml: re-enable pixi build --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 8080ca89..ffe3f8dc 100644 --- a/pixi.toml +++ b/pixi.toml @@ -244,4 +244,4 @@ eigen3-python-oldest = { features = [ "python-oldest", "eigen3" ]} -# test-pixi-build = { features = ["test-pixi-build"], no-default-feature = true } +test-pixi-build = { features = ["test-pixi-build"], no-default-feature = true } From adb2e3488493f5edc196201b62667d8d6cfe7a93 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:40:09 +0100 Subject: [PATCH 57/59] cmake: format --- CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f3a5acd9..65fb58ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,10 +66,7 @@ endif() if(BUILD_WITH_ACCELERATE_SUPPORT AND APPLE) if(Eigen3_VERSION VERSION_LESS 5.0.0) - message( - FATAL_ERROR - "Accelerate requires Eigen >= 5.0.0 (provided ${Eigen3_VERSION})" - ) + message(FATAL_ERROR "Accelerate requires Eigen >= 5.0.0 (provided ${Eigen3_VERSION})") endif() jrl_find_package(Accelerate REQUIRED) From 806e74cde78d6b18102b036ccead3b5993a95167 Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 21 Apr 2026 10:11:24 +0200 Subject: [PATCH 58/59] pixi: update lock file --- pixi.lock | 2041 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 1191 insertions(+), 850 deletions(-) diff --git a/pixi.lock b/pixi.lock index 989721d0..fdbd21d5 100644 --- a/pixi.lock +++ b/pixi.lock @@ -15,7 +15,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -25,11 +25,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -52,16 +52,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.3.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -69,14 +69,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda @@ -94,7 +94,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -123,7 +123,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-6_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -138,39 +138,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -183,7 +183,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -203,7 +203,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -212,7 +211,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -227,39 +226,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -269,7 +268,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -288,26 +287,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda @@ -338,7 +337,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -348,12 +347,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -385,7 +384,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-h95ff59c_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-hf02c80a_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda @@ -394,14 +393,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.3-h9226d62_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-h23b7119_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsuitesparseconfig-7.10.1-h901830b_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-h873dde6_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -411,14 +410,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda @@ -437,7 +436,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -474,7 +473,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcolamd-3.3.4-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxsparse-4.4.1-h3868ee3_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -491,7 +490,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libldl-3.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda @@ -500,15 +499,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspex-3.2.3-hc5c4b0d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspqr-4.3.4-h795628b_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsuitesparseconfig-7.10.1-h00e5f87_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libumfpack-6.3.5-h0658b90_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/metis-5.1.0-h3023b02_1007.conda @@ -517,14 +516,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda @@ -532,7 +531,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/suitesparse-7.10.1-h033788e_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -545,7 +544,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -566,7 +565,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -582,7 +580,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcolamd-3.3.4-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxsparse-4.4.1-h9e79f82_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -599,7 +597,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libldl-3.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda @@ -608,15 +606,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspex-3.2.3-h15d103f_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspqr-4.3.4-h775d698_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsuitesparseconfig-7.10.1-h4a8fc20_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libumfpack-6.3.5-h7c2c975_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/metis-5.1.0-h15f6cfe_1007.conda @@ -625,14 +623,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda @@ -640,7 +638,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/suitesparse-7.10.1-h3071b36_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -651,7 +649,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -682,34 +680,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libklu-2.3.5-h77a2eaa_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libldl-3.3.2-h8c1c262_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libparu-1.0.0-hd80212b_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librbio-4.3.4-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspex-3.2.3-h2f847cc_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspqr-4.3.4-h60c7c62_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsuitesparseconfig-7.10.1-h0795de7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libumfpack-6.3.5-h4ca129d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/metis-5.1.0-h17e2fc9_1007.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.2-h883a981_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/suitesparse-7.10.1-hfa24a04_7100102.conda @@ -736,14 +734,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/clang-22-22.1.0-default_hac490eb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/clang-22.1.0-default_nocfg_hbb9487a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/clangxx-22.1.0-default_nocfg_hbb9487a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/clang-22-22.1.3-default_hac490eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/clang-22.1.3-default_nocfg_hbb9487a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/clangxx-22.1.3-default_nocfg_hbb9487a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/compiler-rt22-22.1.0-h49e36cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_win-64-22.1.0-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/compiler-rt22-22.1.3-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_win-64-22.1.3-h49e36cd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/doxygen-1.13.2-hbf3f430_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/eigen-5.0.1-h5112557_0.conda @@ -772,35 +770,35 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libklu-2.3.5-h77a2eaa_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libldl-3.3.2-h8c1c262_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libparu-1.0.0-hd80212b_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librbio-4.3.4-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspex-3.2.3-h2f847cc_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspqr-4.3.4-h60c7c62_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsuitesparseconfig-7.10.1-h0795de7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libumfpack-6.3.5-h4ca129d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lld-22.1.2-hc465015_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lld-22.1.3-hc465015_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/metis-5.1.0-h17e2fc9_1007.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.2-h883a981_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/suitesparse-7.10.1-hfa24a04_7100102.conda @@ -832,7 +830,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -842,12 +840,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -879,7 +877,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-h95ff59c_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-hf02c80a_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda @@ -888,14 +886,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.3-h9226d62_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-h23b7119_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsuitesparseconfig-7.10.1-h901830b_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-h873dde6_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -905,13 +903,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.20-h3c07f61_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -931,7 +929,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -968,7 +966,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcolamd-3.3.4-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxsparse-4.4.1-h3868ee3_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -985,7 +983,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libldl-3.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libparu-1.0.0-hf1a04d7_7100102.conda @@ -993,15 +991,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspex-3.2.3-hc5c4b0d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspqr-4.3.4-h795628b_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsuitesparseconfig-7.10.1-h00e5f87_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libumfpack-6.3.5-h0658b90_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/metis-5.1.0-h3023b02_1007.conda @@ -1010,13 +1008,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.6-py310h07c5b4d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.20-hea035f4_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda @@ -1025,7 +1023,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/suitesparse-7.10.1-h033788e_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1038,7 +1036,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -1059,7 +1057,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -1075,7 +1072,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcolamd-3.3.4-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxsparse-4.4.1-h9e79f82_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -1092,7 +1089,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libldl-3.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparu-1.0.0-h317a14d_7100102.conda @@ -1100,15 +1097,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspex-3.2.3-h15d103f_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspqr-4.3.4-h775d698_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsuitesparseconfig-7.10.1-h4a8fc20_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libumfpack-6.3.5-h7c2c975_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/metis-5.1.0-h15f6cfe_1007.conda @@ -1117,13 +1114,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.2.6-py310h4d83441_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.20-h1b19095_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda @@ -1132,7 +1129,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/suitesparse-7.10.1-h3071b36_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1143,7 +1140,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -1174,32 +1171,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libklu-2.3.5-h77a2eaa_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libldl-3.3.2-h8c1c262_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libparu-1.0.0-hd80212b_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librbio-4.3.4-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspex-3.2.3-h2f847cc_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspqr-4.3.4-h60c7c62_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsuitesparseconfig-7.10.1-h0795de7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libumfpack-6.3.5-h4ca129d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/metis-5.1.0-h17e2fc9_1007.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.2-h883a981_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.6-py310h4987827_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.20-hc20f281_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda @@ -1232,7 +1229,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -1242,12 +1239,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -1279,7 +1276,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-h95ff59c_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-hf02c80a_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda @@ -1288,14 +1285,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.3-h9226d62_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-h23b7119_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsuitesparseconfig-7.10.1-h901830b_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-h873dde6_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -1305,14 +1302,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda @@ -1331,7 +1328,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -1368,7 +1365,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcolamd-3.3.4-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxsparse-4.4.1-h3868ee3_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -1385,7 +1382,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libldl-3.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda @@ -1394,15 +1391,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspex-3.2.3-hc5c4b0d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspqr-4.3.4-h795628b_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsuitesparseconfig-7.10.1-h00e5f87_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libumfpack-6.3.5-h0658b90_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/metis-5.1.0-h3023b02_1007.conda @@ -1411,14 +1408,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda @@ -1426,7 +1423,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/suitesparse-7.10.1-h033788e_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1439,7 +1436,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -1460,7 +1457,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -1476,7 +1472,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcolamd-3.3.4-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxsparse-4.4.1-h9e79f82_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -1493,7 +1489,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libldl-3.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda @@ -1502,15 +1498,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspex-3.2.3-h15d103f_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspqr-4.3.4-h775d698_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsuitesparseconfig-7.10.1-h4a8fc20_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libumfpack-6.3.5-h7c2c975_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/metis-5.1.0-h15f6cfe_1007.conda @@ -1519,14 +1515,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda @@ -1534,7 +1530,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/suitesparse-7.10.1-h3071b36_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1545,7 +1541,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -1576,34 +1572,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libklu-2.3.5-h77a2eaa_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libldl-3.3.2-h8c1c262_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libparu-1.0.0-hd80212b_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librbio-4.3.4-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspex-3.2.3-h2f847cc_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspqr-4.3.4-h60c7c62_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsuitesparseconfig-7.10.1-h0795de7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libumfpack-6.3.5-h4ca129d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/metis-5.1.0-h17e2fc9_1007.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.2-h883a981_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/suitesparse-7.10.1-hfa24a04_7100102.conda @@ -1635,18 +1631,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.0-default_h99862b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22.1.0-default_cfg_hcbb2b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.0-default_h0a60c25_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx-22.1.0-default_cfg_h9f82b57_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.0-default_h0a60c25_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.3-default_h99862b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22.1.3-default_cfg_hcbb2b3e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.3-default_h0a60c25_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx-22.1.3-default_cfg_h9f82b57_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.3-default_h0a60c25_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.0-hb700be7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.0-hffcefe0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.3-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.3-hffcefe0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/doxygen-1.13.2-h8e693c7_0.conda @@ -1654,11 +1650,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -1667,8 +1663,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.0-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.3-default_h99862b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.3-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda @@ -1683,36 +1679,36 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.3.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.2-hf7376ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.3-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lld-22.1.2-hef48ded_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.2-h4922eb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lld-22.1.3-hef48ded_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.3-h4922eb0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda @@ -1739,7 +1735,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -1749,11 +1745,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -1776,16 +1772,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.3.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -1793,14 +1789,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda @@ -1818,7 +1814,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -1847,7 +1843,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-6_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -1862,39 +1858,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1907,7 +1903,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -1927,7 +1923,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -1936,7 +1931,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -1951,39 +1946,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1993,7 +1988,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -2012,26 +2007,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda @@ -2062,7 +2057,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -2072,12 +2067,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -2109,7 +2104,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libklu-2.3.5-h95ff59c_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libldl-3.3.2-hf02c80a_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda @@ -2118,14 +2113,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspex-3.2.3-h9226d62_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspqr-4.3.4-h23b7119_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsuitesparseconfig-7.10.1-h901830b_7100101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libumfpack-6.3.5-h873dde6_7100101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -2135,14 +2130,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda @@ -2161,7 +2156,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -2198,7 +2193,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcolamd-3.3.4-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxsparse-4.4.1-h3868ee3_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -2215,7 +2210,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libldl-3.3.2-hca54c18_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda @@ -2224,15 +2219,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspex-3.2.3-hc5c4b0d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspqr-4.3.4-h795628b_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsuitesparseconfig-7.10.1-h00e5f87_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libumfpack-6.3.5-h0658b90_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/metis-5.1.0-h3023b02_1007.conda @@ -2241,14 +2236,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda @@ -2256,7 +2251,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/suitesparse-7.10.1-h033788e_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2269,7 +2264,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -2290,7 +2285,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -2306,7 +2300,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcolamd-3.3.4-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxsparse-4.4.1-h9e79f82_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -2323,7 +2317,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libldl-3.3.2-h99b4a89_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda @@ -2332,15 +2326,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspex-3.2.3-h15d103f_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspqr-4.3.4-h775d698_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsuitesparseconfig-7.10.1-h4a8fc20_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libumfpack-6.3.5-h7c2c975_7100102.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/metis-5.1.0-h15f6cfe_1007.conda @@ -2349,14 +2343,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda @@ -2364,7 +2358,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/suitesparse-7.10.1-h3071b36_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2375,7 +2369,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -2406,34 +2400,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libklu-2.3.5-h77a2eaa_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libldl-3.3.2-h8c1c262_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libparu-1.0.0-hd80212b_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librbio-4.3.4-h8c1c262_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspex-3.2.3-h2f847cc_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspqr-4.3.4-h60c7c62_7100102.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsuitesparseconfig-7.10.1-h0795de7_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libumfpack-6.3.5-h4ca129d_7100102.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/metis-5.1.0-h17e2fc9_1007.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mpfr-4.2.2-h883a981_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/suitesparse-7.10.1-hfa24a04_7100102.conda @@ -2465,7 +2459,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -2475,11 +2469,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -2502,16 +2496,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.3.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -2519,13 +2513,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.20-h3c07f61_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -2544,7 +2538,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -2573,7 +2567,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-6_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -2588,30 +2582,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.6-py310h07c5b4d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.20-hea035f4_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda @@ -2619,7 +2613,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py310hef62574_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2632,7 +2626,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -2652,7 +2646,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h784d473_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -2661,7 +2654,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -2676,30 +2669,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.2.6-py310h4d83441_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.20-h1b19095_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda @@ -2707,7 +2700,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py310h32ab4ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2717,7 +2710,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -2736,24 +2729,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.6-py310h4987827_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.20-hc20f281_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda @@ -2785,7 +2778,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -2795,11 +2788,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -2822,16 +2815,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.3.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -2839,14 +2832,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda @@ -2865,7 +2858,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -2894,7 +2887,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-6_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -2909,39 +2902,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.17.1-py314h5727af0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda @@ -2955,7 +2948,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -2975,7 +2968,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -2984,7 +2976,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -2999,39 +2991,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.17.1-py314hfc1f868_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda @@ -3042,7 +3034,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -3061,26 +3053,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.17.1-py314h221f224_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda @@ -3112,7 +3104,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda @@ -3122,11 +3114,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda @@ -3149,16 +3141,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhiredis-1.3.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -3166,13 +3158,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.20-h3c07f61_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -3191,7 +3183,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda @@ -3220,7 +3212,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-6_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -3235,30 +3227,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.6-py310h07c5b4d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.20-hea035f4_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda @@ -3266,7 +3258,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.15.2-py310hef62574_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -3279,7 +3271,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda @@ -3299,7 +3291,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.53.0-pl5321hc9deb11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda @@ -3308,7 +3299,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -3323,30 +3314,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.2.6-py310h4d83441_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.20-h1b19095_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda @@ -3354,7 +3345,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py310h32ab4ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -3364,7 +3355,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda @@ -3383,24 +3374,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-2.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.2.6-py310h4987827_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.20-hc20f281_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.15.2-py310h15c175c_0.conda @@ -3417,6 +3408,262 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xxhash-0.8.3-hbba6f48_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + test-pixi-build: + channels: + - url: https://conda.anaconda.org/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.3.1-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-hc65338a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-abi-5.0.1.80-hf414acd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: . + build: h3cb568c_0 + osx-64: + - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.11.0-h7a00415_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_impl_osx-64-1030.6.3-llvm19_1_h7d82c7c_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1030.6.3-llvm19_1_h8f0d4bb_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19-19.1.7-default_h9399c5b_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19.1.7-default_h1323312_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-19.1.7-h8a78ed7_31.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-19.1.7-h8a78ed7_31.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cmake-4.3.1-h2426fb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.11.0-h307afc9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/eigen-5.0.1-h4ff50a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/eigen-abi-5.0.1.80-h969a130_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-956.6-llvm19_1_hc3792c1_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-956.6-llvm19_1_hcae3351_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-6_he492b99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-6_h9b27e0a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.7-default_h9399c5b_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.5-hcc62823_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-6_h859234e_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.7-h56e7563_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.32-openmp_h9e49c7b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsigtool-0.1.3-hc0f2934_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.7-h879f4bc_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-64-26.0-h62b880e_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-codesign-0.1.3-hc0f2934_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + - conda: . + build: hc01b75d_0 + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.11.0-h61f9b84_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm19_1_hd01ab73_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.7-h75f8d18_31.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.7-h75f8d18_31.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmake-4.3.1-h8cb302d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.11.0-h88570a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-h44d0d2d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-abi-5.0.1.100-h485a483_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_ha2625f7_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - conda: . + build: hb02f359_0 + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.3.1-hdcbee5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.11.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/eigen-5.0.1-h5112557_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/eigen-abi-5.0.1.100-hc11354d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-6_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-6_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.5-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-6_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.1-hac47afa_11.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_34.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - conda: . + build: h9845677_0 packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -3612,61 +3859,61 @@ packages: license: ISC size: 147413 timestamp: 1772006283803 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.2-hedf47ba_0.conda - sha256: ec94ed03d2d7b7ea7f0ffc7df347808e9762d1ea8bc33f990901491956efd69c - md5: 49346bc551d07c6940e811a1f93ba373 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ccache-4.13.4-hedf47ba_0.conda + sha256: b8ceeaeec57481a63bf7ec3c0ef3db276aa091a88249f6047662fee2b109c9f4 + md5: 647dbec4597b31bf5a308260c53f320d depends: - - libstdcxx >=14 - libgcc >=14 + - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 - - libhiredis >=1.3.0,<1.4.0a0 - - xxhash >=0.8.3,<0.8.4.0a0 - zstd >=1.5.7,<1.6.0a0 + - xxhash >=0.8.3,<0.8.4.0a0 + - libhiredis >=1.3.0,<1.4.0a0 license: GPL-3.0-only license_family: GPL - size: 847826 - timestamp: 1774189203440 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.2-h894318c_0.conda - sha256: 2b00e119f7c194ffdf7d2ec239dfb0a2bb584db1762bce5539edb783358a58ff - md5: e77ab67215939f46bb6ec8226a242e6a + size: 855152 + timestamp: 1776609564392 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ccache-4.13.4-h894318c_0.conda + sha256: 75bce9f2c2be56607dcd8eca75aab0fe57a386a4b4c83f3d4d4a16e0f01d2443 + md5: 5c38d938a042bf6cc8605cbaf8a9d769 depends: - __osx >=11.0 - libcxx >=19 - - libhiredis >=1.3.0,<1.4.0a0 - xxhash >=0.8.3,<0.8.4.0a0 + - libhiredis >=1.3.0,<1.4.0a0 - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL - size: 654530 - timestamp: 1774189372899 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.2-h414bf82_0.conda - sha256: d9547c2cb6963f7763eb8910724d5c843d1bb7af4b1b8c54023d87d946cc7880 - md5: baeca21071729b617b20b019f85beedf + size: 656424 + timestamp: 1776609709210 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ccache-4.13.4-h414bf82_0.conda + sha256: 455e1a45bc32e9de4bdc19a4155c08e0d60a71e97fd35c5b130df3b44cf195e3 + md5: c6f4bfb11893878780f4b3eae6432e43 depends: - __osx >=11.0 - libcxx >=19 - zstd >=1.5.7,<1.6.0a0 - - xxhash >=0.8.3,<0.8.4.0a0 - libhiredis >=1.3.0,<1.4.0a0 + - xxhash >=0.8.3,<0.8.4.0a0 license: GPL-3.0-only license_family: GPL - size: 598937 - timestamp: 1774189390770 -- conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.2-h7fd822b_0.conda - sha256: fd5928b70b952595b89ce730d7444a1f3ed4ba0bd1520b1470e5663023c934f6 - md5: 9e4446307f83246c5889911f2b89a202 + size: 601136 + timestamp: 1776609698025 +- conda: https://conda.anaconda.org/conda-forge/win-64/ccache-4.13.4-h7fd822b_0.conda + sha256: d81831f4d89fa6f3928d499fd6df2751d2940504ca8e23846bec84e1347cfc09 + md5: eeb4e9f771e43d2164763149e7738254 depends: - ucrt - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - libhiredis >=1.3.0,<1.4.0a0 - xxhash >=0.8.3,<0.8.4.0a0 - zstd >=1.5.7,<1.6.0a0 + - libhiredis >=1.3.0,<1.4.0a0 license: GPL-3.0-only license_family: GPL - size: 689752 - timestamp: 1774189255514 + size: 691717 + timestamp: 1776609624754 - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1030.6.3-llvm19_1_h67a6458_4.conda sha256: 0563fb193edde8002059e1a7fc32b23b5bd48389d9abdf5e49ff81e7490da722 md5: 7b4852df7d4ed4e45bcb70c5d4b08cd0 @@ -3751,20 +3998,20 @@ packages: license_family: Other size: 23429 timestamp: 1772019026855 -- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22.1.0-default_cfg_hcbb2b3e_0.conda - sha256: 0d9742b0b96fabbe31a412903f1b9de6548cc65cce39d78c1d845a2156480d1b - md5: feae0bebfd6f906118d713872ee396d8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22.1.3-default_cfg_hcbb2b3e_1.conda + sha256: 6fbdcb87d55cadfdfc1873f0b3472db766176be52f747b947177d5de13a3393e + md5: a8e6317f5aeff20fb813e9cf00e76316 depends: - binutils - - clang-22 22.1.0 default_h99862b1_0 - - clang_impl_linux-64 22.1.0 default_h0a60c25_0 + - clang-22 22.1.3 default_h99862b1_1 + - clang_impl_linux-64 22.1.3 default_h0a60c25_1 - libgcc-devel_linux-64 - - llvm-openmp >=22.1.0 + - llvm-openmp >=22.1.3 - sysroot_linux-64 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 28113 - timestamp: 1772101286498 + size: 28265 + timestamp: 1776099796598 - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19.1.7-default_h1323312_8.conda sha256: 100109bf7837298607f53121f102ed8acc5efb15af6a3f2bc4e199a429c60e6b md5: fd53f2ec0db69ed874d9ce2b75662633 @@ -3791,21 +4038,21 @@ packages: license_family: Apache size: 24838 timestamp: 1772400473621 -- conda: https://conda.anaconda.org/conda-forge/win-64/clang-22.1.0-default_nocfg_hbb9487a_0.conda - sha256: 349a04e9d84cd67a380b5b90bb033ae084d3685455447648135968ec02aa2e18 - md5: 6da7ea42d788283040dd2785f34fc743 +- conda: https://conda.anaconda.org/conda-forge/win-64/clang-22.1.3-default_nocfg_hbb9487a_0.conda + sha256: 190d8ce6f51c36b2b22f67d83b22ed54cdd7b93acdd33a03c20b8efecbac5dc2 + md5: f6df7cbd0d3a57a399e30913b9c762dd depends: - - clang-22 22.1.0 default_hac490eb_0 - - libzlib >=1.3.1,<2.0a0 - - llvm-openmp >=22.1.0 + - clang-22 22.1.3 default_hac490eb_0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.3 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 114978089 - timestamp: 1772353299731 + size: 114421210 + timestamp: 1775787591070 - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-19-19.1.7-default_h9399c5b_8.conda sha256: ac3b9d1903f74d44698efb0f93101118e24dacf52f635d5d0a4f65df4484e416 md5: f3f31a8c3982f9a4c077842b5178cc3c @@ -3830,48 +4077,48 @@ packages: license_family: Apache size: 765865 timestamp: 1772400229152 -- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.0-default_h99862b1_0.conda - sha256: a24a4eb8522693fbfc6c6b9ab1914314437ca0858b8ac6909275b47be3e93e39 - md5: 1f2b771fc99f1c8115301a9d232dfd94 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.3-default_h99862b1_1.conda + sha256: 6b813a2543e8d84461085e1f1215d325538b7841d782556fe5511c94c3615450 + md5: 24cdd810bd2baec6a7a718391441d38f depends: - __glibc >=2.17,<3.0.a0 - - compiler-rt22 22.1.0.* - - libclang-cpp22.1 22.1.0 default_h99862b1_0 + - compiler-rt22 22.1.3.* + - libclang-cpp22.1 22.1.3 default_h99862b1_1 - libgcc >=14 - - libllvm22 >=22.1.0,<22.2.0a0 + - libllvm22 >=22.1.3,<22.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 835553 - timestamp: 1772101189757 -- conda: https://conda.anaconda.org/conda-forge/win-64/clang-22-22.1.0-default_hac490eb_0.conda - sha256: 0aa2c3daf1b8797305dd85f74f836e1558415dcf6ada712ffadc35e80a5c9f7f - md5: 1f1e771e08f88ba4996ad67189224de6 + size: 837651 + timestamp: 1776099704395 +- conda: https://conda.anaconda.org/conda-forge/win-64/clang-22-22.1.3-default_hac490eb_0.conda + sha256: 20d37fc9ccce34194f31ef0edc02e73581e27728300ea3fd20eb420d4ac8fa6e + md5: 00ef11f739b3a9fc93d7c74d1c936b2a depends: - - compiler-rt22 22.1.0.* - - libzlib >=1.3.1,<2.0a0 + - compiler-rt22 22.1.3.* + - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 77430347 - timestamp: 1772353047325 -- conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.0-default_h0a60c25_0.conda - sha256: 8ac20fa0b6c96e739c06ec22e83560136d06799522bcd9421b083ec999ca01a1 - md5: c679d2aa7914d773899033583278fa24 + size: 77057999 + timestamp: 1775787309173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.3-default_h0a60c25_1.conda + sha256: 7eb6d8d85b6d928857f3b888095f0bf5cd77006fd38a68446045665fe8094f77 + md5: 307208646404d40f182e3673b2eebe54 depends: - binutils_impl_linux-64 - - clang-22 22.1.0 default_h99862b1_0 - - compiler-rt 22.1.0.* + - clang-22 22.1.3 default_h99862b1_1 + - compiler-rt 22.1.3.* - compiler-rt_linux-64 - libgcc-devel_linux-64 - sysroot_linux-64 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 27622 - timestamp: 1772101256543 + size: 27831 + timestamp: 1776099768696 - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-19.1.7-default_ha1a018a_8.conda sha256: 02d729505c073204dd34df5c3bfaca34e34ecef773550cc119e6089b44b3af89 md5: 1895f622944c8c344ff73f42e2a6d034 @@ -3926,17 +4173,17 @@ packages: license_family: BSD size: 21135 timestamp: 1769482854554 -- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx-22.1.0-default_cfg_h9f82b57_0.conda - sha256: 5bbf3d18ad6f3d0e23f223dd52dbf99e19d0281b25e0448190b8cfa9dac4bb49 - md5: ac67de49c14d627fda9b4aae87abe2a7 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx-22.1.3-default_cfg_h9f82b57_1.conda + sha256: e83a2989aab2e3c258712f4205a08d899e31fb6c17c9c98c19c53f7ef15322ec + md5: bf282eb4b25135d92a8714f061606cd3 depends: - - clang 22.1.0 default_cfg_hcbb2b3e_0 - - clangxx_impl_linux-64 22.1.0 default_h0a60c25_0 + - clang 22.1.3 default_cfg_hcbb2b3e_1 + - clangxx_impl_linux-64 22.1.3 default_h0a60c25_1 - libstdcxx-devel_linux-64 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 27869 - timestamp: 1772101348451 + size: 28040 + timestamp: 1776099855706 - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-19.1.7-default_h9089c59_8.conda sha256: d3d4ebd917a17f3da9a9f7538dc6b225a2600538d63b6cd17dec89a77003e3d6 md5: 9fa35b03d31d125cd8db1f268d6bfea2 @@ -3959,31 +4206,31 @@ packages: license_family: Apache size: 24759 timestamp: 1772400631747 -- conda: https://conda.anaconda.org/conda-forge/win-64/clangxx-22.1.0-default_nocfg_hbb9487a_0.conda - sha256: 4aae816794e9018fd1a467bd516847f79ff3bffcf2caa84e86cfe613925fcc72 - md5: eab5eb1bcbdbe1cdf3acd7735e27c87b +- conda: https://conda.anaconda.org/conda-forge/win-64/clangxx-22.1.3-default_nocfg_hbb9487a_0.conda + sha256: b962a8d03b66ff3dcadec7b16f82cf9d01b639cba943d3b3ae7ae32b3f6b5973 + md5: ba6e5ac0c9c3ca8f36ba2ea94a5eaed9 depends: - - clang 22.1.0 default_nocfg_hbb9487a_0 - - libzlib >=1.3.1,<2.0a0 + - clang 22.1.3 default_nocfg_hbb9487a_0 + - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 38349897 - timestamp: 1772353550860 -- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.0-default_h0a60c25_0.conda - sha256: bc870eb662ec371a2c8f09769d8367c44fe9e83c2aa0f11c1b5ba40429091e0b - md5: be5504be6338168fd4eaaea51448ff42 - depends: - - clang-22 22.1.0 default_h99862b1_0 - - clang_impl_linux-64 22.1.0 default_h0a60c25_0 + size: 38162459 + timestamp: 1775787852925 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.3-default_h0a60c25_1.conda + sha256: afdbf5feb1ebe10c2cd6f7a344f4be7eb1b7932c3026d7932c11ebf0b7837503 + md5: 9419dac056a609ba0b634e4f751e1e9a + depends: + - clang-22 22.1.3 default_h99862b1_1 + - clang_impl_linux-64 22.1.3 default_h0a60c25_1 - libstdcxx-devel_linux-64 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 27571 - timestamp: 1772101315400 + size: 27756 + timestamp: 1776099823619 - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-19.1.7-default_ha1a018a_8.conda sha256: 7ad39ca7ea2a64ac421e0170d53762cfaa3013f087d31d8bccfacc2d60297c93 md5: 812549bdef1d523452d711c166382d1b @@ -4116,18 +4363,18 @@ packages: license_family: BSD size: 27011 timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.0-ha770c72_0.conda - sha256: 6c6cd8ec8b99e9e4bbe121b77e0f356a2f8845add6d0cd4d6f71f6201fa654c2 - md5: 98cc540405de03e37417cc94f4191301 +- conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.3-ha770c72_0.conda + sha256: a6e17bb372a61616f611f06571eac23a6ff89f7f30e2c45a81a1bde743315382 + md5: 624997267d77974060a8ec782870d39b depends: - - compiler-rt22 22.1.0 hb700be7_0 - - libcompiler-rt 22.1.0 hb700be7_0 + - compiler-rt22 22.1.3 hb700be7_0 + - libcompiler-rt 22.1.3 hb700be7_0 constrains: - - clang 22.1.0 + - clang 22.1.3 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 16378 - timestamp: 1772021047024 + size: 16470 + timestamp: 1775703449708 - conda: https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-19.1.7-he914875_1.conda sha256: 28e5f0a6293acba68ebc54694a2fc40b1897202735e8e8cbaaa0e975ba7b235b md5: e6b9e71e5cb08f9ed0185d31d33a074b @@ -4150,59 +4397,59 @@ packages: license_family: APACHE size: 97085 timestamp: 1757411887557 -- conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.0-hb700be7_0.conda - sha256: a23f7a8bd6722b41abea88ebd0cea674b0daf8dfee70ece8d2cc798556144675 - md5: 6930338793ffed4140d0903011f6937e +- conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.3-hb700be7_0.conda + sha256: 79dd86a4f450cbe19f4ab434b5ac99d84f7e18781075a5038550709fc6dcc541 + md5: 0a9951e4a87e34bedcb902449d360d3a depends: - __glibc >=2.17,<3.0.a0 - - compiler-rt22_linux-64 22.1.0.* + - compiler-rt22_linux-64 22.1.3.* - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 114932 - timestamp: 1772021045728 -- conda: https://conda.anaconda.org/conda-forge/win-64/compiler-rt22-22.1.0-h49e36cd_0.conda - sha256: 1bda7c26a337e908d6d8df187ebbeb00646bd8b2f82674f2f3ade65bb7a09678 - md5: fb549a3ffb359cf4d3a5e13c31c904cd + size: 114957 + timestamp: 1775703448852 +- conda: https://conda.anaconda.org/conda-forge/win-64/compiler-rt22-22.1.3-h49e36cd_0.conda + sha256: 2210b8304c6c6e7465fd58328ebd9ccd568b7ef6280b2392bddfaf2448d28991 + md5: 495444f4b6fbe9c2df440ba0ee276557 depends: - - compiler-rt22_win-64 22.1.0.* + - compiler-rt22_win-64 22.1.3.* - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 3680052 - timestamp: 1772019087513 -- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.0-hffcefe0_0.conda - sha256: a37472aa2288bea0c588ae47aca6291238558303fdc2e814b58b8de64937263b - md5: 1254d960f9dd3d269c093ee6db94a454 + size: 3619661 + timestamp: 1775704109885 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.3-hffcefe0_0.conda + sha256: 2be412d16dfdbaec86307da84be5b712142757288d7d1c478dafb23993b30a99 + md5: 372da86ed972f6ec8c3e0e64048b86c5 constrains: - compiler-rt >=9.0.1 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 48094890 - timestamp: 1772020917994 -- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_win-64-22.1.0-h49e36cd_0.conda - sha256: 9bdffc3b5afb4385b472828f16d1afd41d3924ec959bfc9c1c44fdb038217c73 - md5: 137eab5c20533a223411df9971d2aa18 + size: 47291875 + timestamp: 1775703342526 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_win-64-22.1.3-h49e36cd_0.conda + sha256: 1f9ec775542c011bf01d8b84d5e4eca4aed94ee1c63c1d3822ee9899e6d1241d + md5: 3525be518fe26de64291e2e318522a29 constrains: - compiler-rt >=9.0.1 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 4013037 - timestamp: 1772019008363 -- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.0-ha770c72_0.conda - sha256: 081a126085b6656b8f5e0ffe0636eb07287d81376bdb8d49f5e0e455dce8bce9 - md5: 00fd62b3f1c0019f6aa9d6913f0917f9 + size: 3536920 + timestamp: 1775704031647 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.3-ha770c72_0.conda + sha256: 05978adae91f39546b520399f2a8b1ed853e716a712fd5d17bb7cf2d7b1f5757 + md5: 8d03b01c8ff638fae87d9dc4b89a0188 depends: - - compiler-rt22_linux-64 22.1.0 hffcefe0_0 + - compiler-rt22_linux-64 22.1.3 hffcefe0_0 constrains: - - clang 22.1.0 + - clang 22.1.3 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 16403 - timestamp: 1772021046573 + size: 16502 + timestamp: 1775703449445 - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-19.1.7-h138dee1_1.conda sha256: e6effe89523fc6143819f7a68372b28bf0c176af5b050fe6cf75b62e9f6c6157 md5: 32deecb68e11352deaa3235b709ddab2 @@ -4392,6 +4639,42 @@ packages: license_family: MOZILLA size: 1308183 timestamp: 1773744771265 +- conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-abi-5.0.1.80-hf414acd_0.conda + sha256: acde70d55f7dbbc043d733427fd6f1ec6ca49db7cbabcf7a656dd29a952b8ad8 + md5: a85c1768af7780d67c6446c17848b76f + constrains: + - eigen >=5.0.1,<5.0.2.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 13265 + timestamp: 1773744756289 +- conda: https://conda.anaconda.org/conda-forge/osx-64/eigen-abi-5.0.1.80-h969a130_0.conda + sha256: 691341c062184be7b6ca198d5210b7174081f41dd417f33aee32c94c3562ef1c + md5: 18e9ad1d3a45e48be53945a1dda3763e + constrains: + - eigen >=5.0.1,<5.0.2.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 13290 + timestamp: 1773745053527 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-abi-5.0.1.100-h485a483_0.conda + sha256: 75a022706a04890db2d56d2967f06773cbef3e257ae4ce898d60d7a4b8aa99a4 + md5: 517f7185d37c1fab8c8220c1110d82cb + constrains: + - eigen >=5.0.1,<5.0.2.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 13293 + timestamp: 1773744888755 +- conda: https://conda.anaconda.org/conda-forge/win-64/eigen-abi-5.0.1.100-hc11354d_0.conda + sha256: 2132168c3e862bcbe32d6d889850ac5ef1ef65f0938ca8a61d5437168344d175 + md5: 53919396018421266fa1a78b537394cc + constrains: + - eigen >=5.0.1,<5.0.2.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 13278 + timestamp: 1773744771265 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -4427,16 +4710,17 @@ packages: license_family: GPL size: 76302378 timestamp: 1771378056505 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda - sha256: 676444fd28bde495e27d32999c6f2e4cb7f96cf05c2ce5e8bf4b37ef0b428dfb - md5: 0b6cd616dab5e509c5c368d58a01982d +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_23.conda + sha256: b535da55f53ed0e44a366295dad325b242958fb3d91ba84b0173bfae28b39793 + md5: b6090b005c6e1947e897c926caac1286 depends: - gcc_impl_linux-64 14.3.0.* - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause - size: 28918 - timestamp: 1774728910114 + license_family: BSD + size: 28912 + timestamp: 1775508892545 - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda sha256: 33b20cf09ff1c6ca960e6c5f7fad1f08ffd3112a87d79e42ed56f4e1b4cdefe3 md5: ad8d4260a6dae5f55960b26b237d576b @@ -4552,17 +4836,18 @@ packages: license_family: GPL size: 14566100 timestamp: 1771378271421 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda - sha256: 0331f697ddd97f4d0ddbf66badf6f94bb397b39c534bcf604967d362dea428b1 - md5: ac8519fa5fe0e5d779b5f6d658c10ed5 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h91b0f8e_23.conda + sha256: 8a6a78d354fd259906b2f01f5c29c4f9e42878fa870eadc20f7251d4554a4445 + md5: 12d093c7df954a01b396a748442bd5cb depends: - gxx_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_22 + - gcc_linux-64 ==14.3.0 h298d278_23 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause - size: 27468 - timestamp: 1774728910114 + license_family: BSD + size: 27479 + timestamp: 1775508892545 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a md5: c80d8a3b84358cb967fa81e7075fbc8a @@ -4583,15 +4868,6 @@ packages: license_family: MIT size: 12273764 timestamp: 1773822733780 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 - md5: f1182c91c0de31a7abd40cedf6a5ebef - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 12361647 - timestamp: 1773822915649 - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 md5: 9614359868482abba1bd15ce465e3c42 @@ -5149,18 +5425,18 @@ packages: license_family: Apache size: 14064507 timestamp: 1772400067348 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda - sha256: 914da94dbf829192b2bb360a7684b32e46f047a57de96a2f5ab39a011aeae6ea - md5: d966a23335e090a5410cc4f0dec8d00a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.3-default_h99862b1_1.conda + sha256: b3576e94643608758ecfc25e1c35a50441b1c729f4c0a9d8c137ac7c0cf58b5c + md5: 1cf5d6f2ae346ea959f223401764845c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libllvm22 >=22.1.0,<22.2.0a0 + - libllvm22 >=22.1.3,<22.2.0a0 - libstdcxx >=14 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 21661249 - timestamp: 1772101075353 + size: 21627287 + timestamp: 1776099638135 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcolamd-3.3.4-hf02c80a_7100101.conda sha256: 00d1b976b914f0c20ae6f81f4e4713fa87717542eba8757b9a3c9e8abcc29858 md5: 56d4c5542887e8955f21f8546ad75d9d @@ -5207,9 +5483,9 @@ packages: license_family: BSD size: 34206 timestamp: 1742288893863 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.0-hb700be7_0.conda - sha256: a80eb63faa09b9e091922e805a5d6bd8e3531948d9bbe09b841c0f84f058bf00 - md5: a5c4f5f06ed7db43eb32bbc80ce28300 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.3-hb700be7_0.conda + sha256: e66d0cf06f5a2cf7386c5e254021e971742ef956ce4224d7895187587d83c698 + md5: 7abbfbbed326d175e27d81762d56753d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -5218,8 +5494,8 @@ packages: - compiler-rt >=9.0.1 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 10658616 - timestamp: 1772021015681 + size: 10380887 + timestamp: 1775703422872 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4 md5: d50608c443a30c341c24277d28290f76 @@ -5325,24 +5601,24 @@ packages: license: LGPL-2.1-or-later size: 70656 timestamp: 1742288893863 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.2-h19cb2f5_0.conda - sha256: 46561199545890e050a8a90edcfce984e5f881da86b09388926e3a6c6b759dec - md5: ed6f7b7a35f942a0301e581d72616f7d +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.3-h19cb2f5_0.conda + sha256: 24d7e7d15d144f2f74fbc9f397a643f0a1da94dbe9aa9f0d15990fabe34974c9 + md5: 212ddd7bd52988f751905114325b5c0b depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 564908 - timestamp: 1774439353713 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda - sha256: d1402087c8792461bfc081629e8aa97e6e577a31ae0b84e6b9cc144a18f48067 - md5: 4280e0a7fd613b271e022e60dea0138c + size: 564947 + timestamp: 1775564350407 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.3-h55c6f16_0.conda + sha256: 34cc56c627b01928e49731bcfe92338e440ab6b5952feee8f1dd16570b8b8339 + md5: acbb3f547c4aae16b19e417db0c6e5ed depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 568094 - timestamp: 1774439202359 + size: 570026 + timestamp: 1775565121045 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.7-h7c275be_2.conda sha256: 760af3509e723d8ee5a9baa7f923a213a758b3a09e41ffdaf10f3a474898ab3f md5: 52031c3ab8857ea8bcc96fe6f1b6d778 @@ -5993,9 +6269,9 @@ packages: license_family: Apache size: 26914852 timestamp: 1757353228286 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.2-hf7376ad_0.conda - sha256: eda0013a9979d142f520747e3621749c493f5fbc8f9d13a52ac7a2b699338e7c - md5: 7147b0792a803cd5b9929ce5d48f7818 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.3-hf7376ad_0.conda + sha256: ad732019e8dd963efb5a54b5ff49168f191246bc418c3033762b6e8cb64b530c + md5: aeb186f7165bf287495a267fa8ff4129 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -6006,51 +6282,51 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 44217146 - timestamp: 1774480335347 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb - md5: c7c83eecbb72d88b940c249af56c8b17 + size: 44235531 + timestamp: 1775641389057 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: b88d90cad08e6bc8ad540cb310a761fb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD - size: 113207 - timestamp: 1768752626120 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.2-h11316ed_0.conda - sha256: 7ab3c98abd3b5d5ec72faa8d9f5d4b50dcee4970ed05339bc381861199dabb41 - md5: 688a0c3d57fa118b9c97bf7e471ab46c + size: 113478 + timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + sha256: d9e2006051529aec5578c6efeb13bb6a7200a014b2d5a77a579e83a8049d5f3c + md5: becdfbfe7049fa248e52aa37a9df09e2 depends: - - __osx >=10.13 + - __osx >=11.0 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD - size: 105482 - timestamp: 1768753411348 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e - md5: 009f0d956d7bfb00de86901d16e486c7 + size: 105724 + timestamp: 1775826029494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 depends: - __osx >=11.0 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD - size: 92242 - timestamp: 1768752982486 -- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.2-hfd05255_0.conda - sha256: f25bf293f550c8ed2e0c7145eb404324611cfccff37660869d97abf526eb957c - md5: ba0bfd4c3cf73f299ffe46ff0eaeb8e3 + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + sha256: d636d1a25234063642f9c531a7bb58d84c1c496411280a36ea000bd122f078f1 + md5: 8f83619ab1588b98dd99c90b0bfc5c6d depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - xz 5.8.2.* + - xz 5.8.3.* license: 0BSD - size: 106169 - timestamp: 1768752763559 + size: 106486 + timestamp: 1775825663227 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 md5: 2c21e66f50753a083cbe6b80f38268fa @@ -6453,46 +6729,46 @@ packages: license_family: GPL size: 181693 timestamp: 1742288893864 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 - md5: fd893f6a3002a635b5e50ceb9dd2c0f4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda + sha256: ec37c79f737933bbac965f5dc0f08ef2790247129a84bb3114fad4900adce401 + md5: 810d83373448da85c3f673fbcb7ad3a3 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing - size: 951405 - timestamp: 1772818874251 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.52.0-h77d7759_0.conda - sha256: f500d1cd50cfcd288d02b8fc3c3b7ecf8de6fec7b86e57ea058def02908e4231 - md5: d553eb96758e038b04027b30fe314b2d + size: 958864 + timestamp: 1775753750179 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda + sha256: ae9d83cab8988a7d4ccec411fef23c141b5b3d301db3e926ab7cd4befe3764e6 + md5: f2bb6692dfb33a1bbce746aa812a9a5b depends: - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 + - icu >=78.3,<79.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing - size: 996526 - timestamp: 1772819669038 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda - sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c - md5: f6233a3fddc35a2ec9f617f79d6f3d71 + size: 1007272 + timestamp: 1775754456682 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda + sha256: 1a9d1e3e18dbb0b87cff3b40c3e42703730d7ac7ee9b9322c2682196a81ba0c3 + md5: 8423c008105df35485e184066cad4566 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing - size: 918420 - timestamp: 1772819478684 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.52.0-hf5d6505_0.conda - sha256: 5fccf1e4e4062f8b9a554abf4f9735a98e70f82e2865d0bfdb47b9de94887583 - md5: 8830689d537fda55f990620680934bb1 + size: 920039 + timestamp: 1775754485962 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda + sha256: 7a6256ea136936df4c4f3b227ba1e273b7d61152f9811b52157af497f07640b0 + md5: 4152b5a8d2513fd7ae9fb9f221a5595d depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing - size: 1297302 - timestamp: 1772818899033 + size: 1301855 + timestamp: 1775753831574 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -6679,16 +6955,16 @@ packages: license_family: GPL size: 361450 timestamp: 1742288893864 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee - md5: db409b7c1720428638e7c0d509d3e1b5 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 + md5: 38ffe67b78c9d4de527be8315e5ada2c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD - size: 40311 - timestamp: 1766271528534 + size: 40297 + timestamp: 1775052476770 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b md5: 0f03292cc56bf91a077a134ea8747118 @@ -6747,57 +7023,58 @@ packages: license: LGPL-2.1-or-later size: 100393 timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda - sha256: 275c324f87bda1a3b67d2f4fcc3555eeff9e228a37655aa001284a7ceb6b0392 - md5: e49238a1609f9a4a844b09d9926f2c3d +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + sha256: 3bc5551720c58591f6ea1146f7d1539c734ed1c40e7b9f5cb8cb7e900c509aba + md5: 995d8c8bad2a3cc8db14675a153dec2b depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libxml2-16 2.15.2 hca6bf5a_0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 hca6bf5a_0 + - libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT - size: 45968 - timestamp: 1772704614539 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.2-hd552753_0.conda - sha256: 5b9e8a5146275ac0539231f646ee51a9e4629e730026ff69dadff35bfb745911 - md5: eea3155f3b4a3b75af504c871ec23858 + size: 46810 + timestamp: 1776376751152 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.3-h953d39d_0.conda + sha256: 24248928e63b5de45012c8ad3fd6b350ae1fe2fc355613bb89ee5f0a35835bea + md5: 33f30d4878d1f047da82a669c33b307d depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libxml2-16 2.15.2 h7a90416_0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h7a90416_0 + - libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT - size: 41106 - timestamp: 1772705465931 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda - sha256: 99cb32dd06a2e58c12981b71a84b052293f27b5ab042e3f21d895f5d7ee13eff - md5: e476ba84e57f2bd2004a27381812ad4e + size: 40836 + timestamp: 1776377277986 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-heed7d32_0.conda + sha256: 4d9c117b2dd222cf891710d5f6a570ebb275479979843a1477ac54ed50907b40 + md5: 0c1fdc80534d8f25fd74722aba81f044 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libxml2-16 2.15.2 h5ef1a60_0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h6967ea9_0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - icu <0.0a0 license: MIT license_family: MIT - size: 41206 - timestamp: 1772704982288 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.2-h5d26750_0.conda - sha256: f905eb7046987c336122121759e7f09144729f6898f48cd06df2a945b86998d8 - md5: 1007e1bfe181a2aee214779ee7f13d30 + size: 41663 + timestamp: 1776377341241 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda + sha256: da68af9d9d28d65a6916db1bef68f8a25c64c4fdcf759f32a2d2f2f143220adf + md5: e3b5acbb857a12f5d59e8d174bc536c0 depends: - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libxml2-16 2.15.2 h692994f_0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h692994f_0 + - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 @@ -6805,71 +7082,71 @@ packages: - icu <0.0a0 license: MIT license_family: MIT - size: 43681 - timestamp: 1772704748950 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - sha256: 08d2b34b49bec9613784f868209bb7c3bb8840d6cf835ff692e036b09745188c - md5: f3bc152cb4f86babe30f3a4bf0dbef69 + size: 43916 + timestamp: 1776376994334 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + sha256: 3d44f737c5ae52d5af32682cc1530df433f401f8e58a7533926536244127572a + md5: e79d2c2f24b027aa8d5ab1b1ba3061e7 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - libxml2 2.15.2 + - libxml2 2.15.3 license: MIT license_family: MIT - size: 557492 - timestamp: 1772704601644 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.2-h7a90416_0.conda - sha256: f67e4b7d7f97e57ecd611a42e42d5f6c047fd3d1eb8270813b888924440c8a59 - md5: 0c8bdbfd118f5963ab343846094932a3 + size: 559775 + timestamp: 1776376739004 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.3-h7a90416_0.conda + sha256: 437f003e299d77403db42d17e532d686236f357ac5c3d6bf466558c697902597 + md5: c74ae93cd7876e3a9c4b5569d5e29e34 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - libxml2 2.15.2 + - libxml2 2.15.3 license: MIT license_family: MIT - size: 495922 - timestamp: 1772705426323 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda - sha256: 6432259204e78c8a8a815afae987fbf60bd722605fe2c4b022e65196b17d4537 - md5: b284e2b02d53ef7981613839fb86beee + size: 496338 + timestamp: 1776377250079 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h6967ea9_0.conda + sha256: 43895a7517c055b8893531290f9dc48bd751eb04be04f14bbce3b6c71b052be6 + md5: 6c8292c2ee808aeef2406083beaa6da7 depends: - __osx >=11.0 - - icu >=78.2,<79.0a0 - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - libxml2 2.15.2 + - libxml2 2.15.3 + - icu <0.0a0 license: MIT license_family: MIT - size: 466220 - timestamp: 1772704950232 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.2-h692994f_0.conda - sha256: b8c71b3b609c7cfe17f3f2a47c75394d7b30acfb8b34ad7a049ea8757b4d33df - md5: e365238134188e42ed36ee996159d482 + size: 465820 + timestamp: 1776377317454 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda + sha256: 8038084c60eda2006d0122d05e3364fe8db0a18935ca6ed0168b5ba5aa33f904 + md5: f7d6fcda29570e20851b78d92ea2154e depends: - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.2,<6.0a0 - - libzlib >=1.3.1,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - libxml2 2.15.2 + - libxml2 2.15.3 - icu <0.0a0 license: MIT license_family: MIT - size: 520078 - timestamp: 1772704728534 + size: 518869 + timestamp: 1776376971242 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 md5: d87ff7921124eccd67248aa483c23fec @@ -6916,25 +7193,25 @@ packages: license_family: Other size: 58347 timestamp: 1774072851498 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lld-22.1.2-hef48ded_0.conda - sha256: 3fa2d6e4d8446a126eeae5a7a8afabdfc0f585ec27c40ff8c6c23a992258574c - md5: 04adc80d652f1779dcf8da611ebd8528 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lld-22.1.3-hef48ded_0.conda + sha256: ee0ad4a8aa2dde531d08779389aa0dc5d92f948826a81f32d4820fe9245b69de + md5: 433f6936b33ae642097c3bb408bd143d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libllvm22 >=22.1.2,<22.2.0a0 + - libllvm22 >=22.1.3,<22.2.0a0 - libstdcxx >=14 - libzlib >=1.3.2,<2.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - llvm ==22.1.2 + - llvm ==22.1.3 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 11646725 - timestamp: 1774503086367 -- conda: https://conda.anaconda.org/conda-forge/win-64/lld-22.1.2-hc465015_0.conda - sha256: 3f9e5817b06cf02dc99bc8ad37044a9ad2d5d65ccacca55bcb204676ac05e8e1 - md5: 23b96a06adb62ac13bb22beb9640ea81 + size: 11863672 + timestamp: 1775702848380 +- conda: https://conda.anaconda.org/conda-forge/win-64/lld-22.1.3-hc465015_0.conda + sha256: a1810ffc09a73090642b1593c96c5e3923fb193d492c7f6faa2f8dd6de7d35e6 + md5: 41836c86b7dcce70032bdc1a91adedb1 depends: - libxml2 - libxml2-16 >=2.14.6 @@ -6944,58 +7221,61 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 constrains: - - llvm ==22.1.2 + - llvm ==22.1.3 license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 143523447 - timestamp: 1774504137926 -- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.2-h4922eb0_0.conda - sha256: 67fa0977eeb7f983b626aaa815b1e9eba3314f5ea5bf99ca0e91f26221dd9bbb - md5: 2a60ab96432bc74eedbcda8a528080a1 + size: 143413409 + timestamp: 1775704029657 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.3-h4922eb0_0.conda + sha256: 39ae724bd3cde1381df53bfb53e4d39da0dd613b180fdda5ac0a8ce1b43fb525 + md5: f7781cb22afa62ef27fd0b3300c53c86 depends: - __glibc >=2.17,<3.0.a0 constrains: - - openmp 22.1.2|22.1.2.* - intel-openmp <0.0a0 + - openmp 22.1.3|22.1.3.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 6132003 - timestamp: 1774564946563 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.2-h0d3cbff_0.conda - sha256: 5dc4c6f21d97d608d5889227e36f77e3316be63464000df4b23194a9b10d1017 - md5: 2f82b78f43520355ae2d297fecde25fd + size: 6122352 + timestamp: 1775711717725 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda + sha256: 58d10bd4638d0b3646389002cac57a46c578512b08ec20a3b2ea15f56b32d565 + md5: fbc27eb49069842d5335776d600856ff depends: - __osx >=11.0 constrains: - - openmp 22.1.2|22.1.2.* - intel-openmp <0.0a0 + - openmp 22.1.3|22.1.3.* license: Apache-2.0 WITH LLVM-exception - size: 310956 - timestamp: 1774732996355 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.2-hc7d1edf_0.conda - sha256: d8acb8e790312346a286f7168380ca3ce86d5982fb073df6e0fbec1e51fa47a1 - md5: 9c162044093d8d689836dafe3c27fe06 + license_family: APACHE + size: 311000 + timestamp: 1775712575099 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda + sha256: 71dcf9a9df103f57a0d5b0abc2594a15c2dd3afe52f07ac2d1c471552a61fb8d + md5: 086b00b77f5f0f7ef5c2a99855650df4 depends: - __osx >=11.0 constrains: + - openmp 22.1.3|22.1.3.* - intel-openmp <0.0a0 - - openmp 22.1.2|22.1.2.* license: Apache-2.0 WITH LLVM-exception - size: 285695 - timestamp: 1774733561929 -- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.2-h4fa8253_0.conda - sha256: fa8bd542624507309cbdfc620bdfe546ed823d418e6ba878977d48da7a0f6212 - md5: 29407a30bd93dc8c11c03ca60249a340 + license_family: APACHE + size: 285886 + timestamp: 1775712563398 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.3-h4fa8253_0.conda + sha256: b82d43c9c52287204c929542e146b54e3eab520dba47c7b3e973ec986bf40f92 + md5: fa585aca061eaaae7225df2e85370bf7 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: + - openmp 22.1.3|22.1.3.* - intel-openmp <0.0a0 - - openmp 22.1.2|22.1.2.* license: Apache-2.0 WITH LLVM-exception - size: 348400 - timestamp: 1774733045609 + license_family: APACHE + size: 348584 + timestamp: 1775712472008 - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.7-hb0207f0_2.conda sha256: 8d042ee522bc9eb12c061f5f7e53052aeb4f13e576e624c8bebaf493725b95a0 md5: 0f79b23c03d80f22ce4fe0022d12f6d2 @@ -7161,6 +7441,66 @@ packages: license_family: BSD size: 185194 timestamp: 1772060965521 +- conda: . + name: nanoeigenpy + version: 0.5.0 + build: h3cb568c_0 + subdir: linux-64 + variants: + eigen: 5.* + target_platform: linux-64 + depends: + - eigen >=3.4 + - libstdcxx >=15 + - libgcc >=15 + - python_abi 3.14.* *_cp314 + - eigen-abi >=5.0.1.80,<5.0.1.81.0a0 + - numpy >=1.23,<3 +- conda: . + name: nanoeigenpy + version: 0.5.0 + build: h9845677_0 + subdir: win-64 + variants: + cxx_compiler: vs2022 + eigen: 5.* + target_platform: win-64 + depends: + - eigen >=3.4 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - eigen-abi >=5.0.1.100,<5.0.1.101.0a0 + - python_abi 3.14.* *_cp314 + - numpy >=1.23,<3 +- conda: . + name: nanoeigenpy + version: 0.5.0 + build: hb02f359_0 + subdir: osx-arm64 + variants: + eigen: 5.* + target_platform: osx-arm64 + depends: + - eigen >=3.4 + - libcxx >=22 + - eigen-abi >=5.0.1.100,<5.0.1.101.0a0 + - python_abi 3.14.* *_cp314 + - numpy >=1.23,<3 +- conda: . + name: nanoeigenpy + version: 0.5.0 + build: hc01b75d_0 + subdir: osx-64 + variants: + eigen: 5.* + target_platform: osx-64 + depends: + - eigen >=3.4 + - libcxx >=22 + - python_abi 3.14.* *_cp314 + - eigen-abi >=5.0.1.80,<5.0.1.81.0a0 + - numpy >=1.23,<3 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 md5: 47e340acb35de30501a76c7c799c41d7 @@ -7373,40 +7713,40 @@ packages: license_family: BSD size: 7311362 timestamp: 1773839141373 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c - md5: f61eb8cd60ff9057122a3d338b99c00f +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda + sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb + md5: da1b85b6a87e141f5140bb9924cecab0 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3164551 - timestamp: 1769555830639 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.1-hb6871ef_1.conda - sha256: e02e5639b0e4d6d4fcf0f3b082642844fb5a37316f5b0a1126c6271347462e90 - md5: 30bb8d08b99b9a7600d39efb3559fff0 + size: 3167099 + timestamp: 1775587756857 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + sha256: 334fd49ea31b99114f5afb1ec44555dc8c90640648302a4f8f838ee345d1ec50 + md5: 5cf0ece4375c73d7a5765e83565a69c7 depends: - - __osx >=10.13 + - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache - size: 2777136 - timestamp: 1769557662405 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 - md5: f4f6ad63f98f64191c3e77c5f5f29d76 + size: 2776564 + timestamp: 1775589970694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea + md5: 25dcccd4f80f1638428613e0d7c9b4e1 depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache - size: 3104268 - timestamp: 1769556384749 -- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - sha256: 53a5ad2e5553b8157a91bb8aa375f78c5958f77cb80e9d2ce59471ea8e5c0bd6 - md5: eb585509b815415bc964b2c7e11c7eb3 + size: 3106008 + timestamp: 1775587972483 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.2-hf411b9b_0.conda + sha256: feb5815125c60f2be4a411e532db1ed1cd2d7261a6a43c54cb6ae90724e2e154 + md5: 05c7d624cff49dbd8db1ad5ba537a8a3 depends: - ca-certificates - ucrt >=10.0.20348.0 @@ -7414,18 +7754,18 @@ packages: - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache - size: 9343023 - timestamp: 1769557547888 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58 - md5: b76541e68fea4d511b1ac46a28dcd2c6 + size: 9410183 + timestamp: 1775589779763 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + sha256: 171d977bc977fd80f2a05de3d4b7d571c4ec3cdea436ed364e5cd50547c50881 + md5: b8ae38639d323d808da535fb71e31be8 depends: - python >=3.8 - python license: Apache-2.0 license_family: APACHE - size: 72010 - timestamp: 1769093650580 + size: 89360 + timestamp: 1776209387231 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff md5: 7a3bff861a6583f1889021facefc08b1 @@ -7500,27 +7840,28 @@ packages: depends: - python >=3.10 license: BSD-2-Clause + license_family: BSD size: 893031 timestamp: 1774796815820 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - sha256: 9e749fb465a8bedf0184d8b8996992a38de351f7c64e967031944978de03a520 - md5: 2b694bad8a50dc2f712f5368de866480 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + sha256: 960f59442173eee0731906a9077bd5ccf60f4b4226f05a22d1728ab9a21a879c + md5: 6a991452eadf2771952f39d43615bb3e depends: + - colorama >=0.4 - pygments >=2.7.2 - python >=3.10 - iniconfig >=1.0.1 - packaging >=22 - pluggy >=1.5,<2 - tomli >=1 - - colorama >=0.4 - exceptiongroup >=1 - python constrains: - pytest-faulthandler >=2 license: MIT license_family: MIT - size: 299581 - timestamp: 1765062031645 + size: 299984 + timestamp: 1775644472530 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.20-h3c07f61_0_cpython.conda sha256: 8ff2ce308faf2588b69c65b120293f59a8f2577b772b34df4e817d220b09e081 md5: 5d4e2b00d99feacd026859b7fa239dc0 @@ -7547,32 +7888,32 @@ packages: license: Python-2.0 size: 25455342 timestamp: 1772729810280 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda - build_number: 101 - sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd - md5: c014ad06e60441661737121d3eae8a60 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda + build_number: 100 + sha256: dec247c5badc811baa34d6085df9d0465535883cf745e22e8d79092ad54a3a7b + md5: a443f87920815d41bfe611296e507995 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.3,<3.0a0 + - libexpat >=2.7.5,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - liblzma >=5.8.2,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libuuid >=2.41.3,<3.0a0 - - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libuuid >=2.42,<3.0a0 + - libzlib >=1.3.2,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 36702440 - timestamp: 1770675584356 + size: 36705460 + timestamp: 1775614357822 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.20-hea035f4_0_cpython.conda sha256: b6b9d6a85003b21ac17cc1485e196906bd704759caaab1315f6f8eeb85f26202 @@ -7595,29 +7936,29 @@ packages: license: Python-2.0 size: 13083662 timestamp: 1772730522090 -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.3-h4f44bb5_101_cp314.conda - build_number: 101 - sha256: f64e357aa0168a201c9b3eedf500d89a8550d6631d26a95590b12de61f8fd660 - md5: 030ec23658b941438ac42303aff0db2b +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda + build_number: 100 + sha256: fc99d7a6a3f5eb776c20880c441e3708ff95d35d0a03f3ceb2a89016f59a01fc + md5: d4e8506d0ac094be21451682eed9ce4d depends: - - __osx >=10.13 + - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 + - libexpat >=2.7.5,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - liblzma >=5.8.2,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libzlib >=1.3.2,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 14387288 - timestamp: 1770676578632 + size: 14431104 + timestamp: 1775616356805 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.20-h1b19095_0_cpython.conda sha256: f0f6fcbb6cfdee5a6b9c03b5b94d2bbe737f3b17a618006c7685cc48992ae667 @@ -7640,29 +7981,29 @@ packages: license: Python-2.0 size: 12468674 timestamp: 1772730636766 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.3-h4c637c5_101_cp314.conda - build_number: 101 - sha256: fccce2af62d11328d232df9f6bbf63464fd45f81f718c661757f9c628c4378ce - md5: 753c8d0447677acb7ddbcc6e03e82661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda + build_number: 100 + sha256: 27e7d6cbe021f37244b643f06a98e46767255f7c2907108dd3736f042757ddad + md5: e1bc5a3015a4bbeb304706dba5a32b7f depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 + - libexpat >=2.7.5,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - liblzma >=5.8.2,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libzlib >=1.3.2,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 13522698 - timestamp: 1770675365241 + size: 13533346 + timestamp: 1775616188373 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.20-hc20f281_0_cpython.conda sha256: e71595dd281a9902d7b84f545f16d7d4c0fb62cc6816431301f8f4870c94dc8c @@ -7685,19 +8026,19 @@ packages: license: Python-2.0 size: 16028082 timestamp: 1772728853200 -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.3-h4b44e0e_101_cp314.conda - build_number: 101 - sha256: 3f99d83bfd95b9bdae64a42a1e4bf5131dc20b724be5ac8a9a7e1ac2c0f006d7 - md5: 7ec2be7eaf59f83f3e5617665f3fbb2e +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.4-h4b44e0e_100_cp314.conda + build_number: 100 + sha256: e258d626b0ba778abb319f128de4c1211306fe86fe0803166817b1ce2514c920 + md5: 40b6a8f438afb5e7b314cc5c4a43cd84 depends: - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.3,<3.0a0 + - libexpat >=2.7.5,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - liblzma >=5.8.2,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.51.2,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -7706,8 +8047,8 @@ packages: - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 18273230 - timestamp: 1770675442998 + size: 18055445 + timestamp: 1775615317758 python_site_packages_path: Lib/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda build_number: 8 @@ -8085,26 +8426,26 @@ packages: license_family: GPL size: 24008591 timestamp: 1765578833462 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_1.conda - sha256: 35eff895faad6e3255da015d8b269cf333577c30d5277b6030f8bf094592056b - md5: 525e2d1714c8bc8f96e9f03c75cf2366 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1600.0.11.8-h8d8e812_2.conda + sha256: 0e814730160c8e214eadd7905e3659d8f52af86fd37d85fd287060748948a2b8 + md5: 524528dee57e42d77b1af677137de5a5 depends: - libcxx >=19.0.0.a0 - __osx >=10.13 - ncurses >=6.5,<7.0a0 license: NCSA - size: 213957 - timestamp: 1774947623947 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_1.conda - sha256: 0072a50a204dc6a309ea61e01315caee86cf82879ce5254bb8feb04a3e0de762 - md5: ddd7d9cd7e3c3f184867e92ed1c7d394 + size: 213790 + timestamp: 1775657389876 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + sha256: de6893e53664e769c1b1c4103a666d436e3d307c0eb6a09a164e749d116e80f7 + md5: 555070ad1e18b72de36e9ee7ed3236b3 depends: - libcxx >=19.0.0.a0 - __osx >=11.0 - ncurses >=6.5,<7.0a0 license: NCSA - size: 200231 - timestamp: 1774947735492 + size: 200192 + timestamp: 1775657222120 - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda sha256: abd9a489f059fba85c8ffa1abdaa4d515d6de6a3325238b8e81203b913cf65a9 md5: 0f9817ffbe25f9e69ceba5ea70c52606 From ecbd06476a3fb448f5ca5a78036ead81c6c9143f Mon Sep 17 00:00:00 2001 From: Antoine Hoarau <703240+ahoarau@users.noreply.github.com> Date: Tue, 21 Apr 2026 10:26:08 +0200 Subject: [PATCH 59/59] ci: comment out pixi build --- .../workflows/macos-linux-windows-pixi.yml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/macos-linux-windows-pixi.yml b/.github/workflows/macos-linux-windows-pixi.yml index 555d300f..615cbc7e 100644 --- a/.github/workflows/macos-linux-windows-pixi.yml +++ b/.github/workflows/macos-linux-windows-pixi.yml @@ -92,17 +92,17 @@ jobs: run: | pixi run -e ${{ matrix.environment }} ccache -sv - pixi-build: - name: Pixi build - ${{ matrix.os }} - runs-on: ${{ matrix.os }} + # pixi-build: + # name: Pixi build - ${{ matrix.os }} + # runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest] + # strategy: + # fail-fast: false + # matrix: + # os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest] - steps: - - uses: actions/checkout@v6 + # steps: + # - uses: actions/checkout@v6 # - uses: prefix-dev/setup-pixi@v0.9.5 # env: @@ -110,9 +110,9 @@ jobs: # with: # environments: test-pixi-build - - name: Test package [MacOS/Linux/Windows] - run: | - pixi run -e test-pixi-build test + # - name: Test package [MacOS/Linux/Windows] + # run: | + # pixi run -e test-pixi-build test check: if: always() @@ -120,7 +120,7 @@ jobs: needs: - pixi - - pixi-build + # - pixi-build runs-on: ubuntu-latest