diff --git a/.coveragerc b/.coveragerc index 4ea8d64..f4c14a7 100644 --- a/.coveragerc +++ b/.coveragerc @@ -2,5 +2,5 @@ [run] branch = True -source = IsoML -include = */IsoML/* +source = pyikt +include = */pyikt/* diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1d6999e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# GitHub syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true +# SCM syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml index bd926a2..6fc44f5 100644 --- a/.github/workflows/deploy-gh-pages.yml +++ b/.github/workflows/deploy-gh-pages.yml @@ -30,5 +30,5 @@ jobs: uses: peaceiris/actions-gh-pages@v4.0.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./doc/_build/html + publish_dir: ./site commit_message: "[ci skip] ${{ github.event.head_commit.message }}" diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 0000000..ce1b003 --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,157 @@ +name: pypi + +on: + workflow_dispatch: + push: + tags: + - "*" + +jobs: + build_linux_wheels: + name: Build ${{ matrix.linux_tag }} wheels with cp${{ matrix.python-version }} + runs-on: ubuntu-latest + strategy: + matrix: + linux_tag: ["manylinux", "musllinux"] + python-version: ["310", "311", "312", "313"] + steps: + - uses: actions/checkout@v4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: all + - name: Build wheels + uses: pypa/cibuildwheel@v2.22.0 + timeout-minutes: 720 + env: + CIBW_BUILD: "cp${{ matrix.python-version }}-${{ matrix.linux_tag }}_*" + CIBW_ARCHS_LINUX: "x86_64 i686 aarch64" + CIBW_SKIP: "*-musllinux_i686" + CIBW_MANYLINUX_X86_64_IMAGE: "manylinux2014" + CIBW_MANYLINUX_I686_IMAGE: "manylinux2014" + CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux2014" + CIBW_MUSLLINUX_X86_64_IMAGE: "musllinux_1_1" + CIBW_MUSLLINUX_I686_IMAGE: "musllinux_1_1" + CIBW_MUSLLINUX_AARCH64_IMAGE: "musllinux_1_1" + CIBW_ENVIRONMENT: 'PATH="$HOME/.cargo/bin:$PATH"' + CIBW_ENVIRONMENT_LINUX: 'PATH="$HOME/.cargo/bin:$PATH" CARGO_NET_GIT_FETCH_WITH_CLI="true"' + CIBW_BEFORE_BUILD: > + rustup default nightly && + rustup show + CIBW_BEFORE_BUILD_LINUX: > + curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=nightly --profile=minimal -y && + rustup show + - uses: actions/upload-artifact@v4 + with: + name: artifact-${{ matrix.linux_tag }}-cp${{ matrix.python-version }} + path: ./wheelhouse/*.whl + + build_macos_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-13, macos-14] + steps: + - uses: actions/checkout@v4 + - name: Set up rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: nightly + - run: rustup target add aarch64-apple-darwin && rustup target add x86_64-apple-darwin + - name: Build wheels + uses: pypa/cibuildwheel@v2.22.0 + timeout-minutes: 720 + env: + CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*" + CIBW_ARCHS_MACOS: "universal2" + # arm64 and universal2 wheels are tagged with x86_64 because there's an issue with Poetry + # More information here: https://cibuildwheel.readthedocs.io/en/stable/faq/#how-to-cross-compile (CTRL + F "poetry") + # https://github.com/pypa/cibuildwheel/issues/1415 + CIBW_REPAIR_WHEEL_COMMAND_MACOS: > + ls {dest_dir} && + delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && + for file in {dest_dir}/*.whl ; do mv $file ${file//x86_64/universal2} ; done + CIBW_ENVIRONMENT: 'PATH="$HOME/.cargo/bin:$PATH"' + CIBW_BEFORE_BUILD: > + rustup default nightly && + rustup show + - uses: actions/upload-artifact@v4 + with: + name: artifact-${{ matrix.os }} + path: ./wheelhouse/*.whl + + build_windows_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-2019, windows-2022] + steps: + - uses: actions/checkout@v4 + - name: Set up rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: nightly + - run: rustup toolchain install stable-i686-pc-windows-msvc + - run: rustup target add i686-pc-windows-msvc + - name: Build wheels + uses: pypa/cibuildwheel@v2.22.0 + timeout-minutes: 720 + env: + CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*" + CIBW_ARCHS_WINDOWS: "AMD64 x86" + CIBW_ENVIRONMENT: 'PATH="$HOME/.cargo/bin:$PATH"' + CIBW_ENVIRONMENT_WINDOWS: 'PATH="$UserProfile\.cargo\bin;$PATH"' + CIBW_BEFORE_BUILD: > + rustup default nightly && + rustup show + - uses: actions/upload-artifact@v4 + with: + name: artifact-${{ matrix.os }} + path: ./wheelhouse/*.whl + + build_sdist: + name: Build source distribution + # Can't use more than 12 jobs in parallel + needs: [build_macos_wheels] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Build River + uses: ./.github/actions/install-env + with: + python-version: "3.13" + + - name: Build dist + run: poetry build + + - uses: actions/upload-artifact@v4 + with: + name: artifact-sdist + path: dist/*.tar.gz + + merge_artifacts: + runs-on: ubuntu-latest + needs: [build_linux_wheels, build_macos_wheels, build_windows_wheels, build_sdist] + steps: + - name: Merge Artifacts + uses: actions/upload-artifact/merge@v4 + with: + name: artifact + pattern: artifact-* + + upload_pypi: + needs: merge_artifacts + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4.1.7 + with: + name: artifact + path: dist + + - uses: pypa/gh-action-pypi-publish@v1.12.2 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index b6dbf66..583d93b 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -30,4 +30,4 @@ jobs: uses: codecov/codecov-action@v4.5.0 with: token: ${{ secrets.CODECOV_TOKEN }} - slug: IsolationKernel/IsoML + slug: IsolationKernel/pyikt diff --git a/.gitignore b/.gitignore index 0fb99ec..847b799 100644 --- a/.gitignore +++ b/.gitignore @@ -181,3 +181,12 @@ cython_debug/ # VsCode .vscode/ + +# test +env.ps1 +env.sh +origin_data/ +myx_test/ +# pixi environments +.pixi +*.egg-info diff --git a/IsoML/__init__.py b/IsoML/__init__.py deleted file mode 100644 index 88df410..0000000 --- a/IsoML/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# Authors: IsolationKernel developers -# License: BSD 3 clause - -from ._template import TemplateClassifier, TemplateEstimator, TemplateTransformer -from ._version import __version__ - -__all__ = [ - "TemplateEstimator", - "TemplateClassifier", - "TemplateTransformer", - "__version__", -] diff --git a/IsoML/_template.py b/IsoML/_template.py deleted file mode 100644 index 5aec059..0000000 --- a/IsoML/_template.py +++ /dev/null @@ -1,308 +0,0 @@ -""" -This is a module to be used as a reference for building other modules -""" - -# Authors: IsolationKernel developers -# License: BSD 3 clause - -import numpy as np -from sklearn.base import BaseEstimator, ClassifierMixin, TransformerMixin, _fit_context -from sklearn.metrics import euclidean_distances -from sklearn.utils.multiclass import check_classification_targets -from sklearn.utils.validation import check_is_fitted - - -class TemplateEstimator(BaseEstimator): - """A template estimator to be used as a reference implementation. - - For more information regarding how to build your own estimator, read more - in the :ref:`User Guide `. - - Parameters - ---------- - demo_param : str, default='demo_param' - A parameter used for demonstration of how to pass and store parameters. - - Attributes - ---------- - is_fitted_ : bool - A boolean indicating whether the estimator has been fitted. - - n_features_in_ : int - Number of features seen during :term:`fit`. - - feature_names_in_ : ndarray of shape (`n_features_in_`,) - Names of features seen during :term:`fit`. Defined only when `X` - has feature names that are all strings. - - Examples - -------- - >>> from IsoML import TemplateEstimator - >>> import numpy as np - >>> X = np.arange(100).reshape(100, 1) - >>> y = np.zeros((100, )) - >>> estimator = TemplateEstimator() - >>> estimator.fit(X, y) - TemplateEstimator() - """ - - # This is a dictionary allowing to define the type of parameters. - # It used to validate parameter within the `_fit_context` decorator. - _parameter_constraints = { - "demo_param": [str], - } - - def __init__(self, demo_param="demo_param"): - self.demo_param = demo_param - - @_fit_context(prefer_skip_nested_validation=True) - def fit(self, X, y): - """A reference implementation of a fitting function. - - Parameters - ---------- - X : {array-like, sparse matrix}, shape (n_samples, n_features) - The training input samples. - - y : array-like, shape (n_samples,) or (n_samples, n_outputs) - The target values (class labels in classification, real numbers in - regression). - - Returns - ------- - self : object - Returns self. - """ - # `_validate_data` is defined in the `BaseEstimator` class. - # It allows to: - # - run different checks on the input data; - # - define some attributes associated to the input data: `n_features_in_` and - # `feature_names_in_`. - X, y = self._validate_data(X, y, accept_sparse=True) - self.is_fitted_ = True - # `fit` should always return `self` - return self - - def predict(self, X): - """A reference implementation of a predicting function. - - Parameters - ---------- - X : {array-like, sparse matrix}, shape (n_samples, n_features) - The training input samples. - - Returns - ------- - y : ndarray, shape (n_samples,) - Returns an array of ones. - """ - # Check if fit had been called - check_is_fitted(self) - # We need to set reset=False because we don't want to overwrite `n_features_in_` - # `feature_names_in_` but only check that the shape is consistent. - X = self._validate_data(X, accept_sparse=True, reset=False) - return np.ones(X.shape[0], dtype=np.int64) - - -# Note that the mixin class should always be on the left of `BaseEstimator` to ensure -# the MRO works as expected. -class TemplateClassifier(ClassifierMixin, BaseEstimator): - """An example classifier which implements a 1-NN algorithm. - - For more information regarding how to build your own classifier, read more - in the :ref:`User Guide `. - - Parameters - ---------- - demo_param : str, default='demo' - A parameter used for demonstation of how to pass and store paramters. - - Attributes - ---------- - X_ : ndarray, shape (n_samples, n_features) - The input passed during :meth:`fit`. - - y_ : ndarray, shape (n_samples,) - The labels passed during :meth:`fit`. - - classes_ : ndarray, shape (n_classes,) - The classes seen at :meth:`fit`. - - n_features_in_ : int - Number of features seen during :term:`fit`. - - feature_names_in_ : ndarray of shape (`n_features_in_`,) - Names of features seen during :term:`fit`. Defined only when `X` - has feature names that are all strings. - - Examples - -------- - >>> from sklearn.datasets import load_iris - >>> from IsoML import TemplateClassifier - >>> X, y = load_iris(return_X_y=True) - >>> clf = TemplateClassifier().fit(X, y) - >>> clf.predict(X) - array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) - """ - - # This is a dictionary allowing to define the type of parameters. - # It used to validate parameter within the `_fit_context` decorator. - _parameter_constraints = { - "demo_param": [str], - } - - def __init__(self, demo_param="demo"): - self.demo_param = demo_param - - @_fit_context(prefer_skip_nested_validation=True) - def fit(self, X, y): - """A reference implementation of a fitting function for a classifier. - - Parameters - ---------- - X : array-like, shape (n_samples, n_features) - The training input samples. - - y : array-like, shape (n_samples,) - The target values. An array of int. - - Returns - ------- - self : object - Returns self. - """ - # `_validate_data` is defined in the `BaseEstimator` class. - # It allows to: - # - run different checks on the input data; - # - define some attributes associated to the input data: `n_features_in_` and - # `feature_names_in_`. - X, y = self._validate_data(X, y) - # We need to make sure that we have a classification task - check_classification_targets(y) - - # classifier should always store the classes seen during `fit` - self.classes_ = np.unique(y) - - # Store the training data to predict later - self.X_ = X - self.y_ = y - - # Return the classifier - return self - - def predict(self, X): - """A reference implementation of a prediction for a classifier. - - Parameters - ---------- - X : array-like, shape (n_samples, n_features) - The input samples. - - Returns - ------- - y : ndarray, shape (n_samples,) - The label for each sample is the label of the closest sample - seen during fit. - """ - # Check if fit had been called - check_is_fitted(self) - - # Input validation - # We need to set reset=False because we don't want to overwrite `n_features_in_` - # `feature_names_in_` but only check that the shape is consistent. - X = self._validate_data(X, reset=False) - - closest = np.argmin(euclidean_distances(X, self.X_), axis=1) - return self.y_[closest] - - -# Note that the mixin class should always be on the left of `BaseEstimator` to ensure -# the MRO works as expected. -class TemplateTransformer(TransformerMixin, BaseEstimator): - """An example transformer that returns the element-wise square root. - - For more information regarding how to build your own transformer, read more - in the :ref:`User Guide `. - - Parameters - ---------- - demo_param : str, default='demo' - A parameter used for demonstation of how to pass and store paramters. - - Attributes - ---------- - n_features_in_ : int - Number of features seen during :term:`fit`. - - feature_names_in_ : ndarray of shape (`n_features_in_`,) - Names of features seen during :term:`fit`. Defined only when `X` - has feature names that are all strings. - """ - - # This is a dictionary allowing to define the type of parameters. - # It used to validate parameter within the `_fit_context` decorator. - _parameter_constraints = { - "demo_param": [str], - } - - def __init__(self, demo_param="demo"): - self.demo_param = demo_param - - @_fit_context(prefer_skip_nested_validation=True) - def fit(self, X, y=None): - """A reference implementation of a fitting function for a transformer. - - Parameters - ---------- - X : {array-like, sparse matrix}, shape (n_samples, n_features) - The training input samples. - - y : None - There is no need of a target in a transformer, yet the pipeline API - requires this parameter. - - Returns - ------- - self : object - Returns self. - """ - X = self._validate_data(X, accept_sparse=True) - - # Return the transformer - return self - - def transform(self, X): - """A reference implementation of a transform function. - - Parameters - ---------- - X : {array-like, sparse-matrix}, shape (n_samples, n_features) - The input samples. - - Returns - ------- - X_transformed : array, shape (n_samples, n_features) - The array containing the element-wise square roots of the values - in ``X``. - """ - # Since this is a stateless transformer, we should not call `check_is_fitted`. - # Common test will check for this particularly. - - # Input validation - # We need to set reset=False because we don't want to overwrite `n_features_in_` - # `feature_names_in_` but only check that the shape is consistent. - X = self._validate_data(X, accept_sparse=True, reset=False) - return np.sqrt(X) - - def _more_tags(self): - # This is a quick example to show the tags API:\ - # https://scikit-learn.org/dev/developers/develop.html#estimator-tags - # Here, our transformer does not do any operation in `fit` and only validate - # the parameters. Thus, it is stateless. - return {"stateless": True} diff --git a/IsoML/_version.py b/IsoML/_version.py deleted file mode 100644 index dca0302..0000000 --- a/IsoML/_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# file generated by setuptools_scm -# don't change, don't track in version control -TYPE_CHECKING = False -if TYPE_CHECKING: - from typing import Tuple, Union - VERSION_TUPLE = Tuple[Union[int, str], ...] -else: - VERSION_TUPLE = object - -version: str -__version__: str -__version_tuple__: VERSION_TUPLE -version_tuple: VERSION_TUPLE - -__version__ = version = '0.1.dev8+g9e0aa3d.d20240615' -__version_tuple__ = version_tuple = (0, 1, 'dev8', 'g9e0aa3d.d20240615') diff --git a/IsoML/kernel/__init__.py b/IsoML/kernel/__init__.py deleted file mode 100644 index 307fa9c..0000000 --- a/IsoML/kernel/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from isoml.kernel._isokernel import IsoKernel -from isoml.kernel._isodiskernel import IsoDisKernel - -# from isoml.kernel._ik_anne import IK_ANNE -# from isoml.kernel._ik_iforest import IK_IForest -# from isoml.kernel._ik_inne import IK_INNE - -__all__ = ["IsoKernel", "IsoDisKernel"] diff --git a/IsoML/kernel/_ik_inne.py b/IsoML/kernel/_ik_inne.py deleted file mode 100644 index 6a00462..0000000 --- a/IsoML/kernel/_ik_inne.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Copyright 2024 Xin Han. All rights reserved. -Use of this source code is governed by a BSD-style -license that can be found in the LICENSE file. -""" - -import numbers -from warnings import warn - -import numpy as np -from sklearn.base import BaseEstimator, TransformerMixin -from sklearn.metrics import euclidean_distances -from sklearn.utils import check_array -from sklearn.utils.validation import check_is_fitted, check_random_state - -MAX_INT = np.iinfo(np.int32).max -MIN_FLOAT = np.finfo(float).eps - - -class IK_INNE(TransformerMixin, BaseEstimator): - """Build Isolation Kernel feature vector representations via the feature map - for a given dataset. - - Isolation kernel is a data dependent kernel measure that is - adaptive to local data distribution and has more flexibility in capturing - the characteristics of the local data distribution. It has been shown promising - performance on density and distance-based classification and clustering problems. - - This version uses iforest to split the data space and calculate Isolation - kernel Similarity. Based on this implementation, the feature - in the Isolation kernel space is the index of the cell in Voronoi diagrams. Each - point is represented as a binary vector such that only the cell the point falling - into is 1. - - Parameters - ---------- - - n_estimators : int - The number of base estimators in the ensemble. - - - max_samples : int - The number of samples to draw from X to train each base estimator. - - - If int, then draw `max_samples` samples. - - If float, then draw `max_samples` * X.shape[0]` samples. - - If "auto", then `max_samples=min(8, n_samples)`. - - random_state : int, RandomState instance or None, default=None - Controls the pseudo-randomness of the selection of the feature - and split values for each branching step and each tree in the forest. - - Pass an int for reproducible results across multiple function calls. - See :term:`Glossary `. - - References - ---------- - .. [1] Qin, X., Ting, K.M., Zhu, Y. and Lee, V.C. - "Nearest-neighbour-induced isolation similarity and its impact on density-based clustering". - In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 33, 2019, July, pp. 4755-4762 - """ - - def __init__(self, n_estimators, max_samples, random_state=None) -> None: - self.n_estimators = n_estimators - self.max_samples = max_samples - self.random_state = random_state - - import numpy as np - - -from random import sample -from scipy.spatial.distance import cdist -from scipy.sparse import csr_matrix - - -class iNN_IK: - data = None - centroid = [] - - def __init__(self, psi, t): - self.psi = psi - self.t = t - - # def fit_transform(self, data): - # self.data = data - # self.centroid = [] - # self.centroids_radius = [] - # sn = self.data.shape[0] - # n, d = self.data.shape - # IDX = np.array([]) #column index - # V = [] - # for i in range(self.t): - # subIndex = sample(range(sn), self.psi) - # self.centroid.append(subIndex) - # tdata = self.data[subIndex, :] - # tt_dis = cdist(tdata, tdata) - # radius = [] #restore centroids' radius - # for r_idx in range(self.psi): - # r = tt_dis[r_idx] - # r[r<0] = 0 - # r = np.delete(r,r_idx) - # radius.append(np.min(r)) - # self.centroids_radius.append(radius) - # nt_dis = cdist(tdata, self.data) - # centerIdx = np.argmin(nt_dis, axis=0) - # for j in range(n): - # V.append(int(nt_dis[centerIdx[j],j] <= radius[centerIdx[j]])) - # IDX = np.concatenate((IDX, centerIdx + i * self.psi), axis=0) - # IDR = np.tile(range(n), self.t) #row index - # #V = np.ones(self.t * n) #value - # ndata = csr_matrix((V, (IDR, IDX)), shape=(n, self.t * self.psi)) - # return ndata - - def fit(self, data): - self.data = data - self.centroid = [] - self.centroids_radius = [] - sn = self.data.shape[0] - for i in range(self.t): - subIndex = sample(range(sn), self.psi) - self.centroid.append(subIndex) - tdata = self.data[subIndex, :] - tt_dis = cdist(tdata, tdata) - radius = [] # restore centroids' radius - for r_idx in range(self.psi): - r = tt_dis[r_idx] - r[r < 0] = 0 - r = np.delete(r, r_idx) - radius.append(np.min(r)) - self.centroids_radius.append(radius) - - def transform(self, newdata): - assert self.centroid != None, "invoke fit() first!" - n, d = newdata.shape - IDX = np.array([]) - V = [] - for i in range(self.t): - subIndex = self.centroid[i] - radius = self.centroids_radius[i] - tdata = self.data[subIndex, :] - dis = cdist(tdata, newdata) - centerIdx = np.argmin(dis, axis=0) - for j in range(n): - V.append(int(dis[centerIdx[j], j] <= radius[centerIdx[j]])) - IDX = np.concatenate((IDX, centerIdx + i * self.psi), axis=0) - IDR = np.tile(range(n), self.t) - ndata = csr_matrix((V, (IDR, IDX)), shape=(n, self.t * self.psi)) - return ndata - - def fit(self, X, y=None): - """Fit the model with the given training data. - - Parameters - ---------- - X : array-like of shape (n_samples, n_features) - The training data. - - y : None - Ignored. - - Returns - ------- - self : object - Returns self. - """ - X = check_array(X) - self._validate_hyperparameters() - self._fit(X) - return self - - def _fit(self, X): - pass - - def transform(self, X): - """Transform the given data into the Isolation Kernel feature space. - - Parameters - ---------- - X : array-like of shape (n_samples, n_features) - The data to transform. - - Returns - ------- - X_new : array-like of shape (n_samples, n_features) - The transformed data. - """ - check_is_fitted(self) - X = check_array(X) - return self._transform(X) - - def _transform(self, X): - pass diff --git a/IsoML/kernel/tests/test_isodiskernel.py b/IsoML/kernel/tests/test_isodiskernel.py deleted file mode 100644 index dc7416f..0000000 --- a/IsoML/kernel/tests/test_isodiskernel.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -Copyright 2024 Xin Han. All rights reserved. -Use of this source code is governed by a BSD-style -license that can be found in the LICENSE file. -""" - -from sklearn.datasets import load_iris -from isoml.kernel._isodiskernel import IsoDisKernel -import pytest - - -@pytest.fixture -def data(): - return load_iris(return_X_y=True) - - -def test_IsoDisKernel_fit(data): - X = data[0] - idk = IsoDisKernel(method="anne", n_estimators=200, max_samples="auto") - idk.fit(X) - assert idk.is_fitted_ - - -def test_IsoDisKernel_similarity(data): - X = data[0] - idk = IsoDisKernel(method="anne", n_estimators=200, max_samples="auto") - idk.fit(X) - D_i = X[:10] - D_j = X[-10:] - similarity = idk.similarity(D_i, D_j) - assert similarity.shape == (10, 10) - - -def test_IsoDisKernel_transform(data): - X = data[0] - idk = IsoDisKernel(method="anne", n_estimators=200, max_samples="auto") - idk.fit(X) - D_i = X[:10] - D_j = X[-10:] - transformed_D_i, transformed_D_j = idk.transform(D_i, D_j) - assert transformed_D_i.shape == (10, idk.n_estimators * idk.max_samples_) - assert transformed_D_j.shape == (10, idk.n_estimators * idk.max_samples_) diff --git a/IsoML/tests/__init__.py b/IsoML/tests/__init__.py deleted file mode 100644 index 6202fa2..0000000 --- a/IsoML/tests/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Authors: IsolationKernel developers -# License: BSD 3 clause diff --git a/IsoML/tests/test_common.py b/IsoML/tests/test_common.py deleted file mode 100644 index cfe3813..0000000 --- a/IsoML/tests/test_common.py +++ /dev/null @@ -1,16 +0,0 @@ -"""This file shows how to write test based on the scikit-learn common tests.""" - -# Authors: IsolationKernel developers -# License: BSD 3 clause - -from sklearn.utils.estimator_checks import parametrize_with_checks - -from isoml.utils.discovery import all_estimators - - -# parametrize_with_checks allows to get a generator of check that is more fine-grained -# than check_estimator -@parametrize_with_checks([est() for _, est in all_estimators()]) -def test_estimators(estimator, check, request): - """Check the compatibility with scikit-learn API""" - check(estimator) diff --git a/IsoML/tests/test_template.py b/IsoML/tests/test_template.py deleted file mode 100644 index f72309f..0000000 --- a/IsoML/tests/test_template.py +++ /dev/null @@ -1,60 +0,0 @@ -"""This file will just show how to write tests for the template classes.""" - -import numpy as np -import pytest -from sklearn.datasets import load_iris -from sklearn.utils._testing import assert_allclose, assert_array_equal - -from isoml import TemplateClassifier, TemplateEstimator, TemplateTransformer - -# Authors: IsolationKernel developers -# License: BSD 3 clause - - -@pytest.fixture -def data(): - return load_iris(return_X_y=True) - - -def test_template_estimator(data): - """Check the internals and behaviour of `TemplateEstimator`.""" - est = TemplateEstimator() - assert est.demo_param == "demo_param" - - est.fit(*data) - assert hasattr(est, "is_fitted_") - - X = data[0] - y_pred = est.predict(X) - assert_array_equal(y_pred, np.ones(X.shape[0], dtype=np.int64)) - - -def test_template_transformer(data): - """Check the internals and behaviour of `TemplateTransformer`.""" - X, y = data - trans = TemplateTransformer() - assert trans.demo_param == "demo" - - trans.fit(X) - assert trans.n_features_in_ == X.shape[1] - - X_trans = trans.transform(X) - assert_allclose(X_trans, np.sqrt(X)) - - X_trans = trans.fit_transform(X) - assert_allclose(X_trans, np.sqrt(X)) - - -def test_template_classifier(data): - """Check the internals and behaviour of `TemplateClassifier`.""" - X, y = data - clf = TemplateClassifier() - assert clf.demo_param == "demo" - - clf.fit(X, y) - assert hasattr(clf, "classes_") - assert hasattr(clf, "X_") - assert hasattr(clf, "y_") - - y_pred = clf.predict(X) - assert y_pred.shape == (X.shape[0],) diff --git a/IsoML/utils/__init__.py b/IsoML/utils/__init__.py deleted file mode 100644 index 6202fa2..0000000 --- a/IsoML/utils/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Authors: IsolationKernel developers -# License: BSD 3 clause diff --git a/IsoML/utils/discovery.py b/IsoML/utils/discovery.py deleted file mode 100644 index ddf9bcb..0000000 --- a/IsoML/utils/discovery.py +++ /dev/null @@ -1,211 +0,0 @@ -""" -The :mod:`IsoML.utils.discovery` module includes utilities to discover -objects (i.e. estimators, displays, functions) from the `IsoML` package. -""" - -# Adapted from scikit-learn -# Authors: IsolationKernel developers -# License: BSD 3 clause - -import inspect -import pkgutil -from importlib import import_module -from operator import itemgetter -from pathlib import Path - -from sklearn.base import ( - BaseEstimator, - ClassifierMixin, - ClusterMixin, - RegressorMixin, - TransformerMixin, -) -from sklearn.utils._testing import ignore_warnings - -_MODULE_TO_IGNORE = {"tests"} - - -def all_estimators(type_filter=None): - """Get a list of all estimators from `IsoML`. - - This function crawls the module and gets all classes that inherit - from `BaseEstimator`. Classes that are defined in test-modules are not - included. - - Parameters - ---------- - type_filter : {"classifier", "regressor", "cluster", "transformer"} \ - or list of such str, default=None - Which kind of estimators should be returned. If None, no filter is - applied and all estimators are returned. Possible values are - 'classifier', 'regressor', 'cluster' and 'transformer' to get - estimators only of these specific types, or a list of these to - get the estimators that fit at least one of the types. - - Returns - ------- - estimators : list of tuples - List of (name, class), where ``name`` is the class name as string - and ``class`` is the actual type of the class. - - Examples - -------- - >>> from IsoML.utils.discovery import all_estimators - >>> estimators = all_estimators() - >>> type(estimators) - - """ - - def is_abstract(c): - if not (hasattr(c, "__abstractmethods__")): - return False - if not len(c.__abstractmethods__): - return False - return True - - all_classes = [] - root = str(Path(__file__).parent.parent) # IsoML package - # Ignore deprecation warnings triggered at import time and from walking - # packages - with ignore_warnings(category=FutureWarning): - for _, module_name, _ in pkgutil.walk_packages(path=[root], prefix="IsoML."): - module_parts = module_name.split(".") - if any(part in _MODULE_TO_IGNORE for part in module_parts): - continue - module = import_module(module_name) - classes = inspect.getmembers(module, inspect.isclass) - classes = [ - (name, est_cls) for name, est_cls in classes if not name.startswith("_") - ] - - all_classes.extend(classes) - - all_classes = set(all_classes) - - estimators = [ - c - for c in all_classes - if (issubclass(c[1], BaseEstimator) and c[0] != "BaseEstimator") - ] - # get rid of abstract base classes - estimators = [c for c in estimators if not is_abstract(c[1])] - - if type_filter is not None: - if not isinstance(type_filter, list): - type_filter = [type_filter] - else: - type_filter = list(type_filter) # copy - filtered_estimators = [] - filters = { - "classifier": ClassifierMixin, - "regressor": RegressorMixin, - "transformer": TransformerMixin, - "cluster": ClusterMixin, - } - for name, mixin in filters.items(): - if name in type_filter: - type_filter.remove(name) - filtered_estimators.extend( - [est for est in estimators if issubclass(est[1], mixin)] - ) - estimators = filtered_estimators - if type_filter: - raise ValueError( - "Parameter type_filter must be 'classifier', " - "'regressor', 'transformer', 'cluster' or " - "None, got" - f" {repr(type_filter)}." - ) - - # drop duplicates, sort for reproducibility - # itemgetter is used to ensure the sort does not extend to the 2nd item of - # the tuple - return sorted(set(estimators), key=itemgetter(0)) - - -def all_displays(): - """Get a list of all displays from `IsoML`. - - Returns - ------- - displays : list of tuples - List of (name, class), where ``name`` is the display class name as - string and ``class`` is the actual type of the class. - - Examples - -------- - >>> from IsoML.utils.discovery import all_displays - >>> displays = all_displays() - """ - all_classes = [] - root = str(Path(__file__).parent.parent) # IsoML package - # Ignore deprecation warnings triggered at import time and from walking - # packages - with ignore_warnings(category=FutureWarning): - for _, module_name, _ in pkgutil.walk_packages(path=[root], prefix="IsoML."): - module_parts = module_name.split(".") - if any(part in _MODULE_TO_IGNORE for part in module_parts): - continue - module = import_module(module_name) - classes = inspect.getmembers(module, inspect.isclass) - classes = [ - (name, display_class) - for name, display_class in classes - if not name.startswith("_") and name.endswith("Display") - ] - all_classes.extend(classes) - - return sorted(set(all_classes), key=itemgetter(0)) - - -def _is_checked_function(item): - if not inspect.isfunction(item): - return False - - if item.__name__.startswith("_"): - return False - - mod = item.__module__ - if not mod.startswith("IsoML.") or mod.endswith("estimator_checks"): - return False - - return True - - -def all_functions(): - """Get a list of all functions from `IsoML`. - - Returns - ------- - functions : list of tuples - List of (name, function), where ``name`` is the function name as - string and ``function`` is the actual function. - - Examples - -------- - >>> from IsoML.utils.discovery import all_functions - >>> functions = all_functions() - """ - all_functions = [] - root = str(Path(__file__).parent.parent) # IsoML package - # Ignore deprecation warnings triggered at import time and from walking - # packages - with ignore_warnings(category=FutureWarning): - for _, module_name, _ in pkgutil.walk_packages(path=[root], prefix="IsoML."): - module_parts = module_name.split(".") - if any(part in _MODULE_TO_IGNORE for part in module_parts): - continue - - module = import_module(module_name) - functions = inspect.getmembers(module, _is_checked_function) - functions = [ - (func.__name__, func) - for name, func in functions - if not name.startswith("_") - ] - all_functions.extend(functions) - - # drop duplicates, sort for reproducibility - # itemgetter is used to ensure the sort does not extend to the 2nd item of - # the tuple - return sorted(set(all_functions), key=itemgetter(0)) diff --git a/IsoML/utils/tests/__init__.py b/IsoML/utils/tests/__init__.py deleted file mode 100644 index 6202fa2..0000000 --- a/IsoML/utils/tests/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Authors: IsolationKernel developers -# License: BSD 3 clause diff --git a/IsoML/utils/tests/test_discovery.py b/IsoML/utils/tests/test_discovery.py deleted file mode 100644 index d433629..0000000 --- a/IsoML/utils/tests/test_discovery.py +++ /dev/null @@ -1,31 +0,0 @@ -# Authors: IsolationKernel developers -# License: BSD 3 clause - -import pytest - -from IsoML.utils.discovery import all_displays, all_estimators, all_functions - - -def test_all_estimators(): - estimators = all_estimators() - assert len(estimators) == 3 - - estimators = all_estimators(type_filter="classifier") - assert len(estimators) == 1 - - estimators = all_estimators(type_filter=["classifier", "transformer"]) - assert len(estimators) == 2 - - err_msg = "Parameter type_filter must be" - with pytest.raises(ValueError, match=err_msg): - all_estimators(type_filter="xxxx") - - -def test_all_displays(): - displays = all_displays() - assert len(displays) == 0 - - -def test_all_functions(): - functions = all_functions() - assert len(functions) == 3 diff --git a/LICENSE b/LICENSE index 77eb96d..bb33d7d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,27 +1,396 @@ -Copyright (c) 2024, IsolationKernel contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of IsoML nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +pyikt (c) by Xin Han + +Attribution-NonCommercial-NoDerivatives 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 +International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-NoDerivatives 4.0 International Public +License ("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + c. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + d. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + e. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + f. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + g. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + h. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce and reproduce, but not Share, Adapted Material + for NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material, You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + For the avoidance of doubt, You do not have permission under + this Public License to Share Adapted Material. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only and provided You do not Share Adapted Material; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md index 1de34b3..f230f95 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,177 @@ -IsoML - A template for scikit-learn contributions -============================================================ + -**IsoML** is a template project for [scikit-learn](https://scikit-learn.org) -compatible extensions. + -It aids development of estimators that can be used in scikit-learn pipelines and -(hyper)parameter search, while facilitating testing (including some API compliance), -documentation, open source development, packaging, and continuous integration. +## About The Project -Refer to the documentation to modify the template for your own scikit-learn -contribution: +**PyIKT** (Python for Isolation Kernel Toolkit) is an intuitive Python library designed for a variety of machine learning tasks including kernel similarity calculation, anomaly detection, clustering, and change detection—all powered by the innovative **Isolation Kernel (IK)** . Isolation Kernel is a data-dependent kernel that measures similarity by isolating data points using an isolation mechanism. It uniquely adapts to the data distribution, with the property that points in sparse regions are more similar than those in dense regions. Notably, it requires no learning or closed-form expression, making it efficient and scalable. -*Thank you for cleanly contributing to the scikit-learn ecosystem!* +--- + +### Why use Isolation Kernel? + +- **Data-Dependent Similarity**: Unlike traditional kernels (e.g., Gaussian, Laplacian), Isolation Kernel adapts to the structure of the data rather than assuming a fixed similarity function. +- **Handles Sparse and Dense Regions**: Isolation Kernel effectively accounts for varying data densities, making it ideal for datasets with non-uniform distributions. +- **No Learning Required**: It eliminates the need for training or parameter tuning, simplifying implementation while reducing computational cost. +- **Effective in High Dimensions**: It uniquely addresses the curse of dimensionality, being the only known measure capable of finding exact nearest neighbors in high-dimensional spaces. +- **Versatile Applications**: Isolation Kernel has been successfully applied to tasks like anomaly detection, clustering, and processing stream data, graph data, trajectory data, and more. + +Learn more about its history and development on the [IsolationKernel GitHub page](https://github.com/IsolationKernel). + +--- + +### Why use PyIKT? + +PyIKT is specifically built to harness the power of Isolation Kernel, providing specialized algorithms for a wide range of data types and tasks. Its seamless integration with the scikit-learn API allows easy adoption and compatibility with scikit-learn tools. + +- **Tailored for Isolation Kernel**: PyIKT directly leverages the unique properties of Isolation Kernel for efficient and effective machine learning solutions. +- **Efficient and User-Friendly**: Designed for simplicity and performance, PyIKT offers an intuitive interface built on the scikit-learn API. +- **Support for Diverse Data Types**: It supports graph data, group data, stream data, time series, and trajectory data, making it versatile for various domains. +- **Comprehensive Resources**: Users benefit from rich documentation and examples to quickly understand and apply the library’s features. +- **Ideal for Research and Industry**: PyIKT is suitable for both academic research and industrial applications, providing scalable and cutting-edge tools for modern machine learning challenges. + +--- + +## Installation & Dependencies + +To install the basic version of `pyikt` with core dependencies, run the following: + +```bash +pip install pyikt +``` + +For more installation options, including dependencies and additional features, check out our [Installation Guide](./quick-start/how-to-install.html). + +--- + +## Implemented Algorithms + +#### Summary + +| Algorithms | Kernel Similarity | Anomaly Detection | Clustering | Change Detection | +| --------------- | ------------------------------ | -------------------------- | -------------------- | ---------------- | +| Point Data | IsoKernel (AAAI'19, SIGKDD'18) | IForest (ICDM'08, TKDD'12) | IDKC (IS'23) | | +| | | INNE (CIJ'18) | PSKC (TKDE'23) | | +| | | IDKD (TKDE'22) | IKAHC (PRJ'23) | | +| Graph Data | IsoGraphKernel (AAAI'21) | IKGOD (SIAM'23) | | | +| Group Data | IsodisKernel (SIGKDD'22) | IKGAD (SIGKDD'22) | | | +| Stream Data | | | StreaKHC (SIGKDD'22) | ICID (JAIR'24) | +| Time Series | | IKTOD (VLDB'22) | | | +| Trajectory Data | | IKAT (JAIR'24) | TIDKC (ICDM'23) | | + +**(i) Isolation Kernel** : + +| Abbr | Algorithm | Utilization | Published | +| ------------------------------------------------------ | ----------------------------- | --------------------------------------------- | -------------------- | +| [IsoKernel](./api/kernel/isolation_kernel.html) | Isolation Kernel | IK feature mapping and similarity calculating | AAAI2019, SIGKDD2018 | +| [IsodisKernel](./api/kernel/isolation_dis_kernel.html) | Isolation Distribution Kernel | Distribution similarity calculating | SIGKDD2022 | + +**(ii) Point Anomaly detection** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------- | ------------------------------------------------------------------ | ----------------- | ------------------ | +| [IForest](./api/anomaly/iforest.html) | Isolation forest | Anomaly Detection | ICDM2008, TKDD2022 | +| [INNE](./api/anomaly/inne.html) | Isolation-based anomaly detection using nearest-neighbor ensembles | Anomaly Detection | CIJ2018 | +| [IDKD](./api/anomaly/idkd.html) | Isolation Distributional Kernel for point anomaly detections | Anomaly Detection | TKDE2022 | + +**(iii) Point Clustering** : + +| Abbr | Algorithm | Utiliztion | Published | +| --------------------------------- | ------------------------------------------------------------ | ----------------------- | --------- | +| [IDKC](./api/cluster/idkc.html) | Kernel-based Clustering via Isolation Distributional Kernel. | Point Clustering | IS2023 | +| [PSKC](./api/cluster/pskc.html) | Point-set Kernel Clustering | Point Clustering | TKDE2023 | +| [IKAHC](./api/cluster/ikahc.html) | Isolation Kernel for Agglomerative Hierarchical Clustering | Hierarchical Clustering | PR2023 | + +**(IV) Graph Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------------------- | ---------------------------------------------------------------------- | --------------------------------------------- | --------- | +| [IKGOD](./api/graph/ikgod.html) | Subgraph Centralization: A Necessary Step for Graph Anomaly Detection. | Graph Anomaly Detection | SIAM2023 | +| [IsoGraphKernel](./api/graph/IsoGraphKernel.html) | Isolation Graph Kernel | Graph IK embedding and similarity calculating | AAAI2021 | + +**(V) Group Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------- | ------------------------------------------------------------ | ----------------------- | --------- | +| [IKGAD](./api/group/ikgad.html) | Isolation Distributional Kernel for group anomaly detections | Group Anomaly Detection | TKDE2022 | + +**(VI) Stream Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| -------------------------------------- | --------------------------------------------------------------- | ------------------------------ | ---------- | +| [StreaKHC](./api/stream/streakhc.html) | Isolation Distribution Kernel for Trajectory Anomaly Detections | Online Hierarchical Clustering | SIGKDD2022 | +| [ICID](./api/stream/icid.html) | Detecting change intervals with isolation distributional kernel | Change Intervals Detection | JAIR2024 | + +**(VII) Trajectory Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------ | --------------------------------------------------------------- | ---------------------------- | --------- | +| [TIDKC](./api/trajectory/tidkc.html) | Distribution-based Tajectory Clustering | Trajectory Clustering | ICDM2023 | +| [IKAT](./api/trajectory/ikat.html) | Isolation Distribution Kernel for Trajectory Anomaly Detections | Trajectory Anomaly Detection | JAIR2024 | + +**(VIII) Time Series** + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------- | --------------------------------------------------------------- | ----------------- | --------- | +| [IKTOD](./api/time_series/iktod.html) | Isolation distribution kernel for Time Series Anomaly Detection | Anomaly detection | VLDB2022 | + +--- + +## Features + +pyikt provides a set of key features designed to make time series forecasting with machine learning easy and efficient. For a detailed overview, see the [User Guides](./user_guides/table-of-contents.html). + +--- + +## Examples and tutorials + +Explore our extensive list of examples and tutorials (English and Spanish) to get you started with PyIKT. You can find them [here](./examples/examples_english.html). + +--- + +## How to contribute + +Primarily, PyIKT development consists of adding and creating new *Forecasters*, new validation strategies, or improving the performance of the current code. However, there are many other ways to contribute: + +- Submit a bug report or feature request on [GitHub Issues](https://github.com/pyikt/pyikt/issues). +- Contribute a Jupyter notebook to our [examples](./examples/examples_english.html). +- Write [unit or integration tests](https://docs.pytest.org/en/latest/) for our project. +- Answer questions on our issues, Stack Overflow, and elsewhere. +- Translate our documentation into another language. +- Write a blog post, tweet, or share our project with others. + +For more information on how to contribute to pyikt, see our [Contribution Guide](./contributing/contribution.html). + +Visit our [authors section](./authors/authors.html) to meet all the contributors to pyikt. + +--- + +## Citation + +If you use pyikt for a scientific publication, we would appreciate citations to the published software. + +**BibTeX**: + +``` +@software{PyIKT, +author = {Xin Han, Yixiao Ma, Ye Zhu, and Kaiming Ting}, +title = {PyIKT}, +version = {0.2.0}, +month = {11}, +year = {2024}, +license = {BSD-3-Clause}, +url = {https://pyikt.org/}, +doi = {10.5281/zenodo.8382788} +} +``` + +--- + +## License + +[BSD-3-Clause License](https://github.com/pyikt/pyikt/blob/master/LICENSE) diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100644 index 25febab..0000000 --- a/doc/Makefile +++ /dev/null @@ -1,184 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -rm -rf auto_examples/ - -rm -rf generated/* - -rm -rf modules/generated/* - -html: - # These two lines make the build a bit more lengthy, and the - # the embedding of images more robust - rm -rf $(BUILDDIR)/html/_images - #rm -rf _build/doctrees/ - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/IsoML.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/IsoML.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/IsoML" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/IsoML" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/doc/_static/css/IsoML.css b/doc/_static/css/IsoML.css deleted file mode 100644 index 62b416b..0000000 --- a/doc/_static/css/IsoML.css +++ /dev/null @@ -1,59 +0,0 @@ -/* Override some aspects of the pydata-sphinx-theme */ - -:root { - /* Use softer blue from bootstrap's default info color */ - --pst-color-info: 23, 162, 184; - } - - table { - width: auto; - /* Override fit-content which breaks Styler user guide ipynb */ - } - - .transparent-image { - background: none !important; - margin-top: 1em; - margin-bottom: 1em; - } - -/* Main index page overview cards */ - -.intro-card { - padding: 30px 10px 20px 10px; -} - -.intro-card .sd-card-img-top { - margin: 10px; - height: 52px; - background: none !important; -} - -.intro-card .sd-card-title { - color: var(--pst-color-primary); - font-size: var(--pst-font-size-h5); - padding: 1rem 0rem 0.5rem 0rem; -} - -.intro-card .sd-card-footer { - border: none !important; -} - -.intro-card .sd-card-footer p.sd-card-text { - max-width: 220px; - margin-left: auto; - margin-right: auto; -} - -.intro-card .sd-btn-secondary { - background-color: #6c757d !important; - border-color: #6c757d !important; -} - -.intro-card .sd-btn-secondary:hover { - background-color: #5a6268 !important; - border-color: #545b62 !important; -} - -.card, .card img { - background-color: var(--pst-color-background); -} diff --git a/doc/_static/img/index_api.svg b/doc/_static/img/index_api.svg deleted file mode 100644 index 69f7ba1..0000000 --- a/doc/_static/img/index_api.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/doc/_static/img/index_examples.svg b/doc/_static/img/index_examples.svg deleted file mode 100644 index de3d902..0000000 --- a/doc/_static/img/index_examples.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/doc/_static/img/index_getting_started.svg b/doc/_static/img/index_getting_started.svg deleted file mode 100644 index 2d36622..0000000 --- a/doc/_static/img/index_getting_started.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/doc/_static/img/index_user_guide.svg b/doc/_static/img/index_user_guide.svg deleted file mode 100644 index bd17053..0000000 --- a/doc/_static/img/index_user_guide.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/doc/_static/img/logo.png b/doc/_static/img/logo.png deleted file mode 100644 index 7806f2a..0000000 Binary files a/doc/_static/img/logo.png and /dev/null differ diff --git a/doc/_static/js/copybutton.js b/doc/_static/js/copybutton.js deleted file mode 100644 index d87f569..0000000 --- a/doc/_static/js/copybutton.js +++ /dev/null @@ -1,63 +0,0 @@ -$(document).ready(function() { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $('.highlight-python .highlight,' + - '.highlight-python3 .highlight,' + - '.highlight-pycon .highlight,' + - '.highlight-default .highlight') - var pre = div.find('pre'); - - // get the styles from the current theme - pre.parent().parent().css('position', 'relative'); - var hide_text = 'Hide the prompts and output'; - var show_text = 'Show the prompts and output'; - var border_width = pre.css('border-top-width'); - var border_style = pre.css('border-top-style'); - var border_color = pre.css('border-top-color'); - var button_styles = { - 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', - 'border-color': border_color, 'border-style': border_style, - 'border-width': border_width, 'color': border_color, 'text-size': '75%', - 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', - 'border-radius': '0 3px 0 0' - } - - // create and add the button to all the code blocks that contain >>> - div.each(function(index) { - var jthis = $(this); - if (jthis.find('.gp').length > 0) { - var button = $('>>>'); - button.css(button_styles) - button.attr('title', hide_text); - button.data('hidden', 'false'); - jthis.prepend(button); - } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis.find('pre:has(.gt)').contents().filter(function() { - return ((this.nodeType == 3) && (this.data.trim().length > 0)); - }).wrap(''); - }); - - // define the behavior of the button when it's clicked - $('.copybutton').click(function(e){ - e.preventDefault(); - var button = $(this); - if (button.data('hidden') === 'false') { - // hide the code output - button.parent().find('.go, .gp, .gt').hide(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); - button.css('text-decoration', 'line-through'); - button.attr('title', show_text); - button.data('hidden', 'true'); - } else { - // show the code output - button.parent().find('.go, .gp, .gt').show(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); - button.css('text-decoration', 'none'); - button.attr('title', hide_text); - button.data('hidden', 'false'); - } - }); -}); diff --git a/doc/_templates/class.rst b/doc/_templates/class.rst deleted file mode 100644 index 3253677..0000000 --- a/doc/_templates/class.rst +++ /dev/null @@ -1,26 +0,0 @@ -{{objname}} -{{ underline }}============== - -.. currentmodule:: {{ module }} - -.. autoclass:: {{ objname }} - - {% block methods %} - - {% if methods %} - .. rubric:: Methods - - .. autosummary:: - {% for item in methods %} - {% if '__init__' not in item %} - ~{{ name }}.{{ item }} - {% endif %} - {%- endfor %} - {% endif %} - {% endblock %} - -.. include:: {{module}}.{{objname}}.examples - -.. raw:: html - -
diff --git a/doc/_templates/function.rst b/doc/_templates/function.rst deleted file mode 100644 index 3d70980..0000000 --- a/doc/_templates/function.rst +++ /dev/null @@ -1,12 +0,0 @@ -{{objname}} -{{ underline }}==================== - -.. currentmodule:: {{ module }} - -.. autofunction:: {{ objname }} - -.. include:: {{module}}.{{objname}}.examples - -.. raw:: html - -
diff --git a/doc/_templates/numpydoc_docstring.py b/doc/_templates/numpydoc_docstring.py deleted file mode 100644 index db4cdfa..0000000 --- a/doc/_templates/numpydoc_docstring.py +++ /dev/null @@ -1,16 +0,0 @@ -{{index}} -{{summary}} -{{extended_summary}} -{{parameters}} -{{returns}} -{{yields}} -{{other_parameters}} -{{attributes}} -{{raises}} -{{warns}} -{{warnings}} -{{see_also}} -{{notes}} -{{references}} -{{examples}} -{{methods}} \ No newline at end of file diff --git a/doc/_templates/sidebar-search-bs.html b/doc/_templates/sidebar-search-bs.html deleted file mode 100644 index 60e2773..0000000 --- a/doc/_templates/sidebar-search-bs.html +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/doc/api.rst b/doc/api.rst deleted file mode 100644 index 271565b..0000000 --- a/doc/api.rst +++ /dev/null @@ -1,48 +0,0 @@ -.. _api: - -############# -API Reference -############# - -This is an example on how to document the API of your own project. - -.. currentmodule:: IsoML - -Estimator -========= - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - TemplateEstimator - -Transformer -=========== - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - TemplateTransformer - -Predictor -========= - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - TemplateClassifier - - -Utilities -========= - -.. autosummary:: - :toctree: generated/ - :template: functions.rst - - utils.discovery.all_estimators - utils.discovery.all_displays - utils.discovery.all_functions diff --git a/doc/conf.py b/doc/conf.py deleted file mode 100644 index f0d9484..0000000 --- a/doc/conf.py +++ /dev/null @@ -1,114 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -import os -import sys - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -from importlib.metadata import version as get_version - -project = "IsoML" -copyright = "2024, Isolation Kernel teem members" -author = "Xin Han" -release = get_version("IsoML") -version = ".".join(release.split(".")[:3]) - -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.autosummary", - "sphinx.ext.intersphinx", - "sphinx_design", - "sphinx-prompt", - "sphinx_gallery.gen_gallery", - "numpydoc", -] - -templates_path = ["_templates"] -exclude_patterns = ["_build", "_templates", "Thumbs.db", ".DS_Store"] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -default_role = "literal" - -# -- Options for HTML output ------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output - -html_theme = "pydata_sphinx_theme" -html_static_path = ["_static"] -html_style = "css/IsoML.css" -html_logo = "_static/img/logo.png" -# html_favicon = "_static/img/favicon.ico" -html_css_files = [ - "css/IsoML.css", -] -html_sidebars = { - "quick_start": [], - "user_guide": [], - "auto_examples/index": [], -} - -html_theme_options = { - "external_links": [], - "github_url": "https://github.com/IsolationKernel/IsoML", - # "twitter_url": "https://twitter.com/pandas_dev", - "use_edit_page_button": True, - "show_toc_level": 1, - # "navbar_align": "right", # For testing that the navbar items align properly -} - -html_context = { - "github_user": "IsolationKernel", - "github_repo": "IsoML", - "github_version": "master", - "doc_path": "doc", -} - -# -- Options for autodoc ------------------------------------------------------ - -autodoc_default_options = { - "members": True, - "inherited-members": True, -} - -# generate autosummary even if no references -autosummary_generate = True - -# -- Options for numpydoc ----------------------------------------------------- - -# this is needed for some reason... -# see https://github.com/numpy/numpydoc/issues/69 -numpydoc_show_class_members = False - -# -- Options for intersphinx -------------------------------------------------- - -intersphinx_mapping = { - "python": ("https://docs.python.org/{.major}".format(sys.version_info), None), - "numpy": ("https://numpy.org/doc/stable", None), - "scipy": ("https://docs.scipy.org/doc/scipy/reference", None), - "scikit-learn": ("https://scikit-learn.org/stable", None), - "matplotlib": ("https://matplotlib.org/", None), - "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None), - "joblib": ("https://joblib.readthedocs.io/en/latest/", None), -} - -# -- Options for sphinx-gallery ----------------------------------------------- - -# Generate the plot for the gallery -plot_gallery = True - -sphinx_gallery_conf = { - "doc_module": "IsoML", - "backreferences_dir": os.path.join("generated"), - "examples_dirs": "../examples", - "gallery_dirs": "auto_examples", - "reference_url": {"IsoML": None}, -} diff --git a/doc/index.rst b/doc/index.rst deleted file mode 100644 index fa3952e..0000000 --- a/doc/index.rst +++ /dev/null @@ -1,108 +0,0 @@ -.. IsoML documentation master file, created by - sphinx-quickstart on Mon Jan 18 14:44:12 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -:notoc: - -############################################# -Project template for `scikit-learn` extension -############################################# - -**Date**: |today| **Version**: |version| - -**Useful links**: -`Source Repository `__ | -`Issues & Ideas `__ | - -This is the documentation for the `IsoML` to help at extending -`scikit-learn`. It provides some information on how to build your own custom -`scikit-learn` compatible estimators as well as a template to package them. - - -.. grid:: 1 2 2 2 - :gutter: 4 - :padding: 2 2 0 0 - :class-container: sd-text-center - - .. grid-item-card:: Getting started - :img-top: _static/img/index_getting_started.svg - :class-card: intro-card - :shadow: md - - Information regarding this template and how to modify it for your own project. - - +++ - - .. button-ref:: quick_start - :ref-type: ref - :click-parent: - :color: secondary - :expand: - - To the getting started guideline - - .. grid-item-card:: User guide - :img-top: _static/img/index_user_guide.svg - :class-card: intro-card - :shadow: md - - An example of narrative documentation. Here, we will explain how to create your - own `scikit-learn` estimator. - - +++ - - .. button-ref:: user_guide - :ref-type: ref - :click-parent: - :color: secondary - :expand: - - To the user guide - - .. grid-item-card:: API reference - :img-top: _static/img/index_api.svg - :class-card: intro-card - :shadow: md - - An example of API documentation. This is an example how to use `sphinx` to - automatically generate reference API page. - - +++ - - .. button-ref:: api - :ref-type: ref - :click-parent: - :color: secondary - :expand: - - To the reference guide - - .. grid-item-card:: Examples - :img-top: _static/img/index_examples.svg - :class-card: intro-card - :shadow: md - - A set of examples. It complements the User Guide and it is the right place to - show how to use your compatible estimator. - - +++ - - .. button-ref:: general_examples - :ref-type: ref - :click-parent: - :color: secondary - :expand: - - To the gallery of examples - - -.. toctree:: - :maxdepth: 3 - :hidden: - :titlesonly: - - quick_start - user_guide - api - auto_examples/index diff --git a/doc/make.bat b/doc/make.bat deleted file mode 100644 index ef9a2c1..0000000 --- a/doc/make.bat +++ /dev/null @@ -1,242 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\IsoML.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\IsoML.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %BUILDDIR%/.. - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end diff --git a/doc/quick_start.rst b/doc/quick_start.rst deleted file mode 100644 index afc3f66..0000000 --- a/doc/quick_start.rst +++ /dev/null @@ -1,181 +0,0 @@ -.. _quick_start: - -############### -Getting started -############### - -This package serves as a IsoML package aiding at developing compatible -scikit-learn contribution. - -Creating your own scikit-learn contribution package -=================================================== - -Download and setup your repository ----------------------------------- - -To create your package, you need to clone the ``IsoML`` repository: - -.. prompt:: bash $ - - git clone https://github.com/IsolationKernel/IsoML.git - -Before to reinitialize your git repository, you need to make the following -changes. Replace all occurrences of ``IsoML``, ``IsoML``, or -``IsoML`` with the name of you own project. You can find all the -occurrences using the following command: - -.. prompt:: bash $ - - git grep IsoML - git grep IsoML - git grep IsoML - -To remove the history of the template package, you need to remove the `.git` -directory: - -.. prompt:: bash $ - - rm -rf .git - -Then, you need to initialize your new git repository: - -.. prompt:: bash $ - - git init - git add . - git commit -m 'Initial commit' - -Finally, you create an online repository on GitHub and push your code online: - -.. prompt:: bash $ - - git remote add origin https://github.com/your_remote/your_contribution.git - git push origin main - -Develop your own scikit-learn estimators ----------------------------------------- - -.. _check_estimator: http://scikit-learn.org/stable/modules/generated/sklearn.utils.estimator_checks.check_estimator.html#sklearn.utils.estimator_checks.check_estimator -.. _`Contributor's Guide`: http://scikit-learn.org/stable/developers/ -.. _PEP8: https://www.python.org/dev/peps/pep-0008/ -.. _PEP257: https://www.python.org/dev/peps/pep-0257/ -.. _NumPyDoc: https://github.com/numpy/numpydoc -.. _doctests: https://docs.python.org/3/library/doctest.html - -You can modify the source files as you want. However, your custom estimators -need to pass the check_estimator_ test to be scikit-learn compatible. We provide a -file called `test_common.py` where we run the checks on our custom estimators. - -You can refer to the :ref:`User Guide ` to help you create a compatible -scikit-learn estimator. - -In any case, developers should endeavor to adhere to scikit-learn's -`Contributor's Guide`_ which promotes the use of: - -* algorithm-specific unit tests, in addition to ``check_estimator``'s common - tests; -* PEP8_-compliant code; -* a clearly documented API using NumpyDoc_ and PEP257_-compliant docstrings; -* references to relevant scientific literature in standard citation formats; -* doctests_ to provide succinct usage examples; -* standalone examples to illustrate the usage, model visualisation, and - benefits/benchmarks of particular algorithms; -* efficient code when the need for optimization is supported by benchmarks. - -Managing your local and continuous integration environment ----------------------------------------------------------- - -Here, we set up for you an repository that uses `pixi`. The `pixi.toml` file defines -the packages and tasks to be run that we will present below. You can refer to the -following documentation link to install `pixi`: https://pixi.sh/latest/#installation - -Once done, you can refer to the documentation to get started but we provide the -command below to interact with the main task requested to develop your package. - -Edit the documentation ----------------------- - -.. _Sphinx: http://www.sphinx-doc.org/en/stable/ - -The documentation is created using Sphinx_. In addition, the examples are -created using ``sphinx-gallery``. Therefore, to generate locally the -documentation, you can leverage the following `pixi` task: - -.. prompt:: bash $ - - pixi run build-doc - -The documentation is made of: - -* a home page, ``doc/index.rst``; -* an API documentation, ``doc/api.rst`` in which you should add all public - objects for which the docstring should be exposed publicly. -* a User Guide documentation, ``doc/user_guide.rst``, containing the narrative - documentation of your package, to give as much intuition as possible to your - users. -* examples which are created in the `examples/` folder. Each example - illustrates some usage of the package. the example file name should start by - `plot_*.py`. - -Local testing -------------- - -To run the tests locally, you can use the following command: - -.. prompt:: bash $ - - pixi run test - -It will use `pytest` under the hood to run the package tests. - -In addition, you have a linter task to check the code consistency in terms of style: - -.. prompt:: bash $ - - pixi run lint - -Activating the development environment --------------------------------------- - -In the case that you don't want to use the `pixi run` commands and directly interact -with the usual python tools, you can activate the development environment: - -.. prompt:: bash $ - - pixi shell -e dev - -This will activate an environment containing the dependencies needed to run the linters, -tests, and build the documentation. So for instance, you can run the tests with: - -.. prompt:: bash $ - - pytest -vsl IsoML - -In this case, you can even use pre-commit before using git. You will need to initialize -it with: - -.. prompt:: bash $ - - pre-commit install - -Setup the continuous integration --------------------------------- - -The project template already contains configuration files of the continuous -integration system. It leverage the above pixi commands and run on GitHub Actions. -In short, it will: - -* run the tests on the different platforms (Linux, MacOS, Windows) and upload the - coverage report to codecov.io; -* check the code style (linter); -* build the documentation and deploy it automatically on GitHub Pages. - -Publish your package -==================== - -.. _PyPi: https://packaging.python.org/tutorials/packaging-projects/ -.. _conda-forge: https://conda-forge.org/ - -You can make your package available through PyPi_ and conda-forge_. Refer to -the associated documentation to be able to upload your packages such that -it will be installable with ``pip`` and ``conda``. diff --git a/doc/user_guide.rst b/doc/user_guide.rst deleted file mode 100644 index 527d4c6..0000000 --- a/doc/user_guide.rst +++ /dev/null @@ -1,180 +0,0 @@ -.. title:: User guide : contents - -.. _user_guide: - -========== -User Guide -========== - -Estimator ---------- - -The central piece of transformer, regressor, and classifier is -:class:`sklearn.base.BaseEstimator`. All estimators in scikit-learn are derived -from this class. In more details, this base class enables to set and get -parameters of the estimator. It can be imported as:: - - >>> from sklearn.base import BaseEstimator - -Once imported, you can create a class which inherate from this base class:: - - >>> class MyOwnEstimator(BaseEstimator): - ... pass - -Transformer ------------ - -Transformers are scikit-learn estimators which implement a ``transform`` method. -The use case is the following: - -* at ``fit``, some parameters can be learned from ``X`` and ``y``; -* at ``transform``, `X` will be transformed, using the parameters learned - during ``fit``. - -.. _mixin: https://en.wikipedia.org/wiki/Mixin - -In addition, scikit-learn provides a -mixin_, i.e. :class:`sklearn.base.TransformerMixin`, which -implement the combination of ``fit`` and ``transform`` called ``fit_transform``. - -One can import the mixin class as:: - - >>> from sklearn.base import TransformerMixin - -Therefore, when creating a transformer, you need to create a class which -inherits from both :class:`sklearn.base.BaseEstimator` and -:class:`sklearn.base.TransformerMixin`. The scikit-learn API imposed ``fit`` to -**return ``self``**. The reason is that it allows to pipeline ``fit`` and -``transform`` imposed by the :class:`sklearn.base.TransformerMixin`. The -``fit`` method is expected to have ``X`` and ``y`` as inputs. Note that -``transform`` takes only ``X`` as input and is expected to return the -transformed version of ``X``:: - - >>> class MyOwnTransformer(TransformerMixin, BaseEstimator): - ... def fit(self, X, y=None): - ... return self - ... def transform(self, X): - ... return X - -We build a basic example to show that our :class:`MyOwnTransformer` is working -within a scikit-learn ``pipeline``:: - - >>> from sklearn.datasets import load_iris - >>> from sklearn.pipeline import make_pipeline - >>> from sklearn.linear_model import LogisticRegression - >>> X, y = load_iris(return_X_y=True) - >>> pipe = make_pipeline(MyOwnTransformer(), - ... LogisticRegression(random_state=10, - ... solver='lbfgs')) - >>> pipe.fit(X, y) # doctest: +ELLIPSIS - Pipeline(...) - >>> pipe.predict(X) # doctest: +ELLIPSIS - array([...]) - -Predictor ---------- - -Regressor -~~~~~~~~~ - -Similarly, regressors are scikit-learn estimators which implement a ``predict`` -method. The use case is the following: - -* at ``fit``, some parameters can be learned from ``X`` and ``y``; -* at ``predict``, predictions will be computed using ``X`` using the parameters - learned during ``fit``. - -In addition, scikit-learn provides a mixin_, i.e. -:class:`sklearn.base.RegressorMixin`, which implements the ``score`` method -which computes the :math:`R^2` score of the predictions. - -One can import the mixin as:: - - >>> from sklearn.base import RegressorMixin - -Therefore, we create a regressor, :class:`MyOwnRegressor` which inherits from -both :class:`sklearn.base.BaseEstimator` and -:class:`sklearn.base.RegressorMixin`. The method ``fit`` gets ``X`` and ``y`` -as input and should return ``self``. It should implement the ``predict`` -function which should output the predictions of your regressor:: - - >>> import numpy as np - >>> class MyOwnRegressor(RegressorMixin, BaseEstimator): - ... def fit(self, X, y): - ... return self - ... def predict(self, X): - ... return np.mean(X, axis=1) - -We illustrate that this regressor is working within a scikit-learn pipeline:: - - >>> from sklearn.datasets import load_diabetes - >>> X, y = load_diabetes(return_X_y=True) - >>> pipe = make_pipeline(MyOwnTransformer(), MyOwnRegressor()) - >>> pipe.fit(X, y) # doctest: +ELLIPSIS - Pipeline(...) - >>> pipe.predict(X) # doctest: +ELLIPSIS - array([...]) - -Since we inherit from the :class:`sklearn.base.RegressorMixin`, we can call -the ``score`` method which will return the :math:`R^2` score:: - - >>> pipe.score(X, y) # doctest: +ELLIPSIS - -3.9... - -Classifier -~~~~~~~~~~ - -Similarly to regressors, classifiers implement ``predict``. In addition, they -output the probabilities of the prediction using the ``predict_proba`` method: - -* at ``fit``, some parameters can be learned from ``X`` and ``y``; -* at ``predict``, predictions will be computed using ``X`` using the parameters - learned during ``fit``. The output corresponds to the predicted class for each sample; -* ``predict_proba`` will give a 2D matrix where each column corresponds to the - class and each entry will be the probability of the associated class. - -In addition, scikit-learn provides a mixin, i.e. -:class:`sklearn.base.ClassifierMixin`, which implements the ``score`` method -which computes the accuracy score of the predictions. - -One can import this mixin as:: - - >>> from sklearn.base import ClassifierMixin - -Therefore, we create a classifier, :class:`MyOwnClassifier` which inherits -from both :class:`slearn.base.BaseEstimator` and -:class:`sklearn.base.ClassifierMixin`. The method ``fit`` gets ``X`` and ``y`` -as input and should return ``self``. It should implement the ``predict`` -function which should output the class inferred by the classifier. -``predict_proba`` will output some probabilities instead:: - - >>> class MyOwnClassifier(ClassifierMixin, BaseEstimator): - ... def fit(self, X, y): - ... self.classes_ = np.unique(y) - ... return self - ... def predict(self, X): - ... return np.random.randint(0, self.classes_.size, - ... size=X.shape[0]) - ... def predict_proba(self, X): - ... pred = np.random.rand(X.shape[0], self.classes_.size) - ... return pred / np.sum(pred, axis=1)[:, np.newaxis] - -We illustrate that this regressor is working within a scikit-learn pipeline:: - - >>> X, y = load_iris(return_X_y=True) - >>> pipe = make_pipeline(MyOwnTransformer(), MyOwnClassifier()) - >>> pipe.fit(X, y) # doctest: +ELLIPSIS - Pipeline(...) - -Then, you can call ``predict`` and ``predict_proba``:: - - >>> pipe.predict(X) # doctest: +ELLIPSIS - array([...]) - >>> pipe.predict_proba(X) # doctest: +ELLIPSIS - array([...]) - -Since our classifier inherits from :class:`sklearn.base.ClassifierMixin`, we -can compute the accuracy by calling the ``score`` method:: - - >>> pipe.score(X, y) # doctest: +ELLIPSIS - 0... diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..f230f95 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,177 @@ + + + + +## About The Project + +**PyIKT** (Python for Isolation Kernel Toolkit) is an intuitive Python library designed for a variety of machine learning tasks including kernel similarity calculation, anomaly detection, clustering, and change detection—all powered by the innovative **Isolation Kernel (IK)** . Isolation Kernel is a data-dependent kernel that measures similarity by isolating data points using an isolation mechanism. It uniquely adapts to the data distribution, with the property that points in sparse regions are more similar than those in dense regions. Notably, it requires no learning or closed-form expression, making it efficient and scalable. + +--- + +### Why use Isolation Kernel? + +- **Data-Dependent Similarity**: Unlike traditional kernels (e.g., Gaussian, Laplacian), Isolation Kernel adapts to the structure of the data rather than assuming a fixed similarity function. +- **Handles Sparse and Dense Regions**: Isolation Kernel effectively accounts for varying data densities, making it ideal for datasets with non-uniform distributions. +- **No Learning Required**: It eliminates the need for training or parameter tuning, simplifying implementation while reducing computational cost. +- **Effective in High Dimensions**: It uniquely addresses the curse of dimensionality, being the only known measure capable of finding exact nearest neighbors in high-dimensional spaces. +- **Versatile Applications**: Isolation Kernel has been successfully applied to tasks like anomaly detection, clustering, and processing stream data, graph data, trajectory data, and more. + +Learn more about its history and development on the [IsolationKernel GitHub page](https://github.com/IsolationKernel). + +--- + +### Why use PyIKT? + +PyIKT is specifically built to harness the power of Isolation Kernel, providing specialized algorithms for a wide range of data types and tasks. Its seamless integration with the scikit-learn API allows easy adoption and compatibility with scikit-learn tools. + +- **Tailored for Isolation Kernel**: PyIKT directly leverages the unique properties of Isolation Kernel for efficient and effective machine learning solutions. +- **Efficient and User-Friendly**: Designed for simplicity and performance, PyIKT offers an intuitive interface built on the scikit-learn API. +- **Support for Diverse Data Types**: It supports graph data, group data, stream data, time series, and trajectory data, making it versatile for various domains. +- **Comprehensive Resources**: Users benefit from rich documentation and examples to quickly understand and apply the library’s features. +- **Ideal for Research and Industry**: PyIKT is suitable for both academic research and industrial applications, providing scalable and cutting-edge tools for modern machine learning challenges. + +--- + +## Installation & Dependencies + +To install the basic version of `pyikt` with core dependencies, run the following: + +```bash +pip install pyikt +``` + +For more installation options, including dependencies and additional features, check out our [Installation Guide](./quick-start/how-to-install.html). + +--- + +## Implemented Algorithms + +#### Summary + +| Algorithms | Kernel Similarity | Anomaly Detection | Clustering | Change Detection | +| --------------- | ------------------------------ | -------------------------- | -------------------- | ---------------- | +| Point Data | IsoKernel (AAAI'19, SIGKDD'18) | IForest (ICDM'08, TKDD'12) | IDKC (IS'23) | | +| | | INNE (CIJ'18) | PSKC (TKDE'23) | | +| | | IDKD (TKDE'22) | IKAHC (PRJ'23) | | +| Graph Data | IsoGraphKernel (AAAI'21) | IKGOD (SIAM'23) | | | +| Group Data | IsodisKernel (SIGKDD'22) | IKGAD (SIGKDD'22) | | | +| Stream Data | | | StreaKHC (SIGKDD'22) | ICID (JAIR'24) | +| Time Series | | IKTOD (VLDB'22) | | | +| Trajectory Data | | IKAT (JAIR'24) | TIDKC (ICDM'23) | | + +**(i) Isolation Kernel** : + +| Abbr | Algorithm | Utilization | Published | +| ------------------------------------------------------ | ----------------------------- | --------------------------------------------- | -------------------- | +| [IsoKernel](./api/kernel/isolation_kernel.html) | Isolation Kernel | IK feature mapping and similarity calculating | AAAI2019, SIGKDD2018 | +| [IsodisKernel](./api/kernel/isolation_dis_kernel.html) | Isolation Distribution Kernel | Distribution similarity calculating | SIGKDD2022 | + +**(ii) Point Anomaly detection** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------- | ------------------------------------------------------------------ | ----------------- | ------------------ | +| [IForest](./api/anomaly/iforest.html) | Isolation forest | Anomaly Detection | ICDM2008, TKDD2022 | +| [INNE](./api/anomaly/inne.html) | Isolation-based anomaly detection using nearest-neighbor ensembles | Anomaly Detection | CIJ2018 | +| [IDKD](./api/anomaly/idkd.html) | Isolation Distributional Kernel for point anomaly detections | Anomaly Detection | TKDE2022 | + +**(iii) Point Clustering** : + +| Abbr | Algorithm | Utiliztion | Published | +| --------------------------------- | ------------------------------------------------------------ | ----------------------- | --------- | +| [IDKC](./api/cluster/idkc.html) | Kernel-based Clustering via Isolation Distributional Kernel. | Point Clustering | IS2023 | +| [PSKC](./api/cluster/pskc.html) | Point-set Kernel Clustering | Point Clustering | TKDE2023 | +| [IKAHC](./api/cluster/ikahc.html) | Isolation Kernel for Agglomerative Hierarchical Clustering | Hierarchical Clustering | PR2023 | + +**(IV) Graph Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------------------- | ---------------------------------------------------------------------- | --------------------------------------------- | --------- | +| [IKGOD](./api/graph/ikgod.html) | Subgraph Centralization: A Necessary Step for Graph Anomaly Detection. | Graph Anomaly Detection | SIAM2023 | +| [IsoGraphKernel](./api/graph/IsoGraphKernel.html) | Isolation Graph Kernel | Graph IK embedding and similarity calculating | AAAI2021 | + +**(V) Group Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------- | ------------------------------------------------------------ | ----------------------- | --------- | +| [IKGAD](./api/group/ikgad.html) | Isolation Distributional Kernel for group anomaly detections | Group Anomaly Detection | TKDE2022 | + +**(VI) Stream Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| -------------------------------------- | --------------------------------------------------------------- | ------------------------------ | ---------- | +| [StreaKHC](./api/stream/streakhc.html) | Isolation Distribution Kernel for Trajectory Anomaly Detections | Online Hierarchical Clustering | SIGKDD2022 | +| [ICID](./api/stream/icid.html) | Detecting change intervals with isolation distributional kernel | Change Intervals Detection | JAIR2024 | + +**(VII) Trajectory Data** : + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------ | --------------------------------------------------------------- | ---------------------------- | --------- | +| [TIDKC](./api/trajectory/tidkc.html) | Distribution-based Tajectory Clustering | Trajectory Clustering | ICDM2023 | +| [IKAT](./api/trajectory/ikat.html) | Isolation Distribution Kernel for Trajectory Anomaly Detections | Trajectory Anomaly Detection | JAIR2024 | + +**(VIII) Time Series** + +| Abbr | Algorithm | Utiliztion | Published | +| ------------------------------------- | --------------------------------------------------------------- | ----------------- | --------- | +| [IKTOD](./api/time_series/iktod.html) | Isolation distribution kernel for Time Series Anomaly Detection | Anomaly detection | VLDB2022 | + +--- + +## Features + +pyikt provides a set of key features designed to make time series forecasting with machine learning easy and efficient. For a detailed overview, see the [User Guides](./user_guides/table-of-contents.html). + +--- + +## Examples and tutorials + +Explore our extensive list of examples and tutorials (English and Spanish) to get you started with PyIKT. You can find them [here](./examples/examples_english.html). + +--- + +## How to contribute + +Primarily, PyIKT development consists of adding and creating new *Forecasters*, new validation strategies, or improving the performance of the current code. However, there are many other ways to contribute: + +- Submit a bug report or feature request on [GitHub Issues](https://github.com/pyikt/pyikt/issues). +- Contribute a Jupyter notebook to our [examples](./examples/examples_english.html). +- Write [unit or integration tests](https://docs.pytest.org/en/latest/) for our project. +- Answer questions on our issues, Stack Overflow, and elsewhere. +- Translate our documentation into another language. +- Write a blog post, tweet, or share our project with others. + +For more information on how to contribute to pyikt, see our [Contribution Guide](./contributing/contribution.html). + +Visit our [authors section](./authors/authors.html) to meet all the contributors to pyikt. + +--- + +## Citation + +If you use pyikt for a scientific publication, we would appreciate citations to the published software. + +**BibTeX**: + +``` +@software{PyIKT, +author = {Xin Han, Yixiao Ma, Ye Zhu, and Kaiming Ting}, +title = {PyIKT}, +version = {0.2.0}, +month = {11}, +year = {2024}, +license = {BSD-3-Clause}, +url = {https://pyikt.org/}, +doi = {10.5281/zenodo.8382788} +} +``` + +--- + +## License + +[BSD-3-Clause License](https://github.com/pyikt/pyikt/blob/master/LICENSE) diff --git a/docs/api/anomaly/idkd.md b/docs/api/anomaly/idkd.md new file mode 100644 index 0000000..b5ebe7b --- /dev/null +++ b/docs/api/anomaly/idkd.md @@ -0,0 +1 @@ +::: pyikt.anomaly.IDKD diff --git a/docs/api/anomaly/iforest.md b/docs/api/anomaly/iforest.md new file mode 100644 index 0000000..df79339 --- /dev/null +++ b/docs/api/anomaly/iforest.md @@ -0,0 +1 @@ +::: pyikt.anomaly.IForest diff --git a/docs/api/anomaly/inne.md b/docs/api/anomaly/inne.md new file mode 100644 index 0000000..467bb9c --- /dev/null +++ b/docs/api/anomaly/inne.md @@ -0,0 +1 @@ +::: pyikt.anomaly.INNE diff --git a/docs/api/cluster/idkc.md b/docs/api/cluster/idkc.md new file mode 100644 index 0000000..b004254 --- /dev/null +++ b/docs/api/cluster/idkc.md @@ -0,0 +1 @@ +::: pyikt.cluster.IDKC diff --git a/docs/api/cluster/ikahc.md b/docs/api/cluster/ikahc.md new file mode 100644 index 0000000..5c44e1b --- /dev/null +++ b/docs/api/cluster/ikahc.md @@ -0,0 +1 @@ +::: pyikt.cluster.IKAHC diff --git a/docs/api/cluster/pskc.md b/docs/api/cluster/pskc.md new file mode 100644 index 0000000..5ee8403 --- /dev/null +++ b/docs/api/cluster/pskc.md @@ -0,0 +1 @@ +::: pyikt.cluster.PSKC diff --git a/docs/api/graph/IsoGraphKernel.md b/docs/api/graph/IsoGraphKernel.md new file mode 100644 index 0000000..f4941f0 --- /dev/null +++ b/docs/api/graph/IsoGraphKernel.md @@ -0,0 +1 @@ +::: pyikt.graph.IsoGraphKernel diff --git a/docs/api/graph/ikgod.md b/docs/api/graph/ikgod.md new file mode 100644 index 0000000..d0ccb4c --- /dev/null +++ b/docs/api/graph/ikgod.md @@ -0,0 +1 @@ +::: pyikt.graph.IKGOD diff --git a/docs/api/group/ikgad.md b/docs/api/group/ikgad.md new file mode 100644 index 0000000..762c979 --- /dev/null +++ b/docs/api/group/ikgad.md @@ -0,0 +1 @@ +::: pyikt.group.IKGAD diff --git a/docs/api/kernel/isolation_dis_kernel.md b/docs/api/kernel/isolation_dis_kernel.md new file mode 100644 index 0000000..e421fd4 --- /dev/null +++ b/docs/api/kernel/isolation_dis_kernel.md @@ -0,0 +1 @@ +::: pyikt.kernel.IsoDisKernel diff --git a/docs/api/kernel/isolation_kernel.md b/docs/api/kernel/isolation_kernel.md new file mode 100644 index 0000000..5ae911a --- /dev/null +++ b/docs/api/kernel/isolation_kernel.md @@ -0,0 +1 @@ +::: pyikt.kernel.IsoKernel diff --git a/docs/api/stream/icid.md b/docs/api/stream/icid.md new file mode 100644 index 0000000..d309e15 --- /dev/null +++ b/docs/api/stream/icid.md @@ -0,0 +1 @@ +::: pyikt.stream.ICID diff --git a/docs/api/stream/streakhc.md b/docs/api/stream/streakhc.md new file mode 100644 index 0000000..e224183 --- /dev/null +++ b/docs/api/stream/streakhc.md @@ -0,0 +1 @@ +::: pyikt.stream.STREAMKHC diff --git a/docs/api/time_series/iktod.md b/docs/api/time_series/iktod.md new file mode 100644 index 0000000..77c8a4c --- /dev/null +++ b/docs/api/time_series/iktod.md @@ -0,0 +1 @@ +::: pyikt.timeseries.IKTOD diff --git a/docs/api/trajectory/data_loader/sheep_dogs.md b/docs/api/trajectory/data_loader/sheep_dogs.md new file mode 100644 index 0000000..91eb50b --- /dev/null +++ b/docs/api/trajectory/data_loader/sheep_dogs.md @@ -0,0 +1 @@ +::: pyikt.trajectory.dataloader.SheepDogs diff --git a/docs/api/trajectory/ikat.md b/docs/api/trajectory/ikat.md new file mode 100644 index 0000000..c39b181 --- /dev/null +++ b/docs/api/trajectory/ikat.md @@ -0,0 +1 @@ +::: pyikt.trajectory.IKAT diff --git a/docs/api/trajectory/tidkc.md b/docs/api/trajectory/tidkc.md new file mode 100644 index 0000000..869a6fa --- /dev/null +++ b/docs/api/trajectory/tidkc.md @@ -0,0 +1 @@ +::: pyikt.trajectory.TIDKC diff --git a/docs/authors/authors.md b/docs/authors/authors.md new file mode 100644 index 0000000..fb0bbe3 --- /dev/null +++ b/docs/authors/authors.md @@ -0,0 +1,27 @@ +# Authors + +All contributions, bug reports, bug fixes, documentation improvements, enhancements, and ideas are welcome. + +A detailed overview on how to contribute can be found in the [contributing guide](https://github.com/skforecast/skforecast/blob/master/CONTRIBUTING.md). + +## Core Development Team + ++ Xin Han (xhan197@outlook.com) + ++ Yixiao Ma (mayx@lamda.nju.edu.cn) + ++ Ye Zhu (ye.zhu@ieee.org) + ++ Kaiming Ting (tingkm@nju.edu.cn) + + +## Main Contributors + ++ Xin han, [Xin Han](https://github.com/xhan97) ++ Yixiao Ma, [Yixiao Ma](https://github.com/yixiaoma666) + + +## Contributions + + + diff --git a/docs/contributing/contribution.md b/docs/contributing/contribution.md new file mode 100644 index 0000000..456f7fc --- /dev/null +++ b/docs/contributing/contribution.md @@ -0,0 +1,91 @@ +Contributing to PyIKT +===================== + +Hi! Thanks for your interest in contributing to PyIKT :D . +In this document we'll try to summarize everything that you need to know to do a good job. + +Code and Issues +--------------- + +We use [Github](https://github.com/IsolationKernel/pyikt) to host our code repositories +and issues.You can look at [issues](https://github.com/IsolationKernel/pyikt/issues) to report any +issues related to pyikt. Here is a [guide](https://guides.github.com/features/issues/) +on how to report better issues. + +Git and our Branching model +--------------------------- + +Git +--- + +We use [Git](http://git-scm.com) as our [version control system](http://en.wikipedia.org/wiki/Revision_control), so the best way to +contribute is to learn how to use it and put your changes on a Git repository. +There are plenty of documentation about Git -- you can start with the [Pro Git book](http://git-scm.com/book/). +Or You can go through the [try git tutorial](https://try.github.io/levels/1/challenges/). + +Forks + GitHub Pull requests +---------------------------- + +We use the famous +[gitflow](http://nvie.com/posts/a-successful-git-branching-model/) to manage our +branches. + +Summary of our git branching model: + +- Fork the desired repository on GitHub to your account; +- Clone your forked repository locally: `git clone git@github.com:your-username:repository-name.git`; +- Create a new branch off of `develop` with a descriptive name (for example: `feature/portuguese-sentiment-analysis`, `hotfix/bug-on-downloader`). You can do it by switching to `develop` branch (`git checkout develop`) and then creating a new branch (`git checkout -b name-of-the-new-branch`); +- Do many small commits on that branch locally (`git add files-changed`, `git commit -m "Add some change"`); +- Push to your fork on GitHub (with the name as your local branch: `git push origin branch-name`); +- Create a pull request using the GitHub Web interface (asking us to pull the changes from your new branch and add the changes to our `develop` branch); +- Wait for comments. + +Tips +---- + +- Write [helpful commit messages](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message). +- Anything in the `dev` branch should be deployable (no failing tests). +- Never use `git add .`: it can add unwanted files; +- Avoid using `git commit -a` unless you know what you're doing; +- Check every change with `git diff` before adding then to the index (stage area) and with `git diff --cached` before commiting; +- If you have push access to the main repository, please do not commit directly to `dev`: your access should be used only to accept pull requests; if you want to make a new feature, you should use the same process as other developers so that your code can be reviewed. + +Documentation Guidelines +------------------------ + +Code Guidelines +--------------- + +- We use [PEP8](http://www.python.org/dev/peps/pep-0008/); +- We permit 120 characters in a line, rather 79 as suggested in PEP8 +- Write tests for your new features (please see "Tests" topic below); +- Always remember that [commented code is dead code](http://www.codinghorror.com/blog/2008/07/coding-without-comments.html); +- Name identifiers (variables, classes, functions, module names) with readable names (`x` is always wrong); +- When manipulating strings, use [Python's new-style formatting](http://docs.python.org/library/string.html#format-string-syntax) (`'{} = {}'.format(a, b)` instead of `'%s = %s' % (a, b)`); +- When working with files use `with open(,(option>) as f` instead of `f = open(,(option>)`; +- Run all tests before pushing `pytest` so you will know if your changes broke something; + +Tests +----- + +We use [Github Actions](https://github.com/features/actions)for continous integration +and python [pytest](https://docs.pytest.org/en/stable/index.html) for writing tests. +You should write tests for every feature you add or bug you solve in the code. +Having automated tests for every line of our code let us make big changes +without worries: there will always be tests to verify if the changes introduced +bugs or lack of features. If we don't have tests we will be blind and every +change will come with some fear of possibly breaking something. + +For a better design of your code, we recommend using a technique called +[test-driven development](https://en.wikipedia.org/wiki/Test-driven_development), +where you write your tests **before** writing the actual code that implements +the desired feature. + +Discussion +---------- + +Please feel free to contact us through mail list if +you have any questions or suggestions. +Every contribution is very welcome! + +Happy hacking! ;) diff --git a/docs/examples/examples_english.md b/docs/examples/examples_english.md new file mode 100644 index 0000000..b3d961c --- /dev/null +++ b/docs/examples/examples_english.md @@ -0,0 +1,9 @@ + + +# Examples and Tutorials + +Practical examples and tutorials to help you understand and apply PyIKT. + +Anomaly Detection + +- [INNE](../user_guides/inne.html) diff --git a/docs/faq/table-of-contents.md b/docs/faq/table-of-contents.md new file mode 100644 index 0000000..c7e78b4 --- /dev/null +++ b/docs/faq/table-of-contents.md @@ -0,0 +1,20 @@ +# Frequently Asked Questions and forecasting tips + +Thank you for choosing skforecast and visiting our Frequently Asked Questions (FAQ) page. Here, we aim to provide solutions to commonly encountered issues on our Github repository. If your question is not answered on this page, we encourage you to create a new issue on our [Github](https://github.com/skforecast/skforecast/issues) so that it can be addressed, and other users can also benefit from it. Additionally, we have included some forecasting tips to help you get the most out of skforecast. + +General Forecasting Tips + ++ [Avoid negative predictions when forecasting](../faq/non-negative-predictions.html) ++ [Forecasting time series with missing values](../faq/forecasting-time-series-with-missing-values.html) ++ [Forecasting with delayed historical data](../faq/forecasting-with-delayed-historical-data.html) ++ [Backtesting vs One-step-ahead](../faq/parameters-search-backtesting-vs-one-step-ahead.html) + +Feature Engineering + ++ [Cyclical features in time series](../faq/cyclical-features-time-series.html) ++ [Time series aggregation](../faq/time-series-aggregation.html) + +Performance Optimization + ++ [Parallelization in skforecast](../faq/parallelization-skforecast.html) ++ [Profiling skforecast](../faq/profiling-skforecast.html) diff --git a/docs/img/favicon.jpg b/docs/img/favicon.jpg new file mode 100644 index 0000000..7f98b82 Binary files /dev/null and b/docs/img/favicon.jpg differ diff --git a/docs/img/ikt_logo_2.jpg b/docs/img/ikt_logo_2.jpg new file mode 100644 index 0000000..7f98b82 Binary files /dev/null and b/docs/img/ikt_logo_2.jpg differ diff --git a/docs/img/pyikt_logo_1.jpg b/docs/img/pyikt_logo_1.jpg new file mode 100644 index 0000000..572c8b8 Binary files /dev/null and b/docs/img/pyikt_logo_1.jpg differ diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 0000000..0e65eb2 --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block outdated %} +This is documentation for an unstable development version. + + Switch to latest stable version. + +{% endblock %} \ No newline at end of file diff --git a/docs/quick-start/how-to-install.md b/docs/quick-start/how-to-install.md new file mode 100644 index 0000000..08e9a8d --- /dev/null +++ b/docs/quick-start/how-to-install.md @@ -0,0 +1,35 @@ +# Installation Guide + +This guide will help you install `pyikt`. The default installation of `pyikt` includes only the essential dependencies required for basic functionality. Additional optional dependencies can be installed for extended features. + +![Python](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue) [![PyPI](https://img.shields.io/pypi/v/pyikt)](https://pypi.org/project/pyikt/) + +## **Basic installation** + +To install the basic version of `pyikt` with its core dependencies, run: + +```bash +pip install pyikt +``` + +Specific version: + +```bash +pip install pyikt==0.01.0 +``` + +Latest (unstable): + +```bash +pip install git+https://github.com/pyikt/pyikt@master +``` + +The following dependencies are installed with the default installation: + ++ numpy>=1.22 ++ pandas>=1.5 ++ tqdm>=4.57 ++ scikit-learn>=1.2 ++ optuna>=2.10 ++ joblib>=1.1 ++ numba>=0.59 diff --git a/docs/releases/releases.md b/docs/releases/releases.md new file mode 100644 index 0000000..92427d1 --- /dev/null +++ b/docs/releases/releases.md @@ -0,0 +1,10 @@ +# Changelog + +All significant changes to this project are documented in this release file. + +| Legend | | +|:-----------------------------------------------------------|:--------------------------------------| +| Feature | New feature | +| Enhancement | Improvement in existing functionality | +| API Change | Changes in the API | +| Fix | Bug fix | \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..b108476 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,162 @@ +/* +=============================== +Jupyter Wrapper Styles +=============================== +*/ + +/* Hide output prompt in Jupyter */ +.jupyter-wrapper .jp-OutputPrompt, +.jupyter-wrapper .jp-CodeCell .jp-Cell-inputWrapper .jp-InputPrompt, +.jupyter-wrapper .jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-InputPrompt { + display: none; +} + +/* Size of code cells in Jupyter Notebooks */ +.jupyter-wrapper .jp-CodeCell .jp-InputArea-editor .CodeMirror { + font-size: 0.95em; /* Adjust the size as needed */ +} + +/* Size of output cells in Jupyter Notebooks */ +.jupyter-wrapper .jp-RenderedText.jp-OutputArea-output pre { + font-size: 1.2em; /* Adjust the size as needed */ +} + +/* Display inline tables for dataframes in Jupyter */ +.jupyter-wrapper table.dataframe { + display: inline; +} + +/* +=============================== +Markdown Content Styles +=============================== +*/ + +.md-typeset h1 { + font-weight: 500; + letter-spacing: -0.01em; + color: var(--md-default-fg-color); +} + +.md-typeset h2 { + font-weight: 500; + letter-spacing: -0.01em; + color: var(--md-default-fg-color); +} + +.md-typeset h3 { + font-size: 1.25em; + font-weight: 500; + letter-spacing: -.01em; + line-height: 1.5; + margin: 1.6em 0 .8em; + color: var(--md-default-fg-color); +} + + +/* Justify text */ +.md-typeset p { + text-align: justify; +} + +/* Increase font size of code blocks in Markdown cells */ +.md-typeset pre { + font-size: 0.95em; /* Adjust the size as needed */ +} + +.md-typeset pre>code { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + font-size: 1.1em; + white-space: pre-wrap; + word-break: break-word; +} + +.md-typeset code:not(.focus-visible) { + font-size: 1.1em; +} + +.md-typeset table:not([class]) td>:last-child, .md-typeset table:not([class]) th>:last-child { + font-size: 1.1em; +} + +/* +=============================== +Color Scheme Styles +=============================== +*/ +/* Light color scheme styles */ +[data-md-color-scheme="light"] { + --md-primary-fg-color: #001633; + --md-primary-fg-color--light: #001633; + --md-primary-fg-color--dark: #001633; + --md-accent-fg-color: #f79939; + --md-accent-fg-color--light: #f79939; + --md-accent-fg-color--dark: #f79939; + --md-primary-bg-color: #f79939; + --md-typeset-a-color: #f79939; + --md-default-fg-color: #2c2c2c; +} + +/* Slate color scheme styles */ +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #001633; + --md-primary-fg-color--light: #001633; + --md-primary-fg-color--dark: #001633; + --md-accent-fg-color: #f79939; + --md-accent-fg-color--light: #f79939; + --md-accent-fg-color--dark: #f79939; + --md-primary-bg-color: #f79939; + --md-typeset-a-color: #f79939; +} + +/* Hide dark images in light mode */ +[data-md-color-scheme="light"] img[src$="#only-dark"], +[data-md-color-scheme="light"] img[src$="#gh-dark-mode-only"] { + display: none; +} + +/* Hide light images in dark mode */ +[data-md-color-scheme="dark"] img[src$="#only-light"], +[data-md-color-scheme="dark"] img[src$="#gh-light-mode-only"] { + display: none; +} + +/* +=============================== +Badge Styles +=============================== +*/ +.badge { + display: inline-block; + padding: 0.2em 0.4em; + font-size: 0.75em; + font-weight: 700; + line-height: 1; + text-align: center; + border-radius: 0.25rem; +} + +/* Enhancement Badge */ +.text-bg-enhancement { + color: #fff; + background-color: #17a2b8; +} + +/* API Change Badge */ +.text-bg-api-change { + color: #fff; + background-color: #ffc107; +} + +/* Feature Badge */ +.text-bg-feature { + color: #fff; + background-color: #28a745; +} + +/* Fix Badge */ +.text-bg-danger { + color: #fff; + background-color: #dc3545; +} \ No newline at end of file diff --git a/docs/user_guides/inne.ipynb b/docs/user_guides/inne.ipynb new file mode 100644 index 0000000..adb9362 --- /dev/null +++ b/docs/user_guides/inne.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# IsolationNNE example\n\nAn example using :class:`pyikt.anomaly.IsolationNNE` for anomaly\ndetection.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\nfrom pyikt.anomaly import IsolationNNE\n\nrng = np.random.RandomState(42)\n\n# Generate train data\nX = 0.3 * rng.randn(100, 2)\nX_train = np.r_[X + 2, X - 2]\n# Generate some regular novel observations\nX = 0.3 * rng.randn(20, 2)\nX_test = np.r_[X + 2, X - 2]\n# Generate some abnormal novel observations\nX_outliers = rng.uniform(low=-4, high=4, size=(20, 2))\n\n# fit the model\nclf = IsolationNNE()\nclf.fit(X_train)\ny_pred_train = clf.predict(X_train)\ny_pred_test = clf.predict(X_test)\ny_pred_outliers = clf.predict(X_outliers)\n\n# plot the line, the samples, and the nearest vectors to the plane\nxx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))\nZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])\nZ = Z.reshape(xx.shape)\n\nplt.title(\"IsolationNNE\")\nplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)\n\nb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c=\"white\", s=20, edgecolor=\"k\")\nb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c=\"green\", s=20, edgecolor=\"k\")\nc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c=\"red\", s=20, edgecolor=\"k\")\nplt.axis(\"tight\")\nplt.xlim((-5, 5))\nplt.ylim((-5, 5))\nplt.legend(\n [b1, b2, c],\n [\"training observations\", \"new regular observations\", \"new abnormal observations\"],\n loc=\"upper left\",\n)\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/user_guides/table-of-contents.md b/docs/user_guides/table-of-contents.md new file mode 100644 index 0000000..94b0ed1 --- /dev/null +++ b/docs/user_guides/table-of-contents.md @@ -0,0 +1,9 @@ +# Table of Contents + +Welcome to the PyIKT user guides! This comprehensive collection of guides is designed to help you navigate through the various features and functionalities of PyIKT. Whether you are a beginner or an advanced user, you will find the necessary resources to master data with PyIKT. Below, you will find the user guides categorized by topic for easier navigation. + +Anomaly Detection + +- [INNE](../user_guides/inne.html) + +We hope you find these guides helpful. If you have any questions or need further assistance, please don't hesitate to reach out to the PyIKT community. diff --git a/examples/plot_classifier.py b/examples/plot_classifier.py deleted file mode 100644 index 0485232..0000000 --- a/examples/plot_classifier.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -============================ -Plotting Template Classifier -============================ - -An example plot of :class:`IsoML.template.TemplateClassifier` -""" - -# %% -# Train our classifier on very simple dataset -from IsoML import TemplateClassifier - -X = [[0, 0], [1, 1]] -y = [0, 1] -clf = TemplateClassifier().fit(X, y) - -# %% -# Create a test dataset -import numpy as np - -rng = np.random.RandomState(13) -X_test = rng.rand(500, 2) - -# %% -# Use scikit-learn to display the decision boundary -from sklearn.inspection import DecisionBoundaryDisplay - -disp = DecisionBoundaryDisplay.from_estimator(clf, X_test) -disp.ax_.scatter( - X_test[:, 0], - X_test[:, 1], - c=clf.predict(X_test), - s=20, - edgecolors="k", - linewidths=0.5, -) -disp.ax_.set( - xlabel="Feature 1", - ylabel="Feature 2", - title="Template Classifier Decision Boundary", -) diff --git a/examples/plot_inne.py b/examples/plot_inne.py new file mode 100644 index 0000000..4e9d306 --- /dev/null +++ b/examples/plot_inne.py @@ -0,0 +1,56 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +""" +========================================== +IsolationNNE example +========================================== + +An example using :class:`pyikt.anomaly.IsolationNNE` for anomaly +detection. + +""" + +import numpy as np +import matplotlib.pyplot as plt +from pyikt.anomaly import INNE + +rng = np.random.RandomState(42) + +# Generate train data +X = 0.3 * rng.randn(100, 2) +X_train = np.r_[X + 2, X - 2] +# Generate some regular novel observations +X = 0.3 * rng.randn(20, 2) +X_test = np.r_[X + 2, X - 2] +# Generate some abnormal novel observations +X_outliers = rng.uniform(low=-4, high=4, size=(20, 2)) + +# fit the model +clf = INNE() +clf.fit(X_train) +y_pred_train = clf.predict(X_train) +y_pred_test = clf.predict(X_test) +y_pred_outliers = clf.predict(X_outliers) + +# plot the line, the samples, and the nearest vectors to the plane +xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50)) +Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) +Z = Z.reshape(xx.shape) + +plt.title("IsolationNNE") +plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r) + +b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c="white", s=20, edgecolor="k") +b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c="green", s=20, edgecolor="k") +c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c="red", s=20, edgecolor="k") +plt.axis("tight") +plt.xlim((-5, 5)) +plt.ylim((-5, 5)) +plt.legend( + [b1, b2, c], + ["training observations", "new regular observations", "new abnormal observations"], + loc="upper left", +) +plt.show() diff --git a/examples/plot_template.py b/examples/plot_template.py deleted file mode 100644 index 2dd6aba..0000000 --- a/examples/plot_template.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -=========================== -Plotting Template Estimator -=========================== - -An example plot of :class:`IsoML.template.TemplateEstimator` -""" -import numpy as np -from matplotlib import pyplot as plt - -from IsoML import TemplateEstimator - -X = np.arange(100).reshape(100, 1) -y = np.zeros((100,)) -estimator = TemplateEstimator() -estimator.fit(X, y) -plt.plot(estimator.predict(X)) -plt.show() diff --git a/examples/plot_transformer.py b/examples/plot_transformer.py deleted file mode 100644 index 0eddb06..0000000 --- a/examples/plot_transformer.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -============================= -Plotting Template Transformer -============================= - -An example plot of :class:`IsoML.template.TemplateTransformer` -""" -import numpy as np -from matplotlib import pyplot as plt - -from IsoML import TemplateTransformer - -X = np.arange(50, dtype=np.float64).reshape(-1, 1) -X /= 50 -estimator = TemplateTransformer() -X_transformed = estimator.fit_transform(X) - -plt.plot(X.flatten(), label="Original Data") -plt.plot(X_transformed.flatten(), label="Transformed Data") -plt.title("Plots of original and transformed data") - -plt.legend(loc="best") -plt.grid(True) -plt.xlabel("Index") -plt.ylabel("Value of Data") - -plt.show() diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..9ded03d --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,190 @@ +site_name: PyIKT Docs +extra_css: + - stylesheets/extra.css +repo_url: https://github.com/IsolationKernel/pyikt +site_url: https://isolationkernel.github.io/pyikt +remote_branch: docs_dev +site_description: Python library for Isolation Kernel Toolkit. +site_author: Isolation Kernel Team +use_directory_urls: false +copyright: Copyright © 2024 - 2025 Xin Han + +nav: + - Home: + - Welcome to PyIKT: README.md + + - Quick start: + - How to install: quick-start/how-to-install.md + + - User Guides: + - Table of contents: user_guides/table-of-contents.md + - Anomaly detection: + - INNE: user_guides/inne.ipynb + + - Examples and tutorials: + - Examples: examples/examples_english.md + + - API Reference: + - Isolation Kernel: + - Isolation Kernel: api/kernel/isolation_kernel.md + - Isolation Distribution Kernel: api/kernel/isolation_dis_kernel.md + - Point Anomaly Detection: + - IForest: api/anomaly/iforest.md + - INNE: api/anomaly/inne.md + - IDKD: api/anomaly/idkd.md + - Point Clustering: + - IDKC: api/cluster/idkc.md + - PSKC: api/cluster/pskc.md + - IKAHC: api/cluster/ikahc.md + - Graph Mining: + - IKGOD: api/graph/ikgod.md + - IsoGraphKernel: api/graph/IsoGraphKernel.md + - Group Mining: + - IKGAD: api/group/ikgad.md + - Stream Mining: + - ICID: api/stream/icid.md + - StreaKHC: api/stream/streakhc.md + - Trajectory Mining: + - DataLoader: + - SheepDogs: api/trajectory/data_loader/sheep_dogs.md + - IKAT: api/trajectory/ikat.md + - TIDKC: api/trajectory/tidkc.md + - Time Series Mining: + - IKTOD: api/time_series/iktod.md + + - Releases: releases/releases.md + + - Contributing: + - How to contribute: contributing/contribution.md + + - Authors: authors/authors.md + +plugins: + - mkdocstrings: + handlers: + python: + import: + - https://docs.python.org/3/objects.inv + - https://mkdocstrings.github.io/autorefs/objects.inv + - https://www.mkdocs.org/objects.inv + - https://python-markdown.github.io/objects.inv + options: + docstring_style: numpy + docstring_section_style: table + show_root_heading: true + show_root_full_path: true + merge_init_into_class: true + show_symbol_type_heading: false + separate_signature: true + show_signature_annotations: false + summary: true + filters: ["!^_", "^__init__$", "!^_[^_]"] # exclude all members starting with __ + members_order: source + docstring_options: + ignore_init_summary: true + show_if_no_docstring: true + - mkdocs-jupyter: + ignore_h1_titles: True + include_source: True + execute: False + allow_errors: False + include_requirejs: True + - search: + - mike: + alias_type: redirect + redirect_template: null + deploy_prefix: "" + canonical_version: null + version_selector: true + css_dir: css + javascript_dir: js +theme: + name: material + custom_dir: docs/overrides + favicon: img/favicon.jpg + icon: + repo: fontawesome/brands/github + features: + - navigation.tabs + - navigation.tabs.sticky + - navigation.path + #- navigation.sections # To expand sections on the table of contents + #- navigation.expand # To expand sections on the table of contents + - navigation.top + - toc.integrate + - navigation.breadcrumbs + - content.code.annotate + - content.code.copy + - content.tooltips + font: + text: Open Sans + code: Ubuntu Mono + highlightjs: true + logo: img/ikt_logo_2.jpg + palette: + - scheme: default + primary: indigo + accent: indigo + toggle: + icon: material/weather-sunny + name: Switch to dark mode + - scheme: slate + primary: black + accent: black + toggle: + icon: material/weather-night + name: Switch to light mode + +markdown_extensions: + - abbr + - admonition + - attr_list + - codehilite + - footnotes + - pymdownx.details + - md_in_html + - toc: + permalink: true + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight: + use_pygments: true + linenums: false + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + - pymdownx.magiclink + +extra: + version: + provider: mike + analytics: + provider: google + property: G-GR8X9Z9LKL + consent: + title: Cookie consent + description: >- + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. + seo: + description: >- + **PyIKT** (Python for Isolation Kernel Similarity) is an intuitive Python library designed for a variety of machine learning tasks including kernel similarity calculation, anomaly detection, clustering, and change detection—all powered by the innovative **Isolation Kernel (IK)** . Isolation Kernel is a data-dependent kernel that measures similarity by isolating data points using an isolation mechanism. It uniquely adapts to the data distribution, with the property that points in sparse regions are more similar than those in dense regions. Notably, it requires no learning or closed-form expression, making it efficient and scalable. + keywords: time series, forecasting, machine learning, python, data science, scikit-learn, anomaly detection, clustering, change detection, kernel similarity, isolation kernel diff --git a/pixi.lock b/pixi.lock index 18af704..2d73ec1 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,4 +1,4 @@ -version: 5 +version: 6 environments: default: channels: @@ -9,133 +9,262 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-he0ac6c6_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.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.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.38.1-py310h58363a5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.55.2-py310ha5257ce_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py312h394d371_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py310h27f47ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - pypi: https://files.pythonhosted.org/packages/e3/59/35a2892bf09ded9c1bf3804461efe772836a5261ef5dfb4e264ce813ff99/pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h53e7c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.6-hf95d169_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py312he3a82b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm11-11.1.0-h8fb7429_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.6-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.38.1-py310h8fbb61a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.55.2-py310hab1bff6_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.22.0-py310hfbbbacf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hc426f3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.14-h00d2728_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-5_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py312h7167a34_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py312h8adb940_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py310h6ed8a50_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.2-py310h3900cf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310h41d873f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + - pypi: https://files.pythonhosted.org/packages/3c/b2/0d4a5729ce1ce11630c4fc5d5522a33b967b3ca146c210f58efde7c40e99/pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310hb4ad77e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm11-11.1.0-hfa12f05_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.38.1-py310hbf292a2_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.55.2-py310ha67b2a8_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.22.0-py310h567df17_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.14-h2469fbe_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py312hd4306f4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py312h9d7df2b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py310h48c93d9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.2-py310h0975f3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h2665a74_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + - pypi: https://files.pythonhosted.org/packages/4a/f6/f620ca62365d83e663a255a41b08d2fc2eaf304e0b8b21bb6d62a7390fe3/pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . win-64: - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-26_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_hc8275d1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py312h8753938_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.3-h2628c8c_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py312hcacafb1_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py312h8753938_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-devel-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.38.1-py310h2c03ce5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.55.2-py310h77579ad_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.22.0-py310hcae7c84_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.14-h4de0772_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py310hf2a6c47_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.2-py310h578b7cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.6.4-h208afaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-tools-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py310he5e10e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda + - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ed/30/b97456e7063edac0e5a405128065f0cd2033adfe3716fb2256c186bd41d0/pandas-2.0.3-cp310-cp310-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . dev: channels: @@ -146,622 +275,753 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py311h38be061_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py311h331c9d8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.3-h9ad1361_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.3-haf2f30d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310ha75aee5_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py310hff52083_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py310h89163eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py310hf71b8c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.5-default_h5d6823c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.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/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.5-hb77312f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.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/libxkbcommon-1.7.0-h662e7e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py311h38be061_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.40.1-py310h1b8f574_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.1-py310h6ee67d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.57.1-py310h0f6aa51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.21.6-py310h45f3432_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py310h71f11fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.2-py311hae69bc3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py311he08f58d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h517d4fd_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py310ha75aee5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py310hc1293b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.2-py310h9065425_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py310h27f47ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py311h459d7ec_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py310hff52083_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - pypi: https://files.pythonhosted.org/packages/e3/59/35a2892bf09ded9c1bf3804461efe772836a5261ef5dfb4e264ce813ff99/pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py311h6eed73b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hdf8f085_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.16.0-py311hc0b63fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py311h1d816ee_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.5.1-py311h42a8b16_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py311he705e18_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py311h5fe6e05_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-17.0.6-h88467a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-21.2.0-py310h837254d_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py310h2ec42d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h53e7c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.12-py310h8e2f543_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.12-py310h6954a95_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.6-hf95d169_1.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/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.5-h39e0ece_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py311he705e18_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py311h6eed73b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py311hff79762_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py311h1b85569_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm14-14.0.6-hc8e404f_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.5-he8ee3e7_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxslt-1.1.39-h03b04e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.6-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.40.1-py310hd8379ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-5.3.1-py310hca20839_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py310h8e2f543_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.57.1-py310he09a53b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.21.6-py310hb608527_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hc426f3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.6.3-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.9-h657bba9_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py311h2725bcf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.0-py310hae5a141_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.0-py310hae5a141_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.16-h5acdff8_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py310h8e2f543_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-26.2.1-py310he599bfe_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.2-py311h9220a05_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py311h3c3ac6d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py311hd5d9b8d_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/regex-2024.11.6-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.23.1-py310h40a894c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.2-py310h4a464a8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py310h6ed8a50_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.2-py310h3900cf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py311he705e18_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py311h5fe6e05_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py310hfa8da69_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/watchdog-6.0.0-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310h41d873f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + - pypi: https://files.pythonhosted.org/packages/3c/b2/0d4a5729ce1ce11630c4fc5d5522a33b967b3ca146c210f58efde7c40e99/pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py311h267d04e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311ha891d26_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py311h4a08483_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py311hcc98501_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.1-py311hd3f4193_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py311h05b510d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py311he4fd1f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.20-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-21.2.0-py310h493c2e1_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py310hbe9552e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310hb4ad77e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.12-py310hc74094e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.12-py310h853098b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.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/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.5-hde57baf_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py311h05b510d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py311ha1ab1f8_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py311h000fb6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py311h0b5d0a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm14-14.0.6-hd1a9a77_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxslt-1.1.39-h223e5b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.40.1-py310h95b248a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.3.1-py310h660342b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py310hc74094e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.57.1-py310hb9b3264_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.21.6-py310h2e04ed8_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.6.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.9-h932a869_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py311heffc1b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.0-py310h4e4eb3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.0-py310h4e4eb3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.16-h870587a_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py310hc74094e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py310h6d25ecc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.2-py311hae5a712_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py311hbfb48bc_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py311hceeca8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.23.1-py310h31b3829_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.2-py310h275c10e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py310h48c93d9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.2-py310h0975f3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py311h05b510d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311he4fd1f5_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hb547adb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.3-h27ca646_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py310h7306fd8_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h2665a74_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + - pypi: https://files.pythonhosted.org/packages/4a/f6/f620ca62365d83e663a255a41b08d2fc2eaf304e0b8b21bb6d62a7390fe3/pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py311h1ea47a8_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h12c1d0e_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py311h005e61a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.5.1-py311he736701_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.51.0-py311ha68e1ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.2-h0df6a38_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.2-h2f9d560_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.3-hba88be7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.3-h5006eae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py311h005e61a_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.5-default_hf64faad_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-21.2.0-py310ha8f682b_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py310h5588dad_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.6.12-py310h38315fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.10.16-py310hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.12-py310h9e98ed7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh4bbf305_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh5737063_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-26_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.2-h0df6a38_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h8125262_1001.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_hc8275d1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.5-he286e8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.40.1-py310hb84602e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lxml-5.3.1-py310hb043844_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py311h1ea47a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py311h9b31f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py310h38315fa_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py311h6819b35_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.57.1-py310h19bcfe9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.21.6-py310hcae7c84_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.6.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py311h125bc19_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py311h12c1d0e_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.9-h631f459_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-hcef0176_21.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.2-py311ha637bb9_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py311hdcb8d17_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py311hd4686c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py311h12c1d0e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.16-h37870fc_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-307-py310h9e98ed7_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py310h9e98ed7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py310h38315fa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-26.2.1-py310h656833d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/regex-2024.11.6-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.23.1-py310h7c79e54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.2-py310h7f1804c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py310hf2a6c47_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.2-py310h578b7cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-hc790b64_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh5737063_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py311ha68e1ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h005e61a_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4.2-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py310hc19bc0b_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py310h5588dad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py310he5e10e1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda + - pypi: https://files.pythonhosted.org/packages/ed/30/b97456e7063edac0e5a405128065f0cd2033adfe3716fb2256c186bd41d0/pandas-2.0.3-cp310-cp310-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . doc: channels: @@ -772,530 +1032,713 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py312h98912ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.4.0-h3d44ed6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310ha75aee5_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py310hff52083_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py310hf71b8c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.4-default_h5d6823c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.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/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.4-h2448989_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-he0ac6c6_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.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/libxkbcommon-1.7.0-h662e7e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312he5832f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py312h949fe66_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py312h30efb56_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.38.1-py310h58363a5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py310h6a33d3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.55.2-py310ha5257ce_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py310h71f11fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py312h394d371_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py312h30efb56_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py310ha75aee5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py310hc1293b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py310h27f47ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py312h98912ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py310hff52083_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - pypi: https://files.pythonhosted.org/packages/e3/59/35a2892bf09ded9c1bf3804461efe772836a5261ef5dfb4e264ce813ff99/pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312heafc425_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py312h9230928_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py312h41838bb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py312h49ebfd2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-21.2.0-py310h837254d_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py310h2ec42d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h53e7c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.12-py310h6954a95_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.6-hf95d169_1.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/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py312h41838bb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py312hb401068_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py312h1fe5000_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py312he3a82b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py312h0c923fa_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-4_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm11-11.1.0-h8fb7429_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-h3e169fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxslt-1.1.39-h03b04e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.6-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.38.1-py310h8fbb61a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-5.2.2-py310h27134ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py310h8e2f543_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.55.2-py310hab1bff6_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.22.0-py310hfbbbacf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hc426f3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.6.3-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.0-py310hae5a141_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.0-py310hae5a141_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.14-h00d2728_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py310h8e2f543_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-26.2.1-py310he599bfe_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py312h7167a34_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py312h8adb940_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/regex-2024.11.6-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.23.1-py310h40a894c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py310h6ed8a50_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.2-py310h3900cf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py312h41838bb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/watchdog-6.0.0-py310hbb8c376_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310h41d873f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + - pypi: https://files.pythonhosted.org/packages/3c/b2/0d4a5729ce1ce11630c4fc5d5522a33b967b3ca146c210f58efde7c40e99/pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h9f69965_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py312h0fef576_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py312he37b823_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py312h389731b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.20-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-21.2.0-py310h493c2e1_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py310hbe9552e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310hb4ad77e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.12-py310h853098b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.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/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py312he37b823_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py312h1f38498_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py312ha6faf65_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py312h8a801b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm11-11.1.0-hfa12f05_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-ha661575_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxslt-1.1.39-h223e5b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.38.1-py310hbf292a2_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.2.2-py310h9905115_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py310hc74094e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.55.2-py310ha67b2a8_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.22.0-py310h567df17_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.6.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.0-py310h4e4eb3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.0-py310h4e4eb3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.14-h2469fbe_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py310hc74094e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py310h6d25ecc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py312hd4306f4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py312h9d7df2b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.23.1-py310h31b3829_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py310h48c93d9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.2-py310h0975f3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py312he37b823_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hb547adb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.3-h27ca646_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py310h078409c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h2665a74_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + - pypi: https://files.pythonhosted.org/packages/4a/f6/f620ca62365d83e663a255a41b08d2fc2eaf304e0b8b21bb6d62a7390fe3/pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312h53d5487_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py312h0d7def4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.51.0-py312he70551f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py312h0d7def4_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-devel-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.4-default_hf64faad_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-21.2.0-py310ha8f682b_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py310h5588dad_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.12-py310h9e98ed7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh4bbf305_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.7.2-py310h5588dad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-26_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_6.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_hc8275d1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-devel-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.38.1-py310h2c03ce5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/lxml-5.2.2-py310hdccf185_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py312he70551f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py312h2e8e312_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py312h26ecaf7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py310h38315fa_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py312h8753938_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py312h6f6a607_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py312he09f080_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py312h53d5487_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.3-h2628c8c_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-hcef0176_21.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py312hcacafb1_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py312h8753938_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py312h53d5487_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.55.2-py310h77579ad_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.22.0-py310hcae7c84_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.6.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.14-h4de0772_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-307-py310h9e98ed7_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py310h9e98ed7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py310h38315fa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-26.2.1-py310h656833d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/regex-2024.11.6-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.23.1-py310h7c79e54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py310hf2a6c47_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.2-py310h578b7cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh5737063_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py312he70551f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4.2-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py310h5588dad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.6.4-h208afaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-tools-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py310he5e10e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda + - pypi: https://files.pythonhosted.org/packages/ed/30/b97456e7063edac0e5a405128065f0cd2033adfe3716fb2256c186bd41d0/pandas-2.0.3-cp310-cp310-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . lint: channels: @@ -1306,210 +1749,326 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py311h38be061_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py310hff52083_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-he0ac6c6_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.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.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.38.1-py310h58363a5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.55.2-py310ha5257ce_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.2-py311hae69bc3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py311hc009520_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.2-py310h9065425_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py310h27f47ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - pypi: https://files.pythonhosted.org/packages/e3/59/35a2892bf09ded9c1bf3804461efe772836a5261ef5dfb4e264ce813ff99/pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py311h6eed73b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.16.0-py311hc0b63fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py310h2ec42d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h53e7c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.6-hf95d169_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm11-11.1.0-h8fb7429_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.6-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.38.1-py310h8fbb61a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.55.2-py310hab1bff6_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.22.0-py310hfbbbacf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hc426f3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.9-h657bba9_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py311h2725bcf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.14-h00d2728_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py310h8e2f543_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.2-py311h9220a05_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py311he2b4599_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py311h86d0cd9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.2-py310h4a464a8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py310h6ed8a50_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.2-py310h3900cf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py311h5fe6e05_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py310hfa8da69_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.6.4-hd471939_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310h41d873f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + - pypi: https://files.pythonhosted.org/packages/3c/b2/0d4a5729ce1ce11630c4fc5d5522a33b967b3ca146c210f58efde7c40e99/pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py311h267d04e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py311h4a08483_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py310hbe9552e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310hb4ad77e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm11-11.1.0-hfa12f05_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.38.1-py310hbf292a2_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.55.2-py310ha67b2a8_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.22.0-py310h567df17_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.9-h932a869_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py311heffc1b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.14-h2469fbe_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py310hc74094e_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.2-py311hae5a712_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py311h696fe38_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py311h4f9446f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.2-py310h275c10e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py310h48c93d9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.2-py310h0975f3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311he4fd1f5_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py310h7306fd8_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.6.4-h39f12f2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h2665a74_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + - pypi: https://files.pythonhosted.org/packages/4a/f6/f620ca62365d83e663a255a41b08d2fc2eaf304e0b8b21bb6d62a7390fe3/pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . win-64: - - conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py311h1ea47a8_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py310h5588dad_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-26_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_hc8275d1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-devel-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.38.1-py310h2c03ce5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.55.2-py310h77579ad_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.22.0-py310hcae7c84_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.9-h631f459_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.2-py311ha637bb9_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py311h142b183_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py311h0b4df5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.14-h4de0772_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py310h38315fa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.2-py310h7f1804c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py310hf2a6c47_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.2-py310h578b7cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h005e61a_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py310hc19bc0b_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.6.4-h208afaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-tools-5.6.4-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py310he5e10e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda + - pypi: https://files.pythonhosted.org/packages/ed/30/b97456e7063edac0e5a405128065f0cd2033adfe3716fb2256c186bd41d0/pandas-2.0.3-cp310-cp310-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . test: channels: @@ -1520,193 +2079,308 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py312h9a8786e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py310h89163eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-he0ac6c6_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.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.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.38.1-py310h58363a5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.55.2-py310ha5257ce_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py312h394d371_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py310h27f47ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.4-hbcc6ac9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - pypi: https://files.pythonhosted.org/packages/e3/59/35a2892bf09ded9c1bf3804461efe772836a5261ef5dfb4e264ce813ff99/pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-64: - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.5.0-py312h5fa3f64_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h53e7c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.12-py310h8e2f543_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.6-hf95d169_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py312he3a82b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm11-11.1.0-h8fb7429_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.6-ha54dae1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.38.1-py310h8fbb61a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.55.2-py310hab1bff6_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.22.0-py310hfbbbacf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hc426f3f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.14-h00d2728_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-5_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py312h7167a34_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py312h8adb940_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py310h6ed8a50_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.2-py310h3900cf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.6.4-h357f2ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.6.4-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310h41d873f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + - pypi: https://files.pythonhosted.org/packages/3c/b2/0d4a5729ce1ce11630c4fc5d5522a33b967b3ca146c210f58efde7c40e99/pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.0-py312h4a164c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310hb4ad77e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.12-py310hc74094e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm11-11.1.0-hfa12f05_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.38.1-py310hbf292a2_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.55.2-py310ha67b2a8_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.22.0-py310h567df17_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.14-h2469fbe_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py312hd4306f4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py312h9d7df2b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py310h48c93d9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.2-py310h0975f3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.6.4-h9a6d368_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.6.4-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h2665a74_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + - pypi: https://files.pythonhosted.org/packages/4a/f6/f620ca62365d83e663a255a41b08d2fc2eaf304e0b8b21bb6d62a7390fe3/pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . win-64: - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.5.0-py312h4389bb4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py310ha8f682b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.6.12-py310h38315fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-26_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_hc8275d1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py312h8753938_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.3-h2628c8c_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py312hcacafb1_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py312h8753938_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-devel-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.38.1-py310h2c03ce5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.55.2-py310h77579ad_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.22.0-py310hcae7c84_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.14-h4de0772_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py310hf2a6c47_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.2-py310h578b7cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.6.4-h208afaa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-tools-5.6.4-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py310he5e10e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda + - pypi: https://files.pythonhosted.org/packages/ed/30/b97456e7063edac0e5a405128065f0cd2033adfe3716fb2256c186bd41d0/pandas-2.0.3-cp310-cp310-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl - pypi: . packages: -- kind: conda - name: _libgcc_mutex - version: '0.1' - build: conda_forge - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 md5: d7c89558ba9fa0495403155b64376d81 license: None + purls: [] size: 2562 timestamp: 1578324546067 -- kind: conda - name: _openmp_mutex - version: '4.5' - build: 2_gnu +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 build_number: 16 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 md5: 73aaf86a425cc6e73fcf236a5a46396d depends: @@ -1716,3393 +2390,1617 @@ packages: - openmp_impl 9999 license: BSD-3-Clause license_family: BSD + purls: [] size: 23621 timestamp: 1650670423406 -- kind: conda - name: accessible-pygments - version: 0.0.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda - sha256: ce532e2da08fb2b77df281e3d42e2b2131641bdd6a6e8127f3718ae6860bd70d - md5: 46a2e6e3dfa718ce3492018d5a110dd6 +- conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf + md5: 54898d0f524c9dee622d44bbb081a8ab depends: - - pygments - - python >=3.6 - license: BSD-3-Clause + - python >=3.9 + license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/accessible-pygments - size: 15626 - timestamp: 1679583960534 -- kind: conda - name: alabaster - version: 0.7.16 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda - sha256: fd39ad2fabec1569bbb0dfdae34ab6ce7de6ec09dcec8638f83dad0373594069 - md5: def531a3ac77b7fb8c21d17bb5d0badb + - pkg:pypi/appnope?source=hash-mapping + size: 10076 + timestamp: 1733332433806 +- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-23.1.0-pyhd8ed1ab_1.conda + sha256: 7af62339394986bc470a7a231c7f37ad0173ffb41f6bc0e8e31b0be9e3b9d20f + md5: a7ee488b71c30ada51c48468337b85ba depends: + - argon2-cffi-bindings - python >=3.9 - license: BSD-3-Clause - license_family: BSD + - typing-extensions + constrains: + - argon2_cffi ==999 + license: MIT + license_family: MIT purls: - - pkg:pypi/alabaster - size: 18365 - timestamp: 1704848898483 -- kind: conda - name: alsa-lib - version: 1.2.11 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda - sha256: 0e2b75b9834a6e520b13db516f7cf5c9cea8f0bbc9157c978444173dacb98fec - md5: 0bb492cca54017ea314b809b1ee3a176 + - pkg:pypi/argon2-cffi?source=hash-mapping + size: 18594 + timestamp: 1733311166338 +- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310ha75aee5_5.conda + sha256: 1050f55294476b4d9b36ca3cf22b47f2f23d6e143ad6a177025bc5e5984d5409 + md5: a2da54f3a705d518c95a5b6de8ad8af6 depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - license_family: GPL - size: 554699 - timestamp: 1709396557528 -- kind: conda - name: attr - version: 2.5.1 - build: h166bdaf_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 - sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 - md5: d9c69a24ad678ffce24c6543a0176b00 + - __glibc >=2.17,<3.0.a0 + - cffi >=1.0.1 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 34425 + timestamp: 1725356664523 +- conda: https://conda.anaconda.org/conda-forge/osx-64/argon2-cffi-bindings-21.2.0-py310h837254d_5.conda + sha256: a5418c8096b8d4070c0f88ea0dc823d2f630dc2dd929b2a1c7d1bcd3e9629dee + md5: ba0ed7f857ceb937002efb98b6d66328 depends: - - libgcc-ng >=12 - license: GPL-2.0-or-later - license_family: GPL - size: 71042 - timestamp: 1660065501192 -- kind: conda - name: babel - version: 2.14.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - sha256: 8584e3da58e92b72641c89ff9b98c51f0d5dbe76e527867804cbdf03ac91d8e6 - md5: 9669586875baeced8fc30c0826c3270e + - __osx >=10.13 + - cffi >=1.0.1 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 31413 + timestamp: 1725356783377 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-21.2.0-py310h493c2e1_5.conda + sha256: 888c99261419d786a511bbc711b51bdae06ee1bfa35e8c653a0dda1aa8a348f8 + md5: a6a3f529a421164ba519f564b0559a9e depends: - - python >=3.7 - - pytz - - setuptools + - __osx >=11.0 + - cffi >=1.0.1 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 32379 + timestamp: 1725356978614 +- conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-21.2.0-py310ha8f682b_5.conda + sha256: f0b23aa9a3c27500d58a383d635c01b86ab652c34646c3ad9e89fd82607178a0 + md5: d18002177f557891c1fc5482da6decd7 + depends: + - cffi >=1.0.1 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: MIT + license_family: MIT + purls: + - pkg:pypi/argon2-cffi-bindings?source=hash-mapping + size: 33837 + timestamp: 1725357171155 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + sha256: 93b14414b3b3ed91e286e1cbe4e7a60c4e1b1c730b0814d1e452a8ac4b9af593 + md5: 8f587de4bcf981e26228f268df374a9b + depends: + - python >=3.9 + constrains: + - astroid >=2,<4 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/asttokens?source=hash-mapping + size: 28206 + timestamp: 1733250564754 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + depends: + - python >=3.9 + - pytz >=2015.7 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/babel - size: 7609750 - timestamp: 1702422720584 -- kind: conda - name: beautifulsoup4 - version: 4.12.3 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda - sha256: 7b05b2d0669029326c623b9df7a29fa49d1982a9e7e31b2fea34b4c9a4a72317 - md5: 332493000404d8411859539a5a630865 + - pkg:pypi/babel?source=compressed-mapping + size: 6938256 + timestamp: 1738490268466 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.3-pyha770c72_0.conda + sha256: 4ce42860292a57867cfc81a5d261fb9886fc709a34eca52164cc8bbf6d03de9f + md5: 373374a3ed20141090504031dc7b693e depends: - - python >=3.6 + - python >=3.9 - soupsieve >=1.2 + - typing-extensions license: MIT license_family: MIT purls: - - pkg:pypi/beautifulsoup4 - size: 118200 - timestamp: 1705564819537 -- kind: conda - name: black - version: 23.3.0 - build: py311h1ea47a8_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py311h1ea47a8_1.conda - sha256: 12f319748c11697ee3ea154413c7c4895db2dfcc18b44b0bdb2019da1144abdb - md5: cff72d53d4ea05005adc2f478447a0a1 + - pkg:pypi/beautifulsoup4?source=compressed-mapping + size: 145482 + timestamp: 1738740460562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py310hff52083_1.conda + sha256: 9ede541d2f84668f45dd02185d53547e84a5834f8a167d89b74b79b5d7f7a992 + md5: 22bc96cd2aed2482d207ab376fc00f18 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli >=1.1.0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - - pkg:pypi/black - size: 369420 - timestamp: 1682492626505 -- kind: conda - name: black - version: 23.3.0 - build: py311h267d04e_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py311h267d04e_1.conda - sha256: 6968e8bcc232a32cd34934d14ada2a9a2549db7f8276ba9709eb16595e5545fd - md5: 6df8788f081abb97d20ffa83de27d029 + - pkg:pypi/black?source=hash-mapping + size: 271936 + timestamp: 1682492054286 +- conda: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py310h2ec42d9_1.conda + sha256: ccd6cb8877ef0a4246c3ad6893e927bc6ddb265b773f908c2188e5e52c2ae37a + md5: dda28fe2408191e4ab3d48df4a331899 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli >=1.1.0 + arch: x86_64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/black - size: 355456 - timestamp: 1682492376012 -- kind: conda - name: black - version: 23.3.0 - build: py311h38be061_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/black-23.3.0-py311h38be061_1.conda - sha256: c729ebbdca2ca7286305ad51cc3beea6b85e68cd02794fb9895f3d5e16540b86 - md5: b0d621848bfba5aacbdfc43dfdeabfec + - pkg:pypi/black?source=hash-mapping + size: 271994 + timestamp: 1682492532222 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-23.3.0-py310hbe9552e_1.conda + sha256: 26ee80c3d884eef62b6850085fdab4ecb83ba91d2a23179b9c2292ec55ba9f52 + md5: a81d69fef268a3a8fba818da27bab102 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - tomli >=1.1.0 + arch: arm64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/black - size: 354716 - timestamp: 1682492111062 -- kind: conda - name: black - version: 23.3.0 - build: py311h6eed73b_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/black-23.3.0-py311h6eed73b_1.conda - sha256: 78b007b394be2e0ddd42224970be1b212639a8941fee0e7d724986155e517e24 - md5: 2783c68e84c0573fece0880488c7c001 + - pkg:pypi/black?source=hash-mapping + size: 272162 + timestamp: 1682492378469 +- conda: https://conda.anaconda.org/conda-forge/win-64/black-23.3.0-py310h5588dad_1.conda + sha256: 1ce1ddbddf3397fafa1e8cfa5df8add4c2184c09ebc8db29534d933085e8a869 + md5: 1d8f9fb35cc2668ee709dbbdb18864c0 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: MIT - license_family: MIT - purls: - - pkg:pypi/black - size: 355441 - timestamp: 1682492328351 -- kind: conda - name: brotli - version: 1.1.0 - build: h0dc2134_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda - sha256: 4bf66d450be5d3f9ebe029b50f818d088b1ef9666b1f19e90c85479c77bbdcde - md5: 9272dd3b19c4e8212f8542cefd5c3d67 - depends: - - brotli-bin 1.1.0 h0dc2134_1 - - libbrotlidec 1.1.0 h0dc2134_1 - - libbrotlienc 1.1.0 h0dc2134_1 - license: MIT - license_family: MIT - size: 19530 - timestamp: 1695990310168 -- kind: conda - name: brotli - version: 1.1.0 - build: hb547adb_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hb547adb_1.conda - sha256: 62d1587deab752fcee07adc371eb20fcadc09f72c0c85399c22b637ca858020f - md5: a33aa58d448cbc054f887e39dd1dfaea - depends: - - brotli-bin 1.1.0 hb547adb_1 - - libbrotlidec 1.1.0 hb547adb_1 - - libbrotlienc 1.1.0 hb547adb_1 - license: MIT - license_family: MIT - size: 19506 - timestamp: 1695990588610 -- kind: conda - name: brotli - version: 1.1.0 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda - sha256: b927c95121c5f3d82fe084730281739fb04621afebf2d9f05711a0f42d27e326 - md5: f47f6db2528e38321fb00ae31674c133 - depends: - - brotli-bin 1.1.0 hcfcfb64_1 - - libbrotlidec 1.1.0 hcfcfb64_1 - - libbrotlienc 1.1.0 hcfcfb64_1 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - size: 19772 - timestamp: 1695990547936 -- kind: conda - name: brotli - version: 1.1.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda - sha256: f2d918d351edd06c55a6c2d84b488fe392f85ea018ff227daac07db22b408f6b - md5: f27a24d46e3ea7b70a1f98e50c62508f - depends: - - brotli-bin 1.1.0 hd590300_1 - - libbrotlidec 1.1.0 hd590300_1 - - libbrotlienc 1.1.0 hd590300_1 - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 19383 - timestamp: 1695990069230 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: h0dc2134_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda - sha256: 7ca3cfb4c5df314ed481301335387ab2b2ee651e2c74fbb15bacc795c664a5f1 - md5: ece565c215adcc47fc1db4e651ee094b - depends: - - libbrotlidec 1.1.0 h0dc2134_1 - - libbrotlienc 1.1.0 h0dc2134_1 - license: MIT - license_family: MIT - size: 16660 - timestamp: 1695990286737 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: hb547adb_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hb547adb_1.conda - sha256: 8fbfc2834606292016f2faffac67deea4c5cdbc21a61169f0b355e1600105a24 - md5: 990d04f8c017b1b77103f9a7730a5f12 - depends: - - libbrotlidec 1.1.0 hb547adb_1 - - libbrotlienc 1.1.0 hb547adb_1 - license: MIT - license_family: MIT - size: 17001 - timestamp: 1695990551239 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda - sha256: 4fbcb8f94acc97b2b04adbc64e304acd7c06fa0cf01953527bddae46091cc942 - md5: 0105229d7c5fabaa840043a86c10ec64 - depends: - - libbrotlidec 1.1.0 hcfcfb64_1 - - libbrotlienc 1.1.0 hcfcfb64_1 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - size: 20885 - timestamp: 1695990517506 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda - sha256: a641abfbaec54f454c8434061fffa7fdaa9c695e8a5a400ed96b4f07c0c00677 - md5: 39f910d205726805a958da408ca194ba - depends: - - libbrotlidec 1.1.0 hd590300_1 - - libbrotlienc 1.1.0 hd590300_1 - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 18980 - timestamp: 1695990054140 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py311h12c1d0e_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h12c1d0e_1.conda - sha256: 5390e1e5e8e159d4893ecbfd2c08ca75ef51bdce1a4a44ff4ee9e2d596004aac - md5: 42fbf4e947c17ea605e6a4d7f526669a - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - libbrotlicommon 1.1.0 hcfcfb64_1 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli >=1.1.0 + arch: x86_64 + platform: win license: MIT license_family: MIT purls: - - pkg:pypi/brotli - size: 322086 - timestamp: 1695990976742 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py311ha891d26_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311ha891d26_1.conda - sha256: 2d78c79ccf2c17236c52ef217a4c34b762eb7908a6903d94439f787aac1c8f4b - md5: 5e802b015e33447d1283d599d21f052b + - pkg:pypi/black?source=hash-mapping + size: 287586 + timestamp: 1682492402457 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda + sha256: a05971bb80cca50ce9977aad3f7fc053e54ea7d5321523efc7b9a6e12901d3cd + md5: f0b4c8e370446ef89797608d60a564b3 depends: - - libcxx >=15.0.7 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 + - python >=3.9 + - webencodings + - python constrains: - - libbrotlicommon 1.1.0 hb547adb_1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/brotli - size: 343332 - timestamp: 1695991223439 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py311hb755f60_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda - sha256: 559093679e9fdb6061b7b80ca0f9a31fe6ffc213f1dae65bc5c82e2cd1a94107 - md5: cce9e7c3f1c307f2a5fb08a2922d6164 + - tinycss >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/bleach?source=hash-mapping + size: 141405 + timestamp: 1737382993425 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.2.0-h82add2a_4.conda + sha256: 0aba699344275b3972bd751f9403316edea2ceb942db12f9f493b63c74774a46 + md5: a30e9406c873940383555af4c873220d + depends: + - bleach ==6.2.0 pyh29332c3_4 + - tinycss2 + license: Apache-2.0 AND MIT + purls: [] + size: 4213 + timestamp: 1737382993425 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda + sha256: 14f1e89d3888d560a553f40ac5ba83e4435a107552fa5b2b2029a7472554c1ef + md5: bf502c169c71e3c6ac0d6175addfacc2 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - - libbrotlicommon 1.1.0 hd590300_1 + - libbrotlicommon 1.1.0 hb9d3cd8_2 license: MIT license_family: MIT purls: - - pkg:pypi/brotli - size: 351340 - timestamp: 1695990160360 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py311hdf8f085_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py311hdf8f085_1.conda - sha256: 0f5e0a7de58006f349220365e32db521a1fe494c37ee455e5ecf05b8fe567dcc - md5: 546fdccabb90492fbaf2da4ffb78f352 + - pkg:pypi/brotli?source=hash-mapping + size: 349668 + timestamp: 1725267875087 +- conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py310h53e7c6a_2.conda + sha256: acb9164da7426b7ce5b619fdec0b58703ef442436f11f3f8e3ee4ac3169d525b + md5: c64cd414df458e3c8342f2c602fc34e6 depends: - - libcxx >=15.0.7 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - __osx >=10.13 + - libcxx >=17 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - - libbrotlicommon 1.1.0 h0dc2134_1 + - libbrotlicommon 1.1.0 h00291cd_2 license: MIT license_family: MIT purls: - - pkg:pypi/brotli - size: 366864 - timestamp: 1695990449997 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py312h30efb56_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda - sha256: b68706698b6ac0d31196a8bcb061f0d1f35264bcd967ea45e03e108149a74c6f - md5: 45801a89533d3336a365284d93298e36 + - pkg:pypi/brotli?source=hash-mapping + size: 362793 + timestamp: 1725268121746 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py310hb4ad77e_2.conda + sha256: a824cc3da3975a2812fac81a53902c07c5cf47d9dd344b783ff4401894de851f + md5: 3117b40143698e1afd17bca69f04e2d9 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - __osx >=11.0 + - libcxx >=17 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 constrains: - - libbrotlicommon 1.1.0 hd590300_1 + - libbrotlicommon 1.1.0 hd74edd7_2 license: MIT license_family: MIT purls: - - pkg:pypi/brotli - size: 350604 - timestamp: 1695990206327 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py312h53d5487_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312h53d5487_1.conda - sha256: 769e276ecdebf86f097786cbde1ebd11e018cd6cd838800995954fe6360e0797 - md5: d01a6667b99f0e8ad4097af66c938e62 + - pkg:pypi/brotli?source=hash-mapping + size: 339329 + timestamp: 1725268335778 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda + sha256: 1b7893a07f2323410b09b63b4627103efa86163be835ac94966333b37741cdc7 + md5: 3a10a1d0cf3ece273195f26191fd6cc6 depends: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - libbrotlicommon 1.1.0 hcfcfb64_1 + - libbrotlicommon 1.1.0 h2466b09_2 license: MIT license_family: MIT purls: - - pkg:pypi/brotli - size: 322514 - timestamp: 1695991054894 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py312h9f69965_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312h9f69965_1.conda - sha256: 3418b1738243abba99e931c017b952771eeaa1f353c07f7d45b55e83bb74fcb3 - md5: 1bc01b9ffdf42beb1a9fe4e9222e0567 + - pkg:pypi/brotli?source=hash-mapping + size: 321576 + timestamp: 1725268612274 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 depends: - - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 hb547adb_1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/brotli - size: 343435 - timestamp: 1695990731924 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py312heafc425_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312heafc425_1.conda - sha256: fc55988f9bc05a938ea4b8c20d6545bed6e9c6c10aa5147695f981136ca894c1 - md5: a288b88f06b8bfe0dedaf5c4b6ac6b7a + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 depends: - - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 h0dc2134_1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/brotli - size: 366883 - timestamp: 1695990710194 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h10d778d_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - sha256: 61fb2b488928a54d9472113e1280b468a309561caa54f33825a3593da390b242 - md5: 6097a6ca9ada32699b5fc4312dd6ef18 + - __osx >=10.13 license: bzip2-1.0.6 license_family: BSD - size: 127885 - timestamp: 1699280178474 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h93a5062_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda - sha256: bfa84296a638bea78a8bb29abc493ee95f2a0218775642474a840411b950fe5f - md5: 1bbc659ca658bfd49a481b5ef7a0f40f + purls: [] + size: 134188 + timestamp: 1720974491916 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 license: bzip2-1.0.6 license_family: BSD - size: 122325 - timestamp: 1699280294368 -- kind: conda - name: bzip2 - version: 1.0.8 - build: hcfcfb64_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 - md5: 26eb8ca6ea332b675e11704cce84a3be + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: bzip2-1.0.6 license_family: BSD - size: 124580 - timestamp: 1699280668742 -- kind: conda - name: bzip2 - version: 1.0.8 - build: hd590300_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 - md5: 69b8b6202a07720f448be700e300ccf4 - depends: - - libgcc-ng >=12 - license: bzip2-1.0.6 - license_family: BSD - size: 254228 - timestamp: 1699279927352 -- kind: conda - name: ca-certificates - version: 2024.2.2 - build: h56e8100_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 - md5: 63da060240ab8087b60d1357051ea7d6 + purls: [] + size: 54927 + timestamp: 1720974860185 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + sha256: 1afd7274cbc9a334d6d0bc62fa760acc7afdaceb0b91a8df370ec01fd75dc7dd + md5: 720523eb0d6a9b0f6120c16b2aa4e7de license: ISC - size: 155886 - timestamp: 1706843918052 -- kind: conda - name: ca-certificates - version: 2024.2.2 - build: h8857fd0_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda - sha256: 54a794aedbb4796afeabdf54287b06b1d27f7b13b3814520925f4c2c80f58ca9 - md5: f2eacee8c33c43692f1ccfd33d0f50b1 + purls: [] + size: 157088 + timestamp: 1734208393264 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + sha256: ddaafdcd1b8ace6ffeea22b6824ca9db8a64cf0a2652a11d7554ece54935fa06 + md5: b7b887091c99ed2e74845e75e9128410 license: ISC - size: 155665 - timestamp: 1706843838227 -- kind: conda - name: ca-certificates - version: 2024.2.2 - build: hbcca054_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - sha256: 91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb - md5: 2f4327a1cbe7f022401b236e915a5fef + purls: [] + size: 156925 + timestamp: 1734208413176 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + sha256: 256be633fd0882ccc1a7a32bc278547e1703f85082c0789a87a603ee3ab8fb82 + md5: 7cb381a6783d91902638e4ed1ebd478e license: ISC - size: 155432 - timestamp: 1706843687645 -- kind: conda - name: ca-certificates - version: 2024.2.2 - build: hf0a4a13_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda - sha256: 49bc3439816ac72d0c0e0f144b8cc870fdcc4adec2e861407ec818d8116b2204 - md5: fb416a1795f18dcc5a038bc2dc54edf9 + purls: [] + size: 157091 + timestamp: 1734208344343 +- conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + sha256: 424d82db36cd26234bc4772426170efd60e888c2aed0099a257a95e131683a5e + md5: cb2eaeb88549ddb27af533eccf9a45c1 license: ISC - size: 155725 - timestamp: 1706844034242 -- kind: conda - name: cairo - version: 1.18.0 - build: h3faef2a_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda - sha256: 142e2639a5bc0e99c44d76f4cc8dce9c6a2d87330c4beeabb128832cd871a86e - md5: f907bb958910dc404647326ca80c263e - depends: - - fontconfig >=2.14.2,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 - - icu >=73.2,<74.0a0 - - libgcc-ng >=12 - - libglib >=2.78.0,<3.0a0 - - libpng >=1.6.39,<1.7.0a0 - - libstdcxx-ng >=12 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - pixman >=0.42.2,<1.0a0 - - xorg-libice >=1.1.1,<2.0a0 - - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.6,<2.0a0 - - xorg-libxext >=1.3.4,<2.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - - zlib - license: LGPL-2.1-only or MPL-1.1 - size: 982351 - timestamp: 1697028423052 -- kind: conda - name: certifi - version: 2024.2.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 - md5: 0876280e409658fc6f9e75d035960333 + purls: [] + size: 157422 + timestamp: 1734208404685 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda + sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 + md5: c207fa5ac7ea99b149344385a9c0880d depends: - - python >=3.7 + - python >=3.9 license: ISC purls: - - pkg:pypi/certifi - size: 160559 - timestamp: 1707022289175 -- kind: conda - name: cffi - version: 1.16.0 - build: py311h4a08483_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.16.0-py311h4a08483_0.conda - sha256: 9430416328fe2a28e206e703de771817064c8613a79a6a21fe7107f6a783104c - md5: cbdde0484a47b40e6ce2a4e5aaeb48d7 + - pkg:pypi/certifi?source=compressed-mapping + size: 162721 + timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda + sha256: 1b389293670268ab80c3b8735bc61bc71366862953e000efbb82204d00e41b6c + md5: 1fc24a3196ad5ede2a68148be61894f4 depends: + - __glibc >=2.17,<3.0.a0 - libffi >=3.4,<4.0a0 + - libgcc >=13 - pycparser - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 license: MIT license_family: MIT purls: - - pkg:pypi/cffi - size: 292511 - timestamp: 1696002194472 -- kind: conda - name: cffi - version: 1.16.0 - build: py311ha68e1ae_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py311ha68e1ae_0.conda - sha256: eb7463fe3785dd9ac0b3b1e5fea3b721d20eb082e194cab0af8d9ff28c28934f - md5: d109d6e767c4890ea32880b8bfa4a3b6 + - pkg:pypi/cffi?source=hash-mapping + size: 243532 + timestamp: 1725560630552 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py310hfce808e_0.conda + sha256: a9a98a09031c4b5304ca04d29f9b35329e40a915e8e9c6431daee97c1b606d36 + md5: eefa80a0b01ffccf57c7c865bc6acfc4 depends: + - __osx >=10.13 + - libffi >=3.4,<4.0a0 - pycparser - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 license: MIT license_family: MIT purls: - - pkg:pypi/cffi - size: 297043 - timestamp: 1696002186279 -- kind: conda - name: cffi - version: 1.16.0 - build: py311hb3a22ac_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda - sha256: b71c94528ca0c35133da4b7ef69b51a0b55eeee570376057f3d2ad60c3ab1444 - md5: b3469563ac5e808b0cd92810d0697043 + - pkg:pypi/cffi?source=hash-mapping + size: 229844 + timestamp: 1725560765436 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py310h497396d_0.conda + sha256: 2cd81f5f8bb45f7625c232905e5f50f4f50a0cef651ec7143c6cf7d8d87bebcb + md5: 61ed55c277b0bdb5e6e67771f9e5b63e depends: + - __osx >=11.0 - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - pycparser - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 license: MIT license_family: MIT purls: - - pkg:pypi/cffi - size: 300207 - timestamp: 1696001873452 -- kind: conda - name: cffi - version: 1.16.0 - build: py311hc0b63fd_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.16.0-py311hc0b63fd_0.conda - sha256: 1f13a5fa7f310fdbd27f5eddceb9e62cfb10012c58a58c923dd6f51fa979748a - md5: 15d07b82223cac96af629e5e747ba27a + - pkg:pypi/cffi?source=hash-mapping + size: 229224 + timestamp: 1725560797724 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py310ha8f682b_0.conda + sha256: 32638e79658f76e3700f783c519025290110f207833ae1d166d262572cbec8a8 + md5: 9c7ec967f4ae263aec56cff05bdbfc07 depends: - - libffi >=3.4,<4.0a0 - pycparser - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: - - pkg:pypi/cffi - size: 289932 - timestamp: 1696002096156 -- kind: conda - name: cfgv - version: 3.3.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c - md5: ebb5f5f7dc4f1a3780ef7ea7738db08c + - pkg:pypi/cffi?source=hash-mapping + size: 238887 + timestamp: 1725561032032 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + sha256: d5696636733b3c301054b948cdd793f118efacce361d9bd4afb57d5980a9064f + md5: 57df494053e17dce2ac3a0b33e1b2a2e depends: - - python >=3.6.1 + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/cfgv - size: 10788 - timestamp: 1629909423398 -- kind: conda - name: charset-normalizer - version: 3.3.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 - md5: 7f4a9e3fcff3f6356ae99244a014da6a + - pkg:pypi/cfgv?source=hash-mapping + size: 12973 + timestamp: 1734267180483 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 depends: - - python >=3.7 + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/charset-normalizer - size: 46597 - timestamp: 1698833765762 -- kind: conda - name: click - version: 8.1.7 - build: unix_pyh707e725_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec - md5: f3ad426304898027fc619827ff428eca + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 depends: - __unix - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/click - size: 84437 - timestamp: 1692311973840 -- kind: conda - name: click - version: 8.1.7 - build: win_pyh7428d3b_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 - md5: 3549ecbceb6cd77b91a105511b7d0786 + - pkg:pypi/click?source=hash-mapping + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh7428d3b_0.conda + sha256: c889ed359ae47eead4ffe8927b7206b22c55e67d6e74a9044c23736919d61e8d + md5: 90e5571556f7a45db92ee51cb8f97af6 depends: - __win - colorama - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/click - size: 85051 - timestamp: 1692312207348 -- kind: conda + - pkg:pypi/click?source=hash-mapping + size: 85169 + timestamp: 1734858972635 +- pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl name: colorama version: 0.4.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 depends: - - python >=3.7 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/colorama - size: 25170 - timestamp: 1666700778190 -- kind: conda - name: contourpy - version: 1.2.1 - build: py311h005e61a_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py311h005e61a_0.conda - sha256: f9c392ae4c746ac32c55b20d8c487cbc06a91d5dd650261089d90fb55cfcb8c2 - md5: 050075a7a22e39222595b9191bc082e3 - depends: - - numpy >=1.20 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + sha256: 7e87ef7c91574d9fac19faedaaee328a70f718c9b4ddadfdc0ba9ac021bd64af + md5: 74673132601ec2b7fc592755605f4c1b + depends: + - python >=3.9 + - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/contourpy - size: 206670 - timestamp: 1712430308615 -- kind: conda - name: contourpy - version: 1.2.1 - build: py311h1d816ee_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py311h1d816ee_0.conda - sha256: b33d5801564943bbbbe939a9ec4d460b2e0ced624089bdfe0bfa2a5e5d8fa1f3 - md5: 4f7502f4d2cddbea5feba4e82d99c6c4 + - pkg:pypi/comm?source=hash-mapping + size: 12103 + timestamp: 1733503053903 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py310h89163eb_0.conda + sha256: 78cb9ec8b72b52a2846130663a8a54f28a32d3b3560d85eb3bae53e7917c1b94 + md5: 6fdad60a1f9adce8c1bf2eca277b3cc8 depends: - - libcxx >=16 - - numpy >=1.20 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/contourpy - size: 249875 - timestamp: 1712430222440 -- kind: conda - name: contourpy - version: 1.2.1 - build: py311h9547e67_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda - sha256: 82cec326aa81b9b6b40d9f4dab5045f0553092405efd0de9d2daf71179f20607 - md5: 74ad0ae64f1ef565e27eda87fa749e84 + - pkg:pypi/coverage?source=hash-mapping + size: 295677 + timestamp: 1739302127062 +- conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.12-py310h8e2f543_0.conda + sha256: 989d0790ee10a5c063d4be7d28ae7cdcd4218a3abac08c5ac12ad18900f047a2 + md5: 0cf3ffbdea650160edccb8217db6da1d depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.20 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli + arch: x86_64 + platform: osx + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/contourpy - size: 258932 - timestamp: 1712430087609 -- kind: conda - name: contourpy - version: 1.2.1 - build: py311hcc98501_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py311hcc98501_0.conda - sha256: 9045fa8a05a102d4cd484fec327511386db759b4241bbacd2c5ac34a238f9379 - md5: 3f5b59b9e9b329527f1af3ee98b3d750 + - pkg:pypi/coverage?source=hash-mapping + size: 295314 + timestamp: 1739302101862 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.12-py310hc74094e_0.conda + sha256: 8635a882f2e94faed4987d6d6ebc64a08e0b7cbbb85cff4cd2b31b637e74ed01 + md5: 6693032c14e674a827ffc16ebf41ae50 depends: - - libcxx >=16 - - numpy >=1.20 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - tomli + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/contourpy - size: 242204 - timestamp: 1712430316704 -- kind: conda - name: contourpy - version: 1.2.1 - build: py312h0d7def4_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py312h0d7def4_0.conda - sha256: 3af3de9a099d9ab88d24d0956c3acb838a774b64e52afa25abeed7b31c1174ef - md5: bc0160f16ae02e18de578eaddadd4f61 - depends: - - numpy >=1.20 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - pkg:pypi/coverage?source=hash-mapping + size: 294570 + timestamp: 1739302236599 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.6.12-py310h38315fa_0.conda + sha256: 880b8bc206618a9e685cbd22be92f0bc9522f35df94d69cd744449a4e45eb53a + md5: ce4c964daa1f98c5158992352531945e + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - tomli - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy - size: 206433 - timestamp: 1712430299728 -- kind: conda - name: contourpy - version: 1.2.1 - build: py312h0fef576_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py312h0fef576_0.conda - sha256: 89bb5c2f1f5daed13240d5fccfc51cd63b92293cee690c8b0a8f633971e588bb - md5: f825cced50aa6ae9f6ae158a49ecb68c - depends: - - libcxx >=16 - - numpy >=1.20 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy - size: 239915 - timestamp: 1712430307181 -- kind: conda - name: contourpy - version: 1.2.1 - build: py312h8572e83_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda - sha256: b0731336b9788c247b11a592352f700a647119340b549aba9e933835c7c77df0 - md5: 12c6a831ef734f0b2dd4caff514cbb7f - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.20 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy - size: 256764 - timestamp: 1712430146809 -- kind: conda - name: contourpy - version: 1.2.1 - build: py312h9230928_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py312h9230928_0.conda - sha256: 3879ed298cc9ec5486d13b7d65da960c813925837fe67fc385c9b31f7eefddc0 - md5: 079df34ce7c71259cfdd394645370891 - depends: - - libcxx >=16 - - numpy >=1.20 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy - size: 248928 - timestamp: 1712430234380 -- kind: conda - name: coverage - version: 7.5.0 - build: py312h4389bb4_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.5.0-py312h4389bb4_0.conda - sha256: 3cce9d3ecbfed8af08dd055fb766d567a02b1c184f8a1dac8ff16f32bd387ad2 - md5: 2a54fb0df8668f9dfe0bef3e5e1da5c2 - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tomli - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage - size: 380966 - timestamp: 1713908870798 -- kind: conda - name: coverage - version: 7.5.0 - build: py312h4a164c9_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.0-py312h4a164c9_0.conda - sha256: 63b79f7cd3ec0c4a07275311cd055c5f2919b97d5fe1556f47f5b493af9fb391 - md5: f2c3d8ee99ae610188154fde66ce8aa4 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - tomli - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage - size: 362399 - timestamp: 1713908355106 -- kind: conda - name: coverage - version: 7.5.0 - build: py312h5fa3f64_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.5.0-py312h5fa3f64_0.conda - sha256: 7b663f3cf38fa82b2c3b9f4653b4425ace74de6e8986de1b30cbbd9a40aa0684 - md5: 0ec479f31895645cfaabaa7ea318e6a5 - depends: - - __osx >=10.9 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tomli + arch: x86_64 + platform: win license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/coverage - size: 362224 - timestamp: 1713908313894 -- kind: conda - name: coverage - version: 7.5.0 - build: py312h9a8786e_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py312h9a8786e_0.conda - sha256: 95391da7d654536563f9851a89a75e760c9bb844fbd162c8dda243721e842bfd - md5: 25044745b530207291239ad6f914c1d8 + - pkg:pypi/coverage?source=hash-mapping + size: 321457 + timestamp: 1739302405587 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.10.16-py310hd8ed1ab_1.conda + noarch: generic + sha256: 522b5ff2c5b1ebe0050ad15cd76a1e14696752eead790ab28e29977d7a8a99e6 + md5: 5c7fe189f8761cd08a69924554c1ffab depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tomli - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage - size: 362502 - timestamp: 1713908152975 -- kind: conda - name: coverage - version: 7.5.1 - build: py311h331c9d8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py311h331c9d8_0.conda - sha256: 2ecb21dc0efec42419c50f63daf1db0d6910f47db1b2653ebc5c43f76302024e - md5: 9f35e13e3b9e05e153b78f42662061f6 + - python 3.10.16.* + - python_abi * *_cp310 + license: Python-2.0 + purls: [] + size: 48888 + timestamp: 1733407928192 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py310hf71b8c6_0.conda + sha256: 1de0f06d106d89355977e859320fb0412d757f62114597f9bd1c4f1b377440c3 + md5: 9b1dedfc47e1242253d6e2ca3b864693 depends: - - libgcc-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tomli - license: Apache-2.0 - license_family: APACHE + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT purls: - - pkg:pypi/coverage - size: 369007 - timestamp: 1714846741185 -- kind: conda - name: coverage - version: 7.5.1 - build: py311h42a8b16_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.5.1-py311h42a8b16_0.conda - sha256: d2ca14f7d750652eb3a4f7a674b5a8ce65bae3586a699b613a83e66d879eef5d - md5: 043b439c3c4ae4b8a91aba062ef27d10 + - pkg:pypi/debugpy?source=hash-mapping + size: 2161391 + timestamp: 1737269905873 +- conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.12-py310h6954a95_0.conda + sha256: 2adbc7fb029d8c5203a114a78092ebef54f6cdc1ab4763433e5f17ad97084993 + md5: 80f041f64b7c87cb0277bac54e17b09a depends: - - __osx >=10.9 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tomli - license: Apache-2.0 - license_family: APACHE + - __osx >=10.13 + - libcxx >=18 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx + license: MIT + license_family: MIT purls: - - pkg:pypi/coverage - size: 367115 - timestamp: 1714846868088 -- kind: conda - name: coverage - version: 7.5.1 - build: py311hd3f4193_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.5.1-py311hd3f4193_0.conda - sha256: 6eaa811402fc3433bd891179410a434d0826da1f44579eccccc9dbb632769403 - md5: 81834421a20531c880f6c0a5342f3922 + - pkg:pypi/debugpy?source=hash-mapping + size: 2064533 + timestamp: 1737269953949 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.12-py310h853098b_0.conda + sha256: d6b8b0268194cd26003ae38c5014c6d14c99f6e5f282b52cf2c39e079557b6bf + md5: b0d7edf6edaf7d0a86bfa03d0b7de436 depends: - __osx >=11.0 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - - tomli - license: Apache-2.0 - license_family: APACHE + - libcxx >=18 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx + license: MIT + license_family: MIT purls: - - pkg:pypi/coverage - size: 368146 - timestamp: 1714846963260 -- kind: conda - name: coverage - version: 7.5.1 - build: py311he736701_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.5.1-py311he736701_0.conda - sha256: 844aea7ee1ff29d72f20406debb68b2e9bdd51f83299e6fb2e0b1f9b97e7e8e0 - md5: 44beec11cad6c9cd78fdd3594d62817b - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tomli + - pkg:pypi/debugpy?source=hash-mapping + size: 2092415 + timestamp: 1737269984282 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.12-py310h9e98ed7_0.conda + sha256: fa60c05e1ba14eab7f619a0416764e88c7bb8935b59ee936f2562493f6b5a1f5 + md5: 6ce8c7ad37a65f7c39014a106e9c38e1 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: APACHE + arch: x86_64 + platform: win + license: MIT + license_family: MIT purls: - - pkg:pypi/coverage - size: 385417 - timestamp: 1714847169739 -- kind: conda - name: cycler - version: 0.12.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 - md5: 5cd86562580f274031ede6aa6aa24441 + - pkg:pypi/debugpy?source=hash-mapping + size: 3182693 + timestamp: 1737270373802 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 + md5: 9ce473d1d1be1cc3810856a48b3fab32 depends: - - python >=3.8 - license: BSD-3-Clause + - python >=3.9 + license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/cycler - size: 13458 - timestamp: 1696677888423 -- kind: conda - name: dbus - version: 1.13.6 - build: h5008d03_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 - md5: ecfff944ba3960ecb334b9a2663d708d - depends: - - expat >=2.4.2,<3.0a0 - - libgcc-ng >=9.4.0 - - libglib >=2.70.2,<3.0a0 - license: GPL-2.0-or-later - license_family: GPL - size: 618596 - timestamp: 1640112124844 -- kind: conda - name: distlib - version: 0.3.8 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - sha256: 3ff11acdd5cc2f80227682966916e878e45ced94f59c402efb94911a5774e84e - md5: db16c66b759a64dc5183d69cc3745a52 + - pkg:pypi/decorator?source=compressed-mapping + size: 14129 + timestamp: 1740385067843 +- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + md5: 961b3a227b437d82ad7054484cfa71b2 depends: - - python 2.7|>=3.6 + - python >=3.6 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/defusedxml?source=hash-mapping + size: 24062 + timestamp: 1615232388757 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + sha256: 0e160c21776bd881b79ce70053e59736f51036784fa43a50da10a04f0c1b9c45 + md5: 8d88f4a2242e6b96f9ecff9a6a05b2f1 + depends: + - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/distlib - size: 274915 - timestamp: 1702383349284 -- kind: conda - name: docutils - version: 0.21.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - sha256: 362bfe3afaac18298c48c0c6a935641544077ce5105a42a2d8ebe750ad07c574 - md5: e8cd5d629f65bdf0f3bb312cde14659e + - pkg:pypi/distlib?source=hash-mapping + size: 274151 + timestamp: 1733238487461 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 + md5: a16662747cdeb9abbac74d0057cc976e depends: - python >=3.9 - license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 - purls: - - pkg:pypi/docutils - size: 403226 - timestamp: 1713930478970 -- kind: conda - name: exceptiongroup - version: 1.2.0 - build: pyhd8ed1ab_2 - build_number: 2 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - sha256: a6ae416383bda0e3ed14eaa187c653e22bec94ff2aa3b56970cdf0032761e80d - md5: 8d652ea2ee8eaee02ed8dc820bc794aa - depends: - - python >=3.7 license: MIT and PSF-2.0 purls: - - pkg:pypi/exceptiongroup - size: 20551 - timestamp: 1704921321122 -- kind: conda - name: expat - version: 2.6.2 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - sha256: 89916c536ae5b85bb8bf0cfa27d751e274ea0911f04e4a928744735c14ef5155 - md5: 53fb86322bdb89496d7579fe3f02fd61 - depends: - - libexpat 2.6.2 h59595ed_0 - - libgcc-ng >=12 + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 20486 + timestamp: 1733208916977 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + sha256: 28d25ea375ebab4bf7479228f8430db20986187b04999136ff5c722ebd32eb60 + md5: ef8b5fca76806159fc25b4f48d8737eb + depends: + - python >=3.9 license: MIT license_family: MIT - size: 137627 - timestamp: 1710362144873 -- kind: conda - name: filelock - version: 3.14.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - sha256: 6031be667e1b0cc0dee713f1cbca887cdee4daafa8bac478da33096f3147d38b - md5: 831d85ae0acfba31b8efd0f0d07da736 + purls: + - pkg:pypi/executing?source=hash-mapping + size: 28348 + timestamp: 1733569440265 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 depends: - - python >=3.7 + - python >=3.9 license: Unlicense purls: - - pkg:pypi/filelock - size: 15902 - timestamp: 1714422911808 -- kind: conda - name: font-ttf-dejavu-sans-mono - version: '2.37' - build: hab24e00_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b - md5: 0c96522c6bdaed4b1566d11387caaf45 - license: BSD-3-Clause - license_family: BSD - size: 397370 - timestamp: 1566932522327 -- kind: conda - name: font-ttf-inconsolata - version: '3.000' - build: h77eed37_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c - md5: 34893075a5c9e55cdafac56607368fc6 - license: OFL-1.1 - license_family: Other - size: 96530 - timestamp: 1620479909603 -- kind: conda - name: font-ttf-source-code-pro - version: '2.038' - build: h77eed37_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 - md5: 4d59c254e01d9cde7957100457e2d5fb - license: OFL-1.1 - license_family: Other - size: 700814 - timestamp: 1620479612257 -- kind: conda - name: font-ttf-ubuntu - version: '0.83' - build: h77eed37_2 - build_number: 2 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - sha256: c940f6e969143e13a3a9660abb3c7e7e23b8319efb29dbdd5dee0b9939236e13 - md5: cbbe59391138ea5ad3658c76912e147f - license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 - license_family: Other - size: 1622566 - timestamp: 1714483134319 -- kind: conda - name: fontconfig - version: 2.14.2 - build: h14ed4e7_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda - sha256: 155d534c9037347ea7439a2c6da7c24ffec8e5dd278889b4c57274a1d91e0a83 - md5: 0f69b688f52ff6da70bccb7ff7001d1d - depends: - - expat >=2.5.0,<3.0a0 - - freetype >=2.12.1,<3.0a0 - - libgcc-ng >=12 - - libuuid >=2.32.1,<3.0a0 - - libzlib >=1.2.13,<1.3.0a0 - license: MIT - license_family: MIT - size: 272010 - timestamp: 1674828850194 -- kind: conda - name: fonts-conda-ecosystem - version: '1' - build: '0' - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 - md5: fee5683a3f04bd15cbd8318b096a27ab + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + sha256: 40fdf5a9d5cc7a3503cd0c33e1b90b1e6eab251aaaa74e6b965417d089809a15 + md5: 93f742fe078a7b34c29a182958d4d765 depends: - - fonts-conda-forge - license: BSD-3-Clause - license_family: BSD - size: 3667 - timestamp: 1566974674465 -- kind: conda - name: fonts-conda-forge - version: '1' - build: '0' - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 - md5: f766549260d6815b0c52253f1fb1bb29 - depends: - - font-ttf-dejavu-sans-mono - - font-ttf-inconsolata - - font-ttf-source-code-pro - - font-ttf-ubuntu - license: BSD-3-Clause - license_family: BSD - size: 4102 - timestamp: 1566932280397 -- kind: conda - name: fonttools - version: 4.51.0 - build: py311h05b510d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py311h05b510d_0.conda - sha256: eb302bff243557c00376f6132c70b613de58c89fb056f48dd356c418c24817a2 - md5: 24f53a9bde6f321549791406abbe7171 - depends: - - brotli - - munkres - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools - size: 2779777 - timestamp: 1712345091169 -- kind: conda - name: fonttools - version: 4.51.0 - build: py311h459d7ec_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda - sha256: 117bc8eb7bb390911faa0b816d404d776669b088c41a9caba7b7561cd2f67970 - md5: 17e1997cc17c571d5ad27bd0159f616c - depends: - - brotli - - libgcc-ng >=12 - - munkres - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools - size: 2827021 - timestamp: 1712344736242 -- kind: conda - name: fonttools - version: 4.51.0 - build: py311ha68e1ae_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.51.0-py311ha68e1ae_0.conda - sha256: 7f130b53d957624bfea553cab96cf85a9d51bcf0ddcfc4e68f655bc8321cc744 - md5: 5d497f05b17751c8e4c60103aa20d2d6 - depends: - - brotli - - munkres - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools - size: 2417702 - timestamp: 1712345179311 -- kind: conda - name: fonttools - version: 4.51.0 - build: py311he705e18_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py311he705e18_0.conda - sha256: b3c868d3f98675b0e69530e75ee943349c98fc8e3c7c121fe123067c1a70e3bc - md5: edf0af3a7002844b5b59605c9725625b - depends: - - brotli - - munkres - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools - size: 2753573 - timestamp: 1712344918883 -- kind: conda - name: fonttools - version: 4.51.0 - build: py312h41838bb_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py312h41838bb_0.conda - sha256: 38d7a31e6dc0150e70b7658f0fa5aa747ae951cd961fb4c0d8ce9f717c2a2a61 - md5: ebe40134b860cf704ddaf81f684f95a5 - depends: - - brotli - - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT + - python >=3.9 + - python-dateutil >=2.8.1 + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/fonttools - size: 2688978 - timestamp: 1712345024723 -- kind: conda - name: fonttools - version: 4.51.0 - build: py312h98912ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py312h98912ed_0.conda - sha256: 2589622654b59454a2b6f1e37b864d429a46849db575415803fbe571e6f564c7 - md5: f0cd0e54adf65aaa976f5731b7a3f383 - depends: - - brotli - - libgcc-ng >=12 - - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT + - pkg:pypi/ghp-import?source=hash-mapping + size: 16538 + timestamp: 1734344477841 +- conda: https://conda.anaconda.org/conda-forge/noarch/griffe-1.5.7-pyhd8ed1ab_0.conda + sha256: b0a7e5276a2cd9372a477e0908001d6b49cde887dd77b18f2c60dfef4b27db53 + md5: d7ac3d8a83ff2bd718452ff1d0a2d32a + depends: + - colorama >=0.4 + - python >=3.9 + license: ISC purls: - - pkg:pypi/fonttools - size: 2787769 - timestamp: 1712344705346 -- kind: conda - name: fonttools - version: 4.51.0 - build: py312he37b823_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py312he37b823_0.conda - sha256: 2c6681ed2c3c31cc132d4ed8e5ba7d44cb330d4c61bd35970f9f5a410535d076 - md5: 30bd6e9be6d9f932bc54e7b88130bca3 - depends: - - brotli - - munkres - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - pkg:pypi/griffe?source=hash-mapping + size: 98792 + timestamp: 1739298169057 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/fonttools - size: 2688172 - timestamp: 1712345007991 -- kind: conda - name: fonttools - version: 4.51.0 - build: py312he70551f_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.51.0-py312he70551f_0.conda - sha256: c86a5a3483587fac156afe5e1ec9f44aeb91d885b1bf1b753c9f2c1fa2d07229 - md5: 6820105f0928bb46b99358d45d4f3994 - depends: - - brotli - - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/fonttools - size: 2363814 - timestamp: 1712345188022 -- kind: conda - name: freetype - version: 2.12.1 - build: h267a509_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 - md5: 9ae35c3d96db2c94ce0cef86efdfa2cb - depends: - - libgcc-ng >=12 - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - license: GPL-2.0-only OR FTL - size: 634972 - timestamp: 1694615932610 -- kind: conda - name: freetype - version: 2.12.1 - build: h60636b9_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - sha256: b292cf5a25f094eeb4b66e37d99a97894aafd04a5683980852a8cbddccdc8e4e - md5: 25152fce119320c980e5470e64834b50 - depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - license: GPL-2.0-only OR FTL - size: 599300 - timestamp: 1694616137838 -- kind: conda - name: freetype - version: 2.12.1 - build: hadb7bae_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 - md5: e6085e516a3e304ce41a8ee08b9b89ad - depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - license: GPL-2.0-only OR FTL - size: 596430 - timestamp: 1694616332835 -- kind: conda - name: freetype - version: 2.12.1 - build: hdaf720e_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - sha256: 2c53ee8879e05e149a9e525481d36adfd660a6abda26fd731376fa64ff03e728 - md5: 3761b23693f768dc75a8fd0a73ca053f - depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-2.0-only OR FTL - size: 510306 - timestamp: 1694616398888 -- kind: conda - name: gettext - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda - sha256: cd4ef93fd052a4fe89a4db963c9d69e60c8a434d41968fc9dc8726db67191582 - md5: da84216f88a8c89eb943c683ceb34d7d - depends: - - gettext-tools 0.22.5 h7d00a51_2 - - libasprintf 0.22.5 h5728263_2 - - libasprintf-devel 0.22.5 h5728263_2 - - libgettextpo 0.22.5 h5728263_2 - - libgettextpo-devel 0.22.5 h5728263_2 - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - - libintl-devel 0.22.5 h5728263_2 - license: LGPL-2.1-or-later AND GPL-3.0-or-later - size: 34028 - timestamp: 1712517225377 -- kind: conda - name: gettext - version: 0.22.5 - build: h59595ed_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda - sha256: 386181254ddd2aed1fccdfc217da5b6545f6df4e9979ad8e08f5e91e22eaf7dc - md5: 219ba82e95d7614cf7140d2a4afc0926 - depends: - - gettext-tools 0.22.5 h59595ed_2 - - libasprintf 0.22.5 h661eb56_2 - - libasprintf-devel 0.22.5 h661eb56_2 - - libgcc-ng >=12 - - libgettextpo 0.22.5 h59595ed_2 - - libgettextpo-devel 0.22.5 h59595ed_2 - - libstdcxx-ng >=12 - license: LGPL-2.1-or-later AND GPL-3.0-or-later - size: 475058 - timestamp: 1712512357949 -- kind: conda - name: gettext-tools - version: 0.22.5 - build: h59595ed_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda - sha256: 67d7b1d6fe4f1c516df2000640ec7dcfebf3ff6ea0785f0276870e730c403d33 - md5: 985f2f453fb72408d6b6f1be0f324033 - depends: - - libgcc-ng >=12 - license: GPL-3.0-or-later - license_family: GPL - size: 2728420 - timestamp: 1712512328692 -- kind: conda - name: gettext-tools - version: 0.22.5 - build: h7d00a51_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda - sha256: e3621dc3d48399c89bf0dd512a6a398d354429b3b84219473d674aa56e0feef2 - md5: ef1c3bb48c013099c4872640a5f2096c - depends: - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-or-later - license_family: GPL - size: 3415835 - timestamp: 1712516856107 -- kind: conda - name: glib - version: 2.80.0 - build: h39d0aa6_6 - build_number: 6 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_6.conda - sha256: 25b3e8930540cfbb87c03feda23cd412eb1b01fd903f46d1bd067f7d39d5941d - md5: a4036d0bc6f499ebe9fef7b887f3ca0f - depends: - - glib-tools 2.80.0 h0a98069_6 - - libffi >=3.4,<4.0a0 - - libglib 2.80.0 h39d0aa6_6 - - libintl >=0.22.5,<1.0a0 - - libintl-devel - - python * - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.1-or-later - size: 572781 - timestamp: 1713639879324 -- kind: conda - name: glib - version: 2.80.0 - build: hf2295e7_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_6.conda - sha256: 186e366c3a48c07830aa94dfc84616155bdfd08e9b73cb8e482c6ca84a550d3e - md5: a1e026a82a562b443845db5614ca568a - depends: - - glib-tools 2.80.0 hde27a5a_6 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_6 - - python * - license: LGPL-2.1-or-later - size: 597788 - timestamp: 1713639483074 -- kind: conda - name: glib - version: 2.80.2 - build: h0df6a38_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.2-h0df6a38_0.conda - sha256: 8d4ebee8bfef919212e8c692f88cfa3f5f393501338ca1f1df83bbc2f0f3b6e7 - md5: a728ca6f04c33ecb0f39eeda5fbd0e23 - depends: - - glib-tools 2.80.2 h2f9d560_0 - - libffi >=3.4,<4.0a0 - - libglib 2.80.2 h0df6a38_0 - - libintl >=0.22.5,<1.0a0 - - libintl-devel - - python * - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.1-or-later - size: 571410 - timestamp: 1715253202444 -- kind: conda - name: glib - version: 2.80.2 - build: hf974151_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda - sha256: d10a0f194d2c125617352a81a4ff43a17cf5835e88e8f151da9f9710e2db176d - md5: d427988dc3dbd0a4c136f52db356cc6a - depends: - - glib-tools 2.80.2 hb6ce0ca_0 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libglib 2.80.2 hf974151_0 - - python * - license: LGPL-2.1-or-later - size: 600389 - timestamp: 1715252749399 -- kind: conda - name: glib-tools - version: 2.80.0 - build: h0a98069_6 - build_number: 6 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_6.conda - sha256: a7533a2e10fe95c8503e990da15933711843061e962450a1c7e753dc050f221b - md5: 40d452e4012c00f644b1dd6319fcdbcf - depends: - - libglib 2.80.0 h39d0aa6_6 - - libintl >=0.22.5,<1.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.1-or-later - size: 94763 - timestamp: 1713639812512 -- kind: conda - name: glib-tools - version: 2.80.0 - build: hde27a5a_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_6.conda - sha256: fb63c92ba2b08aad574404c6229d45f12dc78309ff7a540f1e8d941a8a075074 - md5: a9d23c02485c5cf055f9ac90eb9c9c63 - depends: - - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_6 - license: LGPL-2.1-or-later - size: 113049 - timestamp: 1713639447140 -- kind: conda - name: glib-tools - version: 2.80.2 - build: h2f9d560_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.2-h2f9d560_0.conda - sha256: 2ac7b9cf3cf57a7cec3c431133a989cc783673858fb4225232c03e5ae28bd1db - md5: 42fc785d9db7ab051a206fbf882ecf2e - depends: - - libglib 2.80.2 h0df6a38_0 - - libintl >=0.22.5,<1.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.1-or-later - size: 94852 - timestamp: 1715253157140 -- kind: conda - name: glib-tools - version: 2.80.2 - build: hb6ce0ca_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda - sha256: 221cd047f998301b96b1517d9f7d3fb0e459e8ee18778a1211f302496f6e110d - md5: a965aeaf060289528a3fbe09326edae2 - depends: - - libgcc-ng >=12 - - libglib 2.80.2 hf974151_0 - license: LGPL-2.1-or-later - size: 114359 - timestamp: 1715252713902 -- kind: conda - name: graphite2 - version: 1.3.13 - build: h59595ed_1003 - build_number: 1003 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add - md5: f87c7b7c2cb45f323ffbce941c78ab7c - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LGPL-2.0-or-later - license_family: LGPL - size: 96855 - timestamp: 1711634169756 -- kind: conda - name: gst-plugins-base - version: 1.24.1 - build: h001b923_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda - sha256: 14cdc32e1adf2876d23623cc2047489d7bad122b7020e2b23357bd2416744b80 - md5: 7900eb39e6203249accb52fb705a2fb0 - depends: - - gettext >=0.21.1,<1.0a0 - - gstreamer 1.24.1 hb4038d2_1 - - libglib >=2.78.4,<3.0a0 - - libogg >=1.3.4,<1.4.0a0 - - libvorbis >=1.3.7,<1.4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2090953 - timestamp: 1711319124984 -- kind: conda - name: gst-plugins-base - version: 1.24.1 - build: hfa15dee_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda - sha256: 4228bb9b568a09f8e31f0d52d6ccf06e7752dfa1d72af15ee11fd347e6795bca - md5: a6dd2bbc684913e2bef0a54ce56fcbfb - depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.11,<1.3.0a0 - - gettext >=0.21.1,<1.0a0 - - gstreamer 1.24.1 h98fc4e7_1 - - libexpat >=2.6.2,<3.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libogg >=1.3.4,<1.4.0a0 - - libopus >=1.3.1,<2.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libvorbis >=1.3.7,<1.4.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - xorg-libx11 >=1.8.7,<2.0a0 - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxext >=1.3.4,<2.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2789211 - timestamp: 1711318581613 -- kind: conda - name: gst-plugins-base - version: 1.24.3 - build: h9ad1361_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.3-h9ad1361_0.conda - sha256: bfcd03bde2be5293dfb901639778bfe08bc17c59c4935d43cc981953196d7b82 - md5: 8fb0e954c616bb0f9389efac4b4ed44b - depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.11,<1.3.0a0 - - gstreamer 1.24.3 haf2f30d_0 - - libexpat >=2.6.2,<3.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libogg >=1.3.4,<1.4.0a0 - - libopus >=1.3.1,<2.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libvorbis >=1.3.7,<1.4.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - xorg-libx11 >=1.8.9,<2.0a0 - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxext >=1.3.4,<2.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2794610 - timestamp: 1714842288833 -- kind: conda - name: gst-plugins-base - version: 1.24.3 - build: hba88be7_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.3-hba88be7_0.conda - sha256: b35bd225b26961ba9b9edca1d048adf8d158b1dec41f18fc3065574dbf10e294 - md5: 1fa879c7b4868c58830762b6fac0075d - depends: - - gstreamer 1.24.3 h5006eae_0 - - libglib >=2.80.0,<3.0a0 - - libintl >=0.22.5,<1.0a0 - - libogg >=1.3.4,<1.4.0a0 - - libvorbis >=1.3.7,<1.4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2063715 - timestamp: 1714842910504 -- kind: conda - name: gstreamer - version: 1.24.1 - build: h98fc4e7_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_1.conda - sha256: a341496165602c8de4e537e596ba8f5070232d0362a9fe36b3591116a0f0752d - md5: b04b5cdf3ba01430db27979250bc5a1d - depends: - - __glibc >=2.17,<3.0.a0 - - gettext >=0.21.1,<1.0a0 - - glib >=2.80.0,<3.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libstdcxx-ng >=12 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2010273 - timestamp: 1711318435463 -- kind: conda - name: gstreamer - version: 1.24.1 - build: hb4038d2_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_1.conda - sha256: f2ee66bb1ef3d12f9c2d6784d2c4bf19bb9d4e99c55c96ca4df53c9bd308c084 - md5: 8a6dfe53ad02a3b151e6383a950043ee - depends: - - gettext >=0.21.1,<1.0a0 - - glib >=2.78.4,<3.0a0 - - libglib >=2.78.4,<3.0a0 - - libiconv >=1.17,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2069365 - timestamp: 1711318923388 -- kind: conda - name: gstreamer - version: 1.24.3 - build: h5006eae_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.3-h5006eae_0.conda - sha256: 43c8a3176e82010bf3614ba02ec3c79c581dbf6e797dfa692932a8a100050072 - md5: 8c8959a520ef4911271fbf2cb2dfc3fe - depends: - - glib >=2.80.0,<3.0a0 - - libglib >=2.80.0,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libintl >=0.22.5,<1.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2022128 - timestamp: 1714842722684 -- kind: conda - name: gstreamer - version: 1.24.3 - build: haf2f30d_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.3-haf2f30d_0.conda - sha256: 020f78890f16e2352f8e9ac12ada652fa0465761aa61b95100c9331e7a1c5742 - md5: f3df87cc9ef0b5113bff55aefcbcafd5 + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac depends: - - __glibc >=2.17,<3.0.a0 - - glib >=2.80.0,<3.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libstdcxx-ng >=12 - license: LGPL-2.0-or-later - license_family: LGPL - size: 2024018 - timestamp: 1714842147120 -- kind: conda - name: harfbuzz - version: 8.4.0 - build: h3d44ed6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.4.0-h3d44ed6_0.conda - sha256: d27441d53498f28a36a1612d8f767bae0418076e9c08dcd2cd511c8439d2fb4d - md5: 27f46291a6aaa3c2a4f798ebd35a7ddb - depends: - - cairo >=1.18.0,<2.0a0 - - freetype >=2.12.1,<3.0a0 - - graphite2 - - icu >=73.2,<74.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libstdcxx-ng >=12 - license: MIT - license_family: MIT - size: 1587652 - timestamp: 1713957638950 -- kind: conda - name: harfbuzz - version: 8.5.0 - build: hfac3d4d_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda - sha256: a141fc55f8bfdab7db03fe9d8e61cb0f8c8b5970ed6540eda2db7186223f4444 - md5: f5126317dd0ce0ba26945e411ecc6960 - depends: - - cairo >=1.18.0,<2.0a0 - - freetype >=2.12.1,<3.0a0 - - graphite2 - - icu >=73.2,<74.0a0 - - libgcc-ng >=12 - - libglib >=2.80.2,<3.0a0 - - libstdcxx-ng >=12 + - python >=3.9 license: MIT license_family: MIT - size: 1598244 - timestamp: 1715701061364 -- kind: conda - name: icu - version: '73.2' - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 md5: cc47e1facc155f91abd89b11e48e72ff depends: - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: MIT license_family: MIT + purls: [] size: 12089150 timestamp: 1692900650789 -- kind: conda - name: icu - version: '73.2' - build: h63175ca_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda - sha256: 423aaa2b69d713520712f55c7c71994b7e6f967824bb39b59ad968e7b209ce8c - md5: 0f47d9e3192d9e09ae300da0d28e0f56 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + sha256: f66362dc36178ac9b7c7a9b012948a9d2d050b3debec24bbd94aadbc44854185 + md5: 5cc301d759ec03f28328428e28f65591 + arch: x86_64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 11787527 + timestamp: 1692901622519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + sha256: ff9cd0c6cd1349954c801fb443c94192b637e1b414514539f3c49c56a39f51b1 + md5: 8521bd47c0e11c5902535bb1a17c565f + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 11997841 + timestamp: 1692902104771 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __osx >=11.0 + arch: arm64 + platform: osx license: MIT license_family: MIT - size: 13422193 - timestamp: 1692901469029 -- kind: conda - name: identify - version: 2.5.36 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - sha256: dc98ab2233d3ed3692499e2a06b027489ee317658cef9277ec23cab00236f31c - md5: ba68cb5105760379432cebc82b45af40 + purls: [] + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda + sha256: 26347a71ff3bf9d3d775b6764a85782d4b9238a8e3a5c16a548325724dccbdea + md5: 153a6ad50ad9db7bb4e042ee52a56f87 depends: - - python >=3.6 + - python >=3.9 - ukkonen license: MIT license_family: MIT purls: - - pkg:pypi/identify - size: 78375 - timestamp: 1713673091737 -- kind: conda - name: idna - version: '3.7' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b - md5: c0cc1420498b17414d8617d0b9f506ca + - pkg:pypi/identify?source=hash-mapping + size: 78619 + timestamp: 1740257841338 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 depends: - - python >=3.6 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/idna - size: 52718 - timestamp: 1713279497047 -- kind: conda - name: imagesize - version: 1.4.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 - md5: 7de5386c8fea29e76b303f37dde4c352 + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c depends: - - python >=3.4 - license: MIT - license_family: MIT + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/imagesize - size: 10164 - timestamp: 1656939625410 -- kind: conda - name: importlib-metadata - version: 7.1.0 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 - md5: 0896606848b2dc5cebdf111b6543aa04 + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.5.2-pyhd8ed1ab_0.conda + sha256: a99a3dafdfff2bb648d2b10637c704400295cb2ba6dc929e2d814870cf9f6ae5 + md5: e376ea42e9ae40f3278b0f79c9bf9826 depends: - - python >=3.8 - - zipp >=0.5 + - importlib_resources >=6.5.2,<6.5.3.0a0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 9724 + timestamp: 1736252443859 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata - size: 27043 - timestamp: 1710971498183 -- kind: conda - name: iniconfig - version: 2.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 - md5: f800d2da156d08e289b14e87e43c1ae5 + - pkg:pypi/importlib-resources?source=hash-mapping + size: 33781 + timestamp: 1736252433366 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 depends: - - python >=3.7 + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/iniconfig - size: 11101 - timestamp: 1673103208955 -- kind: conda - name: intel-openmp - version: 2024.1.0 - build: h57928b3_965 - build_number: 965 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - sha256: 7b029e476ad6d401d645636ee3e4b40130bfcc9534f7415209dd5b666c6dd292 - md5: c66eb2fd33b999ccc258aef85689758e - license: LicenseRef-ProprietaryIntel + - pkg:pypi/iniconfig?source=hash-mapping + size: 11474 + timestamp: 1733223232820 +- conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + sha256: 0fd2b0b84c854029041b0ede8f4c2369242ee92acc0092f8407b1fe9238a8209 + md5: 2d89243bfb53652c182a7c73182cce4f + license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary - size: 1617555 - timestamp: 1712943333029 -- kind: pypi - name: isoml - version: 0.1.dev8+g9e0aa3d - path: . - sha256: f780841eeb6db682f8f7d380ce58895d736d175217baf1e1366b8ea682aff57d - requires_dist: - - scikit-learn>=1.4.2 - requires_python: '>=3.9' - editable: true -- kind: conda - name: jinja2 - version: 3.1.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc - md5: e7d8df6509ba635247ff9aea31134262 - depends: - - markupsafe >=2.0 - - python >=3.7 + purls: [] + size: 1852356 + timestamp: 1723739573141 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + sha256: 33cfd339bb4efac56edf93474b37ddc049e08b1b4930cf036c893cc1f5a1f32a + md5: b40131ab6a36ac2c09b7c57d4d3fbf99 + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio + - packaging + - psutil + - python >=3.8 + - pyzmq >=24 + - tornado >=6.1 + - traitlets >=5.4.0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jinja2 - size: 111589 - timestamp: 1704967140287 -- kind: conda - name: jinja2 - version: 3.1.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d - md5: 7b86ecb7d3557821c649b3c31e3eb9f2 - depends: - - markupsafe >=2.0 - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jinja2 - size: 111565 - timestamp: 1715127275924 -- kind: conda - name: joblib - version: 1.4.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.0-pyhd8ed1ab_0.conda - sha256: 56eea2c4af35a9c8f9cdca530f6aea0dc8e2551bfcc8b8da37da78221366af10 - md5: e0ed1bf13ce3a440e022157bf4764465 + - pkg:pypi/ipykernel?source=hash-mapping + size: 119084 + timestamp: 1719845605084 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh4bbf305_0.conda + sha256: dc569094125127c0078aa536f78733f383dd7e09507277ef8bcd1789786e7086 + md5: 18df5fc4944a679e085e0e8f31775fc8 depends: + - __win + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio + - packaging + - psutil - python >=3.8 - - setuptools + - pyzmq >=24 + - tornado >=6.1 + - traitlets >=5.4.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 119853 + timestamp: 1719845858082 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda + sha256: 072534d4d379225b2c3a4e38bc7730b65ae171ac7f0c2d401141043336e97980 + md5: 9eb15d654daa0ef5a98802f586bb4ffc + depends: + - __osx + - appnope + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio + - packaging + - psutil + - python >=3.8 + - pyzmq >=24 + - tornado >=6.1 + - traitlets >=5.4.0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/joblib - size: 220154 - timestamp: 1712597317378 -- kind: conda - name: joblib - version: 1.4.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda - sha256: 8ad719524b1039510fcbd75eb776123189d75e2c09228189257ddbcab86f5b64 - md5: 25df261d4523d9f9783bcdb7208d872f + - pkg:pypi/ipykernel?source=hash-mapping + size: 119568 + timestamp: 1719845667420 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh707e725_0.conda + sha256: 521291dd15bf09fbb3ecea1c27536742d8e434c2e539b06776e734ee729bdead + md5: 371344fdbdf9c70cfe9adb512a8cbca6 depends: - - python >=3.8 - - setuptools + - __unix + - decorator + - exceptiongroup + - jedi >=0.16 + - matplotlib-inline + - pexpect >4.3 + - pickleshare + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.4.0 + - python >=3.10 + - stack_data + - traitlets >=5 + - typing_extensions + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=hash-mapping + size: 592143 + timestamp: 1706795844870 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.21.0-pyh7428d3b_0.conda + sha256: 91d4fe1b927354287ec9ad0314232a58e988402a0e0d6322805f81c042737038 + md5: 632aeffb0cce428d8b91229dbe69dbce + depends: + - __win + - colorama + - decorator + - exceptiongroup + - jedi >=0.16 + - matplotlib-inline + - pickleshare + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.4.0 + - python >=3.10 + - stack_data + - traitlets >=5 + - typing_extensions + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=hash-mapping + size: 591584 + timestamp: 1706796140240 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-pyhd8ed1ab_2.conda + sha256: 45821a8986b4cb2421f766b240dbe6998a3c3123f012dd566720c1322e9b6e18 + md5: 2f0ba4bc12af346bc6c99bdc377e8944 + depends: + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/joblib - size: 219731 - timestamp: 1714665585214 -- kind: conda - name: keyutils - version: 1.6.1 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb - md5: 30186d27e2c9fa62b45fb1476b7200e3 + - pkg:pypi/ipython-genutils?source=hash-mapping + size: 28153 + timestamp: 1733399692864 +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 + md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 depends: - - libgcc-ng >=10.3.0 - license: LGPL-2.1-or-later - size: 117831 - timestamp: 1646151697040 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py311h005e61a_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py311h005e61a_1.conda - sha256: 8fdd1bff75c24ac6a2a13be4db1c9abcfa39ab50b81539e8bd01131141df271a - md5: de0b3f37405f8386ac8be18fdc06ff92 + - parso >=0.8.3,<0.9.0 + - python >=3.9 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/jedi?source=hash-mapping + size: 843646 + timestamp: 1733300981994 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - markupsafe >=2.0 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver - size: 55822 - timestamp: 1695380386563 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py311h5fe6e05_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py311h5fe6e05_1.conda - sha256: 586a4d0a17e6cfd9f8fdee56106d263ee40ca156832774d6e899f82ad68ac8d0 - md5: 24305b23f7995de72bbd53b7c01242a2 + - pkg:pypi/jinja2?source=hash-mapping + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_1.conda + sha256: 51cc2dc491668af0c4d9299b0ab750f16ccf413ec5e2391b924108c1fbacae9b + md5: bf8243ee348f3a10a14ed0cae323e0c1 depends: - - libcxx >=15.0.7 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.9 + - setuptools license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver - size: 60694 - timestamp: 1695380246398 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py311h9547e67_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda - sha256: 723b0894d2d2b05a38f9c5a285d5a0a5baa27235ceab6531dbf262ba7c6955c1 - md5: 2c65bdf442b0d37aad080c8a4e0d452f + - pkg:pypi/joblib?source=conda-forge-mapping + size: 220252 + timestamp: 1733736157394 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + sha256: be992a99e589146f229c58fe5083e0b60551d774511c494f91fe011931bd7893 + md5: a3cead9264b331b32fe8f0aabc967522 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD + - attrs >=22.2.0 + - importlib_resources >=1.4.0 + - jsonschema-specifications >=2023.03.6 + - pkgutil-resolve-name >=1.3.10 + - python >=3.9 + - referencing >=0.28.4 + - rpds-py >=0.7.1 + license: MIT + license_family: MIT purls: - - pkg:pypi/kiwisolver - size: 73273 - timestamp: 1695380140676 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py311he4fd1f5_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py311he4fd1f5_1.conda - sha256: 907af50734789d47b3e8b2148dde763699dc746c64e5849baf6bd720c8cd0235 - md5: 4c871d65040b8c7bbb914df7f8f11492 + - pkg:pypi/jsonschema?source=hash-mapping + size: 74256 + timestamp: 1733472818764 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + sha256: 37127133837444cf0e6d1a95ff5a505f8214ed4e89e8e9343284840e674c6891 + md5: 3b519bc21bc80e60b456f1e62962a766 depends: - - libcxx >=15.0.7 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD + - python >=3.9 + - referencing >=0.31.0 + license: MIT + license_family: MIT purls: - - pkg:pypi/kiwisolver - size: 61946 - timestamp: 1695380538042 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py312h0d7def4_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py312h0d7def4_1.conda - sha256: 07021ffc3bbf42922694c23634e028950547d088717b448b46296b3ca5a26068 - md5: 77c9d46fc8680bb08f4e1ebb6669e44e + - pkg:pypi/jsonschema-specifications?source=hash-mapping + size: 16170 + timestamp: 1733493624968 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 depends: - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver - size: 55576 - timestamp: 1695380565733 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py312h389731b_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py312h389731b_1.conda - sha256: ee1a2189dc405f59c27ee1f061076d8761684c0fcd38cccc215630d8debf9f85 - md5: 77eeca70c1c4f4187d6b199015c99ee5 + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_core-0.4.0-pyhd8ed1ab_1.conda + sha256: 82976586c5051431d2a3a9e5f2e34516779a734f6bf5507912edee4169b7ccd9 + md5: acd20924c6110dd9a454ecfd10d4417e depends: - - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python >=3.12.0rc3,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - jupyter_core + - notebook >=4.0 + - python >=3.9 + - setuptools + - tornado + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-contrib-core?source=hash-mapping + size: 20132 + timestamp: 1734637795802 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_contrib_nbextensions-0.7.0-pyhd8ed1ab_0.conda + sha256: 736c338c621d6015c1497581d34217bc1885af55d6e8720d5411edca2fc43fc6 + md5: e172ca934d0aa08617c87c5954574bbf + depends: + - ipython_genutils + - jupyter_contrib_core >=0.3.3 + - jupyter_core + - jupyter_highlight_selected_word >=0.1.1 + - jupyter_latex_envs >=1.3.8 + - jupyter_nbextensions_configurator >=0.4.0 + - lxml + - nbconvert >=4.2 + - notebook >=4.0 + - python >=2.7 + - pyyaml + - tornado + - traitlets >=4.1 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver - size: 61747 - timestamp: 1695380538266 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py312h49ebfd2_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py312h49ebfd2_1.conda - sha256: 11d9daa79051a7ae52881d11f48816366fd3d46018281431abe507da7b45f69c - md5: 21f174a5cfb5964069c374171a979157 + - pkg:pypi/jupyter-contrib-nbextensions?source=hash-mapping + size: 21371319 + timestamp: 1670068917549 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 depends: - - libcxx >=15.0.7 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver - size: 60227 - timestamp: 1695380392812 -- kind: conda - name: kiwisolver - version: 1.4.5 - build: py312h8572e83_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda - sha256: 2ffd3f6726392591c6794ab130f6701f5ffba0ec8658ef40db5a95ec8d583143 - md5: c1e71f2bc05d8e8e033aefac2c490d05 + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh5737063_1.conda + sha256: 7c903b2d62414c3e8da1f78db21f45b98de387aae195f8ca959794113ba4b3fd + md5: 46d87d1c0ea5da0aae36f77fa406e20d depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - __win + - cpython + - platformdirs >=2.5 + - python >=3.8 + - pywin32 >=300 + - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver - size: 72099 - timestamp: 1695380122482 -- kind: conda - name: krb5 - version: 1.21.2 - build: h659d440_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda - sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 - md5: cd95826dbd331ed1be26bdf401432844 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.1.2,<4.0a0 - license: MIT - license_family: MIT - size: 1371181 - timestamp: 1692097755782 -- kind: conda - name: krb5 - version: 1.21.2 - build: heb0366b_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda - sha256: 6002adff9e3dcfc9732b861730cb9e33d45fd76b2035b2cdb4e6daacb8262c0b - md5: 6e8b0f22b4eef3b3cb3849bb4c3d47f9 - depends: - - openssl >=3.1.2,<4.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - size: 710894 - timestamp: 1692098129546 -- kind: conda - name: lame - version: '3.100' - build: h166bdaf_1003 - build_number: 1003 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab - md5: a8832b479f93521a9e7b5b743803be51 - depends: - - libgcc-ng >=12 - license: LGPL-2.0-only - license_family: LGPL - size: 508258 - timestamp: 1664996250081 -- kind: conda - name: lcms2 - version: '2.16' - build: h67d730c_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - sha256: f9fd9e80e46358a57d9bb97b1e37a03da4022143b019aa3c4476d8a7795de290 - md5: d3592435917b62a8becff3a60db674f6 - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - size: 507632 - timestamp: 1701648249706 -- kind: conda - name: lcms2 - version: '2.16' - build: ha0e7c42_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 - md5: 66f6c134e76fe13cce8a9ea5814b5dd5 - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - license: MIT - license_family: MIT - size: 211959 - timestamp: 1701647962657 -- kind: conda - name: lcms2 - version: '2.16' - build: ha2f27b4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda - sha256: 222ebc0a55544b9922f61e75015d02861e65b48f12113af41d48ba0814e14e4e - md5: 1442db8f03517834843666c422238c9b - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - license: MIT - license_family: MIT - size: 224432 - timestamp: 1701648089496 -- kind: conda - name: lcms2 - version: '2.16' - build: hb7c19ff_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 - md5: 51bb7010fc86f70eee639b4bb7a894f5 + - pkg:pypi/jupyter-core?source=hash-mapping + size: 58269 + timestamp: 1727164026641 +- conda: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.7.2-py310h5588dad_0.conda + sha256: 220a6fe571d3e9a5b5f4467d7f2fb22080b96f7143c9b2703528032528338d50 + md5: 6646c59c6c096e0b99c53dc9d3deaada depends: - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - license: MIT - license_family: MIT - size: 245247 - timestamp: 1701647787198 -- kind: conda - name: ld_impl_linux-64 - version: '2.40' - build: h55db66e_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - sha256: ef969eee228cfb71e55146eaecc6af065f468cb0bc0a5239bc053b39db0b5f09 - md5: 10569984e7db886e4f1abc2b47ad79a1 - constrains: - - binutils_impl_linux-64 2.40 - license: GPL-3.0-only - license_family: GPL - size: 713322 - timestamp: 1713651222435 -- kind: conda - name: lerc - version: 4.0.0 - build: h27087fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 - md5: 76bbff344f0134279f225174e9064c8f - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: Apache-2.0 - license_family: Apache - size: 281798 - timestamp: 1657977462600 -- kind: conda - name: lerc - version: 4.0.0 - build: h63175ca_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - sha256: f4f39d7f6a2f9b407f8fb567a6c25755270421731d70f0ff331f5de4fa367488 - md5: 1900cb3cab5055833cfddb0ba233b074 - depends: - - vc >=14.2,<15 - - vs2015_runtime >=14.29.30037 - license: Apache-2.0 - license_family: Apache - size: 194365 - timestamp: 1657977692274 -- kind: conda - name: lerc - version: 4.0.0 - build: h9a09cb3_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 - md5: de462d5aacda3b30721b512c5da4e742 - depends: - - libcxx >=13.0.1 - license: Apache-2.0 - license_family: Apache - size: 215721 - timestamp: 1657977558796 -- kind: conda - name: lerc - version: 4.0.0 - build: hb486fe8_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - sha256: e41790fc0f4089726369b3c7f813117bbc14b533e0ed8b94cf75aba252e82497 - md5: f9d6a4c82889d5ecedec1d90eb673c55 - depends: - - libcxx >=13.0.1 - license: Apache-2.0 - license_family: Apache - size: 290319 - timestamp: 1657977526749 -- kind: conda - name: libasprintf - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_2.conda - sha256: 5722a4a260355c9233680a3424a977433f25826ca0a1c05af403d62b805681bc - md5: 75a6982b9ff0a8db0f53303527b07af8 - license: LGPL-2.1-or-later - size: 49778 - timestamp: 1712515968238 -- kind: conda - name: libasprintf - version: 0.22.5 - build: h661eb56_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda - sha256: 31d58af7eb54e2938123200239277f14893c5fa4b5d0280c8cf55ae10000638b - md5: dd197c968bf9760bba0031888d431ede - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LGPL-2.1-or-later - size: 43226 - timestamp: 1712512265295 -- kind: conda - name: libasprintf-devel - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libasprintf-devel-0.22.5-h5728263_2.conda - sha256: d5c711d9da4e35d29f4f2191664075c64cbf8cd481a35bf7ef3a527018eb0184 - md5: 8377da2cc31200d7181d2e48d60e4c7b - depends: - - libasprintf 0.22.5 h5728263_2 - license: LGPL-2.1-or-later - size: 36272 - timestamp: 1712516175913 -- kind: conda - name: libasprintf-devel - version: 0.22.5 - build: h661eb56_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda - sha256: 99d26d272a8203d30b3efbe734a99c823499884d7759b4291674438137c4b5ca - md5: 02e41ab5834dcdcc8590cf29d9526f50 - depends: - - libasprintf 0.22.5 h661eb56_2 - - libgcc-ng >=12 - license: LGPL-2.1-or-later - size: 34225 - timestamp: 1712512295117 -- kind: conda - name: libblas - version: 3.9.0 - build: 22_linux64_openblas - build_number: 22 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda - sha256: 082b8ac20d43a7bbcdc28b3b1cd40e4df3a8b5daf0a2d23d68953a44d2d12c1b - md5: 1a2a0cd3153464fee6646f3dd6dad9b8 - depends: - - libopenblas >=0.3.27,<0.3.28.0a0 - - libopenblas >=0.3.27,<1.0a0 - constrains: - - libcblas 3.9.0 22_linux64_openblas - - blas * openblas - - liblapacke 3.9.0 22_linux64_openblas - - liblapack 3.9.0 22_linux64_openblas + - platformdirs >=2.5 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - pywin32 >=300 + - traitlets >=5.3 + arch: x86_64 + platform: win + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 97082 + timestamp: 1710257770270 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_highlight_selected_word-0.2.0-pyhd8ed1ab_1006.conda + sha256: 92b5807f4be85581138bacc6cafcc1d395180f254e9cf3ead805fdfbe1df2861 + md5: 61fc0eb3b6533815398f4025c336b2de + depends: + - jupyter_contrib_core >=0.3 + - notebook >=4.0,<7 + - python >=3.7 + - setuptools license: BSD-3-Clause license_family: BSD - size: 14537 - timestamp: 1712542250081 -- kind: conda - name: libblas - version: 3.9.0 - build: 22_osx64_openblas - build_number: 22 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - sha256: d72060239f904b3a81d2329efcf84dc62c2dfd66dbc4efc8dcae1afdf8f02b59 - md5: b80966a8c8dd0b531f8e65f709d732e8 - depends: - - libopenblas >=0.3.27,<0.3.28.0a0 - - libopenblas >=0.3.27,<1.0a0 - constrains: - - liblapacke 3.9.0 22_osx64_openblas - - blas * openblas - - libcblas 3.9.0 22_osx64_openblas - - liblapack 3.9.0 22_osx64_openblas + purls: + - pkg:pypi/jupyter-highlight-selected-word?source=hash-mapping + size: 17153 + timestamp: 1695322547350 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_latex_envs-1.4.6-pyhd8ed1ab_1002.tar.bz2 + sha256: 4927e74b5878011771cbaebc2a119bb1066a41ceca0609e9b15dfd4c11969ba2 + md5: 4b888fd7d6b4cdb6736878b2cf8ea951 + depends: + - ipython + - jupyter_contrib_core >=0.3 + - nbconvert + - notebook >=4.0 + - python >=2.7 + - setuptools + - traitlets >=4.1 license: BSD-3-Clause license_family: BSD - size: 14749 - timestamp: 1712542279018 -- kind: conda - name: libblas - version: 3.9.0 - build: 22_osxarm64_openblas - build_number: 22 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda - sha256: 8620e13366076011cfcc6b2565c7a2d362c5d3f0423f54b9ef9bfc17b1a012a4 - md5: aeaf35355ef0f37c7c1ba35b7b7db55f - depends: - - libopenblas >=0.3.27,<0.3.28.0a0 - - libopenblas >=0.3.27,<1.0a0 - constrains: - - blas * openblas - - liblapack 3.9.0 22_osxarm64_openblas - - liblapacke 3.9.0 22_osxarm64_openblas - - libcblas 3.9.0 22_osxarm64_openblas + purls: + - pkg:pypi/jupyter-latex-envs?source=hash-mapping + size: 752235 + timestamp: 1614852344783 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_nbextensions_configurator-0.6.1-pyhd8ed1ab_0.conda + sha256: 027fa24402a5fab42658dc4e98a0294800b59c388c7ff6d77a6b55670e73c07e + md5: 7fc02dc73038b4c3cb0cf2f4a5e94f0f + depends: + - jupyter_contrib_core >=0.3.3 + - jupyter_core + - notebook >=6.0 + - python >=3.6 + - pyyaml + - tornado + - traitlets license: BSD-3-Clause license_family: BSD - size: 14824 - timestamp: 1712542396471 -- kind: conda - name: libblas - version: 3.9.0 - build: 22_win64_mkl - build_number: 22 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - sha256: 4faab445cbd9a13736a206b98fde962d0a9fa80dcbd38300951a8b2863e7c35c - md5: 65c56ecdeceffd6c32d3d54db7e02c6e - depends: - - mkl 2024.1.0 h66d3029_692 + purls: + - pkg:pypi/jupyter-nbextensions-configurator?source=hash-mapping + size: 461142 + timestamp: 1670793882838 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 + md5: fd312693df06da3578383232528c468d + depends: + - pygments >=2.4.1,<3 + - python >=3.9 constrains: - - liblapacke 3.9.0 22_win64_mkl - - blas * mkl - - libcblas 3.9.0 22_win64_mkl - - liblapack 3.9.0 22_win64_mkl + - jupyterlab >=4.0.8,<5.0.0 license: BSD-3-Clause license_family: BSD - size: 5182602 - timestamp: 1712542984136 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: h0dc2134_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda - sha256: f57c57c442ef371982619f82af8735f93a4f50293022cfd1ffaf2ff89c2e0b2a - md5: 9e6c31441c9aa24e41ace40d6151aab6 - license: MIT - license_family: MIT - size: 67476 - timestamp: 1695990207321 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: hb547adb_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hb547adb_1.conda - sha256: 556f0fddf4bd4d35febab404d98cb6862ce3b7ca843e393da0451bfc4654cf07 - md5: cd68f024df0304be41d29a9088162b02 - license: MIT - license_family: MIT - size: 68579 - timestamp: 1695990426128 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda - sha256: f75fed29b0cc503d1b149a4945eaa32df56e19da5e2933de29e8f03947203709 - md5: f77f319fb82980166569e1280d5b2864 + purls: + - pkg:pypi/jupyterlab-pygments?source=hash-mapping + size: 18711 + timestamp: 1733328194037 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda + sha256: cfbd169b6d64c983e74c5fdfbaac1128209017ebd0992f163c13dadea71f606e + md5: f5abe5ee23914325837250927f20e623 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - markdown-it-py >=1.0 + - mdit-py-plugins + - nbformat + - packaging + - python >=3.9 + - pyyaml + - tomli license: MIT license_family: MIT - size: 70598 - timestamp: 1695990405143 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda - sha256: 40f29d1fab92c847b083739af86ad2f36d8154008cf99b64194e4705a1725d78 - md5: aec6c91c7371c26392a06708a73c70e5 + purls: + - pkg:pypi/jupytext?source=hash-mapping + size: 104934 + timestamp: 1739265244139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT - size: 69403 - timestamp: 1695990007212 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: h0dc2134_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda - sha256: b11939c4c93c29448660ab5f63273216969d1f2f315dd9be60f3c43c4e61a50c - md5: 9ee0bab91b2ca579e10353738be36063 + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + sha256: 83b52685a4ce542772f0892a0f05764ac69d57187975579a0835ff255ae3ef9c + md5: d4765c524b1d91567886bde656fb514b depends: - - libbrotlicommon 1.1.0 h0dc2134_1 + - __osx >=10.13 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: osx license: MIT license_family: MIT - size: 30327 - timestamp: 1695990232422 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: hb547adb_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hb547adb_1.conda - sha256: c1c85937828ad3bc434ac60b7bcbde376f4d2ea4ee42d15d369bf2a591775b4a - md5: ee1a519335cc10d0ec7e097602058c0a + purls: [] + size: 1185323 + timestamp: 1719463492984 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 depends: - - libbrotlicommon 1.1.0 hb547adb_1 + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx license: MIT license_family: MIT - size: 28928 - timestamp: 1695990463780 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda - sha256: 1b352ee05931ea24c11cd4a994d673890fd1cc690c21e023e736bdaac2632e93 - md5: 19ce3e1dacc7912b3d6ff40690ba9ae0 + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + sha256: 18e8b3430d7d232dad132f574268f56b3eb1a19431d6d5de8c53c29e6c18fa81 + md5: 31aec030344e962fbd7dbbbbd68e60a9 depends: - - libbrotlicommon 1.1.0 hcfcfb64_1 + - openssl >=3.3.1,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win license: MIT license_family: MIT - size: 32788 - timestamp: 1695990443165 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda - sha256: 86fc861246fbe5ad85c1b6b3882aaffc89590a48b42d794d3d5c8e6d99e5f926 - md5: f07002e225d7a60a694d42a7bf5ff53f - depends: - - libbrotlicommon 1.1.0 hd590300_1 - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 32775 - timestamp: 1695990022788 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: h0dc2134_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda - sha256: bc964c23e1a60ca1afe7bac38a9c1f2af3db4a8072c9f2eac4e4de537a844ac7 - md5: 8a421fe09c6187f0eb5e2338a8a8be6d + purls: [] + size: 712034 + timestamp: 1719463874284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 depends: - - libbrotlicommon 1.1.0 h0dc2134_1 - license: MIT - license_family: MIT - size: 299092 - timestamp: 1695990259225 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: hb547adb_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hb547adb_1.conda - sha256: 690dfc98e891ee1871c54166d30f6e22edfc2d7d6b29e7988dde5f1ce271c81a - md5: d7e077f326a98b2cc60087eaff7c730b + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 669211 + timestamp: 1729655358674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda + build_number: 20 + sha256: 8a0ee1de693a9b3da4a11b95ec81b40dd434bd01fa1f5f38f8268cd2146bf8f0 + md5: 2b7bb4f7562c8cf334fc2e20c2d28abc + depends: + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + constrains: + - liblapacke 3.9.0 20_linux64_openblas + - libcblas 3.9.0 20_linux64_openblas + - blas * openblas + - liblapack 3.9.0 20_linux64_openblas + - mkl <2025 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14433 + timestamp: 1700568383457 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda + build_number: 20 + sha256: 89cac4653b52817d44802d96c13e5f194320e2e4ea805596641d0f3e22e32525 + md5: 1673476d205d14a9042172be795f63cb depends: - - libbrotlicommon 1.1.0 hb547adb_1 - license: MIT - license_family: MIT - size: 280943 - timestamp: 1695990509392 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda - sha256: eae6b76154e594c6d211160c6d1aeed848672618152a562e0eabdfa641d34aca - md5: 71e890a0b361fd58743a13f77e1506b7 + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + constrains: + - blas * openblas + - liblapack 3.9.0 20_osx64_openblas + - liblapacke 3.9.0 20_osx64_openblas + - libcblas 3.9.0 20_osx64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14739 + timestamp: 1700568675962 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda + build_number: 20 + sha256: 5b5b8394352c8ca06b15dcc9319d0af3e9f1dc03fc0a6f6deef05d664d6b763a + md5: 49bc8dec26663241ee064b2d7116ec2d depends: - - libbrotlicommon 1.1.0 hcfcfb64_1 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - size: 246515 - timestamp: 1695990479484 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda - sha256: f751b8b1c4754a2a8dfdc3b4040fa7818f35bbf6b10e905a47d3a194b746b071 - md5: 5fc11c6020d421960607d821310fcd4d + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + constrains: + - liblapack 3.9.0 20_osxarm64_openblas + - liblapacke 3.9.0 20_osxarm64_openblas + - libcblas 3.9.0 20_osxarm64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14722 + timestamp: 1700568881837 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-26_win64_mkl.conda + build_number: 26 + sha256: d631993a5cf5b8d3201f881084fce7ff6a26cd49883e189bf582cd0b7975c80a + md5: ecfe732dbad1be001826fdb7e5e891b5 depends: - - libbrotlicommon 1.1.0 hd590300_1 - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 282523 - timestamp: 1695990038302 -- kind: conda - name: libcap - version: '2.69' - build: h0f662aa_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda - sha256: 942f9564b4228609f017b6617425d29a74c43b8a030e12239fa4458e5cb6323c - md5: 25cb5999faa414e5ccb2c1388f62d3d5 - depends: - - attr >=2.5.1,<2.6.0a0 - - libgcc-ng >=12 + - mkl 2024.2.2 h66d3029_15 + constrains: + - liblapacke 3.9.0 26_win64_mkl + - liblapack 3.9.0 26_win64_mkl + - blas * mkl + - libcblas 3.9.0 26_win64_mkl license: BSD-3-Clause license_family: BSD - size: 100582 - timestamp: 1684162447012 -- kind: conda - name: libcblas - version: 3.9.0 - build: 22_linux64_openblas - build_number: 22 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - sha256: da1b2faa017663c8f5555c1c5518e96ac4cd8e0be2a673c1c9e2cb8507c8fe46 - md5: 4b31699e0ec5de64d5896e580389c9a1 - depends: - - libblas 3.9.0 22_linux64_openblas + purls: [] + size: 3733122 + timestamp: 1734432745507 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda + build_number: 20 + sha256: 0e34fb0f82262f02fcb279ab4a1db8d50875dc98e3019452f8f387e6bf3c0247 + md5: 36d486d72ab64ffea932329a1d3729a3 + depends: + - libblas 3.9.0 20_linux64_openblas constrains: - - liblapack 3.9.0 22_linux64_openblas + - liblapacke 3.9.0 20_linux64_openblas - blas * openblas - - liblapacke 3.9.0 22_linux64_openblas + - liblapack 3.9.0 20_linux64_openblas + - mkl <2025 license: BSD-3-Clause license_family: BSD - size: 14438 - timestamp: 1712542270166 -- kind: conda - name: libcblas - version: 3.9.0 - build: 22_osx64_openblas - build_number: 22 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - sha256: 6a2ba9198e2320c3e22fe3d121310cf8a8ac663e94100c5693b34523fcb3cc04 - md5: b9fef82772330f61b2b0201c72d2c29b - depends: - - libblas 3.9.0 22_osx64_openblas + purls: [] + size: 14383 + timestamp: 1700568410580 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda + build_number: 20 + sha256: b0a4eab6d22b865d9b0e39f358f17438602621709db66b8da159197bedd2c5eb + md5: b324ad206d39ce529fb9073f9d062062 + depends: + - libblas 3.9.0 20_osx64_openblas constrains: - - liblapacke 3.9.0 22_osx64_openblas + - liblapack 3.9.0 20_osx64_openblas + - liblapacke 3.9.0 20_osx64_openblas - blas * openblas - - liblapack 3.9.0 22_osx64_openblas license: BSD-3-Clause license_family: BSD - size: 14636 - timestamp: 1712542311437 -- kind: conda - name: libcblas - version: 3.9.0 - build: 22_osxarm64_openblas - build_number: 22 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda - sha256: 2c7902985dc77db1d7252b4e838d92a34b1729799ae402988d62d077868f6cca - md5: 37b3682240a69874a22658dedbca37d9 - depends: - - libblas 3.9.0 22_osxarm64_openblas + purls: [] + size: 14648 + timestamp: 1700568722960 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda + build_number: 20 + sha256: d3a74638f60e034202e373cf2950c69a8d831190d497881d13cbf789434d2489 + md5: 89f4718753c08afe8cda4dd5791ba94c + depends: + - libblas 3.9.0 20_osxarm64_openblas constrains: + - liblapack 3.9.0 20_osxarm64_openblas + - liblapacke 3.9.0 20_osxarm64_openblas - blas * openblas - - liblapack 3.9.0 22_osxarm64_openblas - - liblapacke 3.9.0 22_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14741 - timestamp: 1712542420590 -- kind: conda - name: libcblas - version: 3.9.0 - build: 22_win64_mkl - build_number: 22 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda - sha256: 5503273924650330dc03edd1eb01ec4020b9967b5a4cafc377ba20b976d15590 - md5: 336c93ab102846c6131cf68e722a68f1 - depends: - - libblas 3.9.0 22_win64_mkl + purls: [] + size: 14642 + timestamp: 1700568912840 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-26_win64_mkl.conda + build_number: 26 + sha256: 66699c4f84fd36b67a34a7ac59fb86e73ee0c5b3c3502441041c8dd51f0a7d49 + md5: 652f3adcb9d329050a325416edb14246 + depends: + - libblas 3.9.0 26_win64_mkl constrains: - - liblapacke 3.9.0 22_win64_mkl + - liblapacke 3.9.0 26_win64_mkl + - liblapack 3.9.0 26_win64_mkl - blas * mkl - - liblapack 3.9.0 22_win64_mkl license: BSD-3-Clause license_family: BSD - size: 5191513 - timestamp: 1712543043641 -- kind: conda - name: libclang-cpp15 - version: 15.0.7 - build: default_h127d8a8_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda - sha256: 9b0238e705a33da74ca82efd03974f499550f7dada1340cc9cb7c35a92411ed8 - md5: d0a9633b53cdc319b8a1a532ae7822b8 - depends: - - libgcc-ng >=12 - - libllvm15 >=15.0.7,<15.1.0a0 - - libstdcxx-ng >=12 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 17206402 - timestamp: 1711063711931 -- kind: conda - name: libclang13 - version: 18.1.4 - build: default_h5d6823c_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.4-default_h5d6823c_0.conda - sha256: 3ec4de4613285b971350c9588125164ed2753bdabfd3a0f6378b7bc832a5a859 - md5: 2c3b47879fc036ef57f3056834737ecb - depends: - - libgcc-ng >=12 - - libllvm18 >=18.1.4,<18.2.0a0 - - libstdcxx-ng >=12 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 11043670 - timestamp: 1714511189746 -- kind: conda - name: libclang13 - version: 18.1.4 - build: default_hf64faad_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.4-default_hf64faad_0.conda - sha256: 126ad517d9d85371566f6668e5207f69bc43e22dea4663674ebd90e23c36f38f - md5: eb322d98026526776d1464c2b04ddbe3 - depends: - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - - zstd >=1.5.5,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 25328763 - timestamp: 1714517601407 -- kind: conda - name: libclang13 - version: 18.1.5 - build: default_h5d6823c_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.5-default_h5d6823c_0.conda - sha256: 60c7cdd313566033910bce884b879f39468eb966b2ac61ea828fe432b8a084c5 - md5: 60c39a00b694c98da03f67a3ba1d7499 + purls: [] + size: 3732146 + timestamp: 1734432785653 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.6-hf95d169_1.conda + sha256: c40661648c34c08e21b69e0eec021ccaf090ffff070d2a9cbcb1519e1b310568 + md5: 1bad6c181a0799298aad42fc5a7e98b7 depends: - - libgcc-ng >=12 - - libllvm18 >=18.1.5,<18.2.0a0 - - libstdcxx-ng >=12 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 11052898 - timestamp: 1714870310416 -- kind: conda - name: libclang13 - version: 18.1.5 - build: default_hf64faad_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.5-default_hf64faad_0.conda - sha256: 6c2e0287f1da7c3dbdbfe6710f85b321848d2eee249405cf80e9e8c08f058c44 - md5: 8a662434c6be1f40e2d5d2506d05a41d - depends: - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - - zstd >=1.5.6,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 25325912 - timestamp: 1714873235951 -- kind: conda - name: libcups - version: 2.3.3 - build: h4637d8d_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 - md5: d4529f4dff3057982a7617c7ac58fde3 - depends: - - krb5 >=1.21.1,<1.22.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - license: Apache-2.0 - license_family: Apache - size: 4519402 - timestamp: 1689195353551 -- kind: conda - name: libcxx - version: 16.0.6 - build: h4653b0c_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - sha256: 11d3fb51c14832d9e4f6d84080a375dec21ea8a3a381a1910e67ff9cedc20355 - md5: 9d7d724faf0413bf1dbc5a85935700c8 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 1160232 - timestamp: 1686896993785 -- kind: conda - name: libcxx - version: 16.0.6 - build: hd57cbcb_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - sha256: 9063271847cf05f3a6cc6cae3e7f0ced032ab5f3a3c9d3f943f876f39c5c2549 - md5: 7d6972792161077908b62971802f289a + - __osx >=10.13 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 1142172 - timestamp: 1686896907750 -- kind: conda - name: libcxx - version: 17.0.6 - build: h5f092b4_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda - sha256: 119d3d9306f537d4c89dc99ed99b94c396d262f0b06f7833243646f68884f2c2 - md5: a96fd5dda8ce56c86a971e0fa02751d0 + purls: [] + size: 527370 + timestamp: 1734494305140 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + sha256: 2b2443404503cd862385fd2f2a2c73f9624686fd1e5a45050b4034cfc06904ec + md5: ce5252d8db110cdb4ae4173d0a63c7c5 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 1248885 - timestamp: 1715020154867 -- kind: conda - name: libcxx - version: 17.0.6 - build: h88467a6_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-17.0.6-h88467a6_0.conda - sha256: e7b57062c1edfcbd13d2129467c94cbff7f0a988ee75782bf48b1dc0e6300b8b - md5: 0fe355aecb8d24b8bc07c763209adbd9 + purls: [] + size: 520992 + timestamp: 1734494699681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + sha256: 6cc49785940a99e6a6b8c6edbb15f44c2dd6c789d9c283e5ee7bdfedd50b4cd6 + md5: 1f4ed31220402fcddc083b4bff406868 depends: + - ncurses - __osx >=10.13 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 1249309 - timestamp: 1715020018902 -- kind: conda - name: libdeflate - version: '1.20' - build: h49d49c5_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda - sha256: 8c2087952db55c4118dd2e29381176a54606da47033fd61ebb1b0f4391fcd28d - md5: d46104f6a896a0bc6a1d37b88b2edf5c - license: MIT - license_family: MIT - size: 70364 - timestamp: 1711196727346 -- kind: conda - name: libdeflate - version: '1.20' - build: h93a5062_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.20-h93a5062_0.conda - sha256: 6d16cccb141b6bb05c38107b335089046664ea1d6611601d3f6e7e4227a99925 - md5: 97efeaeba2a9a82bdf46fc6d025e3a57 - license: MIT - license_family: MIT - size: 54481 - timestamp: 1711196723486 -- kind: conda - name: libdeflate - version: '1.20' - build: hcfcfb64_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda - sha256: 6628a5b76ad70c1a0909563c637ddc446ee824739ba7c348d4da2f0aa6ac9527 - md5: b12b5bde5eb201a1df75e49320cc938a - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - size: 155358 - timestamp: 1711197066985 -- kind: conda - name: libdeflate - version: '1.20' - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda - sha256: f8e0f25c382b1d0b87a9b03887a34dbd91485453f1ea991fef726dba57373612 - md5: 8e88f9389f1165d7c0936fe40d9a9a79 - depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 71500 - timestamp: 1711196523408 -- kind: conda - name: libedit - version: 3.1.20191231 - build: he28a2e2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf - md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 - depends: - - libgcc-ng >=7.5.0 - - ncurses >=6.2,<7.0.0a0 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: osx license: BSD-2-Clause license_family: BSD - size: 123878 - timestamp: 1597616541093 -- kind: conda - name: libevent - version: 2.1.12 - build: hf998b51_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 - md5: a1cfcc585f0c42bf8d5546bb1dfb668d + purls: [] + size: 115563 + timestamp: 1738479554273 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b depends: - - libgcc-ng >=12 - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause license_family: BSD - size: 427426 - timestamp: 1685725977222 -- kind: conda - name: libexpat - version: 2.6.2 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 - md5: e7ba12deb7020dd080c6c70e7b6f6a3d + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 depends: - - libgcc-ng >=12 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - size: 73730 - timestamp: 1710362120304 -- kind: conda - name: libexpat - version: 2.6.2 - build: h63175ca_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 - md5: bc592d03f62779511d392c175dcece64 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - size: 139224 - timestamp: 1710362609641 -- kind: conda - name: libexpat - version: 2.6.2 - build: h73e2aa4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - sha256: a188a77b275d61159a32ab547f7d17892226e7dac4518d2c6ac3ac8fc8dfde92 - md5: 3d1d51c8f716d97c864d12f7af329526 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - size: 69246 - timestamp: 1710362566073 -- kind: conda - name: libexpat - version: 2.6.2 - build: hebf3989_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - sha256: ba7173ac30064ea901a4c9fb5a51846dcc25512ceb565759be7d18cbf3e5415e - md5: e3cde7cfa87f82f7cb13d482d5e0ad09 - constrains: - - expat 2.6.2.* + - libgcc-ng >=9.4.0 license: MIT license_family: MIT - size: 63655 - timestamp: 1710362424980 -- kind: conda - name: libffi - version: 3.4.2 - build: h0d85af4_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + purls: [] + size: 58292 + timestamp: 1636488182923 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f md5: ccb34fb14960ad8b125962d3d79b31a9 license: MIT license_family: MIT + purls: [] size: 51348 timestamp: 1636488394370 -- kind: conda - name: libffi - version: 3.4.2 - build: h3422bc3_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca md5: 086914b672be056eb70fd4285b6783b6 license: MIT license_family: MIT + purls: [] size: 39020 timestamp: 1636488587153 -- kind: conda - name: libffi - version: 3.4.2 - build: h7f98852_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - size: 58292 - timestamp: 1636488182923 -- kind: conda - name: libffi - version: 3.4.2 - build: h8ffe710_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 md5: 2c96d1b6915b408893f9472569dee135 depends: @@ -5110,429 +4008,125 @@ packages: - vs2015_runtime >=14.16.27012 license: MIT license_family: MIT + purls: [] size: 42063 timestamp: 1636489106777 -- kind: conda - name: libflac - version: 1.4.3 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d - md5: ee48bf17cc83a00f59ca1494d5646869 - depends: - - gettext >=0.21.1,<1.0a0 - - libgcc-ng >=12 - - libogg 1.3.* - - libogg >=1.3.4,<1.4.0a0 - - libstdcxx-ng >=12 - license: BSD-3-Clause - license_family: BSD - size: 394383 - timestamp: 1687765514062 -- kind: conda - name: libgcc-ng - version: 13.2.0 - build: h77fa898_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda - sha256: 62af2b89acbe74a21606c8410c276e57309c0a2ab8a9e8639e3c8131c0b60c92 - md5: 72ec1b1b04c4d15d4204ece1ecea5978 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df depends: - _libgcc_mutex 0.1 conda_forge - _openmp_mutex >=4.5 constrains: - - libgomp 13.2.0 h77fa898_7 + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 775806 - timestamp: 1715016057793 -- kind: conda - name: libgcc-ng - version: 13.2.0 - build: hc881cc4_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda - sha256: 836a0057525f1414de43642d357d0ab21ac7f85e24800b010dbc17d132e6efec - md5: df88796bd09a0d2ed292e59101478ad8 - depends: - - _libgcc_mutex 0.1 conda_forge - - _openmp_mutex >=4.5 - constrains: - - libgomp 13.2.0 hc881cc4_6 + purls: [] + size: 848745 + timestamp: 1729027721139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 777315 - timestamp: 1713755001744 -- kind: conda - name: libgcrypt - version: 1.10.3 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda - sha256: d1bd47faa29fec7288c7b212198432b07f890d3d6f646078da93b059c2e9daff - md5: 32d16ad533c59bb0a3c5ffaf16110829 - depends: - - libgcc-ng >=12 - - libgpg-error >=1.47,<2.0a0 - license: LGPL-2.1-or-later AND GPL-2.0-or-later - license_family: GPL - size: 634887 - timestamp: 1701383493365 -- kind: conda - name: libgettextpo - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda - sha256: 445ecfc4bf5b474c2ac79f716dcb8459a08a532ab13a785744665f086ef94c95 - md5: f4c826b19bf1ccee2a63a2c685039728 - depends: - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - license: GPL-3.0-or-later - license_family: GPL - size: 171210 - timestamp: 1712516290149 -- kind: conda - name: libgettextpo - version: 0.22.5 - build: h59595ed_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda - sha256: e2f784564a2bdc6f753f00f63cc77c97601eb03bc89dccc4413336ec6d95490b - md5: 172bcc51059416e7ce99e7b528cede83 - depends: - - libgcc-ng >=12 - license: GPL-3.0-or-later - license_family: GPL - size: 170582 - timestamp: 1712512286907 -- kind: conda - name: libgettextpo-devel - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda - sha256: bcee730b2be23ba9aa5de3471b78c4644d3b17d5a71e7fdc59bb40e252edb2f7 - md5: 6f42ec61abc6d52a4079800a640319c5 - depends: - - libgettextpo 0.22.5 h5728263_2 - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - license: GPL-3.0-or-later - license_family: GPL - size: 40312 - timestamp: 1712516436925 -- kind: conda - name: libgettextpo-devel - version: 0.22.5 - build: h59595ed_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda - sha256: 695eb2439ad4a89e4205dd675cc52fba5cef6b5d41b83f07cdbf4770a336cc15 - md5: b63d9b6da3653179a278077f0de20014 - depends: - - libgcc-ng >=12 - - libgettextpo 0.22.5 h59595ed_2 - license: GPL-3.0-or-later + purls: [] + size: 54142 + timestamp: 1729027726517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda + sha256: e05263e8960da03c341650f2a3ffa4ccae4e111cb198e8933a2908125459e5a6 + md5: fb54c4ea68b460c278d26eea89cfbcc3 + depends: + - libgfortran5 14.2.0 hf1ad2bd_2 + constrains: + - libgfortran-ng ==14.2.0=*_2 + license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 36758 - timestamp: 1712512303244 -- kind: conda - name: libgfortran - version: 5.0.0 - build: 13_2_0_h97931a8_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + purls: [] + size: 53733 + timestamp: 1740240690977 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda sha256: 4874422e567b68334705c135c17e5acdca1404de8255673ce30ad3510e00be0d md5: 0b6e23a012ee7a9a5f6b244f5a92c1d5 depends: - libgfortran5 13.2.0 h2873a65_3 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 110106 timestamp: 1707328956438 -- kind: conda - name: libgfortran - version: 5.0.0 - build: 13_2_0_hd922786_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b md5: 4a55d9e169114b2b90d3ec4604cd7bbf depends: - libgfortran5 13.2.0 hf226fd6_3 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + purls: [] size: 110233 timestamp: 1707330749033 -- kind: conda - name: libgfortran-ng - version: 13.2.0 - build: h69a702a_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda - sha256: 5e436753c55d81005e9383d7a8ec14298ebd35029d148db7e03c4834ffca54ee - md5: 3666a850342f8f3be88f9a93d948d027 - depends: - - libgfortran5 13.2.0 h43f5ff8_6 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 24183 - timestamp: 1713755271389 -- kind: conda - name: libgfortran-ng - version: 13.2.0 - build: h69a702a_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda - sha256: a588e69f96b8e0983a8cdfdbf1dc75eb48189f5420ec71150c8d8cdc0a811a9b - md5: 1b84f26d9f4f6026e179e7805d5a15cd - depends: - - libgfortran5 13.2.0 hca663fb_7 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 24314 - timestamp: 1715016272844 -- kind: conda - name: libgfortran5 - version: 13.2.0 - build: h2873a65_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - sha256: da3db4b947e30aec7596a3ef92200d17e774cccbbf7efc47802529a4ca5ca31b - md5: e4fb4d23ec2870ff3c40d10afe305aec - depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 5.0.0 13_2_0_*_3 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1571379 - timestamp: 1707328880361 -- kind: conda - name: libgfortran5 - version: 13.2.0 - build: h43f5ff8_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda - sha256: 5da2abd9e2c09ec8566fbacb237926b532f6629871ff2733c90a0be77b77679e - md5: e54a5ddc67e673f9105cf2a2e9c070b0 - depends: - - libgcc-ng >=13.2.0 - constrains: - - libgfortran-ng 13.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1442624 - timestamp: 1713755021286 -- kind: conda - name: libgfortran5 - version: 13.2.0 - build: hca663fb_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda - sha256: 754ab038115edce550fdccdc9ddf7dead2fa8346b8cdd4428c59ae1e83293978 - md5: c0bd771f09a326fdcd95a60b617795bf - depends: - - libgcc-ng >=13.2.0 - constrains: - - libgfortran-ng 13.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1441361 - timestamp: 1715016068766 -- kind: conda - name: libgfortran5 - version: 13.2.0 - build: hf226fd6_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a - md5: 66ac81d54e95c534ae488726c1f698ea +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_2.conda + sha256: 688a5968852e677d2a64974c8869ffb120eac21997ced7d15c599f152ef6857e + md5: 4056c857af1a99ee50589a941059ec55 depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 5.0.0 13_2_0_*_3 + - libgfortran 14.2.0 h69a702a_2 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 997381 - timestamp: 1707330687590 -- kind: conda - name: libglib - version: 2.80.0 - build: h39d0aa6_6 - build_number: 6 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_6.conda - sha256: 87772cdcfb292a64ddd9e737c5deaaf671c7cd82b22ad70c8a8a9f1f34074fb5 - md5: cd5c6efbe213c089f78575c98ab9a0ed - depends: - - libffi >=3.4,<4.0a0 - - libiconv >=1.17,<2.0a0 - - libintl >=0.22.5,<1.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - pcre2 >=10.43,<10.44.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - glib 2.80.0 *_6 - license: LGPL-2.1-or-later - size: 3740691 - timestamp: 1713639713931 -- kind: conda - name: libglib - version: 2.80.0 - build: hf2295e7_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_6.conda - sha256: d2867a1515676f3b64265420598badb2e4ad2369d85237fb276173a99959eb37 - md5: 9342e7c44c38bea649490f72d92c382d - depends: - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - pcre2 >=10.43,<10.44.0a0 - constrains: - - glib 2.80.0 *_6 - license: LGPL-2.1-or-later - size: 3942450 - timestamp: 1713639388280 -- kind: conda - name: libglib - version: 2.80.2 - build: h0df6a38_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.2-h0df6a38_0.conda - sha256: 941bbe089a7a87fbe88324bfc7970a1688c7a765490e25b829ff73c7abc3fc5a - md5: ef9ae80bb2a15aee7a30180c057678ea - depends: - - libffi >=3.4,<4.0a0 - - libiconv >=1.17,<2.0a0 - - libintl >=0.22.5,<1.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - pcre2 >=10.43,<10.44.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + purls: [] + size: 53781 + timestamp: 1740240884760 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda + sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c + md5: 556a4fdfac7287d349b8f09aba899693 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.2.0 constrains: - - glib 2.80.2 *_0 - license: LGPL-2.1-or-later - size: 3749179 - timestamp: 1715253077632 -- kind: conda - name: libglib - version: 2.80.2 - build: hf974151_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda - sha256: 93e03b6cf4765bc06d64fa3dac65f22c53ae4a30247bb0e2dea0bd9c47a3fb26 - md5: 72724f6a78ecb15559396966226d5838 + - libgfortran 14.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1461978 + timestamp: 1740240671964 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + sha256: da3db4b947e30aec7596a3ef92200d17e774cccbbf7efc47802529a4ca5ca31b + md5: e4fb4d23ec2870ff3c40d10afe305aec depends: - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - pcre2 >=10.43,<10.44.0a0 + - llvm-openmp >=8.0.0 constrains: - - glib 2.80.2 *_0 - license: LGPL-2.1-or-later - size: 3912673 - timestamp: 1715252654366 -- kind: conda - name: libgomp - version: 13.2.0 - build: h77fa898_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda - sha256: 781444fa069d3b50e8ed667b750571cacda785761c7fc2a89ece1ac49693d4ad - md5: abf3fec87c2563697defa759dec3d639 + - libgfortran 5.0.0 13_2_0_*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1571379 + timestamp: 1707328880361 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea depends: - - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 422336 - timestamp: 1715015995979 -- kind: conda - name: libgomp - version: 13.2.0 - build: hc881cc4_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda - sha256: e722b19b23b31a14b1592d5eceabb38dc52452ff5e4d346e330526971c22e52a - md5: aae89d3736661c36a5591788aebd0817 + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 depends: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 422363 - timestamp: 1713754915251 -- kind: conda - name: libgpg-error - version: '1.49' - build: h4f305b6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda - sha256: b2664c2c11211a63856f23278efb49d3e65d902297989a0c12dcd228b5d97110 - md5: dfcfd72c7a430d3616763ecfbefe4ca9 - depends: - - gettext - - libasprintf >=0.22.5,<1.0a0 - - libgcc-ng >=12 - - libgettextpo >=0.22.5,<1.0a0 - - libstdcxx-ng >=12 - license: GPL-2.0-only - license_family: GPL - size: 263319 - timestamp: 1714121531915 -- kind: conda - name: libhwloc - version: 2.10.0 - build: default_h2fffb23_1000 - build_number: 1000 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda - sha256: e0d75da50e67a81e3cb37e2ee3b0d6ddc6543ec0f7b3828f884558552a1c4d93 - md5: ee944f0d41d9e2048f9d7492c1623ca3 - depends: - - libxml2 >=2.12.6,<3.0a0 - - pthreads-win32 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-3-Clause - license_family: BSD - size: 2376728 - timestamp: 1711491473761 -- kind: conda - name: libhwloc - version: 2.10.0 - build: default_h8125262_1001 - build_number: 1001 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h8125262_1001.conda - sha256: 7f1aa1b071269df72e88297c046ec153b7f9a81e6f135d2da4401c96f41b5052 - md5: e761885eb4c181074d172220d46319a0 + purls: [] + size: 460992 + timestamp: 1729027639220 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_hc8275d1_1000.conda + sha256: 29db3126762be449bf137d0ce6662e0c95ce79e83a0685359012bb86c9ceef0a + md5: 2805c2eb3a74df931b3e2b724fcb965e depends: - libxml2 >=2.12.7,<3.0a0 - pthreads-win32 @@ -5541,1115 +4135,1096 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - size: 2373948 - timestamp: 1715973819139 -- kind: conda - name: libiconv - version: '1.17' - build: hcfcfb64_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - sha256: 5f844dd19b046d43174ad80c6ea75b5d504020e3b63cfbc4ace97b8730d35c7b - md5: e1eb10b1cca179f2baa3601e4efc8712 + purls: [] + size: 2389010 + timestamp: 1727380221363 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux license: LGPL-2.1-only - size: 636146 - timestamp: 1702682547199 -- kind: conda - name: libiconv - version: '1.17' - build: hd590300_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 - md5: d66573916ffcf376178462f1b61c941e + purls: [] + size: 713084 + timestamp: 1740128065462 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h4b5e92a_1.conda + sha256: c2a9c65a245c7bcb8c17c94dd716dad2d42b7c98e0c17cc5553a5c60242c4dda + md5: 6283140d7b2b55b6b095af939b71b13f depends: - - libgcc-ng >=12 + - __osx >=10.13 + arch: x86_64 + platform: osx license: LGPL-2.1-only - size: 705775 - timestamp: 1702682170569 -- kind: conda - name: libintl - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda - sha256: 1b95335af0a3e278b31e16667fa4e51d1c3f5e22d394d982539dfd5d34c5ae19 - md5: aa622c938af057adc119f8b8eecada01 - depends: - - libiconv >=1.17,<2.0a0 - license: LGPL-2.1-or-later - size: 95745 - timestamp: 1712516102666 -- kind: conda - name: libintl-devel - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_2.conda - sha256: 6164fd51abfc7294477c58da77ee1ff9ebc63b9a33404b646407f7fbc3cc7d0d - md5: a2ad82fae23975e4ccbfab2847d31d48 + purls: [] + size: 669052 + timestamp: 1740128415026 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda + sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 + md5: 450e6bdc0c7d986acf7b8443dce87111 depends: - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - license: LGPL-2.1-or-later - size: 40772 - timestamp: 1712516363413 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: h0dc2134_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - sha256: d9572fd1024adc374aae7c247d0f29fdf4b122f1e3586fe62acc18067f40d02f - md5: 72507f8e3961bc968af17435060b6dd6 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - size: 579748 - timestamp: 1694475265912 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: hb547adb_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 - md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - size: 547541 - timestamp: 1694475104253 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - sha256: 4e7808e3098b4b4ed7e287f63bb24f9045cc4d95bfd39f0db870fc2837d74dff - md5: 3f1b948619c45b1ca714d60c7389092c + - __osx >=11.0 + arch: arm64 + platform: osx + license: LGPL-2.1-only + purls: [] + size: 681804 + timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda + sha256: 5f844dd19b046d43174ad80c6ea75b5d504020e3b63cfbc4ace97b8730d35c7b + md5: e1eb10b1cca179f2baa3601e4efc8712 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - size: 822966 - timestamp: 1694475223854 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f - md5: ea25936bb4080d843790b586850f82b8 + license: LGPL-2.1-only + purls: [] + size: 636146 + timestamp: 1702682547199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda + build_number: 20 + sha256: ad7745b8d0f2ccb9c3ba7aaa7167d62fc9f02e45eb67172ae5f0dfb5a3b1a2cc + md5: 6fabc51f5e647d09cc010c40061557e0 depends: - - libgcc-ng >=12 + - libblas 3.9.0 20_linux64_openblas constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - size: 618575 - timestamp: 1694474974816 -- kind: conda - name: liblapack - version: 3.9.0 - build: 22_linux64_openblas - build_number: 22 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda - sha256: db246341d42f9100d45adeb1a7ba8b1ef5b51ceb9056fd643e98046a3259fde6 - md5: b083767b6c877e24ee597d93b87ab838 - depends: - - libblas 3.9.0 22_linux64_openblas - constrains: - - libcblas 3.9.0 22_linux64_openblas + - liblapacke 3.9.0 20_linux64_openblas + - libcblas 3.9.0 20_linux64_openblas - blas * openblas - - liblapacke 3.9.0 22_linux64_openblas + - mkl <2025 license: BSD-3-Clause license_family: BSD - size: 14471 - timestamp: 1712542277696 -- kind: conda - name: liblapack - version: 3.9.0 - build: 22_osx64_openblas - build_number: 22 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - sha256: e36744f3e780564d6748b5dd05e15ad6a1af9184cf32ab9d1304c13a6bc3e16b - md5: f21b282ff7ba14df6134a0fe6ab42b1b - depends: - - libblas 3.9.0 22_osx64_openblas + purls: [] + size: 14350 + timestamp: 1700568424034 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda + build_number: 20 + sha256: d64e11b93dada339cd0dcc057b3f3f6a5114b8c9bdf90cf6c04cbfa75fb02104 + md5: 704bfc2af1288ea973b6755281e6ad32 + depends: + - libblas 3.9.0 20_osx64_openblas constrains: - - liblapacke 3.9.0 22_osx64_openblas - blas * openblas - - libcblas 3.9.0 22_osx64_openblas + - liblapacke 3.9.0 20_osx64_openblas + - libcblas 3.9.0 20_osx64_openblas license: BSD-3-Clause license_family: BSD - size: 14657 - timestamp: 1712542322711 -- kind: conda - name: liblapack - version: 3.9.0 - build: 22_osxarm64_openblas - build_number: 22 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda - sha256: 2b1b24c98d15a6a3ad54cf7c8fef1ddccf84b7c557cde08235aaeffd1ff50ee8 - md5: f2794950bc005e123b2c21f7fa3d7a6e - depends: - - libblas 3.9.0 22_osxarm64_openblas + purls: [] + size: 14658 + timestamp: 1700568740660 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda + build_number: 20 + sha256: e13f79828a7752f6e0a74cbe62df80c551285f6c37de86bc3bd9987c97faca57 + md5: 1fefac78f2315455ce2d7f34782eac0a + depends: + - libblas 3.9.0 20_osxarm64_openblas constrains: + - liblapacke 3.9.0 20_osxarm64_openblas + - libcblas 3.9.0 20_osxarm64_openblas - blas * openblas - - liblapacke 3.9.0 22_osxarm64_openblas - - libcblas 3.9.0 22_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14730 - timestamp: 1712542435551 -- kind: conda - name: liblapack - version: 3.9.0 - build: 22_win64_mkl - build_number: 22 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - sha256: 8b28b361a13819ed83a67d3bfdde750a13bc8b50b9af26d94fd61616d0f2d703 - md5: c752cc2af9f3d8d7b2fdebb915a33ef7 - depends: - - libblas 3.9.0 22_win64_mkl + purls: [] + size: 14648 + timestamp: 1700568930669 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-26_win64_mkl.conda + build_number: 26 + sha256: 6701bd162d105531b75d05acf82b4ad9fbc5a24ffbccf8c66efa9e72c386b33c + md5: 0a717f5fda7279b77bcce671b324408a + depends: + - libblas 3.9.0 26_win64_mkl constrains: - - liblapacke 3.9.0 22_win64_mkl + - liblapacke 3.9.0 26_win64_mkl - blas * mkl - - libcblas 3.9.0 22_win64_mkl + - libcblas 3.9.0 26_win64_mkl license: BSD-3-Clause license_family: BSD - size: 5182500 - timestamp: 1712543085027 -- kind: conda - name: libllvm15 - version: 15.0.7 - build: hb3ce162_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda - sha256: e71584c0f910140630580fdd0a013029a52fd31e435192aea2aa8d29005262d1 - md5: 8a35df3cbc0c8b12cc8af9473ae75eef + purls: [] + size: 3732160 + timestamp: 1734432822278 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-he0ac6c6_5.tar.bz2 + sha256: fe02eb90fb3c9a2eb57c0b653d7630f7df72ee8b3093b0c3d1c34296e4e01134 + md5: cae79c6fd61cc6823cbebdbb2c16c60e depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - libxml2 >=2.12.1,<3.0.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - zstd >=1.5.5,<1.6.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 33321457 - timestamp: 1701375836233 -- kind: conda - name: libllvm18 - version: 18.1.4 - build: h2448989_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.4-h2448989_0.conda - sha256: fce6d29c7e5771858a653653475366a9742b06ef725d85cf062e855fe3eba5c5 - md5: fc46f35def3d50b071c138fe8b84bc72 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libxml2 >=2.12.6,<3.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - zstd >=1.5.5,<1.6.0a0 + purls: [] + size: 30190183 + timestamp: 1666875231224 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm11-11.1.0-h8fb7429_5.tar.bz2 + sha256: 1513e2606e5bf9a6ae42b300346232af8a021be9bb55027a1939d43b080c1382 + md5: 7c9c5bf4c2e24b54e56ace2a20e79dca + depends: + - libcxx >=14.a0 + - libzlib >=1.2.13,<2.0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 23312806 + timestamp: 1666875671505 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm11-11.1.0-hfa12f05_5.tar.bz2 + sha256: 90756edc54a692d8cc0d11d2795b35dd3031a879c353b3baafb3c7e45cde747d + md5: 0a2e3df7ea28a78ab1e779ffeb1d38bf + depends: + - libcxx >=14.a0 + - libzlib >=1.2.13,<2.0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 38415463 - timestamp: 1714412509082 -- kind: conda - name: libllvm18 - version: 18.1.5 - build: hb77312f_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.5-hb77312f_0.conda - sha256: 2e0a7c023b2df11bd316baad7c409bc95f2e7a92a322ab7973c08d72d03653d2 - md5: efd221d3668077ca067a206269418dec + purls: [] + size: 21598652 + timestamp: 1666873733354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda + sha256: 225cc7c3b20ac1db1bdb37fa18c95bf8aecef4388e984ab2f7540a9f4382106a + md5: 73301c133ded2bf71906aa2104edae8b depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - libxml2 >=2.12.6,<3.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - zstd >=1.5.6,<1.6.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 31484415 + timestamp: 1690557554081 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm14-14.0.6-hc8e404f_4.conda + sha256: 0df3902a300cfe092425f86144d5e00ef67be3cd1cc89fd63084d45262a772ad + md5: ed06753e2ba7c66ed0ca7f19578fcb68 + depends: + - libcxx >=15 + - libzlib >=1.2.13,<2.0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 22467131 + timestamp: 1690563140552 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm14-14.0.6-hd1a9a77_4.conda + sha256: 6f603914fe8633a615f0d2f1383978eb279eeb552079a78449c9fbb43f22a349 + md5: 9f3dce5d26ea56a9000cd74c034582bd + depends: + - libcxx >=15 + - libzlib >=1.2.13,<2.0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 38403202 - timestamp: 1714775293919 -- kind: conda - name: libnsl - version: 2.0.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + purls: [] + size: 20571387 + timestamp: 1690559110016 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 + md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: 0BSD + purls: [] + size: 111132 + timestamp: 1733407410083 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: 0BSD + purls: [] + size: 111357 + timestamp: 1738525339684 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + sha256: c70639ff3cb034a8e31cb081c907879b6a639bb12b0e090069a68eb69125b10e + md5: f9e9205fed9c664421c1c09f0b90ce6d + depends: + - __osx >=10.13 + license: 0BSD + purls: [] + size: 103745 + timestamp: 1733407504892 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.4-hd471939_0.conda + sha256: a895b5b16468a6ed436f022d72ee52a657f9b58214b91fabfab6230e3592a6dd + md5: db9d7b0152613f097cdb61ccf9f70ef5 + depends: + - __osx >=10.13 + license: 0BSD + purls: [] + size: 103749 + timestamp: 1738525448522 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + sha256: d863b8257406918ffdc50ae65502f2b2d6cede29404d09a094f59509d6a0aaf1 + md5: b2553114a7f5e20ccd02378a77d836aa + depends: + - __osx >=11.0 + license: 0BSD + purls: [] + size: 99129 + timestamp: 1733407496073 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.4-h39f12f2_0.conda + sha256: 560c59d3834cc652a84fb45531bd335ad06e271b34ebc216e380a89798fe8e2c + md5: e3fd1f8320a100f2b210e690a57cd615 + depends: + - __osx >=11.0 + license: 0BSD + purls: [] + size: 98945 + timestamp: 1738525462560 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + sha256: 24d04bd55adfa44c421c99ce169df38cb1ad2bba5f43151bc847fc802496a1fa + md5: 015b9c0bd1eef60729ab577a38aaf0b5 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: 0BSD + purls: [] + size: 104332 + timestamp: 1733407872569 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.6.4-h2466b09_0.conda + sha256: 3f552b0bdefdd1459ffc827ea3bf70a6a6920c7879d22b6bfd0d73015b55227b + md5: c48f6ad0ef0a555b27b233dfcab46a90 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: 0BSD + purls: [] + size: 104465 + timestamp: 1738525557254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.6.4-hb9d3cd8_0.conda + sha256: 34928b36a3946902196a6786db80c8a4a97f6c9418838d67be90a1388479a682 + md5: 5ab1a0df19c8f3ec00d5e63458e0a420 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.6.4 hb9d3cd8_0 + license: 0BSD + purls: [] + size: 378821 + timestamp: 1738525353119 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.6.4-hd471939_0.conda + sha256: 0f8c5679cce617a3c45f58a4e984cf2ec920a9b98f4e522fc3e0e6a69a31bf26 + md5: 06eccf9183d7bfeb45888e07804e6297 + depends: + - __osx >=10.13 + - liblzma 5.6.4 hd471939_0 + license: 0BSD + purls: [] + size: 113686 + timestamp: 1738525464050 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.6.4-h39f12f2_0.conda + sha256: b5585156354258a85c7739039b6793e42324d29a24952fac8a9311cf2b6fff7a + md5: 5789af7c91332d5d5693d3afd499b9eb + depends: + - __osx >=11.0 + - liblzma 5.6.4 h39f12f2_0 + license: 0BSD + purls: [] + size: 113696 + timestamp: 1738525475905 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-devel-5.6.4-h2466b09_0.conda + sha256: 9b185dc6889843f6660584be226c45c048e9b18598642e7455b69e277587c872 + md5: 1e5c2564c8615e8ed993ff634e4181a9 + depends: + - liblzma 5.6.4 h2466b09_0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: 0BSD + purls: [] + size: 126091 + timestamp: 1738525583264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 depends: - libgcc-ng >=12 license: LGPL-2.1-only license_family: GPL + purls: [] size: 33408 timestamp: 1697359010159 -- kind: conda - name: libogg - version: 1.3.4 - build: h7f98852_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 - sha256: b88afeb30620b11bed54dac4295aa57252321446ba4e6babd7dce4b9ffde9b25 - md5: 6e8cc2173440d77708196c5b93771680 - depends: - - libgcc-ng >=9.3.0 - license: BSD-3-Clause - license_family: BSD - size: 210550 - timestamp: 1610382007814 -- kind: conda - name: libogg - version: 1.3.4 - build: h8ffe710_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2 - sha256: ef20f04ad2121a07e074b34bfc211587df18180e680963f5c02c54d1951b9ee6 - md5: 04286d905a0dcb7f7d4a12bdfe02516d +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda + sha256: 628564517895ee1b09cf72c817548bd80ef1acce6a8214a8520d9f7b44c4cfaf + md5: d172b34a443b95f86089e8229ddc9a17 depends: - - vc >=14.1,<15.0a0 - - vs2015_runtime >=14.16.27012 + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + constrains: + - openblas >=0.3.25,<0.3.26.0a0 license: BSD-3-Clause license_family: BSD - size: 35187 - timestamp: 1610382533961 -- kind: conda - name: libopenblas - version: 0.3.27 - build: openmp_h6c19121_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - sha256: feb2662444fc98a4842fe54cc70b1f109b2146108e7bac2b3bbad1f219cede90 - md5: 82eba59f4eca26a9fc904d584f8761c0 + purls: [] + size: 5545169 + timestamp: 1700536004164 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda + sha256: 9895bccdbaa34958ab7dd1f29de66d1dfb94c551c7bb5a663666a500c67ee93c + md5: a01b96f00c3155c830d98a518c7dcbfb depends: - libgfortran 5.* - libgfortran5 >=12.3.0 - llvm-openmp >=16.0.6 constrains: - - openblas >=0.3.27,<0.3.28.0a0 + - openblas >=0.3.25,<0.3.26.0a0 license: BSD-3-Clause license_family: BSD - size: 2925015 - timestamp: 1712364212874 -- kind: conda - name: libopenblas - version: 0.3.27 - build: openmp_hfef2a42_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - sha256: 45519189c0295296268cb7eabeeaa03ef54d780416c9a24be1d2a21db63a7848 - md5: 00237c9c7f2cb6725fe2960680a6e225 + purls: [] + size: 6019426 + timestamp: 1700537709900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda + sha256: b112e0d500bc0314ea8d393efac3ab8c67857e5a2b345348c98e703ee92723e5 + md5: a1843550403212b9dedeeb31466ade03 depends: - libgfortran 5.* - libgfortran5 >=12.3.0 - llvm-openmp >=16.0.6 constrains: - - openblas >=0.3.27,<0.3.28.0a0 + - openblas >=0.3.25,<0.3.26.0a0 license: BSD-3-Clause license_family: BSD - size: 6047531 - timestamp: 1712366254156 -- kind: conda - name: libopenblas - version: 0.3.27 - build: pthreads_h413a1c8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda - sha256: 2ae7559aed0705deb3f716c7b247c74fd1b5e35b64e39834ce8b95f7564d4a3e - md5: a356024784da6dfd4683dc5ecf45b155 + purls: [] + size: 2896390 + timestamp: 1700535987588 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 depends: - libgcc-ng >=12 - - libgfortran-ng - - libgfortran5 >=12.3.0 - constrains: - - openblas >=0.3.27,<0.3.28.0a0 - license: BSD-3-Clause - license_family: BSD - size: 5598747 - timestamp: 1712364444346 -- kind: conda - name: libopus - version: 1.3.1 - build: h7f98852_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f - md5: 15345e56d527b330e1cacbdf58676e8f + arch: x86_64 + platform: linux + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda + sha256: d3975cfe60e81072666da8c76b993af018cf2e73fe55acba2b5ba0928efaccf5 + md5: 6af4b059e26492da6013e79cbcb4d069 + depends: + - __osx >=10.13 + arch: x86_64 + platform: osx + license: ISC + purls: [] + size: 210249 + timestamp: 1716828641383 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + purls: [] + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda + sha256: 7bcb3edccea30f711b6be9601e083ecf4f435b9407d70fc48fbcf9e5d69a0fc6 + md5: 198bb594f202b205c7d18b936fa4524f depends: - - libgcc-ng >=9.3.0 - license: BSD-3-Clause - license_family: BSD - size: 260658 - timestamp: 1606823578035 -- kind: conda - name: libpng - version: 1.6.43 - build: h091b4b1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda - sha256: 66c4713b07408398f2221229a1c1d5df57d65dc0902258113f2d9ecac4772495 - md5: 77e684ca58d82cae9deebafb95b1a2b8 - depends: - - libzlib >=1.2.13,<1.3.0a0 - license: zlib-acknowledgement - size: 264177 - timestamp: 1708780447187 -- kind: conda - name: libpng - version: 1.6.43 - build: h19919ed_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda - sha256: 6ad31bf262a114de5bbe0c6ba73b29ed25239d0f46f9d59700310d2ea0b3c142 - md5: 77e398acc32617a0384553aea29e866b - depends: - - libzlib >=1.2.13,<1.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - license: zlib-acknowledgement - size: 347514 - timestamp: 1708780763195 -- kind: conda - name: libpng - version: 1.6.43 - build: h2797004_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda - sha256: 502f6ff148ac2777cc55ae4ade01a8fc3543b4ffab25c4e0eaa15f94e90dd997 - md5: 009981dd9cfcaa4dbfa25ffaed86bcae + arch: x86_64 + platform: win + license: ISC + purls: [] + size: 202344 + timestamp: 1716828757533 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 + md5: 18aa975d2094c34aef978060ae7da7d8 depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - license: zlib-acknowledgement - size: 288221 - timestamp: 1708780443939 -- kind: conda - name: libpng - version: 1.6.43 - build: h92b6c6a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda - sha256: 13e646d24b5179e6b0a5ece4451a587d759f55d9a360b7015f8f96eff4524b8f - md5: 65dcddb15965c9de2c0365cb14910532 - depends: - - libzlib >=1.2.13,<1.3.0a0 - license: zlib-acknowledgement - size: 268524 - timestamp: 1708780496420 -- kind: conda - name: libpq - version: '16.2' - build: h33b98f1_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda - sha256: e03a8439b79e013840c44c957d37dbce10316888b2b5dc7dcfcfc0cfe3a3b128 - md5: 9e49ec2a61d02623b379dc332eb6889d + - libzlib >=1.2.13,<2.0a0 + license: Unlicense + purls: [] + size: 865346 + timestamp: 1718050628718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + sha256: 48af21ebc2cbf358976f1e0f4a0ab9e91dfc83d0ef337cf3837c6f5bc22fb352 + md5: b58da17db24b6e08bcbf8fed2fb8c915 depends: - - krb5 >=1.21.2,<1.22.0a0 - - libgcc-ng >=12 - - openssl >=3.2.1,<4.0a0 - license: PostgreSQL - size: 2601973 - timestamp: 1710863646063 -- kind: conda - name: libpq - version: '16.3' - build: ha72fbe1_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda - sha256: 117ba1e11f07b1ca0671641bd6d1f2e7fc6e27db1c317a0cdb4799ffa69f47db - md5: bac737ae28b79cfbafd515258d97d29e - depends: - - krb5 >=1.21.2,<1.22.0a0 - - libgcc-ng >=12 - - openssl >=3.3.0,<4.0a0 - license: PostgreSQL - size: 2500439 - timestamp: 1715266400833 -- kind: conda - name: libsndfile - version: 1.2.2 - build: hc60ed4a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 - md5: ef1910918dd895516a769ed36b5b3a4e + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 873551 + timestamp: 1733761824646 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda + sha256: 63af1a9e3284c7e4952364bafe7267e41e2d9d8bcc0e85a4ea4b0ec02d3693f6 + md5: 5dadfbc1a567fe6e475df4ce3148be09 depends: - - lame >=3.100,<3.101.0a0 - - libflac >=1.4.3,<1.5.0a0 - - libgcc-ng >=12 - - libogg >=1.3.4,<1.4.0a0 - - libopus >=1.3.1,<2.0a0 - - libstdcxx-ng >=12 - - libvorbis >=1.3.7,<1.4.0a0 - - mpg123 >=1.32.1,<1.33.0a0 - license: LGPL-2.1-or-later - license_family: LGPL - size: 354372 - timestamp: 1695747735668 -- kind: conda - name: libsqlite - version: 3.45.3 - build: h091b4b1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc - md5: c8c1186c7f3351f6ffddb97b1f54fc58 - depends: - - libzlib >=1.2.13,<1.3.0a0 + - __osx >=10.13 + - libzlib >=1.2.13,<2.0a0 license: Unlicense - size: 824794 - timestamp: 1713367748819 -- kind: conda - name: libsqlite - version: 3.45.3 - build: h2797004_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - sha256: e2273d6860eadcf714a759ffb6dc24a69cfd01f2a0ea9d6c20f86049b9334e0c - md5: b3316cbe90249da4f8e84cd66e1cc55b + purls: [] + size: 908643 + timestamp: 1718050720117 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda + sha256: 4d5e188d921f93c97ce172fc8c4341e8171670ec98d76f9961f65f6306fcda77 + md5: 44d9799fda97eb34f6d88ac1e3eb0ea6 depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 923167 + timestamp: 1733761860127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda + sha256: 73048f9cb8647d3d3bfe6021c0b7d663e12cffbe9b4f31bd081e713b0a9ad8f9 + md5: 12300188028c9bc02da965128b91b517 + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0a0 license: Unlicense - size: 859858 - timestamp: 1713367435849 -- kind: conda - name: libsqlite - version: 3.45.3 - build: h92b6c6a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - sha256: 4d44b68fb29dcbc2216a8cae0b274b02ef9b4ae05d1d0f785362ed30b91c9b52 - md5: 68e462226209f35182ef66eda0f794ff - depends: - - libzlib >=1.2.13,<1.3.0a0 + purls: [] + size: 830198 + timestamp: 1718050644825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + sha256: f192f3c8973de9ec4c214990715f13b781965247a5cedf9162e7f9e699cfc3c4 + md5: 122d6f29470f1a991e85608e77e56a8a + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 license: Unlicense - size: 902546 - timestamp: 1713367776445 -- kind: conda - name: libsqlite - version: 3.45.3 - build: hcfcfb64_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - sha256: 06ec75faa51d7ec6d5db98889e869b579a9df19d7d3d9baff8359627da4a3b7e - md5: 73f5dc8e2d55d9a1e14b11f49c3b4a28 + purls: [] + size: 850553 + timestamp: 1733762057506 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + sha256: ecfc0182c3b2e63c870581be1fa0e4dbdfec70d2011cb4f5bde416ece26c41df + md5: ff00095330e0d35a16bd3bdbd1a2d3e7 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Unlicense - size: 870518 - timestamp: 1713367888406 -- kind: conda - name: libstdcxx-ng - version: 13.2.0 - build: h95c4c6d_6 - build_number: 6 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda - sha256: 2616dbf9d28431eea20b6e307145c6a92ea0328a047c725ff34b0316de2617da - md5: 3cfab3e709f77e9f1b3d380eb622494a + purls: [] + size: 891292 + timestamp: 1733762116902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 + md5: 234a5554c53625688d51062645337328 + depends: + - libgcc 14.2.0 h77fa898_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3842900 - timestamp: 1713755068572 -- kind: conda - name: libstdcxx-ng - version: 13.2.0 - build: hc0a3c3a_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda - sha256: 35f1e08be0a84810c9075f5bd008495ac94e6c5fe306dfe4b34546f11fed850f - md5: 53ebd4c833fa01cb2c6353e99f905406 + purls: [] + size: 3893695 + timestamp: 1729027746910 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 + md5: 8371ac6457591af2cf6159439c1fd051 + depends: + - libstdcxx 14.2.0 hc0a3c3a_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3837704 - timestamp: 1715016117360 -- kind: conda - name: libsystemd0 - version: '255' - build: h3516f8a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda - sha256: af27b0d225435d03f378a119f8eab6b280c53557a3c84cdb3bb8fd3167615aed - md5: 3366af27f0b593544a6cd453c7932ac5 - depends: - - __glibc >=2.17,<3.0.a0 - - libcap >=2.69,<2.70.0a0 - - libgcc-ng >=12 - - libgcrypt >=1.10.3,<2.0a0 - - lz4-c >=1.9.3,<1.10.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: LGPL-2.1-or-later - size: 402592 - timestamp: 1709568499820 -- kind: conda - name: libtiff - version: 4.6.0 - build: h07db509_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda - sha256: 6df3e129682f6dc43826e5028e1807624b2a7634c4becbb50e56be9f77167f25 - md5: 28c9f8c6dd75666dfb296aea06c49cb8 - depends: - - lerc >=4.0.0,<5.0a0 - - libcxx >=16 - - libdeflate >=1.20,<1.21.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: HPND - size: 238349 - timestamp: 1711218119201 -- kind: conda - name: libtiff - version: 4.6.0 - build: h129831d_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda - sha256: f9b35c5ec1aea9a2cc20e9275a0bb8f056482faa8c5a62feb243ed780755ea30 - md5: 568593071d2e6cea7b5fc1f75bfa10ca - depends: - - lerc >=4.0.0,<5.0a0 - - libcxx >=16 - - libdeflate >=1.20,<1.21.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: HPND - size: 257489 - timestamp: 1711218113053 -- kind: conda - name: libtiff - version: 4.6.0 - build: h1dd3fc0_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda - sha256: fc3b210f9584a92793c07396cb93e72265ff3f1fa7ca629128bf0a50d5cb15e4 - md5: 66f03896ffbe1a110ffda05c7a856504 - depends: - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.20,<1.21.0a0 - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libstdcxx-ng >=12 - - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: HPND - size: 282688 - timestamp: 1711217970425 -- kind: conda - name: libtiff - version: 4.6.0 - build: hddb2be6_3 - build_number: 3 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda - sha256: 2e04844865cfe0286d70482c129f159542b325f4e45774aaff5fbe5027b30b0a - md5: 6d1828c9039929e2f185c5fa9d133018 - depends: - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.20,<1.21.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: HPND - size: 787198 - timestamp: 1711218639912 -- kind: conda - name: libuuid - version: 2.38.1 - build: h0b41bf4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + purls: [] + size: 54105 + timestamp: 1729027780628 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b depends: - libgcc-ng >=12 license: BSD-3-Clause license_family: BSD + purls: [] size: 33601 timestamp: 1680112270483 -- kind: conda - name: libvorbis - version: 1.3.7 - build: h0e60522_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 - sha256: 6cdc018a024908270205d8512d92f92cf0adaaa5401c2b403757189b138bf56a - md5: e1a22282de0169c93e4ffe6ce6acc212 - depends: - - libogg >=1.3.4,<1.4.0a0 - - vc >=14.1,<15.0a0 - - vs2015_runtime >=14.16.27012 - license: BSD-3-Clause - license_family: BSD - size: 273721 - timestamp: 1610610022421 -- kind: conda - name: libvorbis - version: 1.3.7 - build: h9c3ff4c_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 - sha256: 53080d72388a57b3c31ad5805c93a7328e46ff22fab7c44ad2a86d712740af33 - md5: 309dec04b70a3cc0f1e84a4013683bc0 - depends: - - libgcc-ng >=9.3.0 - - libogg >=1.3.4,<1.4.0a0 - - libstdcxx-ng >=9.3.0 - license: BSD-3-Clause - license_family: BSD - size: 286280 - timestamp: 1610609811627 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: h10d778d_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - sha256: 7bafd8f4c637778cd0aa390bf3a894feef0e1fcf6ea6000c7ffc25c4c5a65538 - md5: b2c0047ea73819d992484faacbbe1c24 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - size: 355099 - timestamp: 1713200298965 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: h93a5062_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - sha256: 0d4bad713a512d79bfeb4d61821f447afab8b0792aca823f505ce6b195e9fde5 - md5: c0af0edfebe780b19940e94871f1a765 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - size: 287750 - timestamp: 1713200194013 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: hcfcfb64_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - sha256: d0ca51cb1de9192be9a3238e71fbcca5a535619c499c4f4c9b2ed41c14d36770 - md5: abd61d0ab127ec5cd68f62c2969e6f34 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - size: 274359 - timestamp: 1713200524021 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f - md5: b26e8aa824079e1be0294e7152ca4559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc depends: - libgcc-ng >=12 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - size: 438953 - timestamp: 1713199854503 -- kind: conda - name: libxcb - version: '1.15' - build: h0b41bf4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda - sha256: a670902f0a3173a466c058d2ac22ca1dd0df0453d3a80e0212815c20a16b0485 - md5: 33277193f5b92bad9fdd230eb700929c + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda + sha256: 576ea9134176636283ff052897bf7a91ffd8ac35b2c505dfde2890ec52849698 + md5: 340278ded8b0dc3a73f3660bbb0adbc6 depends: + - icu >=73.2,<74.0a0 - libgcc-ng >=12 - - pthread-stubs - - xorg-libxau - - xorg-libxdmcp - license: MIT - license_family: MIT - size: 384238 - timestamp: 1682082368177 -- kind: conda - name: libxcb - version: '1.15' - build: hb7f2c08_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda - sha256: f41904f466acc8b3197f37f2dd3a08da75720c7f7464d9267635debc4ac1902b - md5: 5513f57e0238c87c12dffedbcc9c1a4a - depends: - - pthread-stubs - - xorg-libxau - - xorg-libxdmcp + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<2.0a0 + - xz >=5.2.6,<6.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT - size: 313793 - timestamp: 1682083036825 -- kind: conda - name: libxcb - version: '1.15' - build: hcd874cb_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda - sha256: d01322c693580f53f8d07a7420cd6879289f5ddad5531b372c3efd1c37cac3bf - md5: 090d91b69396f14afef450c285f9758c + purls: [] + size: 704984 + timestamp: 1717546454837 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda + sha256: 306e18aa647d8208ad2cd0e62d84933222b2fbe93d2d53cd5283d2256b1d54de + md5: f5b05674697ae7d2c5932766695945e1 depends: - - m2w64-gcc-libs - - m2w64-gcc-libs-core - - pthread-stubs - - xorg-libxau - - xorg-libxdmcp + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT - size: 969788 - timestamp: 1682083087243 -- kind: conda - name: libxcb - version: '1.15' - build: hf346824_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda - sha256: 6eaa87760ff3e91bb5524189700139db46f8946ff6331f4e571e4a9356edbb0d - md5: 988d5f86ab60fa6de91b3ee3a88a3af9 - depends: - - pthread-stubs - - xorg-libxau - - xorg-libxdmcp + purls: [] + size: 689993 + timestamp: 1733443678322 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-h3e169fe_1.conda + sha256: 75554b5ef4c61a97c1d2ddcaff2d87c5ee120ff6925c2b714e18b20727cafb98 + md5: ddb63049aa7bd9f08f2cdc5a1c144d1a + depends: + - __osx >=10.13 + - icu >=73.2,<74.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<2.0a0 + - xz >=5.2.6,<6.0a0 + arch: x86_64 + platform: osx license: MIT license_family: MIT - size: 334770 - timestamp: 1682082734262 -- kind: conda - name: libxcrypt - version: 4.4.36 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - size: 100393 - timestamp: 1702724383534 -- kind: conda - name: libxkbcommon - version: 1.7.0 - build: h662e7e4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda - sha256: 3d97d7f964237f42452295d461afdbc51e93f72e2c80be516f56de80e3bb6621 - md5: b32c0da42b1f24a98577bb3d7fc0b995 + purls: [] + size: 619297 + timestamp: 1717546472911 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.5-he8ee3e7_1.conda + sha256: 254730b4640684eb392aa70d14d0dec4e0568bdedabd5ee22df4128d95408fe0 + md5: 9379f216f9132d0d3cdeeb10af165262 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libxcb >=1.15,<1.16.0a0 - - libxml2 >=2.12.6,<3.0a0 - - xkeyboard-config - - xorg-libxau >=1.0.11,<2.0a0 - license: MIT/X11 Derivative + - __osx >=10.13 + - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: x86_64 + platform: osx + license: MIT license_family: MIT - size: 593534 - timestamp: 1711303445595 -- kind: conda - name: libxml2 - version: 2.12.6 - build: h232c23b_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda - sha256: 0fd41df7211aae04f492c8550ce10238e8cfa8b1abebc2215a983c5e66d284ea - md5: 9a3a42df8a95f65334dfc7b80da1195d + purls: [] + size: 609081 + timestamp: 1733443988169 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-ha661575_1.conda + sha256: 0ea12032b53d3767564a058ccd5208c0a1724ed2f8074dd22257ff3859ea6a4e + md5: 8ea71a74847498c793b0a8e9054a177a depends: + - __osx >=11.0 - icu >=73.2,<74.0a0 - - libgcc-ng >=12 - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0a0 - xz >=5.2.6,<6.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 588487 + timestamp: 1717546487246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda + sha256: d7af3f25a4cece170502acd38f2dafbea4521f373f46dcb28a37fbe6ac2da544 + md5: 3dc3cff0eca1640a6acbbfab2f78139e + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx license: MIT license_family: MIT - size: 704938 - timestamp: 1713314718258 -- kind: conda - name: libxml2 - version: 2.12.6 - build: hc3477c8_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - sha256: 9a717cad6da52c84cfc490f7d52203c4cbc9e0e0389941fc6523273be5ccd17a - md5: ac7af7a949db01dae61ddc48f4a93d79 + purls: [] + size: 582898 + timestamp: 1733443841584 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_1.conda + sha256: aef096aa784e61f860fab08974c6260836bf05d742fb69f304f0e9b7d557c99a + md5: 7ab2653cc21c44a1370ef3b409261b3d depends: - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 1589904 - timestamp: 1713315104803 -- kind: conda - name: libxml2 - version: 2.12.7 - build: h283a6d9_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_0.conda - sha256: e246fefa745b56c022063ba1b69ff2965f280c6eee3de9821184e7c8f2475eab - md5: 1451be68a5549561979125c1827b79ed + purls: [] + size: 1709896 + timestamp: 1717547244225 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.5-he286e8c_1.conda + sha256: 084dd4dde342f13c43ee418d153ac5b2610f95be029073a15fa9dda22b130d06 + md5: 77eaa84f90fc90643c5a0be0aa9bdd1b depends: - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 1615693 - timestamp: 1715606533379 -- kind: conda - name: libxml2 - version: 2.12.7 - build: hc051c1a_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda - sha256: 2d8c402687f7045295d78d66688b140e3310857c7a070bba7547a3b9fcad5e7d - md5: 5d801a4906adc712d480afc362623b59 + purls: [] + size: 1612294 + timestamp: 1733443909984 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda + sha256: 684e9b67ef7b9ca0ca993762eeb39705ec58e2e7f958555c758da7ef416db9f3 + md5: e71f31f8cfb0a91439f2086fc8aa0461 depends: - - icu >=73.2,<74.0a0 - libgcc-ng >=12 - - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - xz >=5.2.6,<6.0a0 + - libxml2 >=2.12.1,<3.0.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 254297 + timestamp: 1701628814990 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxslt-1.1.39-h03b04e6_0.conda + sha256: decfc5614a10231a17543b7366616fb2d88c14be6dd9dd5ecde63aa9a5acfb9e + md5: a6e0cec6b3517ffc6b5d36a920fc9312 + depends: + - libxml2 >=2.12.1,<3.0.0a0 + arch: x86_64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 231368 + timestamp: 1701628933115 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxslt-1.1.39-h223e5b9_0.conda + sha256: 2f1d99ef3fb960f23a63f06cf65ee621a5594a8b4616f35d9805be44617a92af + md5: 560c9cacc33e927f55b998eaa0cb1732 + depends: + - libxml2 >=2.12.1,<3.0.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 225705 + timestamp: 1701628966565 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.39-h3df6e99_0.conda + sha256: 6e3d99466d2076c35e7ac8dcdfe604da3d593f55b74a5b8e96c2b2ff63c247aa + md5: 279ee338c9b34871d578cb3c7aa68f70 + depends: + - libxml2 >=2.12.1,<3.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win license: MIT license_family: MIT - size: 705857 - timestamp: 1715606286167 -- kind: conda - name: libzlib - version: 1.2.13 - build: h53f4e23_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - sha256: ab1c8aefa2d54322a63aaeeefe9cf877411851738616c4068e0dccc66b9c758a - md5: 1a47f5236db2e06a320ffa0392f81bd8 + purls: [] + size: 418542 + timestamp: 1701629338549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + sha256: 8ced4afed6322172182af503f21725d072a589a6eb918f8a58135c1e00d35980 + md5: 27329162c0dc732bcf67a4e0cd488125 + depends: + - libgcc-ng >=12 constrains: - - zlib 1.2.13 *_5 + - zlib 1.2.13 *_6 license: Zlib license_family: Other - size: 48102 - timestamp: 1686575426584 -- kind: conda - name: libzlib - version: 1.2.13 - build: h8a1eda9_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - sha256: fc58ad7f47ffea10df1f2165369978fba0a1cc32594aad778f5eec725f334867 - md5: 4a3ad23f6e16f99c04e166767193d700 + purls: [] + size: 61571 + timestamp: 1716874066944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 constrains: - - zlib 1.2.13 *_5 + - zlib 1.3.1 *_2 license: Zlib license_family: Other - size: 59404 - timestamp: 1686575566695 -- kind: conda - name: libzlib - version: 1.2.13 - build: hcfcfb64_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 - md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h87427d6_6.conda + sha256: 1c70fca0720685242b5c68956f310665c7ed43f04807aa4227322eee7925881c + md5: c0ef3c38a80c02ae1d86588c055184fc + depends: + - __osx >=10.13 + constrains: + - zlib 1.2.13 *_6 + license: Zlib + license_family: Other + purls: [] + size: 57373 + timestamp: 1716874185419 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 57133 + timestamp: 1727963183990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + sha256: 8b29a2386d99b8f58178951dcf19117b532cd9c4aa07623bf1667eae99755d32 + md5: 9c4e121cd926cab631bd1c4a61d18b17 + depends: + - __osx >=11.0 + constrains: + - zlib 1.2.13 *_6 + license: Zlib + license_family: Other + purls: [] + size: 46768 + timestamp: 1716874151980 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-h2466b09_6.conda + sha256: 97f47db85265b596d08c044b6533013b7286fb66259c77d04da76b74414c896e + md5: 9f41e3481778398837720a84dd26b7b1 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - zlib 1.2.13 *_5 + - zlib 1.2.13 *_6 license: Zlib license_family: Other - size: 55800 - timestamp: 1686575452215 -- kind: conda - name: libzlib - version: 1.2.13 - build: hd590300_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 - md5: f36c115f1ee199da648e0597ec2047ad + purls: [] + size: 56119 + timestamp: 1716874608785 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 depends: - - libgcc-ng >=12 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - - zlib 1.2.13 *_5 + - zlib 1.3.1 *_2 license: Zlib license_family: Other - size: 61588 - timestamp: 1686575217516 -- kind: conda - name: llvm-openmp - version: 18.1.3 - build: hb6ac08f_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - sha256: 997e4169ea474a7bc137fed3b5f4d94b1175162b3318e8cb3943003e460fe458 - md5: 506f270f4f00980d27cc1fc127e0ed37 - constrains: - - openmp 18.1.3|18.1.3.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 300597 - timestamp: 1712603382363 -- kind: conda - name: llvm-openmp - version: 18.1.3 - build: hcd81f8e_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - sha256: 4cb4eadd633669496ed70c580c965f5f2ed29336890636c61a53e9c1c1541073 - md5: 24cbf1fb1b83056f8ba1beaac0619bf8 - constrains: - - openmp 18.1.3|18.1.3.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 276320 - timestamp: 1712603367897 -- kind: conda - name: llvm-openmp - version: 18.1.5 - build: h39e0ece_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.5-h39e0ece_0.conda - sha256: 9efba1424726d83271727c494138ad1d519d5fed301f1ee5825019eae56f5570 - md5: ee12a644568269838b91f901b2537425 + purls: [] + size: 55476 + timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.6-ha54dae1_0.conda + sha256: f79a1d6f8b2f6044eda1b1251c9bf49f4e11ae644e609e47486561a7eca437fd + md5: 4fe4d62071f8a3322ffb6588b49ccbb8 depends: - - __osx >=10.9 + - __osx >=10.13 constrains: - - openmp 18.1.5|18.1.5.* + - openmp 19.1.6|19.1.6.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 300438 - timestamp: 1714984682878 -- kind: conda - name: llvm-openmp - version: 18.1.5 - build: hde57baf_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.5-hde57baf_0.conda - sha256: c9ecaaa3d83215753a54f66038480582eff632196ed0df7763ca320154d00526 - md5: 5b0ef7f8e9f413cbfd53573da96cae1b + purls: [] + size: 305048 + timestamp: 1734520356844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + sha256: a0f3e9139ab16f0a67b9d2bbabc15b78977168f4a5b5503fed4962dcb9a96102 + md5: 34fdeffa0555a1a56f38839415cc066c depends: - __osx >=11.0 constrains: - - openmp 18.1.5|18.1.5.* + - openmp 19.1.6|19.1.6.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 276522 - timestamp: 1714984701521 -- kind: conda - name: lz4-c - version: 1.9.4 - build: hcb278e6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - sha256: 1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f - md5: 318b08df404f9c9be5712aaa5a6f0bb0 + purls: [] + size: 281251 + timestamp: 1734520462311 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.38.1-py310h58363a5_0.tar.bz2 + sha256: be74872d723e35f9b2a4e311b436452cbcf88462de4ad45c354b6ce625b2ec7b + md5: 32f924efe5e677b4f2378d391d006199 + depends: + - libgcc-ng >=10.3.0 + - libllvm11 >=11.1.0,<11.2.0a0 + - libstdcxx-ng >=10.3.0 + - libzlib >=1.2.11,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - zlib >=1.2.11,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 2417624 + timestamp: 1653080736953 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.40.1-py310h1b8f574_0.conda + sha256: 284462f15daa742e48dee4a103b5de1bee3e0fcddf5f60ca5510e3ca47dbc2e0 + md5: 610577f6de29686bca87a4a8fde5eb19 depends: - libgcc-ng >=12 + - libllvm14 >=14.0.6,<14.1.0a0 - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/llvmlite?source=hash-mapping + size: 2504766 + timestamp: 1687806322435 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.38.1-py310h8fbb61a_0.tar.bz2 + sha256: 9231ecc3f49480164a61f857c0c862c3e3ca464f5f2e18dbafae2cbf3e5ed8aa + md5: 0c2855ba5155dfc66c4864a1e1169489 + depends: + - libcxx >=13.0.1 + - libllvm11 >=11.1.0,<11.2.0a0 + - libzlib >=1.2.11,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - zlib >=1.2.11,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 258055 + timestamp: 1653081526514 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.40.1-py310hd8379ad_0.conda + sha256: 4e40d94c43c581a2942fe759c88097c3c7098fe0b844605db06127adafbf7cb4 + md5: e8b28ccb84dc768d48c9bcd27d9ff686 + depends: + - libcxx >=15.0.7 + - libllvm14 >=14.0.6,<14.1.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/llvmlite?source=hash-mapping + size: 261331 + timestamp: 1687806752460 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.38.1-py310hbf292a2_0.tar.bz2 + sha256: 982db4195fb7c5ce6d23f6e6498fe479958ad35d80408f77377a94ae47cd2ba2 + md5: d2b0c2cc206e431b0a019b6973c71760 + depends: + - libcxx >=13.0.1 + - libllvm11 >=11.1.0,<11.2.0a0 + - libzlib >=1.2.11,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - zlib >=1.2.11,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 258027 + timestamp: 1653081704604 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.40.1-py310h95b248a_0.conda + sha256: 257ff87893f69d65fd338e83c98caf558b9ab63d53485a7570eb87d148d2b0de + md5: 52cd6541bcc41ab3495c243f44ff1817 + depends: + - libcxx >=15.0.7 + - libllvm14 >=14.0.6,<14.1.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 license: BSD-2-Clause license_family: BSD - size: 143402 - timestamp: 1674727076728 -- kind: conda - name: m2w64-gcc-libgfortran - version: 5.3.0 - build: '6' - build_number: 6 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + purls: + - pkg:pypi/llvmlite?source=hash-mapping + size: 264867 + timestamp: 1687806825553 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.38.1-py310h2c03ce5_0.tar.bz2 + sha256: d7e0d71f273442826872f8dea160f8fb1e7cdef67fce99c7dd1ee27509dc8066 + md5: e5d311a2fa4a65ad245af22a54417625 + depends: + - libzlib >=1.2.11,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + - zlib >=1.2.11,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 17072190 + timestamp: 1653081388589 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.40.1-py310hb84602e_0.conda + sha256: 32e62860f031ac439316eed422247d7921055102ab7b6263a9fa9e16b87a5af6 + md5: c0010b84acfaf1f7b7db272bb2a5d524 + depends: + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - vs2015_runtime + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 16825093 + timestamp: 1687807120034 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py310h6a33d3d_0.conda + sha256: 8a96f6afb43efabf4d51cdee4d1ce181285ddb11a85c1408d78a3d6f5e39c58c + md5: ed504cc41e211e637524b75cf104dbef + depends: + - libgcc-ng >=12 + - libxml2 >=2.12.6,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1355437 + timestamp: 1715598646717 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-5.3.1-py310h6ee67d5_0.conda + sha256: c1759d4b53ffe4b4757f328fd9272d6746fed13bdccc1a0e9ea1507c3b8ae393 + md5: 7e36d0ccff40ba091baa9af7e08644e0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxml2 >=2.13.5,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1349652 + timestamp: 1739211845063 +- conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-5.2.2-py310h27134ca_0.conda + sha256: b3e974dd7bf8a140adbbc81725a450150802ba9b74abab005e081d77003a9000 + md5: bbdb7e605c9caa460fd87981ade88ad7 + depends: + - __osx >=10.13 + - libxml2 >=2.12.6,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1154485 + timestamp: 1715599068957 +- conda: https://conda.anaconda.org/conda-forge/osx-64/lxml-5.3.1-py310hca20839_0.conda + sha256: b84f60a4d76023d1c571c8b2c8b7d56f9d930aae0277b79ec7f757bc007d06dc + md5: 3f932232f9dabdb8f7a95235b4dfee33 + depends: + - __osx >=10.13 + - libxml2 >=2.13.5,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1216377 + timestamp: 1739211955023 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.2.2-py310h9905115_0.conda + sha256: b54012077130e62cea7c21c367165587a0f5155349dbb3dde6cb2da3afedf421 + md5: 743b484a70e77849128a27a06dee67ca + depends: + - __osx >=11.0 + - libxml2 >=2.12.6,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1109661 + timestamp: 1715599073060 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-5.3.1-py310h660342b_0.conda + sha256: 038193229e24873c11da23c880ff2cb9372af49a4ce37e48a35d4540aba7c1ca + md5: 580e35267cce16f8cf4976192b8da5d7 + depends: + - __osx >=11.0 + - libxml2 >=2.13.5,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1179892 + timestamp: 1739211981499 +- conda: https://conda.anaconda.org/conda-forge/win-64/lxml-5.2.2-py310hdccf185_0.conda + sha256: 703cabc64b4edfa1da0b9e661d9bddd483934c98498a68be1be843705ce5a748 + md5: a3bc58522808bac61dd123cb548c0de0 + depends: + - libxml2 >=2.12.6,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1027304 + timestamp: 1715599051668 +- conda: https://conda.anaconda.org/conda-forge/win-64/lxml-5.3.1-py310hb043844_0.conda + sha256: 2e639f3b89a3adbe4dd5673252790e1843fb92f793ae309502273cee71c0569c + md5: d268b9b58c3b6a7338681882b4b24999 + depends: + - libxml2 >=2.13.5,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: BSD-3-Clause and MIT-CMU + purls: + - pkg:pypi/lxml?source=hash-mapping + size: 1022107 + timestamp: 1739212132095 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 sha256: 9de95a7996d5366ae0808eef2acbc63f9b11b874aa42375f55379e6715845dc6 md5: 066552ac6b907ec6d72c0ddab29050dc depends: - m2w64-gcc-libs-core - msys2-conda-epoch ==20160418 license: GPL, LGPL, FDL, custom + purls: [] size: 350687 timestamp: 1608163451316 -- kind: conda - name: m2w64-gcc-libs - version: 5.3.0 - build: '7' - build_number: 7 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 sha256: 3bd1ab02b7c89a5b153a17be03b36d833f1517ff2a6a77ead7c4a808b88196aa md5: fe759119b8b3bfa720b8762c6fdc35de depends: @@ -6659,15 +5234,10 @@ packages: - m2w64-libwinpthread-git - msys2-conda-epoch ==20160418 license: GPL3+, partial:GCCRLE, partial:LGPL2+ + purls: [] size: 532390 timestamp: 1608163512830 -- kind: conda - name: m2w64-gcc-libs-core - version: 5.3.0 - build: '7' - build_number: 7 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 sha256: 58afdfe859ed2e9a9b1cc06bc408720cb2c3a6a132e59d4805b090d7574f4ee0 md5: 4289d80fb4d272f1f3b56cfe87ac90bd depends: @@ -6675,1573 +5245,1438 @@ packages: - m2w64-libwinpthread-git - msys2-conda-epoch ==20160418 license: GPL3+, partial:GCCRLE, partial:LGPL2+ + purls: [] size: 219240 timestamp: 1608163481341 -- kind: conda - name: m2w64-gmp - version: 6.1.0 - build: '2' - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 sha256: 7e3cd95f554660de45f8323fca359e904e8d203efaf07a4d311e46d611481ed1 md5: 53a1c73e1e3d185516d7e3af177596d9 depends: - msys2-conda-epoch ==20160418 license: LGPL3 + purls: [] size: 743501 timestamp: 1608163782057 -- kind: conda - name: m2w64-libwinpthread-git - version: 5.0.0.4634.697f757 - build: '2' - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 sha256: f63a09b2cae7defae0480f1740015d6235f1861afa6fe2e2d3e10bd0d1314ee0 md5: 774130a326dee16f1ceb05cc687ee4f0 depends: - msys2-conda-epoch ==20160418 license: MIT, BSD + purls: [] size: 31928 timestamp: 1608166099896 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311h05b510d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py311h05b510d_0.conda - sha256: 3f2127bd8788dc4b7c3d6d65ae4b7d2f8c7d02a246fc17b819390edeca53fd93 - md5: a27177455a9d29f4ac9d687a489e5d52 - depends: - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - constrains: - - jinja2 >=3.0.0 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.6-pyhd8ed1ab_0.conda + sha256: fce1fde00359696983989699c00f9891194c4ebafea647a8d21b7e2e3329b56e + md5: 06e9bebf748a0dea03ecbe1f0e27e909 + depends: + - importlib-metadata >=4.4 + - python >=3.6 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 26578 - timestamp: 1706900556332 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311h459d7ec_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda - sha256: 14912e557a6576e03f65991be89e9d289c6e301921b6ecfb4e7186ba974f453d - md5: a322b4185121935c871d201ae00ac143 + - pkg:pypi/markdown?source=hash-mapping + size: 78331 + timestamp: 1710435316163 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 depends: - - libgcc-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + size: 64430 + timestamp: 1733250550053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda + sha256: 0bed20ec27dcbcaf04f02b2345358e1161fb338f8423a4ada1cf0f4d46918741 + md5: 8ce3f0332fd6de0d737e2911d329523f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - jinja2 >=3.0.0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 27502 - timestamp: 1706900084436 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311ha68e1ae_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda - sha256: c629f79fe78b5df7f08daa6b7f125f7a67f789bf734949c6d68aa063d7296208 - md5: 07da1326e2837e055ef6f44ef3334b0a - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - pkg:pypi/markupsafe?source=hash-mapping + size: 23091 + timestamp: 1733219814479 +- conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py310h8e2f543_1.conda + sha256: c3f9a8738211c82e831117f2c5161dc940295aa251ec0f7ed466bced6f861360 + md5: 946e287b30b11071874906e8b87b437c + depends: + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - jinja2 >=3.0.0 + arch: x86_64 + platform: osx license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 30011 - timestamp: 1706900632904 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311he705e18_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py311he705e18_0.conda - sha256: 83a2b764a4946a04e693a4dd8fe5a35bf093a378da9ce18bf0689cd5dcb3c3fe - md5: 75abe7e2e3a0874a49d7c175115f443f - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - pkg:pypi/markupsafe?source=hash-mapping + size: 22219 + timestamp: 1733219861095 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py310hc74094e_1.conda + sha256: d907e2b7264ae060c0b79ad4accd7b79a59d43ca75c3ba107e534cd0d58115b5 + md5: f6483697076f2711e6a54031a54314b6 + depends: + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 constrains: - jinja2 >=3.0.0 + arch: arm64 + platform: osx license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 26155 - timestamp: 1706900211496 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py312h41838bb_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py312h41838bb_0.conda - sha256: 8dc8f31f78d00713300da000b6ebaa1943a17c112f267de310d5c3d82950079c - md5: c4a9c25c09cef3901789ca818d9beb10 - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - pkg:pypi/markupsafe?source=hash-mapping + size: 22681 + timestamp: 1733219957702 +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py310h38315fa_1.conda + sha256: deb8505b7ef76d363174d133e2ff814ae75b91ac4c3ae5550a7686897392f4d0 + md5: 79dfc050ae5a7dd4e63e392c984e2576 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - jinja2 >=3.0.0 + arch: x86_64 + platform: win license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 25742 - timestamp: 1706900456837 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py312h98912ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda - sha256: 273d8efd6c089c534ccbede566394c0ac1e265bfe5d89fe76e80332f3d75a636 - md5: 6ff0b9582da2d4a74a1f9ae1f9ce2af6 + - pkg:pypi/markupsafe?source=hash-mapping + size: 25941 + timestamp: 1733220087179 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + sha256: 69b7dc7131703d3d60da9b0faa6dd8acbf6f6c396224cf6aef3e855b8c0c41c6 + md5: af6ab708897df59bd6e7283ceab1b56b depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 + - python >=3.9 + - traitlets license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 26685 - timestamp: 1706900070330 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py312he37b823_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py312he37b823_0.conda - sha256: 61480b725490f68856dd14e646f51ffc34f77f2c985bd33e3b77c04b2856d97d - md5: ba3a8f8cf8bbdb81394275b1e1d271da - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 + - pkg:pypi/matplotlib-inline?source=hash-mapping + size: 14467 + timestamp: 1733417051523 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.2-pyhd8ed1ab_1.conda + sha256: c63ed79d9745109c0a70397713b0c07f06e7d3561abcb122cfc80a141ab3b449 + md5: af2060041d4f3250a7eb6ab3ec0e549b + depends: + - markdown-it-py >=1.0.0,<4.0.0 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdit-py-plugins?source=hash-mapping + size: 42180 + timestamp: 1733854816517 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + sha256: e5b555fd638334a253d83df14e3c913ef8ce10100090e17fd6fb8e752d36f95d + md5: d9a8fc1f01deae61735c88ec242e855c + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mergedeep?source=hash-mapping + size: 11676 + timestamp: 1734157119152 +- conda: https://conda.anaconda.org/conda-forge/noarch/mike-2.1.3-pyh29332c3_0.conda + sha256: 0f9ce5712d30f447524fb5a8d8a33337f6544a6cacad295935ea1f51a8d59e4e + md5: 13c7fd10f5bb25cf02cd7798ea02ee37 + depends: + - python >=3.9 + - jinja2 >=2.7 + - mkdocs >=1.0 + - pyparsing >=3.0 + - pyaml >=5.1 + - verspec + - pyyaml-env-tag + - importlib-resources + - importlib-metadata + - python license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 26382 - timestamp: 1706900495057 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py312he70551f_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py312he70551f_0.conda - sha256: f8690a3c87e2e96cebd434a829bb95cac43afe6c439530b336dc3452fe4ce4af - md5: 4950a739b19edaac1ed29ca9474e49ac - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - pkg:pypi/mike?source=hash-mapping + size: 32866 + timestamp: 1736381474362 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.2-pyhd8ed1ab_0.conda + sha256: 63d5308ac732b2f8130702c83ee40ce31c5451ebcb6e70075b771cc8f7df0156 + md5: 0982b0f06168fe3421d09f70596ca1f0 + depends: + - python >=3.9 + - typing_extensions + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mistune?source=compressed-mapping + size: 68903 + timestamp: 1739952304731 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + sha256: 902d2e251f9a7ffa7d86a3e62be5b2395e28614bd4dbe5f50acf921fd64a8c35 + md5: 14661160be39d78f2b210f2cc2766059 + depends: + - click >=7.0 + - colorama >=0.4 + - ghp-import >=1.0 + - importlib-metadata >=4.4 + - jinja2 >=2.11.1 + - markdown >=3.3.6 + - markupsafe >=2.0.1 + - mergedeep >=1.3.4 + - mkdocs-get-deps >=0.2.0 + - packaging >=20.5 + - pathspec >=0.11.1 + - python >=3.9 + - pyyaml >=5.1 + - pyyaml-env-tag >=0.1 + - watchdog >=2.0 constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause + - babel >=2.9.0 + license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/markupsafe - size: 29060 - timestamp: 1706900374745 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py311h1ea47a8_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py311h1ea47a8_2.conda - sha256: 6bd16d34367a7571009a3dc0f6067e8c57ba2d772cd9a5da443c842878f72bfb - md5: 97b9e2a44c863a5ad7b20cbbb908db13 - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - pyqt >=5.10 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8781 - timestamp: 1715977022364 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py311h38be061_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py311h38be061_2.conda - sha256: f1bc7cb045fe64634bbd8bcca97cd0e2fcf99cca527069b54a8e68dea2d17dd1 - md5: 7667100b9559c1b7a40c728cd72dabdf - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - pyqt >=5.10 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8392 - timestamp: 1715976479383 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py311h6eed73b_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py311h6eed73b_2.conda - sha256: 289c70753c8f4a4d1592b8759b59228929391d4450a844a8375fb7e2241da608 - md5: ca778ed2dd6076bd994bcd7db65820e4 - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8498 - timestamp: 1715976619504 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py311ha1ab1f8_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py311ha1ab1f8_2.conda - sha256: b4e069c685e1154e64cc848152bfb69f24d33cabbe66673087664e7b60bff93f - md5: e26f0e6737d62fb305d49eb4953de6d1 - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8523 - timestamp: 1715976611356 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py312h1f38498_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py312h1f38498_0.conda - sha256: 4651d701b5c3d4598329e9d2aa2bbb8a3885db2608def1a70a69bd3dad165d62 - md5: abe7b1e19a0b459c94da4b785664ca74 - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8616 - timestamp: 1712606663191 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py312h2e8e312_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py312h2e8e312_0.conda - sha256: 6ed42f07d0a61b276f2eda67f2492ba1dce42dbfce432d9a840fb5236d7ec5bf - md5: 0340214c925ac0a0652f105ccd48549e - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - pyqt >=5.10 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8828 - timestamp: 1712607229773 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py312h7900ff3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py312h7900ff3_0.conda - sha256: 5d732555c5c806d163c45fe9c43cc24ef0eb58bd109a301afcec2b62866615f6 - md5: 619a27df3b13edbc64b758e67be62267 - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - pyqt >=5.10 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8429 - timestamp: 1712606103817 -- kind: conda - name: matplotlib - version: 3.8.4 - build: py312hb401068_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py312hb401068_0.conda - sha256: 074ba889dc6d565a95e1bad2a9deda97b6fbda26725232f57681f562cc8d4049 - md5: 187ee42addd449b4899b55c304012436 - depends: - - matplotlib-base >=3.8.4,<3.8.5.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - size: 8528 - timestamp: 1712606349796 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py311h000fb6e_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py311h000fb6e_2.conda - sha256: 84b454a56d464439d04b24f39aa70c3c6ca54967a6633096e2af4d21bc78dafb - md5: 6d97618476a1c227b47c78ed34777466 + - pkg:pypi/mkdocs?source=hash-mapping + size: 3524754 + timestamp: 1734344673481 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-autorefs-1.4.0-pyhd8ed1ab_1.conda + sha256: 9bbe08bf45c681c42cc4321b79631d90b67e6e6d1624a0d203972e4ea4e4f3ea + md5: e3a95f495c74f6131ffe571e88ecd7c6 depends: - - __osx >=11.0 - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libcxx >=16 - - numpy >=1.19,<3 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python-dateutil >=2.7 - - python_abi 3.11.* *_cp311 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib - size: 7873166 - timestamp: 1715976559228 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py311h9b31f6e_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py311h9b31f6e_2.conda - sha256: 857ed04795a1e3ea1939d8990fe0f6122b086445f72f92afe50de74ae19977d0 - md5: dbf84485273ba5fea107ef140a173e30 - depends: - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - numpy >=1.19,<3 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.11,<3.12.0a0 - - python-dateutil >=2.7 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib - size: 7671314 - timestamp: 1715976956766 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py311ha4ca890_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda - sha256: 19a65ac35a9f48b3f0277b723b832052728d276e70c0ad1057f5b5bbe1f1ba28 - md5: 0848e2084cbb57014f232f48568561af - depends: - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.19,<3 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.11,<3.12.0a0 - - python-dateutil >=2.7 - - python_abi 3.11.* *_cp311 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF + - markdown >=3.3 + - markupsafe >=2.0.1 + - mkdocs >=1.1 + - pymdown-extensions + - python >=3.9 + license: ISC purls: - - pkg:pypi/matplotlib - size: 7812607 - timestamp: 1715976443225 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py311hff79762_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py311hff79762_2.conda - sha256: 55ef2a9bb6a6638df534eb9ca8a0c838b750975bc89ba9a10db43cead44e33d3 - md5: 0557edaf2d4dba4a161e7d5f574040df + - pkg:pypi/mkdocs-autorefs?source=hash-mapping + size: 1551418 + timestamp: 1740540797063 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + sha256: e0b501b96f7e393757fb2a61d042015966f6c5e9ac825925e43f9a6eafa907b6 + md5: 84382acddb26c27c70f2de8d4c830830 depends: - - __osx >=10.13 - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libcxx >=16 - - numpy >=1.19,<3 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.11,<3.12.0a0 - - python-dateutil >=2.7 - - python_abi 3.11.* *_cp311 - license: PSF-2.0 - license_family: PSF + - importlib-metadata >=4.3 + - mergedeep >=1.3.4 + - platformdirs >=2.2.0 + - python >=3.9 + - pyyaml >=5.1 + license: MIT + license_family: MIT purls: - - pkg:pypi/matplotlib - size: 7917411 - timestamp: 1715976564196 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py312h1fe5000_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py312h1fe5000_0.conda - sha256: e3b090e5a236d28ba5aa5883a0f8cb3437815dbc6d4265114f491022e81741be - md5: 3e3097734a5042cb6d2675e69bf1fc5a + - pkg:pypi/mkdocs-get-deps?source=hash-mapping + size: 14757 + timestamp: 1734353035244 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-jupyter-0.25.0-pyhd8ed1ab_0.conda + sha256: 636a930d20f73d20f9445f17d38944ec2248a3c06b987143ddb92919b1029fea + md5: 5ce2d782691e0cea360842674df07f16 depends: - - __osx >=10.12 - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libcxx >=16 - - numpy >=1.21,<2 - - numpy >=1.26.4,<2.0a0 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - license: PSF-2.0 - license_family: PSF + - ipykernel <7.0.0,>6.0.0 + - jupytext <2,>1.13.8 + - mkdocs <2,>=1.4.0 + - mkdocs-material >9.0.0 + - nbconvert <8,>=7.2.9 + - pygments >2.12.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE purls: - - pkg:pypi/matplotlib - size: 7675757 - timestamp: 1712606295471 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py312h26ecaf7_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py312h26ecaf7_0.conda - sha256: 53098eff7c23641348e9a88acc5dcc8151a65421b721468771ff7740c5abedf8 - md5: e83910bd39860772aaefee3e0eb1c29f - depends: - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - numpy >=1.21,<2 - - numpy >=1.26.4,<2.0a0 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: PSF-2.0 - license_family: PSF + - pkg:pypi/mkdocs-jupyter?source=hash-mapping + size: 1194244 + timestamp: 1725634857081 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.5.39-pyhd8ed1ab_0.conda + sha256: 9893218b065f6c6d833085953e00769275b7b3d74a5baa6ced9b6a86d70d3f39 + md5: fe4bc69162207ba73d3e7635a42ae5a8 + depends: + - babel ~=2.10 + - colorama ~=0.4 + - jinja2 ~=3.0 + - markdown ~=3.2 + - mkdocs ~=1.6 + - mkdocs-material-extensions ~=1.3 + - paginate ~=0.5 + - pygments ~=2.16 + - pymdown-extensions ~=10.2 + - python >=3.8 + - pyyaml + - regex >=2022.4 + - requests ~=2.26 + license: MIT + license_family: MIT purls: - - pkg:pypi/matplotlib - size: 7646613 - timestamp: 1712607178713 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py312ha6faf65_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py312ha6faf65_0.conda - sha256: ecf374bf25cbb0e9739ef1869189956fee40e176239c5383472823f89f7d407d - md5: db0735debe4ba42187aa5d46338fe697 - depends: - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libcxx >=16 - - numpy >=1.21,<2 - - numpy >=1.26.4,<2.0a0 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - license: PSF-2.0 - license_family: PSF + - pkg:pypi/mkdocs-material?source=hash-mapping + size: 4956431 + timestamp: 1727618305376 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + sha256: f62955d40926770ab65cc54f7db5fde6c073a3ba36a0787a7a5767017da50aa3 + md5: de8af4000a4872e16fb784c649679c8e + depends: + - python >=3.9 + constrains: + - mkdocs-material >=5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mkdocs-material-extensions?source=hash-mapping + size: 16122 + timestamp: 1734641109286 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-0.26.1-pyhd8ed1ab_0.conda + sha256: 7b1e08ae00e8eccd5f49a8dfeaec3357b681e25061a762509576d793afb607b3 + md5: 9ded8dcdbc3b5811504a89c604b7080c + depends: + - click >=7.0 + - importlib-metadata >=4.6 + - jinja2 >=2.11.1 + - markdown >=3.6 + - markupsafe >=1.1 + - mkdocs >=1.4 + - mkdocs-autorefs >=1.2 + - platformdirs >=2.2.0 + - pymdown-extensions >=6.3 + - python >=3.8,<4.0 + - typing-extensions >=4.1 + license: ISC purls: - - pkg:pypi/matplotlib - size: 7737709 - timestamp: 1712606601800 -- kind: conda - name: matplotlib-base - version: 3.8.4 - build: py312he5832f3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312he5832f3_0.conda - sha256: e49f00d191b71c4925e4cacfc4b4975d156c29501f6fdce8f934ff4d3743dfd3 - md5: 5377a9a29f607eebe4ad63eb82bcb575 - depends: - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.21,<2 - - numpy >=1.26.4,<2.0a0 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF + - pkg:pypi/mkdocstrings?source=hash-mapping + size: 30653 + timestamp: 1725636621031 +- conda: https://conda.anaconda.org/conda-forge/noarch/mkdocstrings-python-1.11.1-pyhd8ed1ab_0.conda + sha256: ca4ba431c719e77a564171801700154c9081af95db1b1b555c6f428ee1979a1d + md5: cbc23a223d404d947bd6c1e4a7e76f0b + depends: + - griffe >=0.49 + - mkdocs-autorefs >=1.2 + - mkdocstrings >=0.26 + - python >=3.8 + license: ISC purls: - - pkg:pypi/matplotlib - size: 7744308 - timestamp: 1712606072243 -- kind: conda - name: mkl - version: 2024.1.0 - build: h66d3029_692 - build_number: 692 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda - sha256: abfdb5eb3a17af59a827ea49fcb4d2bf18e70b62498bf3720351962e636cb5b7 - md5: b43ec7ed045323edeff31e348eea8652 + - pkg:pypi/mkdocstrings-python?source=hash-mapping + size: 46784 + timestamp: 1725447236738 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda + sha256: 20e52b0389586d0b914a49cd286c5ccc9c47949bed60ca6df004d1d295f2edbd + md5: 302dff2807f2927b3e9e0d19d60121de depends: - intel-openmp 2024.* - tbb 2021.* - license: LicenseRef-ProprietaryIntel + license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary - size: 109491063 - timestamp: 1712153746272 -- kind: conda - name: mpg123 - version: 1.32.6 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda - sha256: 8895a5ce5122a3b8f59afcba4b032f198e8a690a0efc95ef61f2135357ef0d72 - md5: 9160cdeb523a1b20cf8d2a0bf821f45d - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LGPL-2.1-only - license_family: LGPL - size: 491811 - timestamp: 1712327176955 -- kind: conda - name: msys2-conda-epoch - version: '20160418' - build: '1' - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + purls: [] + size: 103106385 + timestamp: 1730232843711 +- conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 md5: b0309b72560df66f71a9d5e34a5efdfa + purls: [] size: 3227 timestamp: 1608166968312 -- kind: conda - name: munkres - version: 1.1.4 - build: pyh9f0ad1d_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 - md5: 2ba8498c1018c1e9c61eb99b973dfe19 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + sha256: a20cff739d66c2f89f413e4ba4c6f6b59c50d5c30b5f0d840c13e8c9c2df9135 + md5: 6bb0d77277061742744176ab555b723c + depends: + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - nbformat >=5.1 + - python >=3.8 + - traitlets >=5.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbclient?source=hash-mapping + size: 28045 + timestamp: 1734628936013 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.6-hb482800_0.conda + sha256: 5480b7e05bf3079fcb7357a5a15a96c3a1649cc1371d0c468c806898a7e53088 + md5: aa90ea40c80d4bd3da35cb17ed668f22 + depends: + - nbconvert-core ==7.16.6 pyh29332c3_0 + - nbconvert-pandoc ==7.16.6 hed9df3c_0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbconvert?source=compressed-mapping + size: 5241 + timestamp: 1738067871725 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda + sha256: dcccb07c5a1acb7dc8be94330e62d54754c0e9c9cb2bb6865c8e3cfe44cf5a58 + md5: d24beda1d30748afcc87c429454ece1b depends: + - beautifulsoup4 + - bleach-with-css !=5.0.0 + - defusedxml + - importlib-metadata >=3.6 + - jinja2 >=3.0 + - jupyter_core >=4.7 + - jupyterlab_pygments + - markupsafe >=2.0 + - mistune >=2.0.3,<4 + - nbclient >=0.5.0 + - nbformat >=5.7 + - packaging + - pandocfilters >=1.4.1 + - pygments >=2.4.1 + - python >=3.9 + - traitlets >=5.1 - python - license: Apache-2.0 - license_family: Apache + constrains: + - pandoc >=2.9.2,<4.0.0 + - nbconvert ==7.16.6 *_0 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/munkres - size: 12452 - timestamp: 1600387789153 -- kind: conda - name: mypy_extensions - version: 1.0.0 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 - md5: 4eccaeba205f0aed9ac3a9ea58568ca3 + - pkg:pypi/nbconvert?source=hash-mapping + size: 200601 + timestamp: 1738067871724 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.6-hed9df3c_0.conda + sha256: 1e8923f1557c2ddb7bba915033cfaf8b8c1b7462c745172458102c11caee1002 + md5: 5b0afb6c52e74a7eca2cf809a874acf4 depends: - - python >=3.5 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mypy-extensions - size: 10492 - timestamp: 1675543414256 -- kind: conda - name: mysql-common - version: 8.3.0 - build: hf1915f5_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda - sha256: 4cf6d29e091398735348550cb74cfd5006e04892d54b6b1ba916935f1af1a151 - md5: 784a4df6676c581ca624fbe460703a6d + - nbconvert-core ==7.16.6 pyh29332c3_0 + - pandoc + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5722 + timestamp: 1738067871725 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 + md5: bbe1963f1e47f594070ffe87cdf612ea depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.2.1,<4.0a0 - license: GPL-2.0-or-later - license_family: GPL - size: 784844 - timestamp: 1709910607121 -- kind: conda - name: mysql-libs - version: 8.3.0 - build: hca2cd23_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda - sha256: c39cdd1a5829aeffc611f789bdfd4dbd4ce1aa829c73d728defec180b5265d91 - md5: 1b50eebe2a738a3146c154d2eceaa8b6 + - jsonschema >=2.6 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-fastjsonschema >=2.15 + - traitlets >=5.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbformat?source=hash-mapping + size: 100945 + timestamp: 1733402844974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + sha256: 17fe6afd8a00446010220d52256bd222b1e4fcb93bd587e7784b03219f3dc358 + md5: 04b34b9a40cdc48cfdab261ab176ff74 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - - mysql-common 8.3.0 hf1915f5_4 - - openssl >=3.2.1,<4.0a0 - - zstd >=1.5.5,<1.6.0a0 - license: GPL-2.0-or-later - license_family: GPL - size: 1537884 - timestamp: 1709910705541 -- kind: conda - name: ncurses - version: 6.4.20240210 - build: h078ce10_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - sha256: 06f0905791575e2cd3aa961493c56e490b3d82ad9eb49f1c332bd338b0216911 - md5: 616ae8691e6608527d0071e6766dcb81 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 license: X11 AND BSD-3-Clause - size: 820249 - timestamp: 1710866874348 -- kind: conda - name: ncurses - version: 6.4.20240210 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - sha256: aa0f005b6727aac6507317ed490f0904430584fa8ca722657e7f0fb94741de81 - md5: 97da8860a0da5413c7c98a3b3838a645 + purls: [] + size: 894452 + timestamp: 1736683239706 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_2.conda + sha256: 507456591054ff83a0179c6b3804dbf6ea7874ac07b68bdf6ab5f23f2065e067 + md5: 7eb0c4be5e4287a3d6bfef015669a545 depends: - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - size: 895669 - timestamp: 1710866638986 -- kind: conda - name: ncurses - version: 6.4.20240210 - build: h73e2aa4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda - sha256: 50b72acf08acbc4e5332807653e2ca6b26d4326e8af16fad1fd3f2ce9ea55503 - md5: 50f28c512e9ad78589e3eab34833f762 - license: X11 AND BSD-3-Clause - size: 823010 - timestamp: 1710866856626 -- kind: conda - name: ncurses - version: '6.5' - build: h5846eda_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - sha256: 6ecc73db0e49143092c0934355ac41583a5d5a48c6914c5f6ca48e562d3a4b79 - md5: 02a888433d165c99bf09784a7b14d900 + - __osx >=10.13 license: X11 AND BSD-3-Clause - size: 823601 - timestamp: 1715195267791 -- kind: conda - name: ncurses - version: '6.5' - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 - md5: fcea371545eda051b6deafb24889fc69 + purls: [] + size: 822835 + timestamp: 1736683439206 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + sha256: b45c73348ec9841d5c893acc2e97adff24127548fe8c786109d03c41ed564e91 + md5: f6f7c5b7d0983be186c46c4f6f8f9af8 depends: - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - size: 887465 - timestamp: 1715194722503 -- kind: conda - name: ncurses - version: '6.5' - build: hb89a1cb_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - sha256: 87d7cf716d9d930dab682cb57b3b8d3a61940b47d6703f3529a155c938a6990a - md5: b13ad5724ac9ae98b6b4fd87e4500ba4 + - __osx >=11.0 license: X11 AND BSD-3-Clause - size: 795131 - timestamp: 1715194898402 -- kind: conda - name: nodeenv - version: 1.8.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda - sha256: 1320306234552717149f36f825ddc7e27ea295f24829e9db4cc6ceaff0b032bd - md5: 2a75b296096adabbabadd5e9782e5fcc + purls: [] + size: 796754 + timestamp: 1736683572099 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 + md5: 598fd7d4d0de2455fb74f56063969a97 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/nest-asyncio?source=hash-mapping + size: 11543 + timestamp: 1733325673691 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + sha256: 3636eec0e60466a00069b47ce94b6d88b01419b6577d8e393da44bb5bc8d3468 + md5: 7ba3f09fceae6a120d664217e58fe686 depends: - - python 2.7|>=3.7 + - python >=3.9 - setuptools license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/nodeenv - size: 34358 - timestamp: 1683893151613 -- kind: conda - name: nspr - version: '4.35' - build: h27087fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - sha256: 8fadeebb2b7369a4f3b2c039a980d419f65c7b18267ba0c62588f9f894396d0c - md5: da0ec11a6454ae19bff5b02ed881a2b1 + - pkg:pypi/nodeenv?source=hash-mapping + size: 34574 + timestamp: 1734112236147 +- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-6.4.12-pyha770c72_0.tar.bz2 + sha256: 3bf942438d0bb1d2d7eaddfcc302a23ed9f67662f4d31737c7d7dbacbd4da75c + md5: 77fc67c5bbea44fd41e8bbe2ac82d1ad depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: MPL-2.0 - license_family: MOZILLA - size: 226848 - timestamp: 1669784948267 -- kind: conda - name: nss - version: '3.98' - build: h1d7d5a4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda - sha256: a9bc94d03df48014011cf6caaf447f2ef86a5edf7c70d70002ec4b59f5a4e198 - md5: 54b56c2fdf973656b748e0378900ec13 + - argon2-cffi + - ipykernel + - ipython_genutils + - jinja2 + - jupyter_client >=5.3.4 + - jupyter_core >=4.6.1 + - nbconvert >=5 + - nbformat + - prometheus_client + - python >=3.7 + - pyzmq >=17 + - send2trash >=1.5.0 + - terminado >=0.8.3 + - tornado >=6.1 + - traitlets >=4.2.1,<5.10.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/notebook?source=hash-mapping + size: 6625141 + timestamp: 1654637065687 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.55.2-py310ha5257ce_0.tar.bz2 + sha256: 4e21bf184213036ac0fbf451c14bd606dc2f1a951b117c6469faae2ba3de8f7c + md5: 9d528f9433b9a9db61c17f4483cb9c23 depends: - - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - - libsqlite >=3.45.1,<4.0a0 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - - nspr >=4.35,<5.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 2019716 - timestamp: 1708065114928 -- kind: conda - name: nss - version: '3.100' - build: hca3bf56_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda - sha256: a4146d2b6636999a21afcaf957029d066637bf26239fd3170242501e38fb1fa4 - md5: 949c4a82290ee58b3c970cef4bcfd4ad + - llvmlite >=0.38.1,<0.39.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - setuptools + constrains: + - scipy >=1.0 + - tbb 2021.* + - cuda-python >=11.6 + - cudatoolkit >=9.2 + - libopenblas !=0.3.6 + - numpy >=1.18,<1.23 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 4016030 + timestamp: 1655473531910 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.57.1-py310h0f6aa51_0.conda + sha256: 4fc115078403e79bcfb1ec9b0649618b6af634e14d57c5172fed1f7bae45dec5 + md5: 1a9f0067a638463c0f49869cab6a1d3e depends: - - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - - libsqlite >=3.45.3,<4.0a0 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - - nspr >=4.35,<5.0a0 - license: MPL-2.0 - license_family: MOZILLA - size: 2047723 - timestamp: 1715184444840 -- kind: conda - name: numpy - version: 1.26.4 - build: py311h0b4df5a_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda - sha256: 14116e72107de3089cc58119a5ce5905c22abf9a715c9fe41f8ac14db0992326 - md5: 7b240edd44fd7a0991aa409b07cee776 + - llvmlite >=0.40.0,<0.41.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - cuda-python >=11.6 + - cudatoolkit >=10.2 + - numpy >=1.21,!=1.22.0,!=1.22.1,!=1.22.2,<1.25 + - libopenblas !=0.3.6 + - cuda-version >=10.2 + - scipy >=1.0 + - tbb >=2021.6.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 4165304 + timestamp: 1687805009043 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.55.2-py310hab1bff6_0.tar.bz2 + sha256: 0b34bde7471623e70b11eb38408935fdfe976b4d765920bb1d6cff4beaac3e46 + md5: 0901f4c9b78f6ed27f20b00078cb07d3 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - libcxx >=13.0.1 + - llvm-openmp >=13.0.1 + - llvm-openmp >=14.0.4 + - llvmlite >=0.38.1,<0.39.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - setuptools + constrains: + - libopenblas !=0.3.6 + - cuda-python >=11.6 + - cudatoolkit >=9.2 + - tbb 2021.* + - numpy >=1.18,<1.23 + - scipy >=1.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 3998845 + timestamp: 1655473842799 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.57.1-py310he09a53b_0.conda + sha256: 67428ff71def3c5ea5d94a5a2032b59ac4188e473a0f21d8dd77d51a465489a1 + md5: 75affaad0bf98ec1faba0c25f632638e + depends: + - libcxx >=15.0.7 + - llvm-openmp >=15.0.7 + - llvm-openmp >=16.0.6 + - llvmlite >=0.40.0,<0.41.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - numpy >=1.21,!=1.22.0,!=1.22.1,!=1.22.2,<1.25 + - cuda-python >=11.6 + - tbb >=2021.6.0 + - libopenblas !=0.3.6 + - cudatoolkit >=10.2 + - cuda-version >=10.2 + - scipy >=1.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 4165882 + timestamp: 1687805242512 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.55.2-py310ha67b2a8_0.tar.bz2 + sha256: 86329c0f3cbd0d585c2a23db77fee12c08f7a99ce6a84ff21f029adc9cd855c9 + md5: af13ede8c8fd8cf5b00f9b4de8a22709 + depends: + - libcxx >=13.0.1 + - llvm-openmp >=13.0.1 + - llvm-openmp >=14.0.4 + - llvmlite >=0.38.1,<0.39.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - setuptools + constrains: + - cuda-python >=11.6 + - tbb 2021.* + - scipy >=1.0 + - numpy >=1.18,<1.23 + - libopenblas >=0.3.18, !=0.3.20 + - cudatoolkit >=9.2 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 3982742 + timestamp: 1655473899807 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.57.1-py310hb9b3264_0.conda + sha256: bb9da3073f7c7093a11176210798e90cabe59d99f1521c6acfa0ffd27393b9a3 + md5: 5abd1894383216c3440b51ea74b2dcc2 + depends: + - libcxx >=15.0.7 + - llvm-openmp >=15.0.7 + - llvm-openmp >=16.0.6 + - llvmlite >=0.40.0,<0.41.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - cuda-python >=11.6 + - cudatoolkit >=10.2 + - scipy >=1.0 + - libopenblas >=0.3.18, !=0.3.20 + - tbb >=2021.6.0 + - numpy >=1.21,!=1.22.0,!=1.22.1,!=1.22.2,<1.25 + - cuda-version >=10.2 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 4142984 + timestamp: 1687805259589 +- conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.55.2-py310h77579ad_0.tar.bz2 + sha256: 430e13fa5f8ecc9bf121f62d0a40d7807b2d523852734265414881419f2aefe9 + md5: 87c637734c63fa18624f19dc363fd8b5 + depends: + - llvmlite >=0.38.1,<0.39.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - setuptools + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + constrains: + - cuda-python >=11.6 + - cudatoolkit >=9.2 + - tbb 2021.* + - numpy >=1.18,<1.23 + - scipy >=1.0 + - libopenblas !=0.3.6 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 4031547 + timestamp: 1655473905895 +- conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.57.1-py310h19bcfe9_0.conda + sha256: f6f33685b02bcd136065eac06829e853ad89b5245d00d98368af791b6ec074fa + md5: 2b62ef412f4d34193128d615cc4e3fa6 + depends: + - llvmlite >=0.40.0,<0.41.0a0 + - numpy >=1.21.6,<2.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - numpy-base <0a0 - license: BSD-3-Clause + - libopenblas !=0.3.6 + - numpy >=1.21,!=1.22.0,!=1.22.1,!=1.22.2,<1.25 + - tbb >=2021.6.0 + - cuda-version >=10.2 + - cudatoolkit >=10.2 + - scipy >=1.0 + - cuda-python >=11.6 + license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 7104093 - timestamp: 1707226459646 -- kind: conda - name: numpy - version: 1.26.4 - build: py311h64a7726_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda - sha256: 3f4365e11b28e244c95ba8579942b0802761ba7bb31c026f50d1a9ea9c728149 - md5: a502d7aad449a1206efb366d6a12c52d + - pkg:pypi/numba?source=hash-mapping + size: 4150917 + timestamp: 1687805503375 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.21.6-py310h45f3432_0.tar.bz2 + sha256: 7cbebcd376f24d9b6e8dd7da2da12ebd87e4b45a1edb127f62ec86014388eed1 + md5: f3dec5e25746cf988b6ad3eb54b391b0 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - libblas >=3.8.0,<4.0a0 + - libcblas >=3.8.0,<4.0a0 + - libgcc-ng >=10.3.0 + - liblapack >=3.8.0,<4.0a0 + - libstdcxx-ng >=10.3.0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 8065890 - timestamp: 1707225944355 -- kind: conda - name: numpy - version: 1.26.4 - build: py311h7125741_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda - sha256: 160a52a01fea44fe9753a2ed22cf13d7b55c8a89ea0b8738546fdbf4795d6514 - md5: 3160b93669a0def35a7a8158ebb33816 + - pkg:pypi/numpy?source=hash-mapping + size: 6460874 + timestamp: 1649806653150 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.0-py310h454958d_1.tar.bz2 + sha256: 8f5a9c1feed1d6062a6d731a62e9fadc52e801789125e8d1a2cea6966aedd411 + md5: 607c66f0cce2986515a8fe9e136b2b57 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - liblapack >=3.9.0,<4.0a0 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 + - libblas >=3.8.0,<4.0a0 + - libcblas >=3.8.0,<4.0a0 + - libgcc-ng >=9.4.0 + - liblapack >=3.8.0,<4.0a0 + - libstdcxx-ng >=9.4.0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 6652352 - timestamp: 1707226297967 -- kind: conda - name: numpy - version: 1.26.4 - build: py311hc43a94b_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py311hc43a94b_0.conda - sha256: dc9628197125ee1d02b2e7a859a769d26291d747ed79337309b8a9e67a8b8e00 - md5: bb02b8801d17265160e466cf8bbf28da + - pkg:pypi/numpy?source=hash-mapping + size: 20333181 + timestamp: 1642632736818 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.21.6-py310hb608527_0.tar.bz2 + sha256: de3fb3650b83ab5ae57b4efc934d7161e8c1bfe10921272067cc6caaf0b263c5 + md5: f8e01c5fba8a9c5a33051bee47caf439 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - liblapack >=3.9.0,<4.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - libblas >=3.8.0,<4.0a0 + - libcblas >=3.8.0,<4.0a0 + - libcxx >=12.0.1 + - liblapack >=3.8.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 7504319 - timestamp: 1707226235372 -- kind: conda - name: numpy - version: 1.26.4 - build: py312h8442bc7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 - md5: d83fc83d589e2625a3451c9a7e21047c + - pkg:pypi/numpy?source=hash-mapping + size: 6252388 + timestamp: 1649806805449 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.22.0-py310hfbbbacf_1.tar.bz2 + sha256: 314f87226d04969a8cf6444a547b8437c5a45869acedb0d9adca9d18b0b0db80 + md5: 6c533068089d17205d21055ed717831e depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - liblapack >=3.9.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - libblas >=3.8.0,<4.0a0 + - libcblas >=3.8.0,<4.0a0 + - libcxx >=11.1.0 + - liblapack >=3.8.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 6073136 - timestamp: 1707226249608 -- kind: conda - name: numpy - version: 1.26.4 - build: py312h8753938_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py312h8753938_0.conda - sha256: 73570817a5109d396b4ebbe5124a89525959269fd33fa33fd413700289fbe0ef - md5: f9ac74c3b07c396014434aca1e58d362 + - pkg:pypi/numpy?source=hash-mapping + size: 6861771 + timestamp: 1642633197594 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.21.6-py310h2e04ed8_0.tar.bz2 + sha256: f2765caa81750d82275dc083445356bf6e034d79707ab4beeaa751714ac67332 + md5: 20c6388138c1fdc9dd39d0ac222eef29 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 + - libcxx >=12.0.1 - liblapack >=3.9.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 6495445 - timestamp: 1707226412944 -- kind: conda - name: numpy - version: 1.26.4 - build: py312he3a82b2_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py312he3a82b2_0.conda - sha256: 6152b73fba3e227afa4952df8753128fc9669bbaf142ee8f9972bf9df3bf8856 - md5: 96c61a21c4276613748dba069554846b + - pkg:pypi/numpy?source=hash-mapping + size: 5524595 + timestamp: 1649806806007 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.22.0-py310h567df17_1.tar.bz2 + sha256: 985e83cdda1fb1d0c3ff813381c258818696985d10fd4ccab2b719ea8fdc8652 + md5: 6ecd7326570ae2fb65fa4d8427f64213 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 + - libcxx >=11.1.0 - liblapack >=3.9.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 6990646 - timestamp: 1707226178262 -- kind: conda - name: numpy - version: 1.26.4 - build: py312heda63a1_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 - md5: d8285bea2a350f63fab23bf460221f3f + - pkg:pypi/numpy?source=hash-mapping + size: 6291591 + timestamp: 1642632976128 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.21.6-py310hcae7c84_0.tar.bz2 + sha256: 1423f300a3493a23d756e0c564bd02a3a7825fa0e1cc43db477ed3e44668fb7f + md5: c015224b71f5f2555ee84be96905bff5 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - libblas >=3.8.0,<4.0a0 + - libcblas >=3.8.0,<4.0a0 + - liblapack >=3.8.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy - size: 7484186 - timestamp: 1707225809722 -- kind: conda - name: numpydoc - version: 1.7.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.7.0-pyhd8ed1ab_0.conda - sha256: fe33123d34c06c6bc05095f17f92d43f012f990813ad4cf0cc93f7b215c2ad04 - md5: 1ad3afced398492586ca1bef70328be4 + - pkg:pypi/numpy?source=hash-mapping + size: 5640083 + timestamp: 1649806985847 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.22.0-py310hcae7c84_1.tar.bz2 + sha256: c327b5bcc96e9f06147c03eecba689eb3cfe2478d8e68f17b471b273ee60cf45 + md5: 07f52c684a2387799426a532170152b6 depends: - - jinja2 >=2.10 - - python >=3.7 - - sphinx >=5 - - tabulate >=0.8.10 + - libblas >=3.8.0,<4.0a0 + - libcblas >=3.8.0,<4.0a0 + - liblapack >=3.8.0,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + constrains: + - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpydoc - size: 57422 - timestamp: 1711638408735 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h3d672ee_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - sha256: dda71cbe094234ab208f3552dec1f4ca6f2e614175d010808d6cb66ecf0bc753 - md5: 7e7099ad94ac3b599808950cec30ad4e - depends: - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-2-Clause - license_family: BSD - size: 237974 - timestamp: 1709159764160 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h488ebb8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 - md5: 7f2e286780f072ed750df46dc2631138 - depends: - - libgcc-ng >=12 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - license: BSD-2-Clause - license_family: BSD - size: 341592 - timestamp: 1709159244431 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h7310d3a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - sha256: dc9c405119b9b54f8ca5984da27ba498bd848ab4f0f580da6f293009ca5adc13 - md5: 05a14cc9d725dd74995927968d6547e3 - depends: - - libcxx >=16 - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - license: BSD-2-Clause - license_family: BSD - size: 331273 - timestamp: 1709159538792 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h9f1df11_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - sha256: 472d6eaffc1996e6af35ec8e91c967f472a536a470079bfa56383cc0dbf4d463 - md5: 5029846003f0bc14414b9128a1f7c84b - depends: - - libcxx >=16 - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 - license: BSD-2-Clause - license_family: BSD - size: 316603 - timestamp: 1709159627299 -- kind: conda - name: openssl - version: 3.3.0 - build: h0d3ecfb_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - sha256: 51f9be8fe929c2bb3243cd0707b6dfcec27541f8284b4bd9b063c288fc46f482 - md5: 25b0e522c3131886a637e347b2ca0c0f + - pkg:pypi/numpy?source=hash-mapping + size: 6171270 + timestamp: 1642633334774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + sha256: f62f6bca4a33ca5109b6d571b052a394d836956d21b25b7ffd03376abf7a481f + md5: 4ce6875f75469b2757a65e10a5d05e31 depends: + - __glibc >=2.17,<3.0.a0 - ca-certificates - constrains: - - pyopenssl >=22.1 + - libgcc >=13 license: Apache-2.0 license_family: Apache - size: 2888226 - timestamp: 1714466346030 -- kind: conda - name: openssl - version: 3.3.0 - build: hcfcfb64_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - sha256: ca7573b7503711b53b2464fa35e4efa6f89dcd3d436fb5f128722b853e356dfd - md5: a6c544c9f060740c625dbf6d92cf3495 + purls: [] + size: 2937158 + timestamp: 1736086387286 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hc426f3f_1.conda + sha256: 879a960d586cf8a64131ac0c060ef575cfb8aa9f6813093cba92042a86ee867c + md5: eaae23dbfc9ec84775097898526c72ea depends: + - __osx >=10.13 - ca-certificates - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 8358240 - timestamp: 1714468180752 -- kind: conda - name: openssl - version: 3.3.0 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - sha256: fdbf05e4db88c592366c90bb82e446edbe33c6e49e5130d51c580b2629c0b5d5 - md5: c0f3abb4a16477208bbd43a39bd56f18 + purls: [] + size: 2590210 + timestamp: 1736086530077 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + sha256: 97772762abc70b3a537683ca9fc3ff3d6099eb64e4aba3b9c99e6fce48422d21 + md5: 22f971393637480bda8c679f374d8861 depends: + - __osx >=11.0 - ca-certificates - - libgcc-ng >=12 - constrains: - - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2895187 - timestamp: 1714466138265 -- kind: conda - name: openssl - version: 3.3.0 - build: hd75f5a5_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - sha256: d3889b0c89c2742e92e20f01e8f298b64c221df5d577c639b823a0bfe314e2e3 - md5: eb8c33aa7929a7714eab8b90c1d88afe + purls: [] + size: 2936415 + timestamp: 1736086108693 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-ha4e3fda_1.conda + sha256: 519a06eaab7c878fbebb8cab98ea4a4465eafb1e9ed8c6ce67226068a80a92f0 + md5: fb45308ba8bfe1abf1f4a27bad24a743 depends: - ca-certificates - constrains: - - pyopenssl >=22.1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache - size: 2541802 - timestamp: 1714467068742 -- kind: conda - name: packaging - version: '24.0' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a - md5: 248f521b64ce055e7feae3105e7abeb8 + purls: [] + size: 8462960 + timestamp: 1736088436984 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa depends: - python >=3.8 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging - size: 49832 - timestamp: 1710076089469 -- kind: conda - name: pathspec - version: 0.12.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d - md5: 17064acba08d3686f1135b5ec1b32b12 + - pkg:pypi/packaging?source=hash-mapping + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + sha256: f6fef1b43b0d3d92476e1870c08d7b9c229aebab9a0556b073a5e1641cf453bd + md5: c3f35453097faf911fd3f6023fc2ab24 depends: - - python >=3.7 - license: MPL-2.0 - license_family: MOZILLA + - python >=3.9 + license: MIT + license_family: MIT purls: - - pkg:pypi/pathspec - size: 41173 - timestamp: 1702250135032 -- kind: conda - name: pcre2 - version: '10.43' - build: h17e33f8_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda - sha256: 9a82c7d49c4771342b398661862975efb9c30e7af600b5d2e08a0bf416fda492 - md5: d0485b8aa2cedb141a7bd27b4efa4c9c - depends: - - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-3-Clause - license_family: BSD - size: 818317 - timestamp: 1708118868321 -- kind: conda - name: pcre2 - version: '10.43' - build: hcad00b1_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda - sha256: 766dd986a7ed6197676c14699000bba2625fd26c8a890fcb7a810e5cf56155bc - md5: 8292dea9e022d9610a11fce5e0896ed8 + - pkg:pypi/paginate?source=hash-mapping + size: 18865 + timestamp: 1734618649164 +- pypi: https://files.pythonhosted.org/packages/3c/b2/0d4a5729ce1ce11630c4fc5d5522a33b967b3ca146c210f58efde7c40e99/pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl + name: pandas + version: 2.0.3 + sha256: e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8 + requires_dist: + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.1 + - numpy>=1.20.3 ; python_full_version < '3.10' + - numpy>=1.21.0 ; python_full_version >= '3.10' + - numpy>=1.23.2 ; python_full_version >= '3.11' + - beautifulsoup4>=4.9.3 ; extra == 'all' + - bottleneck>=1.3.2 ; extra == 'all' + - brotlipy>=0.7.0 ; extra == 'all' + - fastparquet>=0.6.3 ; extra == 'all' + - fsspec>=2021.7.0 ; extra == 'all' + - gcsfs>=2021.7.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.34.2 ; extra == 'all' + - jinja2>=3.0.0 ; extra == 'all' + - lxml>=4.6.3 ; extra == 'all' + - matplotlib>=3.6.1 ; extra == 'all' + - numba>=0.53.1 ; extra == 'all' + - numexpr>=2.7.3 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.0.7 ; extra == 'all' + - pandas-gbq>=0.15.0 ; extra == 'all' + - psycopg2>=2.8.6 ; extra == 'all' + - pyarrow>=7.0.0 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.1 ; extra == 'all' + - pyreadstat>=1.1.2 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - pytest-asyncio>=0.17.0 ; extra == 'all' + - python-snappy>=0.6.0 ; extra == 'all' + - pyxlsb>=1.0.8 ; extra == 'all' + - qtpy>=2.2.0 ; extra == 'all' + - scipy>=1.7.1 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'all' + - sqlalchemy>=1.4.16 ; extra == 'all' + - tables>=3.6.1 ; extra == 'all' + - tabulate>=0.8.9 ; extra == 'all' + - xarray>=0.21.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=1.4.3 ; extra == 'all' + - zstandard>=0.15.2 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'aws' + - pyqt5>=5.15.1 ; extra == 'clipboard' + - qtpy>=2.2.0 ; extra == 'clipboard' + - brotlipy>=0.7.0 ; extra == 'compression' + - python-snappy>=0.6.0 ; extra == 'compression' + - zstandard>=0.15.2 ; extra == 'compression' + - scipy>=1.7.1 ; extra == 'computation' + - xarray>=0.21.0 ; extra == 'computation' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.0.7 ; extra == 'excel' + - pyxlsb>=1.0.8 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=1.4.3 ; extra == 'excel' + - pyarrow>=7.0.0 ; extra == 'feather' + - fsspec>=2021.7.0 ; extra == 'fss' + - gcsfs>=2021.7.0 ; extra == 'gcp' + - pandas-gbq>=0.15.0 ; extra == 'gcp' + - tables>=3.6.1 ; extra == 'hdf5' + - beautifulsoup4>=4.9.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.6.3 ; extra == 'html' + - sqlalchemy>=1.4.16 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - jinja2>=3.0.0 ; extra == 'output-formatting' + - tabulate>=0.8.9 ; extra == 'output-formatting' + - pyarrow>=7.0.0 ; extra == 'parquet' + - bottleneck>=1.3.2 ; extra == 'performance' + - numba>=0.53.1 ; extra == 'performance' + - numexpr>=2.7.1 ; extra == 'performance' + - matplotlib>=3.6.1 ; extra == 'plot' + - sqlalchemy>=1.4.16 ; extra == 'postgresql' + - psycopg2>=2.8.6 ; extra == 'postgresql' + - pyreadstat>=1.1.2 ; extra == 'spss' + - sqlalchemy>=1.4.16 ; extra == 'sql-other' + - hypothesis>=6.34.2 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pytest-asyncio>=0.17.0 ; extra == 'test' + - lxml>=4.6.3 ; extra == 'xml' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/4a/f6/f620ca62365d83e663a255a41b08d2fc2eaf304e0b8b21bb6d62a7390fe3/pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl + name: pandas + version: 2.0.3 + sha256: f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f + requires_dist: + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.1 + - numpy>=1.20.3 ; python_full_version < '3.10' + - numpy>=1.21.0 ; python_full_version >= '3.10' + - numpy>=1.23.2 ; python_full_version >= '3.11' + - beautifulsoup4>=4.9.3 ; extra == 'all' + - bottleneck>=1.3.2 ; extra == 'all' + - brotlipy>=0.7.0 ; extra == 'all' + - fastparquet>=0.6.3 ; extra == 'all' + - fsspec>=2021.7.0 ; extra == 'all' + - gcsfs>=2021.7.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.34.2 ; extra == 'all' + - jinja2>=3.0.0 ; extra == 'all' + - lxml>=4.6.3 ; extra == 'all' + - matplotlib>=3.6.1 ; extra == 'all' + - numba>=0.53.1 ; extra == 'all' + - numexpr>=2.7.3 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.0.7 ; extra == 'all' + - pandas-gbq>=0.15.0 ; extra == 'all' + - psycopg2>=2.8.6 ; extra == 'all' + - pyarrow>=7.0.0 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.1 ; extra == 'all' + - pyreadstat>=1.1.2 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - pytest-asyncio>=0.17.0 ; extra == 'all' + - python-snappy>=0.6.0 ; extra == 'all' + - pyxlsb>=1.0.8 ; extra == 'all' + - qtpy>=2.2.0 ; extra == 'all' + - scipy>=1.7.1 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'all' + - sqlalchemy>=1.4.16 ; extra == 'all' + - tables>=3.6.1 ; extra == 'all' + - tabulate>=0.8.9 ; extra == 'all' + - xarray>=0.21.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=1.4.3 ; extra == 'all' + - zstandard>=0.15.2 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'aws' + - pyqt5>=5.15.1 ; extra == 'clipboard' + - qtpy>=2.2.0 ; extra == 'clipboard' + - brotlipy>=0.7.0 ; extra == 'compression' + - python-snappy>=0.6.0 ; extra == 'compression' + - zstandard>=0.15.2 ; extra == 'compression' + - scipy>=1.7.1 ; extra == 'computation' + - xarray>=0.21.0 ; extra == 'computation' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.0.7 ; extra == 'excel' + - pyxlsb>=1.0.8 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=1.4.3 ; extra == 'excel' + - pyarrow>=7.0.0 ; extra == 'feather' + - fsspec>=2021.7.0 ; extra == 'fss' + - gcsfs>=2021.7.0 ; extra == 'gcp' + - pandas-gbq>=0.15.0 ; extra == 'gcp' + - tables>=3.6.1 ; extra == 'hdf5' + - beautifulsoup4>=4.9.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.6.3 ; extra == 'html' + - sqlalchemy>=1.4.16 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - jinja2>=3.0.0 ; extra == 'output-formatting' + - tabulate>=0.8.9 ; extra == 'output-formatting' + - pyarrow>=7.0.0 ; extra == 'parquet' + - bottleneck>=1.3.2 ; extra == 'performance' + - numba>=0.53.1 ; extra == 'performance' + - numexpr>=2.7.1 ; extra == 'performance' + - matplotlib>=3.6.1 ; extra == 'plot' + - sqlalchemy>=1.4.16 ; extra == 'postgresql' + - psycopg2>=2.8.6 ; extra == 'postgresql' + - pyreadstat>=1.1.2 ; extra == 'spss' + - sqlalchemy>=1.4.16 ; extra == 'sql-other' + - hypothesis>=6.34.2 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pytest-asyncio>=0.17.0 ; extra == 'test' + - lxml>=4.6.3 ; extra == 'xml' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e3/59/35a2892bf09ded9c1bf3804461efe772836a5261ef5dfb4e264ce813ff99/pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pandas + version: 2.0.3 + sha256: ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0 + requires_dist: + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.1 + - numpy>=1.20.3 ; python_full_version < '3.10' + - numpy>=1.21.0 ; python_full_version >= '3.10' + - numpy>=1.23.2 ; python_full_version >= '3.11' + - beautifulsoup4>=4.9.3 ; extra == 'all' + - bottleneck>=1.3.2 ; extra == 'all' + - brotlipy>=0.7.0 ; extra == 'all' + - fastparquet>=0.6.3 ; extra == 'all' + - fsspec>=2021.7.0 ; extra == 'all' + - gcsfs>=2021.7.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.34.2 ; extra == 'all' + - jinja2>=3.0.0 ; extra == 'all' + - lxml>=4.6.3 ; extra == 'all' + - matplotlib>=3.6.1 ; extra == 'all' + - numba>=0.53.1 ; extra == 'all' + - numexpr>=2.7.3 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.0.7 ; extra == 'all' + - pandas-gbq>=0.15.0 ; extra == 'all' + - psycopg2>=2.8.6 ; extra == 'all' + - pyarrow>=7.0.0 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.1 ; extra == 'all' + - pyreadstat>=1.1.2 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - pytest-asyncio>=0.17.0 ; extra == 'all' + - python-snappy>=0.6.0 ; extra == 'all' + - pyxlsb>=1.0.8 ; extra == 'all' + - qtpy>=2.2.0 ; extra == 'all' + - scipy>=1.7.1 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'all' + - sqlalchemy>=1.4.16 ; extra == 'all' + - tables>=3.6.1 ; extra == 'all' + - tabulate>=0.8.9 ; extra == 'all' + - xarray>=0.21.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=1.4.3 ; extra == 'all' + - zstandard>=0.15.2 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'aws' + - pyqt5>=5.15.1 ; extra == 'clipboard' + - qtpy>=2.2.0 ; extra == 'clipboard' + - brotlipy>=0.7.0 ; extra == 'compression' + - python-snappy>=0.6.0 ; extra == 'compression' + - zstandard>=0.15.2 ; extra == 'compression' + - scipy>=1.7.1 ; extra == 'computation' + - xarray>=0.21.0 ; extra == 'computation' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.0.7 ; extra == 'excel' + - pyxlsb>=1.0.8 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=1.4.3 ; extra == 'excel' + - pyarrow>=7.0.0 ; extra == 'feather' + - fsspec>=2021.7.0 ; extra == 'fss' + - gcsfs>=2021.7.0 ; extra == 'gcp' + - pandas-gbq>=0.15.0 ; extra == 'gcp' + - tables>=3.6.1 ; extra == 'hdf5' + - beautifulsoup4>=4.9.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.6.3 ; extra == 'html' + - sqlalchemy>=1.4.16 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - jinja2>=3.0.0 ; extra == 'output-formatting' + - tabulate>=0.8.9 ; extra == 'output-formatting' + - pyarrow>=7.0.0 ; extra == 'parquet' + - bottleneck>=1.3.2 ; extra == 'performance' + - numba>=0.53.1 ; extra == 'performance' + - numexpr>=2.7.1 ; extra == 'performance' + - matplotlib>=3.6.1 ; extra == 'plot' + - sqlalchemy>=1.4.16 ; extra == 'postgresql' + - psycopg2>=2.8.6 ; extra == 'postgresql' + - pyreadstat>=1.1.2 ; extra == 'spss' + - sqlalchemy>=1.4.16 ; extra == 'sql-other' + - hypothesis>=6.34.2 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pytest-asyncio>=0.17.0 ; extra == 'test' + - lxml>=4.6.3 ; extra == 'xml' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ed/30/b97456e7063edac0e5a405128065f0cd2033adfe3716fb2256c186bd41d0/pandas-2.0.3-cp310-cp310-win_amd64.whl + name: pandas + version: 2.0.3 + sha256: 9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e + requires_dist: + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.1 + - numpy>=1.20.3 ; python_full_version < '3.10' + - numpy>=1.21.0 ; python_full_version >= '3.10' + - numpy>=1.23.2 ; python_full_version >= '3.11' + - beautifulsoup4>=4.9.3 ; extra == 'all' + - bottleneck>=1.3.2 ; extra == 'all' + - brotlipy>=0.7.0 ; extra == 'all' + - fastparquet>=0.6.3 ; extra == 'all' + - fsspec>=2021.7.0 ; extra == 'all' + - gcsfs>=2021.7.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.34.2 ; extra == 'all' + - jinja2>=3.0.0 ; extra == 'all' + - lxml>=4.6.3 ; extra == 'all' + - matplotlib>=3.6.1 ; extra == 'all' + - numba>=0.53.1 ; extra == 'all' + - numexpr>=2.7.3 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.0.7 ; extra == 'all' + - pandas-gbq>=0.15.0 ; extra == 'all' + - psycopg2>=2.8.6 ; extra == 'all' + - pyarrow>=7.0.0 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.1 ; extra == 'all' + - pyreadstat>=1.1.2 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - pytest-asyncio>=0.17.0 ; extra == 'all' + - python-snappy>=0.6.0 ; extra == 'all' + - pyxlsb>=1.0.8 ; extra == 'all' + - qtpy>=2.2.0 ; extra == 'all' + - scipy>=1.7.1 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'all' + - sqlalchemy>=1.4.16 ; extra == 'all' + - tables>=3.6.1 ; extra == 'all' + - tabulate>=0.8.9 ; extra == 'all' + - xarray>=0.21.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=1.4.3 ; extra == 'all' + - zstandard>=0.15.2 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'aws' + - pyqt5>=5.15.1 ; extra == 'clipboard' + - qtpy>=2.2.0 ; extra == 'clipboard' + - brotlipy>=0.7.0 ; extra == 'compression' + - python-snappy>=0.6.0 ; extra == 'compression' + - zstandard>=0.15.2 ; extra == 'compression' + - scipy>=1.7.1 ; extra == 'computation' + - xarray>=0.21.0 ; extra == 'computation' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.0.7 ; extra == 'excel' + - pyxlsb>=1.0.8 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=1.4.3 ; extra == 'excel' + - pyarrow>=7.0.0 ; extra == 'feather' + - fsspec>=2021.7.0 ; extra == 'fss' + - gcsfs>=2021.7.0 ; extra == 'gcp' + - pandas-gbq>=0.15.0 ; extra == 'gcp' + - tables>=3.6.1 ; extra == 'hdf5' + - beautifulsoup4>=4.9.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.6.3 ; extra == 'html' + - sqlalchemy>=1.4.16 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - jinja2>=3.0.0 ; extra == 'output-formatting' + - tabulate>=0.8.9 ; extra == 'output-formatting' + - pyarrow>=7.0.0 ; extra == 'parquet' + - bottleneck>=1.3.2 ; extra == 'performance' + - numba>=0.53.1 ; extra == 'performance' + - numexpr>=2.7.1 ; extra == 'performance' + - matplotlib>=3.6.1 ; extra == 'plot' + - sqlalchemy>=1.4.16 ; extra == 'postgresql' + - psycopg2>=2.8.6 ; extra == 'postgresql' + - pyreadstat>=1.1.2 ; extra == 'spss' + - sqlalchemy>=1.4.16 ; extra == 'sql-other' + - hypothesis>=6.34.2 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pytest-asyncio>=0.17.0 ; extra == 'test' + - lxml>=4.6.3 ; extra == 'xml' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.3-ha770c72_0.conda + sha256: a7392b0d5403676b0b3ab9ff09c1e65d8ab9e1c34349bba9be605d76cf622640 + md5: 16ff7c679250dc09f9732aab14408d2c + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 21334851 + timestamp: 1739197772385 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.6.3-h694c41f_0.conda + sha256: 1133230f40d30e3eaa03e209800800751423360193fdc7e6523771125b72daa8 + md5: eb1ef420766e7f9bd8f61a2bc7c2961d + arch: x86_64 + platform: osx + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 14312999 + timestamp: 1739197821852 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.6.3-hce30654_0.conda + sha256: 2013114d2405b4a4e9d9b62522eb09111e1b9e3cd2e902a42e7ccc8a88a2b05a + md5: 41603d280df06636257acd79ea326be9 + arch: arm64 + platform: osx + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 23273280 + timestamp: 1739197846659 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.6.3-h57928b3_0.conda + sha256: ffdb8fd1da7419f6625c8b2339a12f9669a705ada4177b763cc796c60763f734 + md5: 9b999036cccf0d5a94ed3c0b0edbb905 + arch: x86_64 + platform: win + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 25331299 + timestamp: 1739198094952 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f + md5: 457c2c8c08e54905d6954e79cb5b5db9 depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - python !=3.0,!=3.1,!=3.2,!=3.3 license: BSD-3-Clause license_family: BSD - size: 950847 - timestamp: 1708118050286 -- kind: conda - name: pillow - version: 10.3.0 - build: py311h0b5d0a1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py311h0b5d0a1_0.conda - sha256: 756788e2fa2088131da13cfaf923e33b8e5411fa07cac01eba7dfc95ef769920 - md5: 15ea30bca869d60e6de571232638a701 - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow - size: 41877756 - timestamp: 1712155234508 -- kind: conda - name: pillow - version: 10.3.0 - build: py311h18e6fac_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda - sha256: 6e54cc2acead8884e81e3e1b4f299b18d5daa0e3d11f4db5686db9e2ada2a353 - md5: 6c520a9d36c9d7270988c7a6c360d6d4 - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow - size: 42600867 - timestamp: 1712154582003 -- kind: conda - name: pillow - version: 10.3.0 - build: py311h1b85569_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py311h1b85569_0.conda - sha256: ae51c9a8b900396f819840b6be0d8e72180af4e5e913cfa54a673bdaec70cc35 - md5: 881ad821b527c802f1538347cf167449 - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow - size: 41308782 - timestamp: 1712154783659 -- kind: conda - name: pillow - version: 10.3.0 - build: py311h6819b35_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py311h6819b35_0.conda - sha256: aaf367926867e0cfe727b4f64b95d78b9db9166e634cd26ec6f847cdcb0e5adb - md5: 86b3e331bf65cca7b8b5aacf9fefa1be - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tk >=8.6.13,<8.7.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: HPND - purls: - - pkg:pypi/pillow - size: 41717626 - timestamp: 1712155076324 -- kind: conda - name: pillow - version: 10.3.0 - build: py312h0c923fa_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py312h0c923fa_0.conda - sha256: 3e33ce8ba364948eeeeb06da435059b1ed0e6cfb2b1195931b76e190ee671310 - md5: 6f0591ae972e9b815739da3392fbb3c3 - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow - size: 42531277 - timestamp: 1712154782302 -- kind: conda - name: pillow - version: 10.3.0 - build: py312h6f6a607_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py312h6f6a607_0.conda - sha256: f1621c28346609886ccce14b6ae0069b5cb34925ace73e05a8c06770d2ad7a19 - md5: 8d5f5f1fa36200f1ef987299a47de403 - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: HPND - purls: - - pkg:pypi/pillow - size: 42439434 - timestamp: 1712155248737 -- kind: conda - name: pillow - version: 10.3.0 - build: py312h8a801b1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py312h8a801b1_0.conda - sha256: 26bc04e81ae5fce70e4b72478dadea29d32b693eed17640be7721108a3c9af0d - md5: 1d42544faaed27dce36268912b8dfedf - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow - size: 42729895 - timestamp: 1712155044162 -- kind: conda - name: pillow - version: 10.3.0 - build: py312hdcec9eb_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda - sha256: a7fdcc1e56b66d95622bad073cc8d347cc180988040419754abb2a4ed7b29471 - md5: 425bb325f970e57a047ac57c4586489d - depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base >=1.3.2,<2.0a0 - - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow - size: 41991755 - timestamp: 1712154634705 -- kind: conda - name: pixman - version: 0.43.2 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - sha256: 366d28e2a0a191d6c535e234741e0cd1d94d713f76073d8af4a5ccb2a266121e - md5: 71004cbf7924e19c02746ccde9fd7123 + purls: + - pkg:pypi/pandocfilters?source=hash-mapping + size: 11627 + timestamp: 1631603397334 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + sha256: 17131120c10401a99205fc6fe436e7903c0fa092f1b3e80452927ab377239bcc + md5: 5c092057b6badd30f75b06244ecd01c9 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - python >=3.9 license: MIT license_family: MIT - size: 386826 - timestamp: 1706549500138 -- kind: conda - name: platformdirs - version: 4.2.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda - sha256: 5718fef2954f016834058ae1d359e407ff8e2e847b35ab43d5d91bcf22d5578d - md5: d478a8a3044cdff1aa6e62f9269cefe0 + purls: + - pkg:pypi/parso?source=hash-mapping + size: 75295 + timestamp: 1733271352153 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 depends: - - python >=3.8 + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a + md5: d0d408b1f18883a944376da5cf8101ea + depends: + - ptyprocess >=0.5 + - python >=3.9 + license: ISC + purls: + - pkg:pypi/pexpect?source=compressed-mapping + size: 53561 + timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + sha256: e2ac3d66c367dada209fc6da43e645672364b9fd5f9d28b9f016e24b81af475b + md5: 11a9d1d09a3615fc07c3faf79bc0b943 + depends: + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs - size: 20248 - timestamp: 1713912912262 -- kind: conda - name: platformdirs - version: 4.2.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda - sha256: adc59384cf0b2fc6dc7362840151e8cb076349197a38f7230278252698a88442 - md5: 6f6cf28bf8e021933869bae3f84b8fc9 + - pkg:pypi/pickleshare?source=hash-mapping + size: 11748 + timestamp: 1733327448200 +- conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + sha256: adb2dde5b4f7da70ae81309cce6188ed3286ff280355cf1931b45d91164d2ad8 + md5: 5a5870a74432aa332f7d32180633ad05 depends: - - python >=3.8 + - python >=3.9 + license: MIT AND PSF-2.0 + purls: + - pkg:pypi/pkgutil-resolve-name?source=hash-mapping + size: 10693 + timestamp: 1733344619659 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs - size: 20572 - timestamp: 1715777739019 -- kind: conda - name: pluggy - version: 1.5.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 - md5: d3483c8fc2dc2cc3f5cf43e26d60cabf + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + sha256: 122433fc5318816b8c69283aaf267c73d87aa2d09ce39f64c9805c9a3b264819 + md5: e9dcbce5f45f9ee500e728ae58b605b6 depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/pluggy - size: 23815 - timestamp: 1713667175451 -- kind: conda - name: ply - version: '3.11' - build: pyhd8ed1ab_2 - build_number: 2 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - sha256: d8faaf4dcc13caed560fa32956523b35928a70499a2d08c51320947d637e3a41 - md5: 18c6deb6f9602e32446398203c8f0e91 + - pkg:pypi/pluggy?source=hash-mapping + size: 23595 + timestamp: 1733222855563 +- conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_1.conda + sha256: bedda6b36e8e42b0255179446699a0cf08051e6d9d358dd0dd0e787254a3620e + md5: b3e783e8e8ed7577cf0b6dee37d1fbac depends: - - python >=2.6 + - packaging >=20.0 + - platformdirs >=2.5.0 + - python >=3.9 + - requests >=2.19.0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/ply - size: 49196 - timestamp: 1712243121626 -- kind: conda - name: pre-commit - version: 3.7.1 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - pkg:pypi/pooch?source=hash-mapping + size: 54116 + timestamp: 1733421432357 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda sha256: 689c169ce6ed5d516d8524cc1e6ef2687dff19747c1ed1ee9b347a71f47ff12d md5: 724bc4489c1174fc8e3233b0624fa51f depends: @@ -8254,531 +6689,387 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pre-commit + - pkg:pypi/pre-commit?source=hash-mapping size: 179748 timestamp: 1715432871404 -- kind: conda - name: pthread-stubs - version: '0.4' - build: h27ca646_1001 - build_number: 1001 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2 - sha256: 9da9e6f5d51dff6ad2e4ee0874791437ba952e0a6249942273f0fedfd07ea826 - md5: d3f26c6494d4105d4ecb85203d687102 - license: MIT - license_family: MIT - size: 5696 - timestamp: 1606147608402 -- kind: conda - name: pthread-stubs - version: '0.4' - build: h36c2ea0_1001 - build_number: 1001 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 - sha256: 67c84822f87b641d89df09758da498b2d4558d47b920fd1d3fe6d3a871e000ff - md5: 22dad4df6e8630e8dff2428f6f6a7036 - depends: - - libgcc-ng >=7.5.0 - license: MIT - license_family: MIT - size: 5625 - timestamp: 1606147468727 -- kind: conda - name: pthread-stubs - version: '0.4' - build: hc929b4f_1001 - build_number: 1001 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 - sha256: 6e3900bb241bcdec513d4e7180fe9a19186c1a38f0b4080ed619d26014222c53 - md5: addd19059de62181cd11ae8f4ef26084 - license: MIT - license_family: MIT - size: 5653 - timestamp: 1606147699844 -- kind: conda - name: pthread-stubs - version: '0.4' - build: hcd874cb_1001 - build_number: 1001 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 - sha256: bb5a6ddf1a609a63addd6d7b488b0f58d05092ea84e9203283409bff539e202a - md5: a1f820480193ea83582b13249a7e7bd9 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + sha256: bc8f00d5155deb7b47702cb8370f233935704100dbc23e30747c161d1b6cf3ab + md5: 3e01e386307acc60b2f89af0b2e161aa depends: - - m2w64-gcc-libs - license: MIT - license_family: MIT - size: 6417 - timestamp: 1606147814351 -- kind: conda - name: pthreads-win32 - version: 2.9.1 - build: hfa6e2cd_3 - build_number: 3 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 - sha256: 576a228630a72f25d255a5e345e5f10878e153221a96560f2498040cd6f54005 - md5: e2da8758d7d51ff6aa78a14dfb9dbed4 - depends: - - vc 14.* - license: LGPL 2 - size: 144301 - timestamp: 1537755684331 -- kind: conda - name: pulseaudio-client - version: '17.0' - build: hb77b528_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda - sha256: b27c0c8671bd95c205a61aeeac807c095b60bc76eb5021863f919036d7a964fc - md5: 07f45f1be1c25345faddb8db0de8039b - depends: - - dbus >=1.13.6,<2.0a0 - - libgcc-ng >=12 - - libglib >=2.78.3,<3.0a0 - - libsndfile >=1.2.2,<1.3.0a0 - - libsystemd0 >=255 - constrains: - - pulseaudio 17.0 *_0 - license: LGPL-2.1-or-later - license_family: LGPL - size: 757633 - timestamp: 1705690081905 -- kind: conda - name: pycparser - version: '2.22' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 - md5: 844d9eb3b43095b031874477f7d70088 + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/prometheus-client?source=hash-mapping + size: 49002 + timestamp: 1733327434163 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + sha256: 0749c49a349bf55b8539ce5addce559b77592165da622944a51c630e94d97889 + md5: 7d823138f550b14ecae927a5ff3286de depends: - - python >=3.8 + - python >=3.9 + - wcwidth + constrains: + - prompt_toolkit 3.0.50 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pycparser - size: 105098 - timestamp: 1711811634025 -- kind: conda - name: pydata-sphinx-theme - version: 0.15.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda - sha256: 7046e72770e549f8f22865be737f3f8d0f49f11a5894fe48ccf44611941dba5a - md5: ce99859070b0e17ccc63234ca58f3ed8 + - pkg:pypi/prompt-toolkit?source=hash-mapping + size: 271905 + timestamp: 1737453457168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py310ha75aee5_0.conda + sha256: 31e46270c73cac2b24a7f3462ca03eb39f21cbfdb713b0d41eb61c00867eabe9 + md5: da7d592394ff9084a23f62a1186451a2 depends: - - accessible-pygments - - babel - - beautifulsoup4 - - docutils !=0.17.0 - - packaging - - pygments >=2.7 - - python >=3.9 - - sphinx >=5.0 - - typing-extensions + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pydata-sphinx-theme - size: 1375728 - timestamp: 1705630287042 -- kind: conda - name: pygments - version: 2.17.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda - sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 - md5: 140a7f159396547e9799aa98f9f0742e + - pkg:pypi/psutil?source=compressed-mapping + size: 354476 + timestamp: 1740663252954 +- conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.0.0-py310hbb8c376_0.conda + sha256: 614c230961fab2ed8f7087fa81ae0cb5c6a6b3b9aea6d7d021dfad38c0aa349c + md5: c1d3e75575208aa864c8f0ae1ed6842e depends: - - python >=3.7 - license: BSD-2-Clause + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx + license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pygments - size: 860425 - timestamp: 1700608076927 -- kind: conda - name: pygments - version: 2.18.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b - md5: b7f5c092b8f9800150d998a71b76d5a1 + - pkg:pypi/psutil?source=hash-mapping + size: 360590 + timestamp: 1740663319060 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py310h078409c_0.conda + sha256: c4aa4d0e144691383a88214ef02cc67909fccd5885601bafc9eaaf8bbe1c2877 + md5: 0079de80b6bf6e1c5c9ea067dce6bb05 depends: - - python >=3.8 - license: BSD-2-Clause + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx + license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pygments - size: 879295 - timestamp: 1714846885370 -- kind: conda - name: pyparsing - version: 3.1.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - sha256: 06c77cb03e5dde2d939b216c99dd2db52ea93a4c7c599f3882f136005c359c7b - md5: b9a4dacf97241704529131a0dfc0494f + - pkg:pypi/psutil?source=compressed-mapping + size: 363458 + timestamp: 1740663509903 +- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.0.0-py310ha8f682b_0.conda + sha256: 61c016c40848168bc565ceb8f3a78ad2d9288ffbe4236bcec312ef554f1caef2 + md5: ec78bb694e0ea34958e8f479e723499e depends: - - python >=3.6 - license: MIT - license_family: MIT + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/pyparsing - size: 89455 - timestamp: 1709721146886 -- kind: conda - name: pyqt - version: 5.15.9 - build: py311h125bc19_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py311h125bc19_5.conda - sha256: 4608b9caafc4fa16d887f5af08e1bafe95f4cb07596ca8f5af184bf5de8f2c4c - md5: 29d36acae7ccbcb1f0ec4a39841b3197 - depends: - - pyqt5-sip 12.12.2 py311h12c1d0e_5 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - qt-main >=5.15.8,<5.16.0a0 - - sip >=6.7.11,<6.8.0a0 + - pkg:pypi/psutil?source=hash-mapping + size: 369926 + timestamp: 1740663706146 +- conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-h2466b09_4.conda + sha256: b989bdcf0a22ba05a238adac1ad3452c11871681f565e509f629e225a26b7d45 + md5: cf98a67a1ec8040b42455002a24f0b0b + depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - license: GPL-3.0-only - license_family: GPL + license: LGPL-2.1-or-later + purls: [] + size: 265827 + timestamp: 1728400965968 +- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 + md5: 7d9daffbb8d8e0af0f769dbbcd173a54 + depends: + - python >=3.9 + license: ISC purls: - - pkg:pypi/pyqt5 - size: 3906427 - timestamp: 1695422270104 -- kind: conda - name: pyqt - version: 5.15.9 - build: py311hf0fb5b6_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda - sha256: 74fcdb8772c7eaf654b32922f77d9a8a1350b3446111c69a32ba4d15be74905a - md5: ec7e45bc76d9d0b69a74a2075932b8e8 + - pkg:pypi/ptyprocess?source=hash-mapping + size: 19457 + timestamp: 1733302371990 +- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 + md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - pyqt5-sip 12.12.2 py311hb755f60_5 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - qt-main >=5.15.8,<5.16.0a0 - - sip >=6.7.11,<6.8.0a0 - license: GPL-3.0-only - license_family: GPL + - python >=3.9 + license: MIT + license_family: MIT purls: - - pkg:pypi/pyqt5 - size: 5315719 - timestamp: 1695420475603 -- kind: conda - name: pyqt - version: 5.15.9 - build: py312h949fe66_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py312h949fe66_5.conda - sha256: 22ccc59c03872fc680be597a1783d2c77e6b2d16953e2ec67df91f073820bebe - md5: f6548a564e2d01b2a42020259503945b + - pkg:pypi/pure-eval?source=hash-mapping + size: 16668 + timestamp: 1733569518868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-25.1.0-pyhd8ed1ab_0.conda + sha256: 72d74e0582745a925a34c9f427c0079a263e47c9d21a91094727fabb233c3664 + md5: 23f3a65f26bd36f6f8c753c00e039bc3 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - pyqt5-sip 12.12.2 py312h30efb56_5 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - qt-main >=5.15.8,<5.16.0a0 - - sip >=6.7.11,<6.8.0a0 - license: GPL-3.0-only - license_family: GPL + - python >=3.9 + - pyyaml + license: WTFPL purls: - - pkg:pypi/pyqt5 - size: 5263946 - timestamp: 1695421350577 -- kind: conda - name: pyqt - version: 5.15.9 - build: py312he09f080_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py312he09f080_5.conda - sha256: c524cafaf98661f3bd5819494b41563fe5a851f6e44a7d08631c99f1dfb961c7 - md5: fb0861092c40e5d054e984abd88e5ea8 - depends: - - pyqt5-sip 12.12.2 py312h53d5487_5 - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - qt-main >=5.15.8,<5.16.0a0 - - sip >=6.7.11,<6.8.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-only - license_family: GPL + - pkg:pypi/pyaml?source=hash-mapping + size: 29133 + timestamp: 1735833752803 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b + md5: 232fb4577b6687b2d503ef8e254270c9 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD purls: - - pkg:pypi/pyqt5 - size: 3894083 - timestamp: 1695421066159 -- kind: conda - name: pyqt5-sip - version: 12.12.2 - build: py311h12c1d0e_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py311h12c1d0e_5.conda - sha256: 7130493794e4c65f4e78258619a6ef9d022ba9f9b0f61e70d2973d9bc5f10e11 - md5: 1b53a20f311bd99a1e55b31b7219106f + - pkg:pypi/pygments?source=hash-mapping + size: 888600 + timestamp: 1736243563082 +- pypi: . + name: pyikt + version: 0.0.0 + sha256: 44d7e5a7a3d3f511455889d8501dba6f9e58c8a36da7fb2806c84ec4fcb68883 + requires_dist: + - numpy<=1.22 + - pandas>=1.5 + - scikit-learn>=1.2 + - numba>=0.54 + - tqdm>=4.62.3 + requires_python: '>=3.9' + editable: true +- conda: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.14.3-pyhd8ed1ab_0.conda + sha256: 83b638059eda5208e2e4acfeecf2ff53b5dcb1adc7d85fc92edf0e7a48b943eb + md5: 08bf3657d03e1ee964c66288f5b3d797 depends: - - packaging - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - sip - - toml - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-only - license_family: GPL + - markdown >=3.6 + - python >=3.9 + - pyyaml + license: MIT + license_family: MIT purls: - - pkg:pypi/pyqt5-sip - size: 79724 - timestamp: 1695418442619 -- kind: conda - name: pyqt5-sip - version: 12.12.2 - build: py311hb755f60_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda - sha256: cf6936273d92e5213b085bfd9ce1a37defb46b317b6ee991f2712bf4a25b8456 - md5: e4d262cc3600e70b505a6761d29f6207 + - pkg:pypi/pymdown-extensions?source=hash-mapping + size: 168695 + timestamp: 1738439213597 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-11.0-py310hae5a141_0.conda + sha256: 5f2cf2f8ab52cbc6a4fdf52a8e60f142e8925a090ea2a7c207f37e275abed522 + md5: 2bcbeb72c360a1f07c3719a0c40ab173 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - packaging - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - sip - - toml - license: GPL-3.0-only - license_family: GPL + - __osx >=10.13 + - libffi >=3.4,<4.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - setuptools + arch: x86_64 + platform: osx + license: MIT + license_family: MIT purls: - - pkg:pypi/pyqt5-sip - size: 85162 - timestamp: 1695418076285 -- kind: conda - name: pyqt5-sip - version: 12.12.2 - build: py312h30efb56_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py312h30efb56_5.conda - sha256: c7154e1933360881b99687d580c4b941fb0cc6ad9574762d409a28196ef5e240 - md5: 8a2a122dc4fe14d8cff38f1cf426381f + - pkg:pypi/pyobjc-core?source=hash-mapping + size: 440659 + timestamp: 1736891377279 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.0-py310h4e4eb3c_0.conda + sha256: ef1860dd429d8294d8d3c819e7f2f63b54095321c6a589f333d3ffe67d4d7857 + md5: 113f27b3a820a326335e11dca0a0a032 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - packaging - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - sip - - toml - license: GPL-3.0-only - license_family: GPL + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - setuptools + arch: arm64 + platform: osx + license: MIT + license_family: MIT purls: - - pkg:pypi/pyqt5-sip - size: 85809 - timestamp: 1695418132533 -- kind: conda - name: pyqt5-sip - version: 12.12.2 - build: py312h53d5487_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py312h53d5487_5.conda - sha256: 56242d5203e7231ee5bdd25df417dfc60a4f38e335f922f7e00f8c518ba87bd1 - md5: dbaa69d84f7da6ac3ec20de2a9529a4b + - pkg:pypi/pyobjc-core?source=hash-mapping + size: 431491 + timestamp: 1736891197711 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-framework-cocoa-11.0-py310hae5a141_0.conda + sha256: dcf0154027aaa49eebd6095457b45666ec8430ee0b9e701701f801a6944cc2ee + md5: d61b4a008a1fa7443c549520ce041a25 depends: - - packaging - - python >=3.12.0rc3,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - sip - - toml - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-only - license_family: GPL + - __osx >=10.13 + - libffi >=3.4,<4.0a0 + - pyobjc-core 11.0.* + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx + license: MIT + license_family: MIT purls: - - pkg:pypi/pyqt5-sip - size: 79366 - timestamp: 1695418564486 -- kind: conda - name: pysocks - version: 1.7.1 - build: pyh0701188_6 - build_number: 6 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 - sha256: b3a612bc887f3dd0fb7c4199ad8e342bd148cf69a9b74fd9468a18cf2bef07b7 - md5: 56cd9fe388baac0e90c7149cfac95b60 + - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping + size: 337668 + timestamp: 1736927235562 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.0-py310h4e4eb3c_0.conda + sha256: 2dbc1f27b4f131ee7ca7386f205d002cb45fb9919c3a042901b971e10aca33c6 + md5: 6fe7f5e5ac9c83f5d1942b5d96e4f9b3 + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pyobjc-core 11.0.* + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyobjc-framework-cocoa?source=hash-mapping + size: 340886 + timestamp: 1736927224726 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 285e237b8f351e85e7574a2c7bfa6d46 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=hash-mapping + size: 93082 + timestamp: 1735698406955 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca + md5: e2fd202833c4a981ce8a65974fe4abd1 depends: - __win - - python >=3.8 + - python >=3.9 - win_inet_pton license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pysocks - size: 19348 - timestamp: 1661605138291 -- kind: conda - name: pysocks - version: 1.7.1 - build: pyha2e5f31_6 - build_number: 6 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b - md5: 2a7de29fb590ca14b5243c4c812c8025 + - pkg:pypi/pysocks?source=hash-mapping + size: 21784 + timestamp: 1733217448189 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac depends: - __unix - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pysocks - size: 18981 - timestamp: 1661604969727 -- kind: conda - name: pytest - version: 8.2.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - sha256: 02227fea7b50132a75fb223c2d796306ffebd4dc6324897455f17cb54d16683d - md5: 088ff7e08f4f10a06190468048c2a353 + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + sha256: 75245ca9d0cbd6d38bb45ec02430189a9d4c21c055c5259739d738a2298d61b3 + md5: 799ed216dc6af62520f32aa39bc1c2bb depends: - colorama - exceptiongroup >=1.0.0rc8 - iniconfig - packaging - - pluggy <2.0,>=1.5 - - python >=3.8 + - pluggy <2,>=1.5 + - python >=3.9 - tomli >=1 constrains: - pytest-faulthandler >=2 license: MIT license_family: MIT purls: - - pkg:pypi/pytest - size: 257122 - timestamp: 1714308481448 -- kind: conda - name: pytest-cov - version: 5.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - sha256: 218306243faf3c36347131c2b36bb189daa948ac2e92c7ab52bb26cc8c157b3c - md5: c54c0107057d67ddf077751339ec2c63 + - pkg:pypi/pytest?source=hash-mapping + size: 259195 + timestamp: 1733217599806 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda + sha256: 09acac1974e10a639415be4be326dd21fa6d66ca51a01fb71532263fba6dccf6 + md5: 79963c319d1be62c8fd3e34555816e01 depends: - - coverage >=5.2.1 + - coverage >=7.5 - pytest >=4.6 - - python >=3.8 + - python >=3.9 - toml license: MIT license_family: MIT purls: - - pkg:pypi/pytest-cov - size: 25507 - timestamp: 1711411153367 -- kind: conda - name: python - version: 3.11.9 - build: h631f459_0_cpython - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.11.9-h631f459_0_cpython.conda - sha256: 23698d4eb24970f74911d120204318d48384fabbb25e1e57773ad74fcd38fb12 - md5: d7ed1e7c4e2dcdfd4599bd42c0613e6c + - pkg:pypi/pytest-cov?source=hash-mapping + size: 26256 + timestamp: 1733223113491 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda + sha256: 76a5d12e73542678b70a94570f7b0f7763f9a938f77f0e75d9ea615ef22aa84c + md5: 2b4ba962994e8bd4be9ff5b64b75aff2 depends: - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 + - ld_impl_linux-64 >=2.36.1 - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.2.13,<2.0.0a0 + - ncurses >=6.4.20240210,<7.0a0 - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - xz >=5.2.6,<6.0a0 constrains: - - python_abi 3.11.* *_cp311 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 18232422 - timestamp: 1713551717924 -- kind: conda - name: python - version: 3.11.9 - build: h657bba9_0_cpython - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.9-h657bba9_0_cpython.conda - sha256: 3b50a5abb3b812875beaa9ab792dbd1bf44f335c64e9f9fedcf92d953995651c - md5: 612763bc5ede9552e4233ec518b9c9fb + purls: [] + size: 25517742 + timestamp: 1710939725109 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda + build_number: 1 + sha256: 3f90a2d5062a73cd2dd8a0027718aee1db93f7975b9cfe529e2c9aeec2db262e + md5: b887811a901b3aa622a92caf03bc8917 depends: - - __osx >=10.9 + - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 + - ld_impl_linux-64 >=2.36.1 - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4.20240210,<7.0a0 - - openssl >=3.2.1,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - xz >=5.2.6,<6.0a0 constrains: - - python_abi 3.11.* *_cp311 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 15503226 - timestamp: 1713553747073 -- kind: conda - name: python - version: 3.11.9 - build: h932a869_0_cpython - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.9-h932a869_0_cpython.conda - sha256: a436ceabde1f056a0ac3e347dadc780ee2a135a421ddb6e9a469370769829e3c - md5: 293e0713ae804b5527a673e7605c04fc + purls: [] + size: 25199631 + timestamp: 1733409331823 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.14-h00d2728_0_cpython.conda + sha256: 00c1de2d46ede26609ef4e84a44b83be7876ba6a0215b7c83bff41a0656bf694 + md5: 0a1cddc4382c5c171e791c70740546dd depends: - - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ncurses >=6.4.20240210,<7.0a0 - openssl >=3.2.1,<4.0a0 - readline >=8.2,<9.0a0 @@ -8786,55 +7077,41 @@ packages: - tzdata - xz >=5.2.6,<6.0a0 constrains: - - python_abi 3.11.* *_cp311 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 14644189 - timestamp: 1713552154779 -- kind: conda - name: python - version: 3.11.9 - build: hb806964_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda - sha256: 177f33a1fb8d3476b38f73c37b42f01c0b014fa0e039a701fd9f83d83aae6d40 - md5: ac68acfa8b558ed406c75e98d3428d7b + purls: [] + size: 11890228 + timestamp: 1710940046031 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.16-h5acdff8_1_cpython.conda + build_number: 1 + sha256: 45b0a0a021cbaddfd25a1e43026564bbec33883e4bc9c30fd341be40c12ad88c + md5: 116dda7daaadcc877b936edcdf655208 depends: + - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4.20240210,<7.0a0 - - openssl >=3.2.1,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - xz >=5.2.6,<6.0a0 constrains: - - python_abi 3.11.* *_cp311 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 30884494 - timestamp: 1713553104915 -- kind: conda - name: python - version: 3.12.3 - build: h1411813_0_cpython - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda - sha256: 3b327ffc152a245011011d1d730781577a8274fde1cf6243f073749ead8f1c2a - md5: df1448ec6cbf8eceb03d29003cf72ae6 + purls: [] + size: 13061363 + timestamp: 1733408434547 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.14-h2469fbe_0_cpython.conda + sha256: 454d609fe25daedce9e886efcbfcadad103ed0362e7cb6d2bcddec90b1ecd3ee + md5: 4ae999c8227c6d8c7623d32d51d25ea9 depends: - - __osx >=10.9 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - libsqlite >=3.45.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ncurses >=6.4.20240210,<7.0a0 - openssl >=3.2.1,<4.0a0 - readline >=8.2,<9.0a0 @@ -8842,426 +7119,355 @@ packages: - tzdata - xz >=5.2.6,<6.0a0 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 14557341 - timestamp: 1713208068012 -- kind: conda - name: python - version: 3.12.3 - build: h2628c8c_0_cpython - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.3-h2628c8c_0_cpython.conda - sha256: 1a95494abe572a8819c933f978df89f00bde72ea9432d46a70632599e8029ea4 - md5: f07c8c5dd98767f9a652de5d039b284e + purls: [] + size: 12336005 + timestamp: 1710939659384 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.16-h870587a_1_cpython.conda + build_number: 1 + sha256: cd617b15712c4f9316b22c75459311ed106ccb0659c0bf36e281a9162b4e2d95 + md5: 11ce777f54d8a4b821d7f5f159eda36c depends: + - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.1,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - - xz >=5.2.6,<6.0a0 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 16179248 - timestamp: 1713205644673 -- kind: conda - name: python - version: 3.12.3 - build: h4a7b5fc_0_cpython - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda - sha256: c761fb3713ea66bce3889b33b6f400afb2dd192d1fc2686446e9d8166cfcec6b - md5: 8643ab37bece6ae8f112464068d9df9c + purls: [] + size: 12372048 + timestamp: 1733408850559 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.14-h4de0772_0_cpython.conda + sha256: 332f97d9927b65857d6d2d4d50d66dce9b37da81edb67833ae6b88ad52acbd0c + md5: 4a00e84f29d1eb418d84970598c444e1 depends: - - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - libsqlite >=3.45.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4.20240210,<7.0a0 + - libzlib >=1.2.13,<2.0.0a0 - openssl >=3.2.1,<4.0a0 - - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - vc >=14.1,<15 + - vc14_runtime >=14.16.27033 - xz >=5.2.6,<6.0a0 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 13207557 - timestamp: 1713206576646 -- kind: conda - name: python - version: 3.12.3 - build: hab00c5b_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda - sha256: f9865bcbff69f15fd89a33a2da12ad616e98d65ce7c83c644b92e66e5016b227 - md5: 2540b74d304f71d3e89c81209db4db84 + purls: [] + size: 15864027 + timestamp: 1710938888352 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.16-h37870fc_1_cpython.conda + build_number: 1 + sha256: 3392db6a7a90864d3fd1ce281859a49e27ee68121b63eece2ae6f1dbb2a8aaf1 + md5: 5c292a7bd9c32a256ba7939b3e6dee03 depends: - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.2,<3.0a0 - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.45.2,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4.20240210,<7.0a0 - - openssl >=3.2.1,<4.0a0 - - readline >=8.2,<9.0a0 + - liblzma >=5.6.3,<6.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - xz >=5.2.6,<6.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - - python_abi 3.12.* *_cp312 + - python_abi 3.10.* *_cp310 license: Python-2.0 - size: 31991381 - timestamp: 1713208036041 -- kind: conda + purls: [] + size: 16061214 + timestamp: 1733408154785 +- pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl name: python-dateutil - version: 2.9.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 - md5: 2cf4264fffb9e6eff6031c5b6884d61c + version: 2.9.0.post0 + sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + requires_dist: + - six>=1.5 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e depends: - - python >=3.7 + - python >=3.9 - six >=1.5 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/python-dateutil - size: 222742 - timestamp: 1709299922152 -- kind: conda - name: python_abi - version: '3.11' - build: 4_cp311 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda - sha256: 0be3ac1bf852d64f553220c7e6457e9c047dfb7412da9d22fbaa67e60858b3cf - md5: d786502c97404c94d7d58d258a445a65 - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6385 - timestamp: 1695147338551 -- kind: conda - name: python_abi - version: '3.11' - build: 4_cp311 - build_number: 4 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-4_cp311.conda - sha256: f56dfe2a57b3b27bad3f9527f943548e8b2526e949d9d6fc0a383020d9359afe - md5: fef7a52f0eca6bae9e8e2e255bc86394 - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6478 - timestamp: 1695147518012 -- kind: conda - name: python_abi - version: '3.11' - build: 4_cp311 - build_number: 4 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-4_cp311.conda - sha256: 4837089c477b9b84fa38a17f453e6634e68237267211b27a8a2f5ccd847f4e55 - md5: 8d3751bc73d3bbb66f216fa2331d5649 - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6492 - timestamp: 1695147509940 -- kind: conda - name: python_abi - version: '3.11' - build: 4_cp311 - build_number: 4 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-4_cp311.conda - sha256: 67c2aade3e2160642eec0742384e766b20c766055e3d99335681e3e05d88ed7b - md5: 70513332c71b56eace4ee6441e66c012 - constrains: - - python 3.11.* *_cpython + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + sha256: 1b09a28093071c1874862422696429d0d35bd0b8420698003ac004746c5e82a2 + md5: 38e34d2d1d9dca4fb2b9a0a04f604e2c + depends: + - python >=3.9 license: BSD-3-Clause license_family: BSD - size: 6755 - timestamp: 1695147711935 -- kind: conda - name: python_abi - version: '3.12' - build: 4_cp312 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda - sha256: 182a329de10a4165f6e8a3804caf751f918f6ea6176dd4e5abcdae1ed3095bf6 - md5: dccc2d142812964fcc6abdc97b672dff + purls: + - pkg:pypi/fastjsonschema?source=hash-mapping + size: 226259 + timestamp: 1733236073335 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda + build_number: 5 + sha256: 074d2f0b31f0333b7e553042b17ea54714b74263f8adda9a68a4bd8c7e219971 + md5: 2921c34715e74b3587b4cff4d36844f9 constrains: - - python 3.12.* *_cpython + - python 3.10.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6385 - timestamp: 1695147396604 -- kind: conda - name: python_abi - version: '3.12' - build: 4_cp312 - build_number: 4 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-4_cp312.conda - sha256: 82c154d95c1637604671a02a89e72f1382e89a4269265a03506496bd928f6f14 - md5: 87201ac4314b911b74197e588cca3639 + purls: [] + size: 6227 + timestamp: 1723823165457 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.10-5_cp310.conda + build_number: 5 + sha256: 67eda423ceaf73e50be545464c289ad0c4aecf2df98cc3bbabd5eeded4ca0511 + md5: 5918a11cbc8e1650b2dde23b6ef7452c constrains: - - python 3.12.* *_cpython + - python 3.10.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6496 - timestamp: 1695147498447 -- kind: conda - name: python_abi - version: '3.12' - build: 4_cp312 - build_number: 4 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda - sha256: db25428e4f24f8693ffa39f3ff6dfbb8fd53bc298764b775b57edab1c697560f - md5: bbb3a02c78b2d8219d7213f76d644a2a + purls: [] + size: 6319 + timestamp: 1723823093772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.10-5_cp310.conda + build_number: 5 + sha256: 15a1e37da3e52c9250eac103858aad494ce23501d72fb78f5a2126046c9a9e2d + md5: e33836c9096802b29d28981765becbee constrains: - - python 3.12.* *_cpython + - python 3.10.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6508 - timestamp: 1695147497048 -- kind: conda - name: python_abi - version: '3.12' - build: 4_cp312 - build_number: 4 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda - sha256: 488f8519d04b48f59bd6fde21ebe2d7a527718ff28aac86a8b53aa63658bdef6 - md5: 17f4ccf6be9ded08bd0a376f489ac1a6 + purls: [] + size: 6324 + timestamp: 1723823147856 +- conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.10-5_cp310.conda + build_number: 5 + sha256: 0671bea4d5c5b8618ee7e2b1117d5a90901348ac459db57b654007f1644fa087 + md5: 3c510f4c4383f5fbdb12fdd971b30d49 constrains: - - python 3.12.* *_cpython + - python 3.10.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6785 - timestamp: 1695147430513 -- kind: conda + purls: [] + size: 6715 + timestamp: 1723823141288 +- pypi: https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl name: pytz - version: '2024.1' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 - md5: 3eeeeb9e4827ace8c0c1419c85d590ad + version: '2025.1' + sha256: 89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda + sha256: bc35995ecbd38693567fc143d3e6008e53cff900b453412cae48ffa535f25d1f + md5: d451ccded808abf6511f0a2ac9bb9dcc + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 186859 + timestamp: 1738317649432 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-307-py310h9e98ed7_3.conda + sha256: 712a131fadba8236830fc33d04154865a611e489f595b96370ade21cc2c1a5a2 + md5: 1fd1de4af8c39bb0efa5c9d5b092aa42 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/pywin32?source=hash-mapping + size: 5601095 + timestamp: 1728636656373 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py310h9e98ed7_0.conda + sha256: ca5952309c4faa76c617488da87ac8b77dbeb86b4dae7b767211b2ededf98575 + md5: f49c829097b0b3074801911047e4fd70 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - winpty + arch: x86_64 + platform: win + license: MIT + license_family: MIT + purls: + - pkg:pypi/pywinpty?source=hash-mapping + size: 206592 + timestamp: 1738661787718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda + sha256: 5fba7f5babcac872c72f6509c25331bcfac4f8f5031f0102530a41b41336fce6 + md5: fd343408e64cf1e273ab7c710da374db depends: - - python >=3.7 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - - pkg:pypi/pytz - size: 188538 - timestamp: 1706886944988 -- kind: conda - name: pyyaml - version: 6.0.1 - build: py311h2725bcf_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py311h2725bcf_1.conda - sha256: 8ce2ba443414170a2570514d0ce6d03625a847e91af9763d48dc58c338e6f7f3 - md5: 9283f991b5e5856a99f8aabba9927df5 + - pkg:pypi/pyyaml?source=compressed-mapping + size: 182769 + timestamp: 1737454971552 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py310h8e2f543_2.conda + sha256: ee888a231818e98603439abcad0084ea7600399c4633d3d9415d42a5e7e3aee1 + md5: a421bbf2cdd0d7ec3357a01d2d48709e depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml - size: 188606 - timestamp: 1695373840022 -- kind: conda - name: pyyaml - version: 6.0.1 - build: py311h459d7ec_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda - sha256: 28729ef1ffa7f6f9dfd54345a47c7faac5d34296d66a2b9891fb147f4efe1348 - md5: 52719a74ad130de8fb5d047dc91f247a + - pkg:pypi/pyyaml?source=hash-mapping + size: 168613 + timestamp: 1737454886846 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py310hc74094e_2.conda + sha256: 0c46719507e1664b1085f2142b8250250c6aae01ec367d18068688efeba445ec + md5: b8be3d77488c580d2fd81c9bb3cacdf1 depends: - - libgcc-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml - size: 200626 - timestamp: 1695373818537 -- kind: conda - name: pyyaml - version: 6.0.1 - build: py311ha68e1ae_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py311ha68e1ae_1.conda - sha256: 4fb0770fc70381a8ab3ced33413ad9dc5e82d4c535b593edd580113ce8760298 - md5: 2b4128962cd665153e946f2a88667a3b + - pkg:pypi/pyyaml?source=hash-mapping + size: 166853 + timestamp: 1737454973579 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py310h38315fa_2.conda + sha256: 49dd492bdf2c479118ca9d61a59ce259594853d367a1a0548926f41a6e734724 + md5: 9986c3731bb820db0830dd0825c26cf9 depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: win license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml - size: 175469 - timestamp: 1695374086205 -- kind: conda - name: pyyaml - version: 6.0.1 - build: py311heffc1b2_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py311heffc1b2_1.conda - sha256: b155f5c27f0e2951256774628c4b91fdeee3267018eef29897a74e3d1316c8b0 - md5: d310bfbb8230b9175c0cbc10189ad804 - depends: - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - - yaml >=0.2.5,<0.3.0a0 + - pkg:pypi/pyyaml?source=hash-mapping + size: 157941 + timestamp: 1737455030235 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-0.1-pyhd8ed1ab_1.conda + sha256: 313b597524729b9df052a3a15750df53f9a6a020dbe322a38c0995227e40ee8c + md5: 02a556b5c344b576bbb7ad2a2c6f2246 + depends: + - python >=3.9 + - pyyaml license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml - size: 187795 - timestamp: 1695373829282 -- kind: conda - name: qt-main - version: 5.15.8 - build: hc9dc06e_21 - build_number: 21 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda - sha256: 6b4594f6f2fad65a7ed52993f602e3ab183193755fe4a492aaa48e463b23105b - md5: b325046180590c868ce0dbf267b82eb8 + - pkg:pypi/pyyaml-env-tag?source=hash-mapping + size: 9940 + timestamp: 1734344363898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py310h71f11fc_0.conda + sha256: fb5446c23c920970502e4288ee5a8c2b6a52c8c6761673716d7243f7feedf065 + md5: 7793fb5339be966e5f28971fd6025a9e depends: - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.11,<1.3.0a0 - - dbus >=1.13.6,<2.0a0 - - fontconfig >=2.14.2,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 - - gst-plugins-base >=1.24.1,<1.25.0a0 - - gstreamer >=1.24.1,<1.25.0a0 - - harfbuzz >=8.3.0,<9.0a0 - - icu >=73.2,<74.0a0 - - krb5 >=1.21.2,<1.22.0a0 - - libclang-cpp15 >=15.0.7,<15.1.0a0 - - libclang13 >=15.0.7 - - libcups >=2.3.3,<2.4.0a0 - - libevent >=2.1.12,<2.1.13.0a0 - - libexpat >=2.6.2,<3.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libllvm15 >=15.0.7,<15.1.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libpq >=16.2,<17.0a0 - - libsqlite >=3.45.2,<4.0a0 - - libstdcxx-ng >=12 - - libxcb >=1.15,<1.16.0a0 - - libxkbcommon >=1.7.0,<2.0a0 - - libxml2 >=2.12.6,<3.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - mysql-libs >=8.3.0,<8.4.0a0 - - nspr >=4.35,<5.0a0 - - nss >=3.98,<4.0a0 - - openssl >=3.2.1,<4.0a0 - - pulseaudio-client >=17.0,<17.1.0a0 - - xcb-util >=0.4.0,<0.5.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - xcb-util-keysyms >=0.4.0,<0.5.0a0 - - xcb-util-renderutil >=0.3.9,<0.4.0a0 - - xcb-util-wm >=0.4.1,<0.5.0a0 - - xorg-libice >=1.1.1,<2.0a0 - - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.9,<2.0a0 - - xorg-libxext >=1.3.4,<2.0a0 - - xorg-xf86vidmodeproto - - zstd >=1.5.5,<1.6.0a0 - constrains: - - qt 5.15.8 - license: LGPL-3.0-only - license_family: LGPL - size: 61305384 - timestamp: 1712549380352 -- kind: conda - name: qt-main - version: 5.15.8 - build: hcef0176_21 - build_number: 21 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-hcef0176_21.conda - sha256: 7eb717efea95fb0f8384f7c59b709dbe3c7a2c1fabca60c8792760211c430251 - md5: 76544d3dfeff8fd52250df168cb0005b - depends: - - gst-plugins-base >=1.24.1,<1.25.0a0 - - gstreamer >=1.24.1,<1.25.0a0 - - icu >=73.2,<74.0a0 - - krb5 >=1.21.2,<1.22.0a0 - - libclang13 >=15.0.7 - - libglib >=2.80.0,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libsqlite >=3.45.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.1,<4.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 340732 + timestamp: 1738271116420 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-26.2.1-py310he599bfe_0.conda + sha256: 20fe3d3800757ef89dfb24dbbd5a063d0ad41c33d0fe0387799e5074e0f281ca + md5: 25537e54d502f09cadfb64563b23bd5e + depends: + - __osx >=10.13 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 318212 + timestamp: 1738271240301 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.1-py310h6d25ecc_0.conda + sha256: 9baca161c958a1a9721118dc904eb0c7424d2555b6e03cb58bfbbbbc5bef76e8 + md5: 1efbf45c6e6bcac99fe23806273e8139 + depends: + - __osx >=11.0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 317415 + timestamp: 1738271333622 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-26.2.1-py310h656833d_0.conda + sha256: 992e8813a540770e096d0bcfdd6152f7e57a8a2632957cdd3ec2f4609afd1e21 + md5: a32255b1e5bf69adf98b943fba791bc0 + depends: + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - - zstd >=1.5.5,<1.6.0a0 - constrains: - - qt 5.15.8 - license: LGPL-3.0-only - license_family: LGPL - size: 59806644 - timestamp: 1712551057454 -- kind: conda - name: readline - version: '8.2' - build: h8228510_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - zeromq >=4.3.5,<4.3.6.0a0 + arch: x86_64 + platform: win + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 321163 + timestamp: 1738271740509 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 md5: 47d31b792659ce70f470b5c82fdfb7a4 depends: @@ -9269,950 +7475,508 @@ packages: - ncurses >=6.3,<7.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 281456 timestamp: 1679532220005 -- kind: conda - name: readline - version: '8.2' - build: h92ec313_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + md5: f17f77f2acf4d344734bda76829ce14e + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 255870 + timestamp: 1679532707590 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 md5: 8cbb776a2f641b943d413b3e19df71f4 depends: - ncurses >=6.3,<7.0a0 license: GPL-3.0-only license_family: GPL + purls: [] size: 250351 timestamp: 1679532511311 -- kind: conda - name: readline - version: '8.2' - build: h9e318b2_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 - md5: f17f77f2acf4d344734bda76829ce14e +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + sha256: e20909f474a6cece176dfc0dc1addac265deb5fa92ea90e975fbca48085b20c3 + md5: 9140f1c09dd5489549c6a33931b943c7 depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 255870 - timestamp: 1679532707590 -- kind: conda - name: requests - version: 2.31.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad - md5: a30144e4156cdbb236f99ebb49828f8b + - attrs >=22.2.0 + - python >=3.9 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing?source=hash-mapping + size: 51668 + timestamp: 1737836872415 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py310ha75aee5_0.conda + sha256: 8a069ced0daa925d464d156a5974b0ba0cf694edcd35e355d8831e634e7c5198 + md5: 2a3ef8649e5c64ebbec9536e2fdd856b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 353231 + timestamp: 1730952338254 +- conda: https://conda.anaconda.org/conda-forge/osx-64/regex-2024.11.6-py310hbb8c376_0.conda + sha256: 6e3486ec49587292cdb8057540da531906bda84d13f86efb450c156f3a01714a + md5: 10bc4aefcf72349442fea4b43d954821 + depends: + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 320506 + timestamp: 1730952346773 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py310h078409c_0.conda + sha256: 31a364da36616bb185e7039dc62c9e4d7bc01aedb6942601b7289b77e48fcc48 + md5: 2a5c92f2c11046f3d62e237ed57c24ac + depends: + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 316093 + timestamp: 1730952415918 +- conda: https://conda.anaconda.org/conda-forge/win-64/regex-2024.11.6-py310ha8f682b_0.conda + sha256: 5bd9664970fa8522d65a1e51ccb879a30c88332c31f24a3abc4ba1fcbf169869 + md5: dcc0767d1238e131d60ffd64c418b7da + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: Python-2.0 + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 313710 + timestamp: 1730952721968 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 depends: - certifi >=2017.4.17 - charset-normalizer >=2,<4 - idna >=2.5,<4 - - python >=3.7 + - python >=3.9 - urllib3 >=1.21.1,<3 constrains: - chardet >=3.0.2,<6 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/requests - size: 56690 - timestamp: 1684774408600 -- kind: conda - name: ruff - version: 0.4.2 - build: py311h9220a05_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.2-py311h9220a05_0.conda - sha256: 36cf382467e3ba50cd310d7a384fcbe96982566f1b865e59c006621163741cc3 - md5: d47c573de0e3affc3fff38cc6277ee1f + - pkg:pypi/requests?source=hash-mapping + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py310hc1293b2_0.conda + sha256: 775f9fe47c18f8c6c4cb706c7837cc04cdc18e6a748fd8964e132d8329975eea + md5: 55afda712d4c48108d993ded1bd4de9b depends: - - __osx >=10.9 - - libcxx >=16 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.10.* *_cp310 constrains: - - __osx >=10.12 + - __glibc >=2.17 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - - pkg:pypi/ruff - size: 6102416 - timestamp: 1714090112214 -- kind: conda - name: ruff - version: 0.4.2 - build: py311ha637bb9_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.2-py311ha637bb9_0.conda - sha256: 5a687d674b29b5123f6c4040469bdf3d17573b405e2d5c733f6d988b73ed9dee - md5: 07b2a806a99867b497b9105da236f385 - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - pkg:pypi/rpds-py?source=hash-mapping + size: 391615 + timestamp: 1740153211261 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.23.1-py310h40a894c_0.conda + sha256: a6ee4ba0bbd95e9064a28bd5d783d94348806852adf84b0d89897be1b18c683a + md5: 69a29383e979fb24f31c54d87070e199 + depends: + - python + - __osx >=10.13 + - python_abi 3.10.* *_cp310 + constrains: + - __osx >=10.13 + arch: x86_64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/ruff - size: 6224885 - timestamp: 1714090270741 -- kind: conda - name: ruff - version: 0.4.2 - build: py311hae5a712_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.2-py311hae5a712_0.conda - sha256: 394a607295a9977fecdda07724d77000405d5a560cbca85a37605d94e8fa8df1 - md5: 706c20efce8abf564977a2a01041aac9 + - pkg:pypi/rpds-py?source=hash-mapping + size: 383298 + timestamp: 1740153125655 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.23.1-py310h31b3829_0.conda + sha256: 9c98d4b127853a8504ba89b1bd7fc89b8305725139a521e1e74fde4291e91fe1 + md5: ad47ff848ba8b06ddc424f6fc794a052 depends: + - python + - python 3.10.* *_cpython - __osx >=11.0 - - libcxx >=16 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 + - python_abi 3.10.* *_cp310 constrains: - __osx >=11.0 + arch: arm64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/ruff - size: 5839478 - timestamp: 1714089943980 -- kind: conda - name: ruff - version: 0.4.2 - build: py311hae69bc3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.2-py311hae69bc3_0.conda - sha256: 70889267d849fa1bb22f6a797926ab88e5536b2b9abd2a7fe6f153b7b83b54f8 - md5: 3ab0d0bc3174b728ea114eeefa3d7e7b - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ruff - size: 6305237 - timestamp: 1714089088093 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311h142b183_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py311h142b183_0.conda - sha256: a2c8ca8630f03a23cc90e00711f6d8c17b273b29259ae48645e1bd1e1c5074b0 - md5: e1ed4efff9d6df2695ab996fa2a95896 + - pkg:pypi/rpds-py?source=hash-mapping + size: 373907 + timestamp: 1740153135410 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.23.1-py310h7c79e54_0.conda + sha256: b5d0e848c69dfcefaee5193298ce21aec0b76282eb8333bb20c2c5acb0e09fc8 + md5: c449ac14d17f9139895fb1bc98294627 depends: - - joblib >=1.2.0 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - - ucrt >=10.0.20348.0 + - python - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 9069468 - timestamp: 1712825700186 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311h3c3ac6d_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py311h3c3ac6d_1.conda - sha256: 2cf5eba017eb53d09dcad6116615cb2209321d134e46f4501c4bd435525db156 - md5: eb6f2d36c84d6702eab64ffbe166f3fa - depends: - - __osx >=10.13 - - joblib >=1.2.0 - - libcxx >=16 - - llvm-openmp >=16.0.6 - - llvm-openmp >=18.1.5 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 9363425 - timestamp: 1715869957926 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311h696fe38_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py311h696fe38_0.conda - sha256: ba0bac4a40f25c7d0694728320b974f07d18ecc83eb254229ed0caa9eaf49eac - md5: e18d93bd3b91c8745b8d0c63054b5f88 - depends: - - joblib >=1.2.0 - - libcxx >=16 - - llvm-openmp >=16.0.6 - - llvm-openmp >=18.1.3 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 9453326 - timestamp: 1712825499145 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311hbfb48bc_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py311hbfb48bc_1.conda - sha256: e21e11fee63202ba6dc59df71af1db16351468b0a8c742a7080b1cb2f852c59a - md5: eb4b192b29d412853c75a15102dfd832 - depends: - - __osx >=11.0 - - joblib >=1.2.0 - - libcxx >=16 - - llvm-openmp >=16.0.6 - - llvm-openmp >=18.1.5 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 9449312 - timestamp: 1715870005992 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311hc009520_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py311hc009520_0.conda - sha256: 9de3bf863e5acb32012bd0bbe1033f0df2cfec299ea7e589b6ab65c55316ffac - md5: 5ab3d4d008b052a16c66787e2ea000ba - depends: - - _openmp_mutex >=4.5 - - joblib >=1.2.0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 10416939 - timestamp: 1712825062759 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311hdcb8d17_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py311hdcb8d17_1.conda - sha256: e38cac2faa50b04ae06da6a7c9690ad8f893f2b3318b052ac15710221f32e231 - md5: 4179839852432a4e95b5ff86dd5faa9c - depends: - - joblib >=1.2.0 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 9070251 - timestamp: 1715870319512 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311he08f58d_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py311he08f58d_1.conda - sha256: b818f7df6ae949012a38b41b6577ac2319569971b1a063c0386447ec2c6c09ed - md5: fd4a80e35c05513590b33c83fc81dcc7 - depends: - - _openmp_mutex >=4.5 - - joblib >=1.2.0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 10331975 - timestamp: 1715869752060 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py311he2b4599_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py311he2b4599_0.conda - sha256: f01747e017e7d8b44fd0c3da11617378768bffbe240efa2e2c5e046b3a89502f - md5: eae8d05494e0b8d1fcaa57be777cb5e3 - depends: - - joblib >=1.2.0 - - libcxx >=16 - - llvm-openmp >=16.0.6 - - llvm-openmp >=18.1.3 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD + - ucrt >=10.0.20348.0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: win + license: MIT + license_family: MIT purls: - - pkg:pypi/scikit-learn - size: 9378987 - timestamp: 1712825705694 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py312h394d371_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.4.2-py312h394d371_0.conda - sha256: 37959e8e854ad3e78247f4be353b16ddb1fd1f047d0256a8ef83e73773908b69 - md5: 8ba1ad15c3c42b64d42782c66a7a9ed1 + - pkg:pypi/rpds-py?source=hash-mapping + size: 251319 + timestamp: 1740153103392 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.2-py310h9065425_0.conda + sha256: 64d9aa18c31b7bf9b5f6131afcd9ed5ab956eba0fe54d9d74d6303ac19d5bb6d + md5: cbde66f7f4f8b6231de8614f619a95e1 depends: - - _openmp_mutex >=4.5 - - joblib >=1.2.0 - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT purls: - - pkg:pypi/scikit-learn - size: 10169037 - timestamp: 1712825319303 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py312h7167a34_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.4.2-py312h7167a34_0.conda - sha256: 94bd6e4469de518d34d0f43bdcf0cf9a22b4527aad37fb47761c6f0c5aed52e6 - md5: 3201f533cb017af16c3b0fa98ef7f4d0 + - pkg:pypi/ruff?source=hash-mapping + size: 6305544 + timestamp: 1714088914090 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.4.2-py310h4a464a8_0.conda + sha256: aa1a8e035e114b44c5855a8bc8e2b20cb164e66b17a0d8d3df182830ee0e776f + md5: f950d318915d12ea4d0766431ac820c1 depends: - - joblib >=1.2.0 + - __osx >=10.9 - libcxx >=16 - - llvm-openmp >=16.0.6 - - llvm-openmp >=18.1.3 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scikit-learn - size: 9220566 - timestamp: 1712825832119 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py312hcacafb1_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.4.2-py312hcacafb1_0.conda - sha256: 3de4945d5ee17655028576c225feda991d9ca27f71c438334a8937dbdcfde3d2 - md5: 1a33881a2f7cc94f53ef44b39c853c44 - depends: - - joblib >=1.2.0 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - scipy - - threadpoolctl >=2.0.0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-3-Clause - license_family: BSD + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - __osx >=10.12 + arch: x86_64 + platform: osx + license: MIT + license_family: MIT purls: - - pkg:pypi/scikit-learn - size: 8833096 - timestamp: 1712825551532 -- kind: conda - name: scikit-learn - version: 1.4.2 - build: py312hd4306f4_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.4.2-py312hd4306f4_0.conda - sha256: 3c47f22fa3200113fed3c50da054dda0c69bba3118fbdcce6fb8567fc5b23996 - md5: 0c05d05db3c1d7d4092761b940cd4e1e + - pkg:pypi/ruff?source=hash-mapping + size: 6093722 + timestamp: 1714089668361 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.2-py310h275c10e_0.conda + sha256: 1812ffbcd86a2b0913f9302d1616f4aa042be5a2c4a98214fe0c2281f3bfee51 + md5: 00e1b0cba8e276e87ecfaa206406301a depends: - - joblib >=1.2.0 + - __osx >=11.0 - libcxx >=16 - - llvm-openmp >=16.0.6 - - llvm-openmp >=18.1.3 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - scipy - - threadpoolctl >=2.0.0 - license: BSD-3-Clause - license_family: BSD + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT purls: - - pkg:pypi/scikit-learn - size: 9194883 - timestamp: 1712825599759 -- kind: conda - name: scipy - version: 1.13.0 - build: py311h0b4df5a_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py311h0b4df5a_0.conda - sha256: 0094e9d9b49636182ee797f7db51272e6a9092c024ddf4226194404452cf7c20 - md5: c6658cd2b5a4cb1cd7530ac182566ce5 + - pkg:pypi/ruff?source=hash-mapping + size: 5839236 + timestamp: 1714089852161 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.2-py310h7f1804c_0.conda + sha256: f7a93bba671f185de24a0b2562ca32294fc88deec50714a1489ffeec0f359fb1 + md5: 21d829b02be70b9d3244ea118b9b3544 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - numpy >=1.23.5,<1.28 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=hash-mapping + size: 6229260 + timestamp: 1714089878264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.6.1-py310h27f47ee_0.conda + sha256: 5c865487412b900d0abeb934907e5357c4a6cad19093316701ffd575980d0c54 + md5: 618ec5a8500fb53e8e52785e06d239f4 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - joblib >=1.2.0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=3.1.0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 15668033 - timestamp: 1712257530957 -- kind: conda - name: scipy - version: 1.13.0 - build: py311h4f9446f_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py311h4f9446f_0.conda - sha256: 3b1c61d3ae96e7e6586af560ba4562e2dcbe3bc72a6e29ca175dc64ff150f786 - md5: 8ee0bd3f02934adabade41ab82914ab9 - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - libgfortran 5.* - - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - - liblapack >=3.9.0,<4.0a0 - - numpy >=1.23.5,<1.28 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy - size: 15523738 - timestamp: 1712257730471 -- kind: conda - name: scipy - version: 1.13.0 - build: py311h517d4fd_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h517d4fd_1.conda - sha256: dd14400515cf0ee248293b85a0f4b9f989a430f28e5611db5dff2eee56127816 - md5: a86b8bea39e292a23b2cf9a750f49ea1 - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - libgfortran-ng - - libgfortran5 >=12.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - numpy <2.3 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy - size: 17260178 - timestamp: 1714795125642 -- kind: conda - name: scipy - version: 1.13.0 - build: py311h64a7726_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda - sha256: d61d31d6f54e5d22f45bfce9d37d847313eab0afd6ff45e4c31f56f9ca2f8955 - md5: d443c70b4a05f50236c70b9c79beff64 - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - libgfortran-ng - - libgfortran5 >=12.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - numpy >=1.23.5,<1.28 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy - size: 17410362 - timestamp: 1712256764147 -- kind: conda - name: scipy - version: 1.13.0 - build: py311h86d0cd9_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py311h86d0cd9_0.conda - sha256: 25b39409d6837185f780ad5f4d5733d70f4ab372973429d150ad52ab3148e603 - md5: 280cc0c8d29e2a60bb583db598719b06 + - pkg:pypi/scikit-learn?source=hash-mapping + size: 9468996 + timestamp: 1736497235051 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.6.1-py310h6ed8a50_0.conda + sha256: e5337ddd91619e39a1689477e62add70b8e36885517a83322336f36b1143a5a9 + md5: fa445f7bd024f9b5d0503e9f1985b291 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - libgfortran 5.* - - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - - liblapack >=3.9.0,<4.0a0 - - numpy >=1.23.5,<1.28 - - numpy >=1.23.5,<2.0a0 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - __osx >=10.13 + - joblib >=1.2.0 + - libcxx >=18 + - llvm-openmp >=18.1.8 + - numpy >=1.19,<3 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=3.1.0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 16580478 - timestamp: 1712257627918 -- kind: conda - name: scipy - version: 1.13.0 - build: py311hceeca8c_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py311hceeca8c_1.conda - sha256: 466ef6d19091ad5a8dce8c499cc54d29f0dcb396331900b2080424d52fa15232 - md5: be406411b55eab396da245dbf63eb865 + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8521066 + timestamp: 1736497474316 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.6.1-py310h48c93d9_0.conda + sha256: 5f1636921fefab03c2cf8d8c37f09710a12736fe7c7fea20e7db0d68322dd371 + md5: 8f0d3b1843e1c7e694ad17868948b639 depends: - __osx >=11.0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - libgfortran 5.* - - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.3 + - joblib >=1.2.0 + - libcxx >=18 + - llvm-openmp >=18.1.8 - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=3.1.0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 15627072 - timestamp: 1714796789637 -- kind: conda - name: scipy - version: 1.13.0 - build: py311hd4686c6_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py311hd4686c6_1.conda - sha256: fac9e20c3bd0371ea325ad62f978c9db3fa1591b8ddd0e67c7caa4888174b418 - md5: f01532161760c8e09c4f21a7e9a1e16e + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8581036 + timestamp: 1736497528255 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.6.1-py310hf2a6c47_0.conda + sha256: 3d171289529b5e0f41fdbb547e08d749e3fe2f25975bde3b150e672fd69751c1 + md5: e15710d6d5f6ff3e0c8dbd3bbc21b6fa depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.3 + - joblib >=1.2.0 - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - scipy + - threadpoolctl >=3.1.0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 15753538 - timestamp: 1714796604770 -- kind: conda - name: scipy - version: 1.13.0 - build: py311hd5d9b8d_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py311hd5d9b8d_1.conda - sha256: be28ef6313697646211ca2e64850c137ff1cac7f06c9a7a26b8393b58ba616d5 - md5: a6c59edf565f6e1484913893ddfffe19 + - pkg:pypi/scikit-learn?source=hash-mapping + size: 8389110 + timestamp: 1736497623309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda + sha256: 02c4590f04c94dcfe4ee4bc28e9552b5bbed57c3585f62dfb2b51de12ef7c413 + md5: d1ec73b85cb90900c40c7fbcd36059e8 depends: - - __osx >=10.9 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - libgfortran 5.* + - libgcc-ng >=12 + - libgfortran-ng - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - liblapack >=3.9.0,<4.0a0 - - numpy <2.3 - - numpy >=1.19,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - libstdcxx-ng >=12 + - numpy >=1.21.6,<1.28 + - numpy >=1.21.6,<2.0a0 + - pooch + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - libopenblas <0.3.26 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 16553685 - timestamp: 1714795053678 -- kind: conda - name: scipy - version: 1.13.0 - build: py312h8753938_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py312h8753938_0.conda - sha256: 8441a6e6805e6a99e02c56a52ec1672b549f33739061c313a9c4c7655476a852 - md5: 0acd540ee94e0f2148e8d351ed7c49e8 + - pkg:pypi/scipy?source=hash-mapping + size: 15552848 + timestamp: 1692502224050 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.2-py310h3900cf1_0.conda + sha256: 5887b6ed7a655f6049427bff1b6f8be2ce7a7990b6dc3969784ed7f54ae5c93a + md5: 8ee603f08e5db9b4cecbe4634c31bedb depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 + - libcxx >=15.0.7 + - libgfortran 5.* + - libgfortran5 >=12.3.0 - liblapack >=3.9.0,<4.0a0 - - numpy >=1.26.4,<1.28 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - numpy >=1.21.6,<1.28 + - numpy >=1.21.6,<2.0a0 + - pooch + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + constrains: + - libopenblas <0.3.26 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 15588141 - timestamp: 1712257711887 -- kind: conda - name: scipy - version: 1.13.0 - build: py312h8adb940_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py312h8adb940_0.conda - sha256: 1b14bd37c0973417093baa6d68bd9fb6c66da313681a7f345c1f8ba58545ff23 - md5: 818232a7807c76970172af9c7698ba4a + - pkg:pypi/scipy?source=hash-mapping + size: 15618774 + timestamp: 1692502626418 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.2-py310h0975f3d_0.conda + sha256: e28e6e9473e3be08aab04907826bf4311b63ee27ef5c91bee3267e38e03c82e5 + md5: 186cb960c5b91941a2e5ba00e7f27838 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 + - libcxx >=15.0.7 - libgfortran 5.* - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - liblapack >=3.9.0,<4.0a0 - - numpy >=1.26.4,<1.28 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - numpy >=1.21.6,<1.28 + - numpy >=1.21.6,<2.0a0 + - pooch + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + constrains: + - libopenblas <0.3.26 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 16518412 - timestamp: 1712257461114 -- kind: conda - name: scipy - version: 1.13.0 - build: py312h9d7df2b_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py312h9d7df2b_0.conda - sha256: 52a5ffb343739872af219a9d8985abab2c07db7b026a03a2906f900cee0d1be9 - md5: 28685c45da745561d79dc47323746278 + - pkg:pypi/scipy?source=hash-mapping + size: 14421167 + timestamp: 1692503153450 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.2-py310h578b7cb_0.conda + sha256: 8df3a1b4a9dfcb4952d90d68feb66d60793f72a9dfa33d3c54ccd6ee08f1c365 + md5: d4f2390c1205138a6b4cd1e277d4f129 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - libgfortran 5.* - - libgfortran5 >=12.3.0 - - libgfortran5 >=13.2.0 - liblapack >=3.9.0,<4.0a0 - - numpy >=1.26.4,<1.28 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - m2w64-gcc-libs + - m2w64-gcc-libs-core + - numpy >=1.21.6,<1.28 + - numpy >=1.21.6,<2.0a0 + - pooch + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - libopenblas <0.3.26 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 15450401 - timestamp: 1712257711243 -- kind: conda - name: scipy - version: 1.13.0 - build: py312heda63a1_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda - sha256: 54571d3f3583f64a184b19b0cd50bea7f102052053e48017120026ee1ccacd6f - md5: c53b9f319cafc679476f5613599857e8 + - pkg:pypi/scipy?source=hash-mapping + size: 18194929 + timestamp: 1692503014047 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh0d859eb_1.conda + sha256: 00926652bbb8924e265caefdb1db100f86a479e8f1066efe395d5552dde54d02 + md5: 938c8de6b9de091997145b3bf25cdbf9 depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - libgfortran-ng - - libgfortran5 >=12.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - numpy >=1.26.4,<1.28 - - numpy >=1.26.4,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - __linux + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy - size: 17373483 - timestamp: 1712256604150 -- kind: conda - name: setuptools - version: 69.5.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 - md5: 7462280d81f639363e6e63c81276bd9e + - pkg:pypi/send2trash?source=hash-mapping + size: 22736 + timestamp: 1733322148326 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh31c8845_1.conda + sha256: 5282eb5b462502c38df8cb37cd1542c5bbe26af2453a18a0a0602d084ca39f53 + md5: e67b1b1fa7a79ff9e8e326d0caf55854 depends: - - python >=3.8 - license: MIT - license_family: MIT + - __osx + - pyobjc-framework-cocoa + - python >=3.9 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/setuptools - size: 501790 - timestamp: 1713094963112 -- kind: conda - name: setuptools-scm - version: 8.0.4 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda - sha256: 5b0ae59e7580f8a5acc07a8390181ed63e5fdf891b9100186fee9e864bbf390c - md5: a1986ad21c766ff22f7bae93f0641020 + - pkg:pypi/send2trash?source=hash-mapping + size: 23100 + timestamp: 1733322309409 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-1.8.3-pyh5737063_1.conda + sha256: ba8b93df52e0d625177907852340d735026c81118ac197f61f1f5baea19071ad + md5: e6a4e906051565caf5fdae5b0415b654 depends: - - packaging >=20.0 - - python >=3.8 - - setuptools >=45 - - tomli >=1.0.0 - - typing-extensions - license: MIT - license_family: MIT + - __win + - python >=3.9 + - pywin32 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/setuptools-scm - size: 36626 - timestamp: 1711030572641 -- kind: conda - name: setuptools-scm - version: 8.1.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda - sha256: 3f7b45c90eaa1c9e7ef974d3995a98a37f7672b40e002455baf0fce256e7f202 - md5: ba9f7f0ec4f2a18de3e7bce67c4a431e + - pkg:pypi/send2trash?source=hash-mapping + size: 23359 + timestamp: 1733322590167 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + sha256: e0778e4f276e9a81b51c56f51ec22a27b4d8fc955abc0be77ad09ca9bea06bb9 + md5: 8f28e299c11afdd79e0ec1e279dcdc52 depends: - - packaging >=20.0 - - python >=3.8 - - setuptools >=45 - - tomli >=1.0.0 - - typing-extensions + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/setuptools-scm - size: 37824 - timestamp: 1715083339319 -- kind: conda - name: sip - version: 6.7.12 - build: py311h12c1d0e_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py311h12c1d0e_0.conda - sha256: 1129ac093d0c04ca07603fab9dfd2ee1e9a760eb94b31450e2cef1ffffa6a31a - md5: c29f20b2860d1824535135d76d022394 - depends: - - packaging - - ply - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tomli - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-only - license_family: GPL - purls: - - pkg:pypi/sip - size: 595071 - timestamp: 1697300986959 -- kind: conda - name: sip - version: 6.7.12 - build: py311hb755f60_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda - sha256: 71a0ee22522b232bf50d4d03d012e53cd5d1251d09dffc1c72d7c33a1086fe6f - md5: 02336abab4cb5dd794010ef53c54bd09 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - packaging - - ply - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - tomli - license: GPL-3.0-only - license_family: GPL - purls: - - pkg:pypi/sip - size: 585197 - timestamp: 1697300605264 -- kind: conda - name: sip - version: 6.7.12 - build: py312h30efb56_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py312h30efb56_0.conda - sha256: baf6e63e213bb11e369a51e511b44217546a11f8470242bbaa8fac45cb4a39c3 - md5: 32633871002ee9902f747d2236e0d122 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - packaging - - ply - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tomli - license: GPL-3.0-only - license_family: GPL - purls: - - pkg:pypi/sip - size: 576283 - timestamp: 1697300599736 -- kind: conda - name: sip - version: 6.7.12 - build: py312h53d5487_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py312h53d5487_0.conda - sha256: 2347c2e7d5e7282b991d5d4f7448d9e6fe8c26e5d6df0d09f0e60b11b7d19586 - md5: a5d3d1363d6d0b4827d6b940414a5b76 - depends: - - packaging - - ply - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tomli - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-only - license_family: GPL - purls: - - pkg:pypi/sip - size: 589657 - timestamp: 1697301028797 -- kind: conda + - pkg:pypi/setuptools?source=conda-forge-mapping + size: 775598 + timestamp: 1736512753595 +- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl name: six - version: 1.16.0 - build: pyh6c4a22f_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 - md5: e5f25f8dbc060e9a8d912e432202afc2 + version: 1.17.0 + sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 depends: - - python + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/six - size: 14259 - timestamp: 1620240338595 -- kind: conda - name: snowballstemmer - version: 2.2.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - sha256: a0fd916633252d99efb6223b1050202841fa8d2d53dacca564b0ed77249d3228 - md5: 4d22a9315e78c6827f806065957d566e - depends: - - python >=2 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/snowballstemmer - size: 58824 - timestamp: 1637143137377 -- kind: conda - name: soupsieve - version: '2.5' - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda sha256: 54ae221033db8fbcd4998ccb07f3c3828b4d77e73b0c72b18c1d6a507059059c md5: 3f144b2c34f8cb5a9abd9ed23a39c561 depends: @@ -10220,266 +7984,79 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/soupsieve + - pkg:pypi/soupsieve?source=hash-mapping size: 36754 timestamp: 1693929424267 -- kind: conda - name: sphinx - version: 7.3.7 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda - sha256: 41101e2b0b8722087f06bd73251ba95ef89db515982b6a89aeebfa98ebcb65a1 - md5: 7b1465205e28d75d2c0e1a868ee00a67 - depends: - - alabaster >=0.7.14,<0.8.dev0 - - babel >=2.9 - - colorama >=0.4.5 - - docutils >=0.18.1,<0.22 - - imagesize >=1.3 - - importlib-metadata >=4.8 - - jinja2 >=3.0 - - packaging >=21.0 - - pygments >=2.14 - - python >=3.9 - - requests >=2.25.0 - - snowballstemmer >=2.0 - - sphinxcontrib-applehelp - - sphinxcontrib-devhelp - - sphinxcontrib-htmlhelp >=2.0.0 - - sphinxcontrib-jsmath - - sphinxcontrib-qthelp - - sphinxcontrib-serializinghtml >=1.1.9 - - tomli >=2.0 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinx - size: 1345378 - timestamp: 1713555005540 -- kind: conda - name: sphinx-design - version: 0.5.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda - sha256: 5333c50f3687da5b59dd8df24094d8c0e834922ceabc1f525e54735e06d0bd52 - md5: 264b3c697fa9cdade87eb0abe4440d54 +- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 + md5: b1b505328da7a6b246787df4b5a49fbc depends: - - python >=3.8 - - sphinx >=5,<8 + - asttokens + - executing + - pure_eval + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/sphinx-design - size: 879349 - timestamp: 1690472687410 -- kind: conda - name: sphinx-gallery - version: 0.16.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda - sha256: 46d9b644b2118d265fbc8095d1980344d2df40240dc30cce7c31bda0f64bb166 - md5: add28691ee89e875b190eda07929d5d4 + - pkg:pypi/stack-data?source=hash-mapping + size: 26988 + timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda + sha256: 03cc5442046485b03dd1120d0f49d35a7e522930a2ab82f275e938e17b07b302 + md5: 9190dd0a23d925f7602f9628b3aed511 depends: - - pillow + - libhwloc >=2.11.2,<2.11.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 151460 + timestamp: 1732982860332 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh0d859eb_0.conda + sha256: b300557c0382478cf661ddb520263508e4b3b5871b471410450ef2846e8c352c + md5: efba281bbdae5f6b0a1d53c6d4a97c93 + depends: + - __linux + - ptyprocess - python >=3.8 - - sphinx >=4 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/sphinx-gallery - size: 376506 - timestamp: 1714467900533 -- kind: conda - name: sphinx-prompt - version: 1.4.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-prompt-1.4.0-pyhd8ed1ab_0.tar.bz2 - sha256: 3690b4b70322adc77f18c2b31545ddbbe69f1627de76ea9deace8c9809550bab - md5: 88ee91e8679603f2a5bd036d52919cc2 - depends: - - pygments - - python >=3.0 - - sphinx - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/sphinx-prompt - size: 8196 - timestamp: 1616424811736 -- kind: conda - name: sphinxcontrib-applehelp - version: 1.0.8 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda - sha256: 710013443a063518d587d2af82299e92ab6d6695edf35a676ac3a0ccc9e3f8e6 - md5: 611a35a27914fac3aa37611a6fe40bb5 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-applehelp - size: 29539 - timestamp: 1705126465971 -- kind: conda - name: sphinxcontrib-devhelp - version: 1.0.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda - sha256: 63a6b60653ef13a6712848f4b3c4b713d4b564da1dae571893f1a3659cde85f3 - md5: d7e4954df0d3aea2eacc7835ad12671d - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-devhelp - size: 24474 - timestamp: 1705126153592 -- kind: conda - name: sphinxcontrib-htmlhelp - version: 2.0.5 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda - sha256: 512f393cfe34cb3de96ade7a7ad900d6278e2087a1f0e5732aa60fadee396d99 - md5: 7e1e7437273682ada2ed5e9e9714b140 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-htmlhelp - size: 33499 - timestamp: 1705118297318 -- kind: conda - name: sphinxcontrib-jsmath - version: 1.0.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - sha256: d4337d83b8edba688547766fc80f1ac86d6ec86ceeeda93f376acc04079c5ce2 - md5: da1d979339e2714c30a8e806a33ec087 - depends: - - python >=3.5 + - tornado >=6.1.0 license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/sphinxcontrib-jsmath - size: 10431 - timestamp: 1691604844204 -- kind: conda - name: sphinxcontrib-qthelp - version: 1.0.7 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda - sha256: dd35b52f056c39081cd0ae01155174277af579b69e5d83798a33e9056ec78d63 - md5: 26acae54b06f178681bfb551760f5dd1 + - pkg:pypi/terminado?source=hash-mapping + size: 22452 + timestamp: 1710262728753 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh31c8845_0.conda + sha256: 4daae56fc8da17784578fbdd064f17e3b3076b394730a14119e571707568dc8a + md5: 00b54981b923f5aefcd5e8547de056d5 depends: - - python >=3.9 - - sphinx >=5 + - __osx + - ptyprocess + - python >=3.8 + - tornado >=6.1.0 license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/sphinxcontrib-qthelp - size: 27005 - timestamp: 1705126340442 -- kind: conda - name: sphinxcontrib-serializinghtml - version: 1.1.10 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - sha256: bf80e4c0ff97d5e8e5f6db0831ba60007e820a3a438e8f1afd868aa516d67d6f - md5: e507335cb4ca9cff4c3d0fa9cdab255e + - pkg:pypi/terminado?source=hash-mapping + size: 22717 + timestamp: 1710265922593 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh5737063_0.conda + sha256: 8cb078291fd7882904e3de594d299c8de16dd3af7405787fce6919a385cfc238 + md5: 4abd500577430a942a995fd0d09b76a2 depends: - - python >=3.9 - - sphinx >=5 + - __win + - python >=3.8 + - pywinpty >=1.1.0 + - tornado >=6.1.0 license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/sphinxcontrib-serializinghtml - size: 28776 - timestamp: 1705118378942 -- kind: conda - name: tabulate - version: 0.9.0 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.9.0-pyhd8ed1ab_1.tar.bz2 - sha256: f6e4a0dd24ba060a4af69ca79d32361a6678e61d78c73eb5e357909b025b4620 - md5: 4759805cce2d914c38472f70bf4d8bcb - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/tabulate - size: 35912 - timestamp: 1665138565317 -- kind: conda - name: tbb - version: 2021.12.0 - build: h91493d7_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda - sha256: 621926aae93513408bdca3dd21c97e2aa8ba7dcd2c400dab804fb0ce7da1387b - md5: 21745fdd12f01b41178596143cbecffd - depends: - - libhwloc >=2.10.0,<2.10.1.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: APACHE - size: 161618 - timestamp: 1712960215111 -- kind: conda - name: tbb - version: 2021.12.0 - build: hc790b64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-hc790b64_1.conda - sha256: 87461c83a4f0d4f119af7368f20c47bbe0c27d963a7c22a3d08c71075077f855 - md5: e98333643abc739ebea1bac97a479828 - depends: - - libhwloc >=2.10.0,<2.10.1.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - size: 161771 - timestamp: 1716031112705 -- kind: conda - name: threadpoolctl - version: 3.5.0 - build: pyhc1e730c_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - pkg:pypi/terminado?source=hash-mapping + size: 22883 + timestamp: 1710262943966 +- conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda sha256: 45e402941f6bed094022c5726a2ca494e6224b85180d2367fb6ddd9aea68079d md5: df68d78237980a159bd7149f33c0e8fd depends: @@ -10487,46 +8064,53 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/threadpoolctl + - pkg:pypi/threadpoolctl?source=conda-forge-mapping size: 23548 timestamp: 1714400228771 -- kind: conda - name: tk - version: 8.6.13 - build: h1abcd95_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2 + md5: f1acf5fdefa8300de697982bcb1761c9 + depends: + - python >=3.5 + - webencodings >=0.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/tinycss2?source=hash-mapping + size: 28285 + timestamp: 1729802975370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 md5: bf830ba5afc507c6232d4ef0fb1a882d depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD + purls: [] size: 3270220 timestamp: 1699202389792 -- kind: conda - name: tk - version: 8.6.13 - build: h5083fa2_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 md5: b50a57ba89c32b62428b71a875291c9b depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD + purls: [] size: 3145523 timestamp: 1699202432999 -- kind: conda - name: tk - version: 8.6.13 - build: h5226925_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 md5: fc048363eb8f03cd1737600a5d08aafe depends: @@ -10535,1071 +8119,818 @@ packages: - vc14_runtime >=14.29.30139 license: TCL license_family: BSD + purls: [] size: 3503410 timestamp: 1699202577803 -- kind: conda - name: tk - version: 8.6.13 - build: noxft_h4845f30_101 - build_number: 101 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - license: TCL - license_family: BSD - size: 3318875 - timestamp: 1699202167581 -- kind: conda - name: toml - version: 0.10.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - sha256: f0f3d697349d6580e4c2f35ba9ce05c65dc34f9f049e85e45da03800b46139c1 - md5: f832c45a477c78bebd107098db465095 - depends: - - python >=2.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/toml - size: 18433 - timestamp: 1604308660817 -- kind: conda - name: tomli - version: 2.0.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f - md5: 5844808ffab9ebdb694585b50ba02a96 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/tomli - size: 15940 - timestamp: 1644342331069 -- kind: conda - name: tornado - version: '6.4' - build: py311h05b510d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py311h05b510d_0.conda - sha256: 29c07a81b52310f9679ca05a6f1d3d3ee8c1830f183f91ad8d46f99cc2fb6720 - md5: 241cd427ab1f38b72d6ddda3994c80a7 - depends: - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/tornado - size: 856729 - timestamp: 1708363632330 -- kind: conda - name: tornado - version: '6.4' - build: py311h459d7ec_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py311h459d7ec_0.conda - sha256: 5bb1e24d1767e403183e4cc842d184b2da497e778f0311c5b1d023fb3af9e6b6 - md5: cc7727006191b8f3630936b339a76cd0 - depends: - - libgcc-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/tornado - size: 853245 - timestamp: 1708363316040 -- kind: conda - name: tornado - version: '6.4' - build: py311ha68e1ae_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py311ha68e1ae_0.conda - sha256: ce73a6cede35941e1d82098e37ab483e0f322503a87c48ea39e8ac05798f9e39 - md5: 7bbff4fa9c26e56821e2eb89466436b1 - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: Apache +- conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 + md5: b0dd904de08b7db706167240bf37b164 + depends: + - python >=3.9 + license: MIT + license_family: MIT purls: - - pkg:pypi/tornado - size: 856957 - timestamp: 1708363616871 -- kind: conda - name: tornado - version: '6.4' - build: py311he705e18_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py311he705e18_0.conda - sha256: 0b994ce7984953d1d528b7e19a97db0b34da09398feaf592500df637719d5623 - md5: 40845aadca8df7ccc21c393ba3aa9eac - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache + - pkg:pypi/toml?source=hash-mapping + size: 22132 + timestamp: 1734091907682 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + sha256: 18636339a79656962723077df9a56c0ac7b8a864329eb8f847ee3d38495b863e + md5: ac944244f1fed2eb49bae07193ae8215 + depends: + - python >=3.9 + license: MIT + license_family: MIT purls: - - pkg:pypi/tornado - size: 857610 - timestamp: 1708363541170 -- kind: conda - name: tornado - version: '6.4' - build: py312h41838bb_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py312h41838bb_0.conda - sha256: 558f50290a25d8da6071a8e951b2b0c2ef77f457254438fa7c19cb9ee9f5d952 - md5: 2d2d1fde5800d45cb56218583156d23d - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - pkg:pypi/tomli?source=hash-mapping + size: 19167 + timestamp: 1733256819729 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py310ha75aee5_0.conda + sha256: 9c2b86d4e58c8b0e7d13a7f4c440f34e2201bae9cfc1d7e1d30a5bc7ffb1d4c8 + md5: 166d59aab40b9c607b4cc21c03924e9d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado - size: 840576 - timestamp: 1708363459702 -- kind: conda - name: tornado - version: '6.4' - build: py312h98912ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py312h98912ed_0.conda - sha256: 5764795df60bd9fdbe54ec6df20ef2a94507b2a22b29be899b78745383bafab3 - md5: e8332e534dca8c5c12c8352e0a23501c + - pkg:pypi/tornado?source=hash-mapping + size: 650307 + timestamp: 1732616034421 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py310hbb8c376_0.conda + sha256: 608a947fa9aad774d6dfdcc96c1af4e9522c52554e51a03992331a19b5abf27e + md5: 1988c632b07b884ee3e38ebac2dd1f35 depends: - - libgcc-ng >=12 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado - size: 840527 - timestamp: 1708363299520 -- kind: conda - name: tornado - version: '6.4' - build: py312he37b823_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py312he37b823_0.conda - sha256: 28495954c50ce9034fedf0a528c6f265c72aa3176eb16d3c054ec3cd7b6b28f0 - md5: a081e28c706477c8158f0432cc67c849 - depends: - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 + - pkg:pypi/tornado?source=hash-mapping + size: 651323 + timestamp: 1732616042024 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py310h078409c_0.conda + sha256: 1263e018a20c98c6ff10e830ea5f13855d33f87f751329f3f6d207b182871acc + md5: 21218c56939379bcfeddd26ea37d3fe7 + depends: + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado - size: 840705 - timestamp: 1708363705502 -- kind: conda - name: tornado - version: '6.4' - build: py312he70551f_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py312he70551f_0.conda - sha256: 0ebb1cd17f63f47262c42114a2b0af2b8d0bc19b0ae52e90e312a77ff7c55270 - md5: 98907504f8c3eb0452bb10362227ce16 - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 + - pkg:pypi/tornado?source=hash-mapping + size: 652533 + timestamp: 1732616281463 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4.2-py310ha8f682b_0.conda + sha256: 2e5671d0db03961692b3390778ce6aba40702bd57584fa60badf4baa7614679b + md5: e6819d3a0cae0f1b1838875f858421d1 + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado - size: 844146 - timestamp: 1708363742639 -- kind: conda - name: typing-extensions - version: 4.11.0 - build: hd8ed1ab_0 - subdir: noarch + - pkg:pypi/tornado?source=hash-mapping + size: 655262 + timestamp: 1732616377814 +- pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + name: tqdm + version: 4.67.1 + sha256: 26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 + requires_dist: + - colorama ; platform_system == 'Windows' + - pytest>=6 ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-timeout ; extra == 'dev' + - pytest-asyncio>=0.24 ; extra == 'dev' + - nbval ; extra == 'dev' + - requests ; extra == 'discord' + - slack-sdk ; extra == 'slack' + - requests ; extra == 'telegram' + - ipywidgets>=6 ; extra == 'notebook' + requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + sha256: 343610bce6dbe8a5090500dd2e9d1706057960b3f3120ebfe0abb4a8ecbada4d + md5: d0b4f5c87cd35ac3fb3d47b223263a64 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 98443 + timestamp: 1675110676323 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda - sha256: aecbd9c601ba5a6c128da8975276fd817b968a9edc969b7ae97aee76e80a14a6 - md5: 471e3988f8ca5e9eb3ce6be7eac3bcee + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 depends: - - typing_extensions 4.11.0 pyha770c72_0 + - typing_extensions 4.12.2 pyha770c72_1 license: PSF-2.0 license_family: PSF - size: 10093 - timestamp: 1712330094282 -- kind: conda - name: typing_extensions - version: 4.11.0 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - sha256: a7e8714d14f854058e971a6ed44f18cc37cc685f98ddefb2e6b7899a0cc4d1a2 - md5: 6ef2fc37559256cf682d8b3375e89b80 + purls: [] + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 depends: - - python >=3.8 + - python >=3.9 license: PSF-2.0 license_family: PSF purls: - - pkg:pypi/typing-extensions - size: 37583 - timestamp: 1712330089194 -- kind: conda + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- pypi: https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl name: tzdata - version: 2024a - build: h0c530f3_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 - md5: 161081fc7cec0bfda0d86d7cb595f8d8 + version: '2025.1' + sha256: 7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639 + requires_python: '>=2' +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 license: LicenseRef-Public-Domain - size: 119815 - timestamp: 1706886945727 -- kind: conda - name: ucrt - version: 10.0.22621.0 - build: h57928b3_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 - md5: 72608f6cd3e5898229c3ea16deb1ac43 + purls: [] + size: 122354 + timestamp: 1728047496079 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 constrains: - vs2015_runtime >=14.29.30037 - license: LicenseRef-Proprietary - license_family: PROPRIETARY - size: 1283972 - timestamp: 1666630199266 -- kind: conda - name: ukkonen - version: 1.0.1 - build: py311h005e61a_4 - build_number: 4 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h005e61a_4.conda - sha256: ef774047df25201a6425fe1ec194505a3cac9ba02e96953360442f59364d12b3 - md5: d9988836cc20c90e05901ab05962f496 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 559710 + timestamp: 1728377334097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda + sha256: d491c87088b7c430e9b77acc03307a4ad58bc6cdd686353710c3178977712df6 + md5: e05b0475166b68c9dc4d7937e0315654 depends: + - __glibc >=2.17,<3.0.a0 - cffi - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - - pkg:pypi/ukkonen - size: 17225 - timestamp: 1695549858085 -- kind: conda - name: ukkonen - version: 1.0.1 - build: py311h5fe6e05_4 - build_number: 4 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py311h5fe6e05_4.conda - sha256: b273782a1277042a54e12411beebd378d2a2a69e503bcf147766e98628e91c91 - md5: 8f750b84128d48dc8376572c5eace61e + - pkg:pypi/ukkonen?source=hash-mapping + size: 13756 + timestamp: 1725784148759 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py310hfa8da69_5.conda + sha256: 326ad0a36c09aa74fed9277ab8b12002512a91252d426b0baad34fe11cc59568 + md5: b33e406764d2ffc9d23a0133f3b5fead depends: + - __osx >=10.13 - cffi - - libcxx >=15.0.7 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - libcxx >=17 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + arch: x86_64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/ukkonen - size: 13193 - timestamp: 1695549883822 -- kind: conda - name: ukkonen - version: 1.0.1 - build: py311h9547e67_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda - sha256: c2d33e998f637b594632eba3727529171a06eb09896e36aa42f1ebcb03779472 - md5: 586da7df03b68640de14dc3e8bcbf76f + - pkg:pypi/ukkonen?source=hash-mapping + size: 12925 + timestamp: 1725784218557 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py310h7306fd8_5.conda + sha256: 1c74c4927f2c4ce93a74b4e72081fed818b8cbb291646316e19b92d683384624 + md5: 75162a8dc3ec9e30d8eb5c676a41b366 depends: + - __osx >=11.0 - cffi - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 + - libcxx >=17 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + arch: arm64 + platform: osx license: MIT license_family: MIT purls: - - pkg:pypi/ukkonen - size: 13961 - timestamp: 1695549513130 -- kind: conda - name: ukkonen - version: 1.0.1 - build: py311he4fd1f5_4 - build_number: 4 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311he4fd1f5_4.conda - sha256: 384fc81a34e248019d43a115386f77859ab63e0e6f12dade486d76359703743f - md5: 5d5ab5c5af32931e03608034f4a5fd75 + - pkg:pypi/ukkonen?source=hash-mapping + size: 13565 + timestamp: 1725784246850 +- conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py310hc19bc0b_5.conda + sha256: a82f9cfa34238f8ebbe7c0b77c3aed29c7314282ae842688587f3f22ee319c55 + md5: 89dcdea384ecd45100e43d627da94a58 depends: - cffi - - libcxx >=15.0.7 - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win license: MIT license_family: MIT purls: - - pkg:pypi/ukkonen - size: 13958 - timestamp: 1695549884615 -- kind: conda - name: urllib3 - version: 2.2.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda - sha256: d4009dcc9327684d6409706ce17656afbeae690d8522d3c9bc4df57649a352cd - md5: 08807a87fa7af10754d46f63b368e016 + - pkg:pypi/ukkonen?source=hash-mapping + size: 17065 + timestamp: 1725784497818 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 depends: - brotli-python >=1.0.9 + - h2 >=4,<5 - pysocks >=1.5.6,<2.0,!=1.5.7 - - python >=3.7 + - python >=3.9 + - zstandard >=0.18.0 license: MIT license_family: MIT purls: - - pkg:pypi/urllib3 - size: 94669 - timestamp: 1708239595549 -- kind: conda - name: vc - version: '14.3' - build: hcf57466_18 - build_number: 18 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 - md5: 20e1e652a4c740fa719002a8449994a2 - depends: - - vc14_runtime >=14.38.33130 + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + sha256: 986ddaf8feec2904eac9535a7ddb7acda1a1dfb9482088fdb8129f1595181663 + md5: 7c10ec3158d1eb4ddff7007c9101adb0 + depends: + - vc14_runtime >=14.38.33135 track_features: - vc14 license: BSD-3-Clause license_family: BSD - size: 16977 - timestamp: 1702511255313 -- kind: conda - name: vc14_runtime - version: 14.38.33130 - build: h82b7239_18 - build_number: 18 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff - md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + purls: [] + size: 17479 + timestamp: 1731710827215 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + sha256: c483b090c4251a260aba6ff3e83a307bcfb5fb24ad7ced872ab5d02971bd3a49 + md5: 32b37d0cfa80da34548501cdc913a832 depends: - ucrt >=10.0.20348.0 constrains: - - vs2015_runtime 14.38.33130.* *_18 - license: LicenseRef-ProprietaryMicrosoft + - vs2015_runtime 14.42.34433.* *_23 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary - size: 749868 - timestamp: 1702511239004 -- kind: conda - name: virtualenv - version: 20.26.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda - sha256: 1eefd180723fb2fd295352323b53777eeae5765b24d62ae75fc9f1e71b455f11 - md5: 7d36e7a485ea2f5829408813bdbbfb38 + purls: [] + size: 754247 + timestamp: 1731710681163 +- conda: https://conda.anaconda.org/conda-forge/noarch/verspec-0.1.0-pyh29332c3_2.conda + sha256: 723351de1d7cee8bd22f8ea64b169f36f5c625c315c59c0267fab4bad837d503 + md5: 9c71dfe38494dd49c2547a3842b86fa7 depends: - - distlib <1,>=0.3.7 - - filelock <4,>=3.12.2 - - platformdirs <5,>=3.9.1 - - python >=3.8 + - python >=3.9 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/verspec?source=hash-mapping + size: 23765 + timestamp: 1735596628662 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + sha256: c50a4ab0f5f1164230d42a29f12f61ece9c7b102f57ed1c607d2cd7c77e107b5 + md5: d8a3ee355d5ecc9ee2565cafba1d3573 + depends: + - distlib >=0.3.7,<1 + - filelock >=3.12.2,<4 + - platformdirs >=3.9.1,<5 + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/virtualenv - size: 3458445 - timestamp: 1715681264937 -- kind: conda - name: vs2015_runtime - version: 14.38.33130 - build: hcb4865c_18 - build_number: 18 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db - md5: 10d42885e3ed84e575b454db30f1aa93 - depends: - - vc14_runtime >=14.38.33130 + - pkg:pypi/virtualenv?source=hash-mapping + size: 3519478 + timestamp: 1739263533376 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + sha256: 568ce8151eaae256f1cef752fc78651ad7a86ff05153cc7a4740b52ae6536118 + md5: 5c176975ca2b8366abad3c97b3cd1e83 + depends: + - vc14_runtime >=14.42.34433 license: BSD-3-Clause license_family: BSD - size: 16988 - timestamp: 1702511261442 -- kind: conda - name: win_inet_pton - version: 1.1.0 - build: pyhd8ed1ab_6 - build_number: 6 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 - sha256: a11ae693a0645bf6c7b8a47bac030be9c0967d0b1924537b9ff7458e832c0511 - md5: 30878ecc4bd36e8deeea1e3c151b2e0b + purls: [] + size: 17572 + timestamp: 1731710685291 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py310hff52083_0.conda + sha256: 95ca3ddffb6577c48087d7f14c8d2be9d9963b7431b3448fcce4649b6afd1a99 + md5: f47eccf447f25379f49f8b87c931baac depends: - - __win - - python >=3.6 - license: PUBLIC-DOMAIN - purls: - - pkg:pypi/win-inet-pton - size: 8191 - timestamp: 1667051294134 -- kind: conda - name: xcb-util - version: 0.4.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda - sha256: 0c91d87f0efdaadd4e56a5f024f8aab20ec30f90aa2ce9e4ebea05fbc20f71ad - md5: 9bfac7ccd94d54fd21a0501296d60424 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - pyyaml >=3.10 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 116134 + timestamp: 1730492960947 +- conda: https://conda.anaconda.org/conda-forge/osx-64/watchdog-6.0.0-py310hbb8c376_0.conda + sha256: 895ca992a06152bdb3098ab49d7195312f7979c9dbb3cd0e512ba6a625967961 + md5: f000e96ab28351ad27c21d1a546a7324 depends: - - libgcc-ng >=12 - - libxcb >=1.13 - - libxcb >=1.15,<1.16.0a0 - license: MIT - license_family: MIT - size: 19728 - timestamp: 1684639166048 -- kind: conda - name: xcb-util-image - version: 0.4.0 - build: h8ee46fc_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda - sha256: 92ffd68d2801dbc27afe223e04ae7e78ef605fc8575f107113c93c7bafbd15b0 - md5: 9d7bcddf49cbf727730af10e71022c73 + - __osx >=10.13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - pyyaml >=3.10 + arch: x86_64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 124225 + timestamp: 1730493095862 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchdog-6.0.0-py310h078409c_0.conda + sha256: 8538c55385397900efa5f69c8090629fb3346c00e46d457004464585d25839bd + md5: cf0d5c291d51b6bac2522f27f561a43b depends: - - libgcc-ng >=12 - - libxcb >=1.15,<1.16.0a0 - - xcb-util >=0.4.0,<0.5.0a0 - license: MIT - license_family: MIT - size: 24474 - timestamp: 1684679894554 -- kind: conda - name: xcb-util-keysyms - version: 0.4.0 - build: h8ee46fc_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda - sha256: 8451d92f25d6054a941b962179180728c48c62aab5bf20ac10fef713d5da6a9a - md5: 632413adcd8bc16b515cab87a2932913 + - __osx >=11.0 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - pyyaml >=3.10 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 124807 + timestamp: 1730493162845 +- conda: https://conda.anaconda.org/conda-forge/win-64/watchdog-6.0.0-py310h5588dad_0.conda + sha256: a55fa89c944a126f551d90f63ea3c3e4b09e223c60a7b7d17f229e80c49a18d5 + md5: a6383fa961f02e802c35bae9bdd9f0ec + depends: + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - pyyaml >=3.10 + arch: x86_64 + platform: win + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/watchdog?source=hash-mapping + size: 141143 + timestamp: 1730493348685 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 + md5: b68980f2495d096e71c7fd9d7ccf63e6 depends: - - libgcc-ng >=12 - - libxcb >=1.15,<1.16.0a0 + - python >=3.9 license: MIT license_family: MIT - size: 14186 - timestamp: 1684680497805 -- kind: conda - name: xcb-util-renderutil - version: 0.3.9 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda - sha256: 6987588e6fff5892056021c2ea52f7a0deefb2c7348e70d24750e2d60dabf009 - md5: e995b155d938b6779da6ace6c6b13816 + purls: + - pkg:pypi/wcwidth?source=hash-mapping + size: 32581 + timestamp: 1733231433877 +- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 + md5: 2841eb5bfc75ce15e9a0054b98dcd64d depends: - - libgcc-ng >=12 - - libxcb >=1.13 - - libxcb >=1.15,<1.16.0a0 - license: MIT - license_family: MIT - size: 16955 - timestamp: 1684639112393 -- kind: conda - name: xcb-util-wm - version: 0.4.1 - build: h8ee46fc_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda - sha256: 08ba7147c7579249b6efd33397dc1a8c2404278053165aaecd39280fee705724 - md5: 90108a432fb5c6150ccfee3f03388656 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/webencodings?source=hash-mapping + size: 15496 + timestamp: 1733236131358 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f + md5: 46e441ba871f524e2b067929da3051c2 depends: - - libgcc-ng >=12 - - libxcb >=1.15,<1.16.0a0 + - __win + - python >=3.9 + license: LicenseRef-Public-Domain + purls: + - pkg:pypi/win-inet-pton?source=hash-mapping + size: 9555 + timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + sha256: 9df10c5b607dd30e05ba08cbd940009305c75db242476f4e845ea06008b0a283 + md5: 1cee351bf20b830d991dbe0bc8cd7dfe license: MIT license_family: MIT - size: 52114 - timestamp: 1684679248466 -- kind: conda - name: xkeyboard-config - version: '2.41' - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda - sha256: 56955610c0747ea7cb026bb8aa9ef165ff41d616e89894538173b8b7dd2ee49a - md5: 81f740407b45e3f9047b3174fa94eb9e + purls: [] + size: 1176306 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.6.4-hbcc6ac9_0.conda + sha256: 91fc251034fa5199919680aa50299296d89da54b2d066fb6e6a60461c17c0c4a + md5: bb511c87804cf7220246a3a6efc45c22 depends: - - libgcc-ng >=12 - - xorg-libx11 >=1.8.7,<2.0a0 - license: MIT - license_family: MIT - size: 898045 - timestamp: 1707104384997 -- kind: conda - name: xorg-kbproto - version: 1.0.7 - build: h7f98852_1002 - build_number: 1002 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 - sha256: e90b0a6a5d41776f11add74aa030f789faf4efd3875c31964d6f9cfa63a10dd1 - md5: 4b230e8381279d76131116660f5a241a - depends: - - libgcc-ng >=9.3.0 - license: MIT - license_family: MIT - size: 27338 - timestamp: 1610027759842 -- kind: conda - name: xorg-libice - version: 1.1.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda - sha256: 5aa9b3682285bb2bf1a8adc064cb63aff76ef9178769740d855abb42b0d24236 - md5: b462a33c0be1421532f28bfe8f4a7514 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.6.4 hb9d3cd8_0 + - liblzma-devel 5.6.4 hb9d3cd8_0 + - xz-gpl-tools 5.6.4 hbcc6ac9_0 + - xz-tools 5.6.4 hb9d3cd8_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 23477 + timestamp: 1738525395307 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.6.4-h357f2ed_0.conda + sha256: 6412811e1592b530e84ea5030dedd7088fbe3258fdad9e60253d681b5be367a2 + md5: 702db4b35cffa4f94b94414066ffbb2b depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 58469 - timestamp: 1685307573114 -- kind: conda - name: xorg-libsm - version: 1.2.4 - build: h7391055_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda - sha256: 089ad5f0453c604e18985480218a84b27009e9e6de9a0fa5f4a20b8778ede1f1 - md5: 93ee23f12bc2e684548181256edd2cf6 + - __osx >=10.13 + - liblzma 5.6.4 hd471939_0 + - liblzma-devel 5.6.4 hd471939_0 + - xz-gpl-tools 5.6.4 h357f2ed_0 + - xz-tools 5.6.4 hd471939_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 23585 + timestamp: 1738525517200 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.6.4-h9a6d368_0.conda + sha256: 0ca773e9d3af963414ac9d78c699c5048902bd336fbc989480c5e8a297cfcd10 + md5: b6e676c2c7fde19f56e052acb6acc540 depends: - - libgcc-ng >=12 - - libuuid >=2.38.1,<3.0a0 - - xorg-libice >=1.1.1,<2.0a0 - license: MIT - license_family: MIT - size: 27433 - timestamp: 1685453649160 -- kind: conda - name: xorg-libx11 - version: 1.8.9 - build: h8ee46fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda - sha256: 3e53ba247f1ad68353f18aceba5bf8ce87e3dea930de85d36946844a7658c9fb - md5: 077b6e8ad6a3ddb741fce2496dd01bec + - __osx >=11.0 + - liblzma 5.6.4 h39f12f2_0 + - liblzma-devel 5.6.4 h39f12f2_0 + - xz-gpl-tools 5.6.4 h9a6d368_0 + - xz-tools 5.6.4 h39f12f2_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 23661 + timestamp: 1738525523535 +- conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.6.4-h208afaa_0.conda + sha256: 26d5a1569c391566d42e7094aa5a3695487cf6c5cf33f45a7bb750bbcaca79fc + md5: 97e1f122231e057a3da5cd32affcc9c2 + depends: + - liblzma 5.6.4 h2466b09_0 + - liblzma-devel 5.6.4 h2466b09_0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz-tools 5.6.4 h2466b09_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 23977 + timestamp: 1738525637903 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.6.4-hbcc6ac9_0.conda + sha256: 300fc4e5993a36c979e61b1a38d00f0c23c0c56d5989be537cbc7bd8658254ed + md5: 246840b451f7a66bd68869e56b066dd5 depends: - - libgcc-ng >=12 - - libxcb >=1.15,<1.16.0a0 - - xorg-kbproto - - xorg-xextproto >=7.3.0,<8.0a0 - - xorg-xproto - license: MIT - license_family: MIT - size: 828060 - timestamp: 1712415742569 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: h0dc2134_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda - sha256: 8a2e398c4f06f10c64e69f56bcf3ddfa30b432201446a0893505e735b346619a - md5: 9566b4c29274125b0266d0177b5eb97b - license: MIT - license_family: MIT - size: 13071 - timestamp: 1684638167647 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: hb547adb_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hb547adb_0.conda - sha256: 02c313a1cada46912e5b9bdb355cfb4534bfe22143b4ea4ecc419690e793023b - md5: ca73dc4f01ea91e44e3ed76602c5ea61 - license: MIT - license_family: MIT - size: 13667 - timestamp: 1684638272445 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: hcd874cb_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda - sha256: 8c5b976e3b36001bdefdb41fb70415f9c07eff631f1f0155f3225a7649320e77 - md5: c46ba8712093cb0114404ae8a7582e1a + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.6.4 hb9d3cd8_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 33285 + timestamp: 1738525381548 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.6.4-h357f2ed_0.conda + sha256: 57430768c0f26413dadec7fa4ac203984372a67e906a271f68777d1ad0085d20 + md5: bbe2c5315d02654eb195bdf012bad66c depends: - - m2w64-gcc-libs - - m2w64-gcc-libs-core - license: MIT - license_family: MIT - size: 51297 - timestamp: 1684638355740 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda - sha256: 309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4 - md5: 2c80dc38fface310c9bd81b17037fee5 + - __osx >=10.13 + - liblzma 5.6.4 hd471939_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 33480 + timestamp: 1738525498669 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.6.4-h9a6d368_0.conda + sha256: a380a32a392df8e9c03399197d3e3c6da1b98873b8733b8a9e22d3689a775471 + md5: a2580f5af9e67d0e44a97c015eea94d3 depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 14468 - timestamp: 1684637984591 -- kind: conda - name: xorg-libxdmcp - version: 1.1.3 - build: h27ca646_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.3-h27ca646_0.tar.bz2 - sha256: d9a2fb4762779994718832f05a7d62ab2dcf6103a312235267628b5187ce88f7 - md5: 6738b13f7fadc18725965abdd4129c36 - license: MIT - license_family: MIT - size: 18164 - timestamp: 1610071737668 -- kind: conda - name: xorg-libxdmcp - version: 1.1.3 - build: h35c211d_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2 - sha256: 485421c16f03a01b8ed09984e0b2ababdbb3527e1abf354ff7646f8329be905f - md5: 86ac76d6bf1cbb9621943eb3bd9ae36e - license: MIT - license_family: MIT - size: 17225 - timestamp: 1610071995461 -- kind: conda - name: xorg-libxdmcp - version: 1.1.3 - build: h7f98852_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 - sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 - md5: be93aabceefa2fac576e971aef407908 - depends: - - libgcc-ng >=9.3.0 - license: MIT - license_family: MIT - size: 19126 - timestamp: 1610071769228 -- kind: conda - name: xorg-libxdmcp - version: 1.1.3 - build: hcd874cb_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 - sha256: f51205d33c07d744ec177243e5d9b874002910c731954f2c8da82459be462b93 - md5: 46878ebb6b9cbd8afcf8088d7ef00ece + - __osx >=11.0 + - liblzma 5.6.4 h39f12f2_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 33416 + timestamp: 1738525507604 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.6.4-hb9d3cd8_0.conda + sha256: 57506a312d8cfbee98217fb382822bd49794ea6318dd4e0413a0d588dc6f4f69 + md5: a098f9f949af52610fdceb8e35b57513 depends: - - m2w64-gcc-libs - license: MIT - license_family: MIT - size: 67908 - timestamp: 1610072296570 -- kind: conda - name: xorg-libxext - version: 1.3.4 - build: h0b41bf4_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda - sha256: 73e5cfbdff41ef8a844441f884412aa5a585a0f0632ec901da035a03e1fe1249 - md5: 82b6df12252e6f32402b96dacc656fec + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.6.4 hb9d3cd8_0 + license: 0BSD AND LGPL-2.1-or-later + purls: [] + size: 89735 + timestamp: 1738525367692 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.6.4-hd471939_0.conda + sha256: 5361cadd518a24a19b009cfea1c113bea979b040858a15bbbd3a58c4d4f9774a + md5: 479783497192d1ad6671cbd0080f6dcb depends: - - libgcc-ng >=12 - - xorg-libx11 >=1.7.2,<2.0a0 - - xorg-xextproto - license: MIT - license_family: MIT - size: 50143 - timestamp: 1677036907815 -- kind: conda - name: xorg-libxrender - version: 0.9.11 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda - sha256: 26da4d1911473c965c32ce2b4ff7572349719eaacb88a066db8d968a4132c3f7 - md5: ed67c36f215b310412b2af935bf3e530 + - __osx >=10.13 + - liblzma 5.6.4 hd471939_0 + license: 0BSD AND LGPL-2.1-or-later + purls: [] + size: 81728 + timestamp: 1738525483936 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.6.4-h39f12f2_0.conda + sha256: 4f18cc820f63ad3783c38763eb84132db00940d3291c0d03dc66ec8582e0cf84 + md5: e0ecdb9bfea05d0a763453071e375fc6 depends: - - libgcc-ng >=12 - - xorg-libx11 >=1.8.6,<2.0a0 - - xorg-renderproto - license: MIT - license_family: MIT - size: 37770 - timestamp: 1688300707994 -- kind: conda - name: xorg-renderproto - version: 0.11.1 - build: h7f98852_1002 - build_number: 1002 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 - sha256: 38942930f233d1898594dd9edf4b0c0786f3dbc12065a0c308634c37fd936034 - md5: 06feff3d2634e3097ce2fe681474b534 - depends: - - libgcc-ng >=9.3.0 - license: MIT - license_family: MIT - size: 9621 - timestamp: 1614866326326 -- kind: conda - name: xorg-xextproto - version: 7.3.0 - build: h0b41bf4_1003 - build_number: 1003 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda - sha256: b8dda3b560e8a7830fe23be1c58cc41f407b2e20ae2f3b6901eb5842ba62b743 - md5: bce9f945da8ad2ae9b1d7165a64d0f87 + - __osx >=11.0 + - liblzma 5.6.4 h39f12f2_0 + license: 0BSD AND LGPL-2.1-or-later + purls: [] + size: 81197 + timestamp: 1738525493814 +- conda: https://conda.anaconda.org/conda-forge/win-64/xz-tools-5.6.4-h2466b09_0.conda + sha256: 100d88365523051c5542a2657598cb25a85feb387bba8fa7e4ccb99fa57ad3f6 + md5: 213c6ca29a37cf0d84281d063368428d + depends: + - liblzma 5.6.4 h2466b09_0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: 0BSD AND LGPL-2.1-or-later + purls: [] + size: 64183 + timestamp: 1738525614199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - size: 30270 - timestamp: 1677036833037 -- kind: conda - name: xorg-xf86vidmodeproto - version: 2.3.1 - build: h7f98852_1002 - build_number: 1002 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2 - sha256: 43398aeacad5b8753b7a1c12cb6bca36124e0c842330372635879c350c430791 - md5: 3ceea9668625c18f19530de98b15d5b0 - depends: - - libgcc-ng >=9.3.0 - license: MIT - license_family: MIT - size: 23875 - timestamp: 1620067286978 -- kind: conda - name: xorg-xproto - version: 7.0.31 - build: h7f98852_1007 - build_number: 1007 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 - sha256: f197bb742a17c78234c24605ad1fe2d88b1d25f332b75d73e5ba8cf8fbc2a10d - md5: b4a4381d54784606820704f7b5f05a15 - depends: - - libgcc-ng >=9.3.0 + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux license: MIT license_family: MIT - size: 74922 - timestamp: 1607291557628 -- kind: conda - name: xz - version: 5.2.6 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - size: 418368 - timestamp: 1660346797927 -- kind: conda - name: xz - version: 5.2.6 - build: h57fd34a_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 - size: 235693 - timestamp: 1660346961024 -- kind: conda - name: xz - version: 5.2.6 - build: h775f41a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 - md5: a72f9d4ea13d55d745ff1ed594747f10 - license: LGPL-2.1 and GPL-2.0 - size: 238119 - timestamp: 1660346964847 -- kind: conda - name: xz - version: 5.2.6 - build: h8d14728_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 - md5: 515d77642eaa3639413c6b1bc3f94219 - depends: - - vc >=14.1,<15 - - vs2015_runtime >=14.16.27033 - license: LGPL-2.1 and GPL-2.0 - size: 217804 - timestamp: 1660346976440 -- kind: conda - name: yaml - version: 0.2.5 - build: h0d85af4_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 sha256: 5301417e2c8dea45b401ffee8df3957d2447d4ce80c83c5ff151fc6bfe1c4148 md5: d7e08fcf8259d742156188e8762b4d20 + arch: x86_64 + platform: osx license: MIT license_family: MIT + purls: [] size: 84237 timestamp: 1641347062780 -- kind: conda - name: yaml - version: 0.2.5 - build: h3422bc3_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx license: MIT license_family: MIT + purls: [] size: 88016 timestamp: 1641347076660 -- kind: conda - name: yaml - version: 0.2.5 - build: h7f98852_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 - md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - size: 89141 - timestamp: 1641346969816 -- kind: conda - name: yaml - version: 0.2.5 - build: h8ffe710_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 sha256: 4e2246383003acbad9682c7c63178e2e715ad0eb84f03a8df1fbfba455dfedc5 md5: adbfb9f45d1004a26763652246a33764 depends: - vc >=14.1,<15.0a0 - vs2015_runtime >=14.16.27012 + arch: x86_64 + platform: win license: MIT license_family: MIT + purls: [] size: 63274 timestamp: 1641347623319 -- kind: conda - name: zipp - version: 3.17.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 - md5: 2e4d6bc0b14e10f895fc6791a7d9b26a +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 depends: - - python >=3.8 + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h7130eaa_7.conda + sha256: b932dce8c9de9a8ffbf0db0365d29677636e599f7763ca51e554c43a0c5f8389 + md5: 6a0a76cd2b3d575e1b7aaeb283b9c3ed + depends: + - __osx >=10.13 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: x86_64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 292112 + timestamp: 1731585246902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-ha9f60a1_7.conda + sha256: 15cc8e2162d0a33ffeb3f7b7c7883fd830c54a4b1be6a4b8c7ee1f4fef0088fb + md5: e03f2c245a5ee6055752465519363b1c + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libsodium >=1.0.20,<1.0.21.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + arch: x86_64 + platform: win + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 2527503 + timestamp: 1731585151036 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/zipp - size: 18954 - timestamp: 1695255262261 -- kind: conda - name: zlib - version: 1.2.13 - build: hd590300_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - sha256: 9887a04d7e7cb14bd2b52fa01858f05a6d7f002c890f618d9fcd864adbfecb1b - md5: 68c34ec6149623be41a1933ab996a209 + - pkg:pypi/zipp?source=hash-mapping + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + sha256: 534824ea44939f3e59ca8ebb95e3ece6f50f9d2a0e69999fbc692311252ed6ac + md5: 559d338a4234c2ad6e676f460a093e67 depends: - libgcc-ng >=12 - - libzlib 1.2.13 hd590300_5 + - libzlib 1.2.13 h4ab18f5_6 + license: Zlib + license_family: Other + purls: [] + size: 92883 + timestamp: 1716874088980 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h87427d6_6.conda + sha256: 3091d48a579c08ba20885bc8856def925e9dee9d1a7d8713e3ce002eb29fcd19 + md5: 700b922d6d22e7deb5fb2964d0c8cf6a + depends: + - __osx >=10.13 + - libzlib 1.2.13 h87427d6_6 + license: Zlib + license_family: Other + purls: [] + size: 88732 + timestamp: 1716874218187 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + sha256: c09c9cb6de86d87b9267a6331c74cc8fb05bae5ee7749070a5e8883c3eff5424 + md5: 88cf27df3eff5813734b538461f4c8cf + depends: + - __osx >=11.0 + - libzlib 1.2.13 hfb2fe0b_6 license: Zlib license_family: Other - size: 92825 - timestamp: 1686575231103 -- kind: conda - name: zstd - version: 1.5.5 - build: h12be248_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda - sha256: d540dd56c5ec772b60e4ce7d45f67f01c6614942225885911964ea1e70bb99e3 - md5: 792bb5da68bf0a6cac6a6072ecb8dbeb - depends: - - libzlib >=1.2.13,<1.3.0a0 + purls: [] + size: 78193 + timestamp: 1716874169064 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-h2466b09_6.conda + sha256: 7aebf311fdb9227deddaedc33ace85bc960f5116ffb31f3ff07db380dfca0b41 + md5: 86591a585a18e35d23279b6b384eb4b9 + depends: + - libzlib 1.2.13 h2466b09_6 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 + license: Zlib + license_family: Other + purls: [] + size: 107894 + timestamp: 1716874644593 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda + sha256: fcd784735205d6c5f19dcb339f92d2eede9bc42a01ec2c384381ee1b6089d4f6 + md5: f49de34fb99934bf49ab330b5caffd64 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 license: BSD-3-Clause license_family: BSD - size: 343428 - timestamp: 1693151615801 -- kind: conda - name: zstd - version: 1.5.5 - build: h4f39d0f_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - sha256: 7e1fe6057628bbb56849a6741455bbb88705bae6d6646257e57904ac5ee5a481 - md5: 5b212cfb7f9d71d603ad891879dc7933 - depends: - - libzlib >=1.2.13,<1.3.0a0 - license: BSD-3-Clause - license_family: BSD - size: 400508 - timestamp: 1693151393180 -- kind: conda - name: zstd - version: 1.5.5 - build: h829000d_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - sha256: d54e31d3d8de5e254c0804abd984807b8ae5cd3708d758a8bf1adff1f5df166c - md5: 80abc41d0c48b82fe0f04e7f42f5cb7e - depends: - - libzlib >=1.2.13,<1.3.0a0 + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 408309 + timestamp: 1725305719512 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py310h41d873f_1.conda + sha256: 449fd094d91e509421ddbe7b707c58191473355f29373c0f3d603875b8d2b801 + md5: cbf02a084007c683a22172094d31eac6 + depends: + - __osx >=10.13 + - cffi >=1.11 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 license: BSD-3-Clause license_family: BSD - size: 499383 - timestamp: 1693151312586 -- kind: conda - name: zstd - version: 1.5.5 - build: hfc55251_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - sha256: 607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609 - md5: 04b88013080254850d6c01ed54810589 + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 400765 + timestamp: 1725305605347 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py310h2665a74_1.conda + sha256: a90d06cbfa50fc9b3c37bd092d559452475f22425bacf28f04ecac2e8b1c389c + md5: 81b300570a423c9c9521b79f8f2ed1ba depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - __osx >=11.0 + - cffi >=1.11 + - python >=3.10,<3.11.0a0 + - python >=3.10,<3.11.0a0 *_cpython + - python_abi 3.10.* *_cp310 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 license: BSD-3-Clause license_family: BSD - size: 545199 - timestamp: 1693151163452 -- kind: conda - name: zstd - version: 1.5.6 - build: h0ea2cb4_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - sha256: 768e30dc513568491818fb068ee867c57c514b553915536da09e5d10b4ebf3c3 - md5: 9a17230f95733c04dc40a2b1e5491d74 + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 320810 + timestamp: 1725305704555 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py310he5e10e1_1.conda + sha256: 4e8aff4d0d42024e9f70783e51666186a681384d59fdd03fafda4b28f1fd540e + md5: 2a879227ccc1a10a2caddf12607ffaeb depends: - - libzlib >=1.2.13,<1.3.0a0 + - cffi >=1.11 + - python >=3.10,<3.11.0a0 + - python_abi 3.10.* *_cp310 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 license: BSD-3-Clause license_family: BSD - size: 349143 - timestamp: 1714723445995 -- kind: conda - name: zstd - version: 1.5.6 - build: h915ae27_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - sha256: efa04a98cb149643fa54c4dad5a0179e36a5fbc88427ea0eec88ceed87fd0f96 - md5: 4cb2cd56f039b129bb0e491c1164167e - depends: - - __osx >=10.9 - - libzlib >=1.2.13,<1.3.0a0 - license: BSD-3-Clause - license_family: BSD - size: 498900 - timestamp: 1714723303098 -- kind: conda - name: zstd - version: 1.5.6 - build: ha6fb4c9_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 311278 + timestamp: 1725306039901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b md5: 4d056880988120e29d75bfff282e0f45 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 554846 timestamp: 1714722996770 -- kind: conda - name: zstd - version: 1.5.6 - build: hb46c0d2_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + sha256: efa04a98cb149643fa54c4dad5a0179e36a5fbc88427ea0eec88ceed87fd0f96 + md5: 4cb2cd56f039b129bb0e491c1164167e + depends: + - __osx >=10.9 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 498900 + timestamp: 1714723303098 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 md5: d96942c06c3e84bfcc5efb038724a7fd depends: - __osx >=11.0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD + purls: [] size: 405089 timestamp: 1714723101397 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda + sha256: 768e30dc513568491818fb068ee867c57c514b553915536da09e5d10b4ebf3c3 + md5: 9a17230f95733c04dc40a2b1e5491d74 + depends: + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 349143 + timestamp: 1714723445995 diff --git a/pyikt/__init__.py b/pyikt/__init__.py new file mode 100644 index 0000000..e04b09a --- /dev/null +++ b/pyikt/__init__.py @@ -0,0 +1,54 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from .kernel import IsoKernel +from .kernel import IsoDisKernel + +from .anomaly import IDKD +from .anomaly import INNE + +from .cluster import IDKC +from .cluster import PSKC +from .cluster import IKAHC + +from .graph import IsoGraphKernel +from .graph import IKGOD + +from .group import IKGAD + + +from .trajectory import IKAT +from .trajectory import TIDKC + +from .stream import ICID +from .stream import STREAMKHC + +from .timeseries import IKTOD + +from ._version import __version__ + +__all__ = [ + "IsoDisKernel", + "IsoKernel", + "IDKD", + "INNE", + "IDKC", + "PSKC", + "IKAHC", + "IsoGraphKernel", + "IKGOD", + "IKGAD", + "ICID", + "IKAT", + "TIDKC", + "STREAMKHC", + "IKTOD", + "__version__", +] diff --git a/pyikt/_version.py b/pyikt/_version.py new file mode 100644 index 0000000..38c4d2a --- /dev/null +++ b/pyikt/_version.py @@ -0,0 +1,21 @@ +# file generated by setuptools-scm +# don't change, don't track in version control + +__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"] + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple + from typing import Union + + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '0.1.dev131+g647493f.d20250228' +__version_tuple__ = version_tuple = (0, 1, 'dev131', 'g647493f.d20250228') diff --git a/pyikt/anomaly/__init__.py b/pyikt/anomaly/__init__.py new file mode 100644 index 0000000..eb83102 --- /dev/null +++ b/pyikt/anomaly/__init__.py @@ -0,0 +1,15 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from ._idkd import IDKD +from ._inne import INNE +from ._iforest import IForest + +__all__ = ["IDKD", "INNE", "IForest"] diff --git a/pyikt/anomaly/_idkd.py b/pyikt/anomaly/_idkd.py new file mode 100644 index 0000000..d7a8cd1 --- /dev/null +++ b/pyikt/anomaly/_idkd.py @@ -0,0 +1,248 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numbers +from warnings import warn +import numpy as np +from sklearn.base import BaseEstimator, OutlierMixin +from sklearn.utils.validation import check_is_fitted +from sklearn.utils import check_array +from sklearn.utils.extmath import safe_sparse_dot +from pyikt.kernel import IsoKernel + + +class IDKD(OutlierMixin, BaseEstimator): + """Isolation Distributional Kernel for anomaly detection. + + IDKD measures the similarity between distributions to identify anomalies. + An observation is considered anomalous when its Dirac measure has a low + similarity with respect to the reference distribution from which the dataset + was generated. + + This implementation follows the algorithm described in [1]_. + + Parameters + ---------- + n_estimators : int, default=200 + Number of base estimators in the ensemble. + + max_samples : {"auto", int, float}, default="auto" + Number of samples to draw from X to train each base estimator. + + - If "auto", then `max_samples=min(8, n_samples)`. + - If int, then draw `max_samples` samples. + - If float, then draw `max_samples * X.shape[0]` samples. + + method : {"inne", "anne", "auto"}, default="inne" + Isolation method to use. The original algorithm described in [1]_ uses "inne". + + contamination : {"auto", float}, default="auto" + The proportion of outliers in the data set. + + - If "auto", the threshold is determined as in [1]_. + - If float, the contamination should be in the range (0, 0.5]. + + Used to define the threshold on the decision function. + + random_state : int, RandomState instance or None, default=None + Controls the randomness of the estimator. + Pass an int for reproducible results across multiple function calls. + + Attributes + ---------- + offset_ : float + Offset used to define the decision function from the raw scores. + + max_samples_ : int + Actual number of samples used. + + iso_kernel_ : IsoKernel + The fitted isolation kernel. + + References + ---------- + .. [1] Kai Ming Ting, Bi-Cun Xu, Washio Takashi, Zhi-Hua Zhou (2022). + "Isolation Distributional Kernel: A new tool for kernel based point and group anomaly detections." + IEEE Transactions on Knowledge and Data Engineering. + + Examples + -------- + >>> from pyikt.anomaly import IDKD + >>> import numpy as np + >>> X = np.array([[-1.1, 0.2], [0.3, 0.5], [0.5, 1.1], [100, 90]]) + >>> clf = IDKD(max_samples=2, contamination=0.25).fit(X) + >>> clf.predict([[0.1, 0.3], [0, 0.7], [90, 85]]) + array([ 1, 1, -1]) + """ + + def __init__( + self, + n_estimators=200, + max_samples="auto", + contamination="auto", + method="inne", + random_state=None, + ): + self.n_estimators = n_estimators + self.max_samples = max_samples + self.random_state = random_state + self.contamination = contamination + self.method = method + + def fit(self, X, y=None): + """Fit the IDKD model. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + Training data. Use ``dtype=np.float32`` for maximum efficiency. + + y : Ignored + Not used, present for API consistency. + + Returns + ------- + self : object + Fitted estimator. + """ + + # Check data + X = check_array(X, accept_sparse=False) + + n_samples = X.shape[0] + if isinstance(self.max_samples, str): + if self.max_samples == "auto": + max_samples = min(16, n_samples) + else: + raise ValueError( + "max_samples (%s) is not supported." + 'Valid choices are: "auto", int or' + "float" % self.max_samples + ) + + elif isinstance(self.max_samples, numbers.Integral): + if self.max_samples > n_samples: + warn( + "max_samples (%s) is greater than the " + "total number of samples (%s). max_samples " + "will be set to n_samples for estimation." + % (self.max_samples, n_samples) + ) + max_samples = n_samples + else: + max_samples = self.max_samples + else: # float + if not 0.0 < self.max_samples <= 1.0: + raise ValueError( + "max_samples must be in (0, 1], got %r" % self.max_samples + ) + max_samples = int(self.max_samples * X.shape[0]) + + self.max_samples_ = max_samples + self._fit(X) + self.is_fitted_ = True + + if self.contamination != "auto": + if not (0.0 < self.contamination <= 0.5): + raise ValueError( + "contamination must be in (0, 0.5], got: %f" % self.contamination + ) + + if self.contamination == "auto": + # 0.5 plays a special role as described in the original paper. + # we take the opposite as we consider the opposite of their score. + self.offset_ = -0.5 + else: + # else, define offset_ wrt contamination parameter + self.offset_ = np.percentile( + self.score_samples(X), 100.0 * self.contamination + ) + + return self + + def _kernel_mean_embedding(self, X): + return np.mean(X, axis=0) / self.max_samples_ + + def _fit(self, X): + """Build the isolation kernel from the training data.""" + iso_kernel = IsoKernel( + n_estimators=self.n_estimators, + max_samples=self.max_samples_, + random_state=self.random_state, + method=self.method, + ) + self.iso_kernel_ = iso_kernel.fit(X) + self.is_fitted_ = True + + return self + + def predict(self, X): + """Predict if samples are outliers or not. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The query samples. + + Returns + ------- + is_inlier : ndarray of shape (n_samples,) + Returns +1 for inliers and -1 for outliers. + """ + check_is_fitted(self) + decision_func = self.decision_function(X) + is_inlier = np.ones_like(decision_func, dtype=int) + is_inlier[decision_func < 0] = -1 + return is_inlier + + def decision_function(self, X): + """Compute the decision function for each sample. + + The decision function is defined as score_samples(X) - offset_. + Negative values are considered outliers and positive values are considered inliers. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The query samples. + + Returns + ------- + scores : ndarray of shape (n_samples,) + Decision function values for each sample. + Negative values represent outliers, positive values represent inliers. + """ + # We subtract self.offset_ to make 0 be the threshold value for being + # an outlier. + return self.score_samples(X) - self.offset_ + + def score_samples(self, X): + """Compute the anomaly scores for each sample. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The query samples. + + Returns + ------- + scores : ndarray of shape (n_samples,) + The anomaly score of each input sample. + The lower the score, the more anomalous the sample. + """ + check_is_fitted(self, "is_fitted_") + # Check data + X = check_array(X, accept_sparse=False) + + X_trans = self.iso_kernel_.transform(X) + kme = np.average(X_trans.toarray(), axis=0) / self.max_samples_ + scores = safe_sparse_dot(X_trans, kme.T).flatten() + + return scores diff --git a/pyikt/anomaly/_iforest.py b/pyikt/anomaly/_iforest.py new file mode 100644 index 0000000..067a4cf --- /dev/null +++ b/pyikt/anomaly/_iforest.py @@ -0,0 +1,221 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from sklearn.base import BaseEstimator, OutlierMixin +from sklearn.utils.validation import check_is_fitted +from sklearn.utils import check_array +from sklearn.ensemble import IsolationForest + +MAX_INT = np.iinfo(np.int32).max +MIN_FLOAT = np.finfo(float).eps + + +class IForest(OutlierMixin, BaseEstimator): + """Wrapper of scikit-learn Isolation Forest for anomaly detection. + + The IsolationForest 'isolates' observations by randomly selecting a + feature and then randomly selecting a split value between the maximum and + minimum values of the selected feature. + + Since recursive partitioning can be represented by a tree structure, the + number of splittings required to isolate a sample is equivalent to the path + length from the root node to the terminating node. + + This path length, averaged over a forest of such random trees, is a + measure of normality and our decision function. Random partitioning produces + noticeably shorter paths for anomalies. Hence, when a forest of random trees + collectively produce shorter path lengths for particular samples, they are + highly likely to be anomalies. + + Parameters + ---------- + n_estimators : int, default=100 + The number of base estimators (trees) in the ensemble. + + max_samples : int or float, default="auto" + The number of samples to draw from X to train each base estimator. + - If int, then draw `max_samples` samples. + - If float, then draw `max_samples * X.shape[0]` samples. + - If "auto", then `max_samples=min(256, n_samples)`. + + contamination : float or 'auto', default=0.1 + The proportion of outliers in the data set. Used to define the threshold + on the scores of the samples. + - If 'auto', the threshold is determined as in the original paper. + - If float, the contamination should be in the range (0, 0.5]. + + max_features : int or float, default=1.0 + The number of features to draw from X to train each base estimator. + - If int, then draw `max_features` features. + - If float, then draw `max_features * X.shape[1]` features. + + bootstrap : bool, default=False + If True, individual trees are fit on random subsets of the training + data sampled with replacement. If False, sampling without replacement + is performed. + + n_jobs : int, default=1 + The number of jobs to run in parallel for both `fit` and `predict`. + If -1, then the number of jobs is set to the number of cores. + + random_state : int, RandomState instance or None, default=None + Controls the pseudo-randomness of the selection of the feature + and split values for each branching step and each tree in the forest. + Pass an int for reproducible results across multiple function calls. + + verbose : int, default=0 + Controls the verbosity of the tree building process. + + Attributes + ---------- + detector_ : IsolationForest + The underlying scikit-learn IsolationForest object. + + is_fitted_ : bool + Indicates whether the estimator has been fitted. + + References + ---------- + .. [1] Liu, F. T., Ting, K. M., & Zhou, Z. H. (2008, December). "Isolation forest." + In 2008 Eighth IEEE International Conference on Data Mining (pp. 413-422). IEEE. + + .. [2] Liu, F. T., Ting, K. M., & Zhou, Z. H. (2012). "Isolation-based + anomaly detection." ACM Transactions on Knowledge Discovery from + Data (TKDD), 6(1), 1-39. + + Examples + -------- + >>> from pyikt.anomaly import IForest + >>> import numpy as np + >>> X = np.array([[-1.1, 0.2], [0.3, 0.5], [0.5, 1.1], [100, 90]]) + >>> clf = IForest(contamination=0.25).fit(X) + >>> clf.predict([[0.1, 0.3], [0, 0.7], [90, 85]]) + array([ 1, 1, -1]) + """ + + def __init__( + self, + n_estimators=100, + max_samples="auto", + contamination=0.1, + max_features=1.0, + bootstrap=False, + n_jobs=1, + random_state=None, + verbose=0, + ): + self.contamination=contamination + self.n_estimators = n_estimators + self.max_samples = max_samples + self.max_features = max_features + self.bootstrap = bootstrap + self.n_jobs = n_jobs + self.random_state = random_state + self.verbose = verbose + + def fit(self, X, y=None): + """ + Fit the isolation forest model. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. Use ``dtype=np.float32`` for maximum + efficiency. + + y : Ignored + Not used, present for API consistency by convention. + + Returns + ------- + self : object + Fitted estimator. + """ + # Check data + X = check_array(X, accept_sparse=False) + + self.detector_ = IsolationForest( + n_estimators=self.n_estimators, + max_samples=self.max_samples, + contamination=self.contamination, + max_features=self.max_features, + bootstrap=self.bootstrap, + n_jobs=self.n_jobs, + random_state=self.random_state, + verbose=self.verbose, + ) + + self.detector_.fit(X=X, y=None, sample_weight=None) + self.is_fitted_ = True + + return self + + def predict(self, X): + """ + Predict if a particular sample is an outlier or not. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. + + Returns + ------- + is_inlier : ndarray of shape (n_samples,) + The predicted labels. +1 for inliers, -1 for outliers. + """ + check_is_fitted(self, "is_fitted_") + return self.detector_.predict(X) + + def decision_function(self, X): + """ + Compute the anomaly score for each sample. + + The anomaly score of an input sample is computed as + the mean anomaly score of the trees in the forest. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. + + Returns + ------- + scores : ndarray of shape (n_samples,) + The anomaly score of the input samples. + The lower, the more abnormal. Negative scores represent outliers, + positive scores represent inliers. + """ + check_is_fitted(self, "is_fitted_") + return self.detector_.decision_function(X) + + def score_samples(self, X): + """ + Return the raw anomaly score of samples. + + The anomaly score of an input sample is computed as + the mean anomaly score of the trees in the forest. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. + + Returns + ------- + scores : ndarray of shape (n_samples,) + The raw anomaly score of the input samples. + The lower, the more abnormal. + """ + check_is_fitted(self, "is_fitted_") + # Check data + X = check_array(X, accept_sparse=False) + return self.detector_.score_samples(X) diff --git a/pyikt/anomaly/_inne.py b/pyikt/anomaly/_inne.py new file mode 100644 index 0000000..1feeca4 --- /dev/null +++ b/pyikt/anomaly/_inne.py @@ -0,0 +1,283 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numbers +from warnings import warn +import numpy as np +from sklearn.base import BaseEstimator, OutlierMixin +from sklearn.metrics import euclidean_distances +from sklearn.utils.validation import check_is_fitted, check_random_state +from sklearn.utils import check_array +from sklearn.metrics._pairwise_distances_reduction import ArgKmin + +MAX_INT = np.iinfo(np.int32).max +MIN_FLOAT = np.finfo(float).eps + + +class INNE(OutlierMixin, BaseEstimator): + """Isolation-based anomaly detection using nearest-neighbor ensembles. + + The INNE algorithm uses the nearest neighbour ensemble to isolate anomalies. + It partitions the data space into regions using a subsample and determines an + isolation score for each region. As each region adapts to local distribution, + the calculated isolation score is a local measure that is relative to the local + neighbourhood, enabling it to detect both global and local anomalies. INNE has + linear time complexity to efficiently handle large and high-dimensional datasets + with complex distributions. + + Parameters + ---------- + n_estimators : int, default=200 + The number of base estimators in the ensemble. + + max_samples : int, default="auto" + The number of samples to draw from X to train each base estimator. + + - If int, then draw `max_samples` samples. + - If float, then draw `max_samples` * X.shape[0]` samples. + - If "auto", then `max_samples=min(8, n_samples)`. + + contamination : "auto" or float, default="auto" + The amount of contamination of the data set, i.e. the proportion + of outliers in the data set. Used when fitting to define the threshold + on the scores of the samples. + + - If "auto", the threshold is determined as in the original paper. + - If float, the contamination should be in the range (0, 0.5]. + + random_state : int, RandomState instance or None, default=None + Controls the pseudo-randomness of the selection of the feature + and split values for each branching step and each tree in the forest. + + Pass an int for reproducible results across multiple function calls. + See :term:`Glossary `. + + References + ---------- + .. [1] T. R. Bandaragoda, K. Ming Ting, D. Albrecht, F. T. Liu, Y. Zhu, and J. R. Wells. + "Isolation-based anomaly detection using nearest-neighbor ensembles." In Computational + Intelligence, vol. 34, 2018, pp. 968-998. + + Examples + -------- + >>> from pyikt.anomaly import INNE + >>> import numpy as np + >>> X = np.array([[-1.1, 0.2], [0.3, 0.5], [0.5, 1.1], [100, 90]]) + >>> clf = INNE(contamination=0.25).fit(X) + >>> clf.predict([[0.1, 0.3], [0, 0.7], [90, 85]]) + array([ 1, 1, -1]) + """ + + def __init__( + self, + n_estimators=200, + max_samples="auto", + contamination="auto", + random_state=None, + ): + self.n_estimators = n_estimators + self.max_samples = max_samples + self.random_state = random_state + self.contamination = contamination + + def fit(self, X, y=None): + """ + Fit estimator. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. Use ``dtype=np.float32`` for maximum + efficiency. + + y : Ignored + Not used, present for API consistency by convention. + + Returns + ------- + self : object + Fitted estimator. + """ + + # Check data + X = check_array(X, accept_sparse=False) + + n_samples = X.shape[0] + if isinstance(self.max_samples, str): + if self.max_samples == "auto": + max_samples = min(16, n_samples) + else: + raise ValueError( + "max_samples (%s) is not supported." + 'Valid choices are: "auto", int or' + "float" % self.max_samples + ) + + elif isinstance(self.max_samples, numbers.Integral): + if self.max_samples > n_samples: + warn( + "max_samples (%s) is greater than the " + "total number of samples (%s). max_samples " + "will be set to n_samples for estimation." + % (self.max_samples, n_samples) + ) + max_samples = n_samples + else: + max_samples = self.max_samples + else: # float + if not 0.0 < self.max_samples <= 1.0: + raise ValueError( + "max_samples must be in (0, 1], got %r" % self.max_samples + ) + max_samples = int(self.max_samples * X.shape[0]) + + self.max_samples_ = max_samples + self._fit(X) + self.is_fitted_ = True + + if self.contamination != "auto": + if not (0.0 < self.contamination <= 0.5): + raise ValueError( + "contamination must be in (0, 0.5], got: %f" % self.contamination + ) + + if self.contamination == "auto": + # 0.5 plays a special role as described in the original paper. + # we take the opposite as we consider the opposite of their score. + self.offset_ = -0.5 + else: + # else, define offset_ wrt contamination parameter + self.offset_ = np.percentile( + self.score_samples(X), 100.0 * self.contamination + ) + + return self + + def _fit(self, X): + + n_samples, n_features = X.shape + self._centroids = np.empty([self.n_estimators, self.max_samples_, n_features]) + self._ratio = np.empty([self.n_estimators, self.max_samples_]) + self._centroids_radius = np.empty([self.n_estimators, self.max_samples_]) + + random_state = check_random_state(self.random_state) + self._seeds = random_state.randint(MAX_INT, size=self.n_estimators) + + for i in range(self.n_estimators): + rnd = check_random_state(self._seeds[i]) + center_index = rnd.choice(n_samples, self.max_samples_, replace=False) + self._centroids[i] = X[center_index] + nn_dists, nn_ids = ArgKmin.compute( + X=self._centroids[i], + Y=self._centroids[i], + k=2, + metric="sqeuclidean", + metric_kwargs={}, + strategy="auto", + return_distance=True, + ) + # radius of each hypersphere is the Nearest Neighbors distance of centroid. + self._centroids_radius[i] = nn_dists[:, 1] + # Nearest Neighbors of centroids + cnn_index = nn_ids[:, 1] + cnn_radius = self._centroids_radius[i][cnn_index] + + self._ratio[i] = 1 - (cnn_radius + MIN_FLOAT) / ( + self._centroids_radius[i] + MIN_FLOAT + ) + + return self + + def predict(self, X): + """ + Predict if a particular sample is an outlier or not. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. Internally, it will be converted to + ``dtype=np.float32`` and if a sparse matrix is provided + to a sparse ``csr_matrix``. + + Returns + ------- + is_inlier : ndarray of shape (n_samples,) + For each observation, tells whether or not (+1 or -1) it should + be considered as an inlier according to the fitted model. + """ + + check_is_fitted(self) + decision_func = self.decision_function(X) + is_inlier = np.ones_like(decision_func, dtype=int) + is_inlier[decision_func < 0] = -1 + return is_inlier + + def decision_function(self, X): + """ + Average anomaly score of X of the base classifiers. + + The anomaly score of an input sample is computed as + the mean anomaly score of the . + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. Internally, it will be converted to + ``dtype=np.float32``. + + Returns + ------- + scores : ndarray of shape (n_samples,) + The anomaly score of the input samples. + The lower, the more abnormal. Negative scores represent outliers, + positive scores represent inliers. + """ + # We subtract self.offset_ to make 0 be the threshold value for being + # an outlier. + + return self.score_samples(X) - self.offset_ + + def score_samples(self, X): + """ + Opposite of the anomaly score defined in the original paper. + The anomaly score of an input sample is computed as + the mean anomaly score of the trees in the forest. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. + + Returns + ------- + scores : ndarray of shape (n_samples,) + The anomaly score of the input samples. + The lower, the more abnormal. + """ + + check_is_fitted(self, "is_fitted_") + # Check data + X = check_array(X, accept_sparse=False) + + isolation_scores = np.ones([self.n_estimators, X.shape[0]]) + # each test instance is evaluated against n_estimators sets of hyperspheres + for i in range(self.n_estimators): + x_dists = euclidean_distances(X, self._centroids[i], squared=True) + # find instances that are covered by at least one hypersphere. + cover_radius = np.where( + x_dists <= self._centroids_radius[i], self._centroids_radius[i], np.nan + ) + x_covered = np.where(~np.isnan(cover_radius).all(axis=1)) + # the centroid of the hypersphere covering x and having the smallest radius + cnn_x = np.nanargmin(cover_radius[x_covered], axis=1) + isolation_scores[i][x_covered] = self._ratio[i][cnn_x] + # the isolation scores are averaged to produce the anomaly score + scores = np.mean(isolation_scores, axis=0) + return -scores diff --git a/pyikt/anomaly/tests/__init__.py b/pyikt/anomaly/tests/__init__.py new file mode 100644 index 0000000..3c5155b --- /dev/null +++ b/pyikt/anomaly/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. diff --git a/pyikt/anomaly/tests/test_idkd.py b/pyikt/anomaly/tests/test_idkd.py new file mode 100644 index 0000000..32f3938 --- /dev/null +++ b/pyikt/anomaly/tests/test_idkd.py @@ -0,0 +1,96 @@ +""" +Copyright 2024 Xin Han. All rights reserved. +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file. +""" + +from sklearn.datasets import load_iris +import numpy as np +import pytest +from pyikt.anomaly import IDKD + +method = ["inne", "anne"] + + +@pytest.fixture +def data(): + return load_iris(return_X_y=True) + + +@pytest.mark.parametrize("method", method) +def test_IDKD_fit(data, method): + X = data[0] + idkd = IDKD(method=method, n_estimators=200) + idkd.fit(X) + assert idkd.is_fitted_ + + +@pytest.mark.parametrize("method", method) +def test_IDKD_predict(data, method): + X = data[0] + idkd = IDKD(method=method, n_estimators=200) + idkd.fit(X) + # Test prediction on training data + predictions = idkd.predict(X[:10]) + assert predictions.shape == (10,) + assert np.all(np.isin(predictions, [-1, 1])) + + +@pytest.mark.parametrize("method", method) +def test_IDKD_decision_function(data, method): + X = data[0] + idkd = IDKD(method=method, n_estimators=200) + idkd.fit(X) + # Test decision function + decision_scores = idkd.decision_function(X[:10]) + assert decision_scores.shape == (10,) + + +@pytest.mark.parametrize("method", method) +def test_IDKD_score_samples(data, method): + X = data[0] + idkd = IDKD(method=method, n_estimators=200) + idkd.fit(X) + # Test score samples + scores = idkd.score_samples(X[:10]) + assert scores.shape == (10,) + + +@pytest.mark.parametrize("contamination", [0.1, 0.2, 0.3, "auto"]) +def test_IDKD_contamination(data, contamination): + X = data[0] + idkd = IDKD(contamination=contamination, n_estimators=100) + idkd.fit(X) + assert idkd.is_fitted_ + + +def test_IDKD_invalid_contamination(data): + X = data[0] + idkd = IDKD(contamination=0.6) # Invalid: > 0.5 + with pytest.raises(ValueError): + idkd.fit(X) + + +@pytest.mark.parametrize("max_samples", [10, 20, "auto"]) +def test_IDKD_max_samples(data, max_samples): + X = data[0] + idkd = IDKD(max_samples=max_samples, n_estimators=100) + idkd.fit(X) + assert idkd.is_fitted_ + + +def test_IDKD_invalid_max_samples(): + with pytest.raises(ValueError): + idkd = IDKD(max_samples="invalid") + idkd.fit(np.random.random((10, 2))) + + +def test_IDKD_simple_example(): + X = np.array([[-1.1, 0.2], [0.3, 0.5], [0.5, 1.1], [100, 90]]) + clf = IDKD(max_samples=2, contamination=0.25).fit(X) + predictions = clf.predict([[0.1, 0.3], [0, 0.7], [90, 85]]) + # The sample close to 100 should be classified as an outlier (-1) + assert predictions[-1] == -1 + # The first two samples should be inliers (1) + assert predictions[0] == 1 + assert predictions[1] == 1 diff --git a/pyikt/anomaly/tests/test_inne.py b/pyikt/anomaly/tests/test_inne.py new file mode 100644 index 0000000..243ff9d --- /dev/null +++ b/pyikt/anomaly/tests/test_inne.py @@ -0,0 +1,138 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +import time + +import numpy as np +import pytest +from pyikt.anomaly import INNE +from sklearn.datasets import ( + load_diabetes, + load_iris, +) +from sklearn.metrics import roc_auc_score +from sklearn.model_selection import ParameterGrid +from sklearn.utils import check_random_state +from sklearn.utils._testing import ( + assert_array_equal, + ignore_warnings, +) + +from sklearn.ensemble import IsolationForest + +rng = check_random_state(0) + +# load the iris dataset +# and randomly permute it +iris = load_iris() +perm = rng.permutation(iris.target.size) +iris.data = iris.data[perm] +iris.target = iris.target[perm] + +# also load the diabetes dataset +# and randomly permute it +diabetes = load_diabetes() +perm = rng.permutation(diabetes.target.size) +diabetes.data = diabetes.data[perm] +diabetes.target = diabetes.target[perm] + + +# also load the digits dataset +# and randomly permute it +digit = load_diabetes() +perm = rng.permutation(digit.target.size) +digit.data = digit.data[perm] +digit.target = digit.target[perm] + + +def test_inne(): + """Check Isolation NNE for various parameter settings.""" + X_train = np.array([[0, 1], [1, 2]]) + X_test = np.array([[2, 1], [1, 1]]) + + grid = ParameterGrid({"n_estimators": [100, 200], "max_samples": [10, 20, 30]}) + + with ignore_warnings(): + for params in grid: + INNE(random_state=0, **params).fit(X_train).predict(X_test) + + +def test_inne_performance(): + """Test Isolation NNE performs well""" + + # Generate train/test data + rng = check_random_state(2) + X = 0.3 * rng.randn(120, 2) + X_train = np.r_[X + 2, X - 2] + X_train = X[:100] + + # Generate some abnormal novel observations + X_outliers = rng.uniform(low=-4, high=4, size=(20, 2)) + X_test = np.r_[X[100:], X_outliers] + y_test = np.array([0] * 20 + [1] * 20) + + # fit the model + clf = INNE(n_estimators=100, max_samples=16).fit(X_train) + + # predict scores (the lower, the more normal) + y_pred = -clf.decision_function(X_test) + + # check that there is at most 6 errors (false positive or false negative) + assert roc_auc_score(y_test, y_pred) > 0.98 + + +@pytest.mark.parametrize("contamination", [0.25, "auto"]) +def test_inne_works(contamination): + # toy sample (the last two samples are outliers) + X = [[-2, -1], [-1, -1], [-1, -2], [1, 1], [1, 2], [2, 1], [6, 3], [-4, 7]] + + # Test IsolationForest + clf = INNE(random_state=0, contamination=contamination) + clf.fit(X) + decision_func = -clf.decision_function(X) + pred = clf.predict(X) + # assert detect outliers: + assert np.min(decision_func[-2:]) > np.max(decision_func[:-2]) + assert_array_equal(pred, 6 * [1] + 2 * [-1]) + + +def test_score_samples(): + X_train = [[1, 1], [1, 2], [2, 1]] + clf1 = INNE(contamination=0.1) + clf1.fit(X_train) + clf2 = INNE() + clf2.fit(X_train) + assert_array_equal( + clf1.score_samples([[2.0, 2.0]]), + clf1.decision_function([[2.0, 2.0]]) + clf1.offset_, + ) + assert_array_equal( + clf2.score_samples([[2.0, 2.0]]), + clf2.decision_function([[2.0, 2.0]]) + clf2.offset_, + ) + assert_array_equal( + clf1.score_samples([[2.0, 2.0]]), clf2.score_samples([[2.0, 2.0]]) + ) + + +def test_fit_time(): + data = digit.data + print(data.shape) + clf = INNE(n_estimators=200, max_samples=100) + t1 = time.time() + clf.fit(data) + t2 = time.time() + anomaly_labels = clf.predict(data) + t3 = time.time() + print(t2 - t1) + print(t3 - t2) + + clf2 = IsolationForest(n_estimators=200, max_samples=256) + t1 = time.time() + clf2.fit(data) + t2 = time.time() + anomaly_labels = clf2.predict(data) + t3 = time.time() + print(t2 - t1) + print(t3 - t2) diff --git a/IsoML/base.py b/pyikt/base.py similarity index 100% rename from IsoML/base.py rename to pyikt/base.py diff --git a/pyikt/cluster/__init__.py b/pyikt/cluster/__init__.py new file mode 100644 index 0000000..020f895 --- /dev/null +++ b/pyikt/cluster/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +from ._pskc import PSKC +from ._ikahc import IKAHC +from ._idkc import IDKC + +__all__ = ["PSKC", "IKAHC", "IDKC"] diff --git a/pyikt/cluster/_idkc.py b/pyikt/cluster/_idkc.py new file mode 100644 index 0000000..4633341 --- /dev/null +++ b/pyikt/cluster/_idkc.py @@ -0,0 +1,338 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +import scipy.sparse as sp +from sklearn.utils.extmath import safe_sparse_dot +from sklearn.base import BaseEstimator, ClusterMixin +from sklearn.utils.validation import check_random_state, check_array +from sklearn.metrics._pairwise_distances_reduction import ArgKmin +from pyikt.kernel import IsoKernel +from ._kcluster import KCluster + + +class IDKC(BaseEstimator, ClusterMixin): + """Isolation Distributional Kernel Clustering. + + A clustering algorithm that leverages Isolation Kernels to transform data into + a feature space where cluster structures are more distinguishable. The algorithm + first constructs Isolation Kernel representations, then performs clustering in this + transformed space using a threshold-based assignment mechanism. + + Parameters + ---------- + n_estimators : int + Number of base estimators in the ensemble for the Isolation Kernel. + Higher values generally lead to more stable results but increase computation time. + + max_samples : int + Number of samples to draw from X to train each base estimator in the Isolation Kernel. + Controls the granularity of the kernel representation. + + method : {'inne', 'anne', 'iforest'} + Method used to calculate the Isolation Kernel: + - 'inne': Isolation Nearest Neighbor Ensemble + - 'anne': Approximate Nearest Neighbor Ensemble + - 'iforest': Isolation Forest + + k : int + Number of clusters to form in the dataset. + + kn : int + Number of nearest neighbors used for local contrast density calculation + during initialization. Higher values consider more neighbors when determining + density. + + v : float + Decay factor (0 < v < 1) for reducing the similarity threshold during clustering. + Smaller values cause faster decay, leading to more aggressive cluster assignments. + + n_init_samples : int + Number of samples to consider when initializing cluster centers. + Larger values may produce better initial centers but increase computation. + + init_center : int or array-like of shape (k,), default=None + Index or indices of initial cluster centers. If None, centers are selected + automatically based on density and distance considerations. + + is_post_process : bool, default=True + Whether to perform post-processing refinement of clusters through iterative + reassignment. Improves cluster quality but adds computational overhead. + + random_state : int, RandomState instance or None, default=None + Controls the randomness of the algorithm. Pass an int for reproducible results. + + Attributes + ---------- + clusters_ : list of KCluster objects + The cluster objects containing assignment and centroid information. + + it_ : int + Number of iterations performed during the initial clustering phase. + + labels_ : ndarray of shape (n_samples,) + Cluster labels for each point. Points not assigned to any cluster + have label -1 (outliers). + + is_fitted_ : bool + Whether the model has been fitted to data. + + Examples + -------- + >>> from pyikt.cluster import IDKC + >>> import numpy as np + >>> X = np.array([[1, 2], [1, 4], [5, 2], [5, 5], [1, 0], [5, 0]]) + >>> clustering = IDKC( + ... n_estimators=100, max_samples=3, method='anne', + ... k=2, kn=5, v=0.5, n_init_samples=4, random_state=42 + ... ) + >>> clustering.fit_predict(X) + array([1, 1, 0, 0, 1, 0]) + + References + ---------- + .. [1] Ye Zhu, Kai Ming Ting (2023). Kernel-based Clustering via Isolation Distributional Kernel. Information Systems. + """ + + def __init__( + self, + n_estimators, + max_samples, + method, + k, + kn, + v, + n_init_samples, + init_center=None, + is_post_process=True, + random_state=None, + ): + self.n_estimators = n_estimators + self.max_samples = max_samples + self.method = method + self.k = k + self.kn = kn + self.v = v + self.n_init_samples = n_init_samples + self.is_post_process = is_post_process + self.init_center = init_center + self.random_state = random_state + self.clusters_ = [] + self.it_ = 0 + self.labels_ = None + self.data_index = None + + @property + def n_it(self): + """Get number of iterations performed during clustering.""" + return self.it_ + + def fit(self, X, y=None): + """Fit the IDKC clustering model on data X. + + Parameters + ---------- + X : ndarray of shape (n_samples, n_features) + The input instances to cluster. + y : Ignored + Not used, present for API consistency by convention. + + Returns + ------- + self : object + Fitted estimator. + """ + X = check_array(X) + self.data_index = np.arange(X.shape[0]) + isokernel = IsoKernel( + method=self.method, + max_samples=self.max_samples, + n_estimators=self.n_estimators, + random_state=self.random_state, + ) + data_ik = isokernel.fit_transform(X) + self._fit(data_ik) + + # Apply post-processing if requested + if self.is_post_process: + self._post_process(data_ik) + + self.is_fitted_ = True + self.labels_ = self._get_labels(X) + return self + + def _fit(self, X): + """Perform initial clustering on transformed data.""" + self._initialize_cluster(X) + # Main clustering loop + r = None # Initial threshold + while self.data_index.size > 0: + # Get cluster means and calculate similarities + if sp.issparse(self.clusters_[0].kernel_mean): + c_mean = sp.vstack([c.kernel_mean for c in self.clusters_]) + else: + c_mean = np.vstack([c.kernel_mean for c in self.clusters_]) + + similarity = safe_sparse_dot(X[self.data_index], c_mean.T) + tmp_labels = np.argmax(similarity, axis=1).A1 + if sp.issparse(similarity): + similarity = similarity.todense() + tmp_similarity = np.max(similarity, axis=1).A1 + + # Initialize threshold on first iteration + if self.it_ == 0: + r = float(np.max(tmp_similarity)) + r *= self.v + if np.sum(tmp_similarity) == 0 or r < 0.00001: + break + assigned_mask = np.zeros_like(tmp_labels) + for i in range(self.k): + I = np.logical_and(tmp_labels == i, tmp_similarity > r) + if np.sum(I) > 0: + self.clusters_[i].add_points( + self.data_index[I], X[self.data_index][I] + ) + assigned_mask += I + + self._update_centers(X) + self.data_index = np.delete(self.data_index, np.where(assigned_mask > 0)[0]) + self.it_ += 1 + + return self + + def _initialize_cluster(self, X): + """Initialize cluster centers based on density and distance criteria.""" + self.clusters_ = [KCluster(i) for i in range(self.k)] + if self.init_center is None: + rnd = check_random_state(self.random_state) + samples_index = rnd.choice( + self.data_index.size, self.n_init_samples, replace=False + ) + seeds_id = self._get_seeds(X[samples_index]) + init_center = samples_index[seeds_id] + else: + init_center = self.init_center + for i in range(self.k): + self.clusters_[i].add_points(init_center[i], X[init_center[i]]) + self.data_index = np.delete(self.data_index, init_center) + return self + + def _post_process(self, X): + """Refine clusters through iterative reassignment of points. + + This improves cluster quality by allowing points to move between clusters + based on similarity until convergence or maximum iterations. + """ + # Use 1% of data as threshold for stopping + threshold = max(int(np.ceil(X.shape[0] * 0.01)), 1) + + for _ in range(100): # Maximum iterations + old_labels = self._get_labels(X) + data_index = np.arange(X.shape[0]) + + # Get cluster means + if sp.issparse(self.clusters_[0].kernel_mean): + c_mean = sp.vstack([c.kernel_mean for c in self.clusters_]) + else: + c_mean = np.vstack([c.kernel_mean for c in self.clusters_]) + + # Compute new assignments + new_labels = np.argmax(safe_sparse_dot(X, c_mean.T), axis=1) + if sp.issparse(new_labels): + new_labels = new_labels.A1 + + # Find points that changed clusters + change_id = new_labels != old_labels + + # Stop if few changes or clusters disappeared + if np.sum(change_id) < threshold or len(np.unique(new_labels)) < self.k: + break + + # Update cluster assignments + old_label, new_label = old_labels[change_id], new_labels[change_id] + changed_points = data_index[change_id] + + for old_cluster, new_cluster, point_idx in zip( + old_label, new_label, changed_points + ): + self._change_points( + self.clusters_[old_cluster], + self.clusters_[new_cluster], + point_idx, + X, + ) + + # Update centers after reassignment + self._update_centers(X) + + return self + + def _get_seeds(self, X): + """Select seed points for initialization based on density and distance. + + Uses a strategy similar to Density Peaks clustering to identify points + that are both high in local density and far from other high-density points. + """ + dists = 1 - safe_sparse_dot(X, X.T, dense_output=True) / self.n_estimators + density = self._get_klc(X) + filter_index = density < density.T + tmp_dists = np.ones_like(dists) + tmp_dists[filter_index] = dists[filter_index] + min_dist = np.min(tmp_dists, axis=1) + mult = density * min_dist + sort_mult = np.argpartition(mult, -self.k)[-self.k :] + return sort_mult + + def _get_klc(self, X): + """Calculate local contrast density by comparing each point to its nearest neighbors.""" + density = safe_sparse_dot(X, X.mean(axis=0).T) + n_samples = density.shape[0] + knn_index = ArgKmin.compute( + X=X, + Y=X, + k=min(self.kn + 1, n_samples), # Prevent k > n_samples + metric="sqeuclidean", + metric_kwargs={}, + strategy="auto", + return_distance=False, + ) + nn_density = density[knn_index[:, 1:]].reshape( + n_samples, min(self.kn, n_samples - 1) + ) + lc = np.sum(density > nn_density, axis=1) + return np.array(lc).flatten() + + def _get_labels(self, X): + """Get cluster labels for all points in the dataset.""" + n_samples = X.shape[0] + labels = np.full( + n_samples, -1, dtype=int + ) # Default to -1 for unassigned points + for i, cluster in enumerate(self.clusters_): + labels[cluster.points_] = i + return labels + + def _change_points(self, source_cluster, target_cluster, point_idx, X): + """Move a point from one cluster to another, updating both clusters.""" + target_cluster.add_points(point_idx, X[point_idx]) + source_cluster.delete_points(point_idx, X[point_idx]) + return self + + def _update_centers(self, X): + """Update the center of each cluster to the most central point.""" + for cluster in self.clusters_: + if len(cluster.points) > 0: + similarities = safe_sparse_dot(X[cluster.points], cluster.kernel_mean.T) + center_idx = np.argmax(similarities) + cluster.set_center(cluster.points[center_idx]) + return self + + def fit_predict(self, X, y=None): + return super().fit_predict(X, y) diff --git a/pyikt/cluster/_ikahc.py b/pyikt/cluster/_ikahc.py new file mode 100644 index 0000000..9c4f30b --- /dev/null +++ b/pyikt/cluster/_ikahc.py @@ -0,0 +1,258 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from typing import Optional, Union, Literal, Any + +import numpy as np +from scipy.cluster.hierarchy import linkage, fcluster +from sklearn.base import BaseEstimator, ClusterMixin +from sklearn.utils.validation import check_is_fitted +from sklearn.utils import check_array + +from pyikt.kernel import IsoKernel + + +class IKAHC(BaseEstimator, ClusterMixin): + """IKAHC is a novel hierarchical clustering algorithm. + It uses a data-dependent kernel called Isolation Kernel to measure the similarity between clusters. + + Parameters + ---------- + n_estimators : int, default=200 + The number of base estimators in the ensemble. + + max_samples : int or float or str, default="auto" + The number of samples to draw from X to train each base estimator. + + - If int, then draw `max_samples` samples. + - If float, then draw `max_samples * X.shape[0]` samples. + - If "auto", then `max_samples=min(8, n_samples)`. + + ik_method: {"inne", "anne"}, default="anne" + Isolation method to use. The original algorithm in paper is `"anne"`. + + lk_method : {"single", "complete", "average", "weighted"}, default="single" + The linkage algorithm to use. The supported Linkage Methods are 'single', 'complete', 'average' and + 'weighted'. + + return_flat : bool, default=False + Whether to return flat clusters that extract from the fitted dendrogram. + + t : float, optional + The threshold to apply when forming flat clusters. + Either t or n_clusters should be provided. + + n_clusters : int, optional + The number of flat clusters to form. + Either t or n_clusters should be provided. + + criterion : str, default='distance' + The criterion to use in forming flat clusters. Valid options are + 'distance', 'inconsistent', 'maxclust', or 'monocrit'. + + random_state : int, RandomState instance or None, default=None + Controls the pseudo-randomness of the selection of the samples to + fit the Isolation Kernel. + + Pass an int for reproducible results across multiple function calls. + See :term:`Glossary `. + + Attributes + ---------- + isokernel : IsoKernel + Fitted isolation kernel. + + dendrogram : ndarray + Cluster hierarchy as computed by scipy.cluster.hierarchy.linkage. + + References + ---------- + .. [1] Xin Han, Ye Zhu, Kai Ming Ting, and Gang Li, + "The Impact of Isolation Kernel on Agglomerative Hierarchical Clustering Algorithms", + Pattern Recognition, 2023, 139: 109517. + + Examples + -------- + >>> from pyikt.cluster import IKAHC + >>> import numpy as np + >>> X = [[0.4,0.3], [0.3,0.8], [0.5, 0.4], [0.5, 0.1]] + >>> clf = IKAHC(n_estimators=200, max_samples=2, lk_method='single', n_clusters=2, return_flat=True) + >>> clf.fit_predict(X) + array([1, 2, 1, 1], dtype=int32) + """ + + def __init__( + self, + n_estimators: int = 200, + max_samples: Union[int, float, str] = "auto", + lk_method: Literal["single", "complete", "average", "weighted"] = "single", + ik_method: Literal["inne", "anne"] = "anne", + return_flat: bool = False, + t: Optional[float] = None, + n_clusters: Optional[int] = None, + criterion: str = "distance", + random_state: Optional[Union[int, np.random.RandomState]] = None, + ): + self.n_estimators = n_estimators + self.max_samples = max_samples + self.ik_method = ik_method + self.lk_method = lk_method + self.return_flat = return_flat + self.t = t + self.n_clusters = n_clusters + self.criterion = criterion + self.random_state = random_state + self.labels_ = None + + def fit(self, X: np.ndarray) -> "IKAHC": + """Fit the IKAHC clustering model. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. + + Returns + ------- + self : object + Fitted estimator. + """ + # Check data + X = check_array(X, accept_sparse=False) + + # Validate parameters + if self.lk_method not in ["single", "complete", "average", "weighted"]: + raise ValueError( + f"lk_method must be one of 'single', 'complete', 'average', 'weighted', got {self.lk_method}" + ) + + if self.ik_method not in ["inne", "anne"]: + raise ValueError( + f"ik_method must be one of 'inne', 'anne', got {self.ik_method}" + ) + + if self.n_estimators <= 0: + raise ValueError(f"n_estimators must be positive, got {self.n_estimators}") + + # Check if both t and n_clusters are provided at initialization + if self.return_flat and self.t is not None and self.n_clusters is not None: + raise ValueError( + "Specify either a distance threshold t or n_clusters, not both." + ) + + # Fit isolation kernel + self.isokernel_ = IsoKernel( + method=self.ik_method, + n_estimators=self.n_estimators, + max_samples=self.max_samples, + random_state=self.random_state, + ) + self.isokernel_ = self.isokernel_.fit(X) + + # Calculate similarity matrix and convert to distance matrix (1-similarity) + similarity_matrix = self.isokernel_.similarity(X) + self.dendrogram_ = linkage(1 - similarity_matrix, method=self.lk_method) + + if self.return_flat: + self.labels_ = self._extract_flat_cluster() + + return self + + @property + def dendrogram(self) -> np.ndarray: + """Get the dendrogram of the hierarchical clustering. + + Returns + ------- + dendrogram_ : ndarray + The dendrogram representing the hierarchical clustering. + """ + check_is_fitted(self, "dendrogram_") + return self.dendrogram_ + + @property + def isokernel(self) -> IsoKernel: + """Get the fitted isolation kernel. + + Returns + ------- + isokernel_ : IsoKernel + The fitted isolation kernel. + """ + check_is_fitted(self, "isokernel_") + return self.isokernel_ + + def _extract_flat_cluster( + self, + t: Optional[float] = None, + n_clusters: Optional[int] = None, + criterion: Optional[str] = None, + ) -> np.ndarray: + """Return cluster labels for each sample based on the hierarchical clustering. + + Parameters + ---------- + t : float, optional + The threshold to apply when forming flat clusters. + Either t or n_clusters should be provided. + n_clusters : int, optional + The number of flat clusters to form. + Either t or n_clusters should be provided. + criterion : str, optional + The criterion to use. If not specified, self.criterion is used. + + Returns + ------- + labels : ndarray of shape (n_samples,) + Cluster labels for each sample. + """ + check_is_fitted(self, "dendrogram_") + + # Use parameters or fall back to instance variables + t = t if t is not None else self.t + n_clusters = n_clusters if n_clusters is not None else self.n_clusters + criterion = criterion if criterion is not None else self.criterion + + if t is not None and n_clusters is not None: + raise ValueError( + "Specify either a distance threshold t or n_clusters, not both." + ) + + if t is None and n_clusters is None: + raise ValueError("Either a threshold t or n_clusters must be provided.") + + if t is not None: + return fcluster(self.dendrogram_, t=t, criterion=criterion) + else: + return fcluster(self.dendrogram_, t=n_clusters, criterion="maxclust") + + + def fit_transform(self, X: np.ndarray, y: Any = None) -> np.ndarray: + """Fit algorithm to data and return the dendrogram. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples. + + y : Ignored + Not used, present for API consistency by convention. + + Returns + ------- + dendrogram : np.ndarray + Dendrogram representing the hierarchical clustering. + """ + self.fit(X) + return self.dendrogram + + def fit_predict(self, X, y=None): + """Fit algorithm to data and return the cluster labels.""" + return super().fit_predict(X, y) diff --git a/pyikt/cluster/_kcluster.py b/pyikt/cluster/_kcluster.py new file mode 100644 index 0000000..9673a6e --- /dev/null +++ b/pyikt/cluster/_kcluster.py @@ -0,0 +1,72 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from collections.abc import Iterable +from scipy import sparse as sp +import numpy as np + + +class KCluster(object): + def __init__(self, id: int) -> None: + self.id = id + self.center = None + self.kernel_mean_ = None + self.points_ = [] + self.center = None + + def set_center(self, center): + self.center = center + + def add_points(self, ids, X): + self.increment_kernel_mean_(X) + if isinstance(ids, np.integer): + if self.center is None: + self.center = ids + self.points_.append(ids) + elif isinstance(ids, Iterable): + if self.center is None: + raise ValueError("Cluster is not initialized.") + self.points_.extend(ids) + + def delete_points(self, points, X): + self.reduce_kernel_mean_(X) + if isinstance(points, np.integer): + self.points_.remove(points) + elif isinstance(points, Iterable): + for p in points: + self.points_.remove(p) + + def reduce_kernel_mean_(self, X): + if self.kernel_mean_ is None: + raise ValueError("Kernel mean is not initialized.") + else: + self.kernel_mean_ = (self.kernel_mean_ * self.n_points - X.sum(axis=0)).sum( + axis=0 + ) / (self.n_points - X.shape[0]) + + def increment_kernel_mean_(self, X): + if self.kernel_mean_ is None: + self.kernel_mean_ = X + else: + self.kernel_mean_ = sp.vstack((self.kernel_mean_ * self.n_points, X)).sum( + axis=0 + ) / (self.n_points + X.shape[0]) + + @property + def n_points(self): + return len(self.points_) + + @property + def points(self): + return self.points_ + + @property + def kernel_mean(self): + return self.kernel_mean_ diff --git a/pyikt/cluster/_pskc.py b/pyikt/cluster/_pskc.py new file mode 100644 index 0000000..ede2f27 --- /dev/null +++ b/pyikt/cluster/_pskc.py @@ -0,0 +1,209 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from pyikt.kernel import IsoKernel +from sklearn.utils.extmath import safe_sparse_dot +from sklearn.base import BaseEstimator, ClusterMixin +from sklearn.utils.validation import check_is_fitted +from sklearn.utils import check_array +from pyikt.cluster._kcluster import KCluster + + +class PSKC(BaseEstimator, ClusterMixin): + """Point-Set Kernel Clustering algorithm using Isolation Kernels. + + PSKC is a clustering algorithm that leverages Isolation Kernels to create + feature vector representations of data points. It adaptively captures the + characteristics of local data distributions by using data-dependent kernels. + The algorithm forms clusters by identifying points with high similarity in + the transformed kernel space. + + The clustering process works by iteratively: + 1. Selecting a center point with maximum similarity to the mean + 2. Forming a cluster around this center + 3. Removing these points from consideration + 4. Continuing until stopping criteria are met + + n_estimators : int, default=200 + The number of base estimators (trees) in the isolation ensemble. + + max_samples : int or str, default="auto" + - If int, then draw `max_samples` samples. + - If "auto", then `max_samples=min(256, n_samples)`. + + method : {'inne', 'anne'}, default='inne' + The method used for building the isolation kernel. + + tau : float, default=0.1 + Lower values result in more clusters. + + v : float, default=0.1 + The decay factor for reducing the similarity threshold. + Controls the expansion of clusters. + + Controls the pseudo-randomness of the algorithm for reproducibility. + Pass an int for reproducible results across multiple function calls. + + Attributes + clusters_ : list + List of KCluster objects representing the identified clusters. + + labels_ : ndarray of shape (n_samples,) + Cluster labels for each point in the dataset. + + centers : list + Centers of each cluster in the transformed feature space. + + n_classes : int + Number of clusters found. + + Examples + -------- + >>> from pyikt.cluster import PSKC + >>> import numpy as np + >>> X = np.array([[1, 2], [1, 4], [10, 2], [10, 10], [1, 0], [1, 1]]) + >>> pskc = PSKC(n_estimators=100, max_samples=2, tau=0.3, v=0.1, random_state=24) + >>> pskc.fit_predict(X) + array([0, 0, 1, 1, 0, 0]) + + References + ---------- + .. [1] Kai Ming Ting, Jonathan R. Wells, Ye Zhu (2023) "Point-set Kernel Clustering". + IEEE Transactions on Knowledge and Data Engineering. Vol.35, 5147-5158. + """ + + def __init__( + self, + n_estimators=200, + max_samples="auto", + method="inne", + tau=0.1, + v=0.1, + random_state=None, + ): + self.n_estimators = n_estimators + self.max_samples = max_samples + self.method = method + self.tau = tau + self.v = v + self.random_state = random_state + self.clusters_ = [] + self.labels_ = None + + @property + def clusters(self): + check_is_fitted(self) + return self.clusters_ + + @property + def centers(self): + check_is_fitted(self) + return [c.center for c in self.clusters_] + + @property + def n_classes(self): + check_is_fitted(self) + return len(self.clusters_) + + def fit(self, X, y=None): + """Fit the model on data X. + Parameters + ---------- + X : np.array of shape (n_samples, n_features) + The input instances. + Returns + ------- + self : object + """ + X = check_array(X) + isokernel = IsoKernel( + max_samples=self.max_samples, + n_estimators=self.n_estimators, + random_state=self.random_state, + method=self.method, + ) + ndata = isokernel.fit_transform(X) + self._fit(ndata) + self.is_fitted_ = True + self.labels_ = self._get_labels(X) + return self + + def _fit(self, X): + k = 1 + point_indices = np.arange(X.shape[0]) + while len(point_indices) > 0: + center_id = np.argmax( + safe_sparse_dot(X[point_indices], X[point_indices].mean(axis=0).T) + ) + c_k = KCluster(k) + c_k, point_indices = self._update_cluster( + c_k, + X, + point_indices, + center_id, + ) + self.clusters_.append(c_k) + if len(point_indices) == 0: + break + + nn_dists = ( + safe_sparse_dot(X[point_indices], X[point_indices].mean(axis=0).T) + / self.n_estimators + ) + nn_index = np.argmax(nn_dists) + nn_dist = nn_dists[nn_index] + c_k, point_indices = self._update_cluster(c_k, X, point_indices, nn_index) + + r = (1 - self.v) * nn_dist + if r <= self.tau: + print("break") + break + + while r > self.tau: + S = ( + safe_sparse_dot(X[point_indices], c_k.kernel_mean.T) + / self.n_estimators + ) + x = np.where(S > r)[0] # Use [0] to get the indices as a 1D array + if len(x) == 0: + break + c_k, point_indices = self._update_cluster(c_k, X, point_indices, x) + r = (1 - self.v) * r + assert self._get_n_points() == X.shape[0] - len(point_indices) + k += 1 + return self + + def _update_cluster( + self, + c_k, + X, + point_indices, + x_id, + ): + c_k.add_points(point_indices[x_id], X[point_indices][x_id]) + point_indices = np.delete(point_indices, x_id) + return c_k, point_indices + + + def _get_labels(self, X): + """Get cluster labels for all points in the dataset.""" + n_samples = X.shape[0] + labels = np.full( + n_samples, -1, dtype=int + ) # Default to -1 for unassigned points + for i, cluster in enumerate(self.clusters_): + labels[cluster.points_] = i + return labels + + def _get_n_points(self): + check_is_fitted(self) + n_points = sum([c.n_points for c in self.clusters_]) + return n_points diff --git a/pyikt/cluster/_utils.py b/pyikt/cluster/_utils.py new file mode 100644 index 0000000..7cae759 --- /dev/null +++ b/pyikt/cluster/_utils.py @@ -0,0 +1,43 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import scipy +from scipy import sparse +import numpy as np + + +def delete_row_csr(mat, i): + if not isinstance(mat, scipy.sparse.csr_matrix): + raise ValueError("works only for CSR format -- use .tocsr() first") + n = mat.indptr[i + 1] - mat.indptr[i] + if n > 0: + mat.data[mat.indptr[i] : -n] = mat.data[mat.indptr[i + 1] :] + mat.data = mat.data[:-n] + mat.indices[mat.indptr[i] : -n] = mat.indices[mat.indptr[i + 1] :] + mat.indices = mat.indices[:-n] + mat.indptr[i:-1] = mat.indptr[i + 1 :] + mat.indptr[i:] -= n + mat.indptr = mat.indptr[:-1] + mat._shape = (mat._shape[0] - 1, mat._shape[1]) + return mat + + +def safe_sparse_delete_row(mat, i): + if sparse.issparse(mat): + if mat.format != "csr": + Warning("works only for CSR format -- use .tocsr()") + mat = mat.tocsr() + if isinstance(i, (list, np.ndarray)): + for j in i: + mat = delete_row_csr(mat, j) + return mat + return delete_row_csr(mat, i) + else: + return np.delete(mat, i, axis=0) diff --git a/pyikt/cluster/tests/__init__.py b/pyikt/cluster/tests/__init__.py new file mode 100644 index 0000000..3c5155b --- /dev/null +++ b/pyikt/cluster/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. diff --git a/pyikt/cluster/tests/test_idkc.py b/pyikt/cluster/tests/test_idkc.py new file mode 100644 index 0000000..19a7b94 --- /dev/null +++ b/pyikt/cluster/tests/test_idkc.py @@ -0,0 +1,75 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from sklearn.datasets import make_blobs +from pyikt.cluster import IDKC +from sklearn import metrics + + +def test_IDKC(): + # Generate sample data + centers = np.array( + [ + [0.0, 5.0, 0.0, 0.0, 0.0], + [1.0, 1.0, 4.0, 0.0, 0.0], + [1.0, 0.0, 0.0, 5.0, 1.0], + ] + ) + n_samples = 100 + X, true_labels = make_blobs( + n_samples=n_samples, centers=centers, cluster_std=1.0, random_state=42 + ) + + # Initialize IKDC + n_estimators = 200 + max_samples = 10 + method = "inne" + k = 3 + kn = 5 + v = 0.1 + n_init_samples = 30 + init_center = None + is_post_process = True + random_state = 42 + ikdc = IDKC( + n_estimators=n_estimators, + max_samples=max_samples, + method=method, + k=k, + kn=kn, + v=v, + n_init_samples=n_init_samples, + init_center=init_center, + is_post_process=is_post_process, + random_state=random_state, + ) + + # Fit IKDC + labels_pred = ikdc.fit_predict(X) + + # Check if labels are assigned correctly + assert len(labels_pred) == len(true_labels) + + # Check performance + print(metrics.adjusted_mutual_info_score(true_labels, labels_pred)) + + # Check if number of clusters is correct + assert len(ikdc.clusters_) == k + + # Check if number of points in each cluster is correct + for cluster in ikdc.clusters_: + assert cluster.n_points > 0 + + # Check if the number of iterations is greater than 0 + assert ikdc.n_it > 0 + + +test_IDKC() diff --git a/pyikt/cluster/tests/test_ikahc.py b/pyikt/cluster/tests/test_ikahc.py new file mode 100644 index 0000000..92efbf4 --- /dev/null +++ b/pyikt/cluster/tests/test_ikahc.py @@ -0,0 +1,175 @@ +"""pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +import pytest +from pyikt.cluster import IKAHC + + +def test_ikahc_initialization(): + """Test IKAHC initialization with various parameters.""" + # Default initialization + ikahc = IKAHC() + assert ikahc.n_estimators == 200 + assert ikahc.max_samples == "auto" + assert ikahc.ik_method == "anne" + assert ikahc.lk_method == "single" + assert ikahc.return_flat is False + assert ikahc.t is None + assert ikahc.n_clusters is None + assert ikahc.criterion == "distance" + assert ikahc.random_state is None + + # Custom initialization + ikahc = IKAHC( + n_estimators=100, + max_samples=5, + lk_method="complete", + ik_method="inne", + return_flat=True, + t=0.5, + criterion="distance", + random_state=42, + ) + assert ikahc.n_estimators == 100 + assert ikahc.max_samples == 5 + assert ikahc.ik_method == "inne" + assert ikahc.lk_method == "complete" + assert ikahc.return_flat is True + assert ikahc.t == 0.5 + assert ikahc.n_clusters is None + assert ikahc.criterion == "distance" + assert ikahc.random_state == 42 + + +def test_ikahc_fit(): + """Test IKAHC fit method.""" + X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + ikahc = IKAHC(n_estimators=100, max_samples=2, random_state=42) + + result = ikahc.fit(X) + + # Check if fit returns self + assert result is ikahc + + # Check if attributes are set + assert hasattr(ikahc, "isokernel_") + assert hasattr(ikahc, "dendrogram_") + + # Check dendrogram shape + assert ikahc.dendrogram_.shape == (3, 4) # (n_samples-1) x 4 + + +def test_ikahc_fit_with_return_flat(): + """Test IKAHC fit method with return_flat=True.""" + X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + + # Test with t parameter + ikahc = IKAHC( + n_estimators=100, max_samples=2, return_flat=True, t=0.5, random_state=42 + ) + ikahc.fit(X) + assert hasattr(ikahc, "labels_") + assert ikahc.labels_ is not None + + # Test with n_clusters parameter + ikahc = IKAHC( + n_estimators=100, max_samples=2, return_flat=True, n_clusters=2, random_state=42 + ) + ikahc.fit(X) + assert hasattr(ikahc, "labels_") + assert ikahc.labels_ is not None + + +def test_ikahc_extract_flat_cluster(): + """Test IKAHC _extract_flat_cluster method.""" + X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + ikahc = IKAHC(n_estimators=100, max_samples=2, random_state=42) + ikahc.fit(X) + + # Test with distance threshold + labels_t = ikahc._extract_flat_cluster(t=0.5) + assert labels_t.shape == (4,) + + # Test with n_clusters + labels_n = ikahc._extract_flat_cluster(n_clusters=2) + assert labels_n.shape == (4,) + + # Test error cases + with pytest.raises(ValueError): + ikahc._extract_flat_cluster(t=0.5, n_clusters=2) + + with pytest.raises(ValueError): + ikahc._extract_flat_cluster() + + +def test_ikahc_properties(): + """Test IKAHC properties.""" + X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + ikahc = IKAHC(n_estimators=100, max_samples=2, random_state=42) + ikahc.fit(X) + + # Test dendrogram property + dendrogram = ikahc.dendrogram + assert np.array_equal(dendrogram, ikahc.dendrogram_) + + # Test isokernel property + isokernel = ikahc.isokernel + assert isokernel is ikahc.isokernel_ + + +def test_ikahc_fit_transform(): + """Test IKAHC fit_transform method.""" + X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + ikahc = IKAHC(n_estimators=100, max_samples=2, random_state=42) + + dendrogram = ikahc.fit_transform(X) + + # Check if dendrogram is returned + assert dendrogram.shape == (3, 4) + + # Check if it's the same as dendrogram_ + assert np.array_equal(dendrogram, ikahc.dendrogram_) + + +def test_ikahc_fit_predict(): + """Test IKAHC fit_predict method.""" + X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + ikahc = IKAHC( + n_estimators=100, max_samples=2, random_state=42, return_flat=True, n_clusters=2 + ) + + labels = ikahc.fit_predict(X) + assert labels.shape == (4,) + assert isinstance(labels, np.ndarray) + + +def test_ikahc_invalid_parameters(): + """Test IKAHC with invalid parameters.""" + X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + + # Invalid ik_method + ikahc = IKAHC(ik_method="invalid") + with pytest.raises(ValueError): + ikahc.fit(X) + + # Invalid lk_method + ikahc = IKAHC(lk_method="invalid") + with pytest.raises(ValueError): + ikahc.fit(X) + + # Invalid n_estimators + ikahc = IKAHC(n_estimators=0) + with pytest.raises(ValueError): + ikahc.fit(X) + + # Both t and n_clusters provided + ikahc = IKAHC(return_flat=True, t=0.5, n_clusters=2) + with pytest.raises(ValueError): + ikahc.fit(X) diff --git a/pyikt/cluster/tests/test_pskc.py b/pyikt/cluster/tests/test_pskc.py new file mode 100644 index 0000000..4fbbee1 --- /dev/null +++ b/pyikt/cluster/tests/test_pskc.py @@ -0,0 +1,140 @@ +""" +Copyright 2024 Xin Han. All rights reserved. +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file. +""" + +import numpy as np +import pytest +from sklearn.datasets import make_blobs +from pyikt.cluster import PSKC + + +@pytest.fixture +def simple_data(): + X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) + return X + + +@pytest.fixture +def blob_data(): + X, y = make_blobs(n_samples=300, centers=3, random_state=42) + return X, y + + +def test_pskc_init(): + """Test PSKC initialization with default parameters.""" + pskc = PSKC() + assert pskc.n_estimators == 200 + assert pskc.max_samples == "auto" + assert pskc.method == "inne" + assert pskc.tau == 0.1 + assert pskc.v == 0.1 + assert pskc.random_state is None + + +def test_pskc_init_custom(): + """Test PSKC initialization with custom parameters.""" + pskc = PSKC( + n_estimators=100, max_samples=10, method="anne", tau=0.2, v=0.2, random_state=42 + ) + assert pskc.n_estimators == 100 + assert pskc.max_samples == 10 + assert pskc.method == "anne" + assert pskc.tau == 0.2 + assert pskc.v == 0.2 + assert pskc.random_state == 42 + + +def test_pskc_fit(simple_data): + """Test PSKC fit method on simple data.""" + X = simple_data + pskc = PSKC(random_state=42) + pskc.fit(X) + assert hasattr(pskc, "is_fitted_") + assert pskc.is_fitted_ + assert hasattr(pskc, "labels_") + assert pskc.labels_.shape == (X.shape[0],) + assert hasattr(pskc, "clusters_") + assert len(pskc.clusters_) > 0 + + +@pytest.mark.parametrize("method", ["inne", "anne"]) +def test_pskc_different_methods(simple_data, method): + """Test PSKC with different isolation kernel methods.""" + X = simple_data + pskc = PSKC(method=method, random_state=42) + pskc.fit(X) + assert pskc.is_fitted_ + + +def test_pskc_properties(simple_data): + """Test PSKC properties.""" + X = simple_data + pskc = PSKC(random_state=42) + pskc.fit(X) + + # Test clusters property + assert len(pskc.clusters) > 0 + + # Test centers property + centers = pskc.centers + assert len(centers) > 0 + + # Test n_classes property + assert pskc.n_classes > 0 + assert pskc.n_classes == len(pskc.clusters) + + +def test_pskc_blob_data(blob_data): + """Test PSKC on blob data.""" + X, y = blob_data + pskc = PSKC(random_state=42) + pskc.fit(X) + assert pskc.is_fitted_ + assert pskc.labels_.shape == (X.shape[0],) + + # Typically should find approximately 3 clusters for blobs data + assert 1 <= pskc.n_classes <= 5 + + +@pytest.mark.parametrize("tau", [0.05, 0.1, 0.2]) +def test_pskc_tau_parameter(simple_data, tau): + """Test PSKC with different tau values.""" + X = simple_data + pskc = PSKC(tau=tau, random_state=42) + pskc.fit(X) + assert pskc.is_fitted_ + + +@pytest.mark.parametrize("v", [0.05, 0.1, 0.2]) +def test_pskc_v_parameter(simple_data, v): + """Test PSKC with different v values.""" + X = simple_data + pskc = PSKC(v=v, random_state=42) + pskc.fit(X) + assert pskc.is_fitted_ + + +@pytest.mark.parametrize("max_samples", [10, 20, "auto"]) +def test_pskc_max_samples(simple_data, max_samples): + """Test PSKC with different max_samples values.""" + X = simple_data + pskc = PSKC(max_samples=max_samples, random_state=42) + pskc.fit(X) + assert pskc.is_fitted_ + + +def test_pskc_reproducibility(): + """Test PSKC reproducibility with fixed random state.""" + X = np.random.rand(20, 2) + + pskc1 = PSKC(random_state=42) + pskc1.fit(X) + labels1 = pskc1.labels_ + + pskc2 = PSKC(random_state=42) + pskc2.fit(X) + labels2 = pskc2.labels_ + + np.testing.assert_array_equal(labels1, labels2) diff --git a/pyikt/graph/__init__.py b/pyikt/graph/__init__.py new file mode 100644 index 0000000..e80aa95 --- /dev/null +++ b/pyikt/graph/__init__.py @@ -0,0 +1,17 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from ._isographkernel import IsoGraphKernel +from ._ikgod import IKGOD + +__all__ = [ + "IsoGraphKernel", + "IKGOD", +] diff --git a/pyikt/graph/_ikgod.py b/pyikt/graph/_ikgod.py new file mode 100644 index 0000000..3cbb970 --- /dev/null +++ b/pyikt/graph/_ikgod.py @@ -0,0 +1,387 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numbers +import copy +from warnings import warn +import numpy as np +import scipy.sparse as sp +from sklearn.base import BaseEstimator +from sklearn.utils.validation import check_is_fitted +from sklearn.utils import check_array +from sklearn.utils.extmath import safe_sparse_dot +from pyikt.graph.utils import get_degrees, get_neighbors, check_format + +from pyikt.kernel import IsoKernel + + +class IKGOD(BaseEstimator): + """Isolation-based Graph Anomaly Detection using kernel embeddings. + + This algorithm detects anomalies in graphs by using isolation kernels on subgraph + features. It combines graph structure and node features to identify outliers. + + Parameters + ---------- + n_estimators : int, default=200 + Number of isolation estimators in the ensemble. + + max_samples : int, float or "auto", default="auto" + Number of samples to draw for training each base estimator: + - If int, draw `max_samples` samples + - If float, draw `max_samples * X.shape[0]` samples + - If "auto", use `min(16, n_samples)` + + contamination : float or "auto", default="auto" + Expected proportion of outliers in the data: + - If "auto", threshold is set at -0.5 as in the original paper + - If float, must be in range (0, 0.5] + + method : {"inne", "anne", "auto"}, default="inne" + Isolation method to use. The original algorithm uses "inne". + + random_state : int, RandomState or None, default=None + Controls randomness for reproducibility. + + h : int, default=3 + Maximum hop distance for subgraph extraction. + + Attributes + ---------- + max_samples_ : int + Actual number of samples used + + embedding_ : array of shape (n_samples, n_features) + Learned subgraph embeddings + + offset_ : float + Threshold for determining outliers + + is_fitted_ : bool + Whether the model has been fitted + + References + ---------- + .. [1] Zhong Zhuang, Kai Ming Ting, Guansong Pang, Shuaibin Song (2023). + Subgraph Centralization: A Necessary Step for Graph Anomaly Detection. + Proceedings of The SIAM Conference on Data Mining. + + Examples + -------- + >>> from pyikt.graph import IKGOD + >>> import scipy.sparse as sp + >>> import numpy as np + >>> # Create adjacency matrix and features + >>> adj = sp.csr_matrix([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) + >>> features = np.array([[0.1, 0.2], [0.3, 0.4], [5.0, 6.0]]) + >>> # Fit model + >>> model = IKGOD(n_estimators=100, h=2).fit(adj, features) + >>> # Predict outliers + >>> lables = model.predict(features) + """ + + def __init__( + self, + n_estimators=200, + max_samples="auto", + contamination="auto", + method="inne", + random_state=None, + h=3, + ): + self.n_estimators = n_estimators + self.max_samples = max_samples + self.random_state = random_state + self.contamination = contamination + self.method = method + self.h = h + + def fit(self, adjacency, features, y=None): + """Fit the IKGOD model. + + Parameters + ---------- + adjacency : array-like or sparse matrix of shape (n_samples, n_samples) + Adjacency matrix of the graph + + features : array-like of shape (n_samples, n_features) + Node features + + y : Ignored + Not used, present for API consistency. + + Returns + ------- + self : object + Fitted estimator. + """ + # Check and format inputs + adjacency = check_format(adjacency) + features = check_array(features, accept_sparse=False) + + n_samples = features.shape[0] + + # Determine max_samples + if isinstance(self.max_samples, str): + if self.max_samples == "auto": + max_samples = min(16, n_samples) + else: + raise ValueError( + f"max_samples '{self.max_samples}' is not supported. " + f'Valid choices are: "auto", int or float' + ) + elif isinstance(self.max_samples, numbers.Integral): + if self.max_samples > n_samples: + warn( + f"max_samples ({self.max_samples}) is greater than the " + f"total number of samples ({n_samples}). max_samples " + f"will be set to n_samples for estimation." + ) + max_samples = n_samples + else: + max_samples = self.max_samples + else: # float + if not 0.0 < self.max_samples <= 1.0: + raise ValueError( + f"max_samples must be in (0, 1], got {self.max_samples}" + ) + max_samples = int(self.max_samples * n_samples) + + self.max_samples_ = max_samples + + # Fit the model + self._fit(adjacency, features) + self.is_fitted_ = True + + # Set contamination threshold + if self.contamination != "auto": + if not (0.0 < self.contamination <= 0.5): + raise ValueError( + f"contamination must be in (0, 0.5], got: {self.contamination}" + ) + + if self.contamination == "auto": + # 0.5 plays a special role as described in the original paper + self.offset_ = -0.5 + else: + # Set threshold based on contamination parameter + self.offset_ = np.percentile( + self.score_samples(features), 100.0 * self.contamination + ) + + return self + + def _fit(self, adjacency, features): + """Internal fitting method. + + Parameters + ---------- + adjacency : scipy.sparse matrix + Adjacency matrix of the graph + + features : array-like + Node features + + """ + # Transform features using isolation kernel + iso_kernel = IsoKernel( + n_estimators=self.n_estimators, + max_samples=self.max_samples_, + random_state=self.random_state, + method=self.method, + ) + iso_kernel = iso_kernel.fit(features) + features_trans = iso_kernel.transform(features, dense_output=True) + + # Extract h-hop subgraphs for each node + h_index = self._get_h_nodes_n_dict(adjacency) + + # Compute subgraph embeddings + self.embedding_ = self._subgraph_embeddings(adjacency, features_trans, h_index) + self.is_fitted_ = True + return self + + def _get_h_nodes_n_dict(self, adj): + """Extract h-hop neighbors for each node. + + Parameters + ---------- + adj : scipy.sparse matrix + Adjacency matrix of the graph + + Returns + ------- + h_index : list of lists + h_index[i] contains node indices in the h-hop neighborhood of node i + """ + adj_h = sp.eye(adj.shape[0]) + M = [{i: 0} for i in range(adj.shape[0])] + h_index = [[i] for i in range(adj.shape[0])] + + # Iteratively expand neighborhoods + for k in range(self.h): + adj_h = sp.coo_matrix(adj_h * adj) + for i, j in zip(adj_h.row, adj_h.col): + if j not in M[i]: + M[i][j] = k + 1 + h_index[i].append(j) + return h_index + + def _subgraph_embeddings(self, adjacency, features, subgraph_index): + """Compute embeddings for each node's subgraph. + + Parameters + ---------- + adjacency : scipy.sparse matrix + Adjacency matrix of the graph + + features : array-like + Node features + + subgraph_index : list of lists + Subgraph node indices + + Returns + ------- + subgraph_embedding : scipy.sparse matrix + Matrix of subgraph embeddings + """ + n_nodes = adjacency.shape[0] + subgraph_embedding = None + + for i in range(n_nodes): + source_feat = features[i, :] + subgraph_feat = features[subgraph_index[i]] + + # Center features around source node + subgraph_feat = subgraph_feat - np.tile( + source_feat, (len(subgraph_index[i]), 1) + ) + adj_i = adjacency[subgraph_index[i], :][:, subgraph_index[i]] + graph_embed = self._wlembedding(adj_i, subgraph_feat) + if subgraph_embedding is None: + subgraph_embedding = graph_embed + else: + subgraph_embedding = sp.vstack((subgraph_embedding, graph_embed)) + return subgraph_embedding + + def _wlembedding(self, adjacency, X): + """Compute Weisfeiler-Lehman embedding for a subgraph. + + Parameters + ---------- + adjacency : scipy.sparse matrix + Adjacency matrix of the subgraph + + X : array-like + Node features + + Returns + ------- + embedding : scipy.sparse matrix + WL embedding + """ + n_nodes = adjacency.shape[0] + degrees = get_degrees(adjacency) + tmp_embedding = X + embedding = copy.deepcopy(X) + + # Iterate WL algorithm + for _ in range(1, self.h + 1): + updated_embedding = np.empty(X.shape) + for i in range(n_nodes): + neighbors = get_neighbors(adjacency, i) + if degrees[i] > 0: # Avoid division by zero + updated_embedding[i] = ( + ( + tmp_embedding[neighbors].sum(axis=0) / degrees[i] + + tmp_embedding[i] + ) + / 2 + ) + else: + updated_embedding[i] = tmp_embedding[i] + + tmp_embedding = check_format(updated_embedding) + embedding = sp.hstack((embedding, tmp_embedding)) + + # Return mean embedding + embedding = check_format(embedding.mean(axis=0)) + return embedding + + def _kernel_mean_embedding(self, X): + """Compute kernel mean embedding. + + Parameters + ---------- + X : array-like + Input data + + Returns + ------- + kme : array + Kernel mean embedding + """ + return np.mean(X, axis=0) / self.max_samples_ + + def predict(self, X): + """Predict outliers in X. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples + + Returns + ------- + is_inlier : ndarray of shape (n_samples,) + +1 for inliers, -1 for outliers + """ + check_is_fitted(self, "is_fitted_") + decision_func = self.decision_function(X) + is_inlier = np.ones_like(decision_func, dtype=int) + is_inlier[decision_func < 0] = -1 + return is_inlier + + def decision_function(self, X): + """Compute decision function. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples + + Returns + ------- + scores : ndarray of shape (n_samples,) + Decision scores. Negative scores represent outliers. + """ + return self.score_samples(X) - self.offset_ + + def score_samples(self, X): + """Compute anomaly scores for samples. + + Lower scores indicate more anomalous points. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input samples + + Returns + ------- + scores : ndarray of shape (n_samples,) + Anomaly scores. Lower values indicate more anomalous points. + """ + check_is_fitted(self, "is_fitted_") + X = check_array(X, accept_sparse=False) + kme = self._kernel_mean_embedding(self.embedding_) + scores = safe_sparse_dot(self.embedding_, kme.T).A1 + return -scores diff --git a/pyikt/graph/_isographkernel.py b/pyikt/graph/_isographkernel.py new file mode 100644 index 0000000..28d3940 --- /dev/null +++ b/pyikt/graph/_isographkernel.py @@ -0,0 +1,235 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import copy +from warnings import warn +from typing import Union, Optional +import numpy as np +import scipy.sparse as sp +from sklearn.base import BaseEstimator +from sklearn.utils import check_array +from sklearn.utils.validation import check_is_fitted +from sklearn.utils.extmath import safe_sparse_dot +from pyikt.kernel import IsoKernel +from pyikt.graph.utils import get_degrees, get_neighbors, check_format + + +class IsoGraphKernel(BaseEstimator): + """Isolation Graph Kernel is a new way to measure the similarity between two graphs. + + It addresses two key issues of kernel mean embedding, where the kernel employed has: + (i) a feature map with intractable dimensionality which leads to high computational cost; + and (ii) data independency which leads to poor detection accuracy in anomaly detection. + + Parameters + ---------- + method : str, default="anne" + The method to compute the isolation kernel feature. The available methods are: `anne`, `inne`, and `iforest`. + + n_estimators : int, default=200 + The number of base estimators in the ensemble. + + max_samples : int or float or str, default="auto" + The number of samples to draw from X to train each base estimator. + + - If int, then draw `max_samples` samples. + - If float, then draw `max_samples` * X.shape[0]` samples. + - If "auto", then `max_samples=min(8, n_samples)`. + + random_state : int, RandomState instance or None, default=None + Controls the pseudo-randomness of the selection of the feature + and split values for each branching step and each tree in the forest. + + Pass an int for reproducible results across multiple function calls. + See :term:`Glossary `. + + References + ---------- + .. [1] Bi-Cun Xu, Kai Ming Ting and Yuan Jiang. 2021. "Isolation Graph Kernel". + In Proceedings of The Thirty-Fifth AAAI Conference on Artificial Intelligence. 10487-10495. + + Examples + -------- + >>> from pyikt.graph import IsoGraphKernel + >>> import numpy as np + >>> X = np.array([[0.4, 0.3], [0.3, 0.8], [0.5, 0.4], [0.5, 0.1]]) + >>> adjacency = np.array([[0, 1, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 1, 0]]) + >>> igk = IsoGraphKernel() + >>> igk = igk.fit(X) + >>> embedding = igk.transform(adjacency, X, h=2) + """ + + def __init__( + self, + method: str = "anne", + n_estimators: int = 200, + max_samples: Union[int, float, str] = "auto", + random_state: Optional[int] = None, + ) -> None: + self.n_estimators = n_estimators + self.max_samples = max_samples + self.random_state = random_state + self.method = method + + def fit( + self, + features: Union[sp.csr_matrix, np.ndarray], + ): + """Fit the model on data X. + + Parameters + ---------- + features : sparse.csr_matrix, np.ndarray + Features, array of shape (n_nodes, n_features). + + Returns + ------- + self : IsoGraphKernel + The fitted estimator. + """ + features = check_array(features) + self.iso_kernel_ = IsoKernel( + self.method, self.n_estimators, self.max_samples, self.random_state + ) + self.iso_kernel_ = self.iso_kernel_.fit(features) + self.is_fitted_ = True + return self + + def similarity( + self, X: Union[sp.csr_matrix, np.ndarray], dense_output: bool = True + ) -> Union[sp.csr_matrix, np.ndarray]: + """Compute the isolation kernel similarity matrix of X. + + Parameters + ---------- + X: array-like of shape (n_instances, n_features) + The input instances or pre-computed embeddings. + dense_output: bool, default=True + Whether to return dense matrix of output. + + Returns + ------- + similarity : array-like of shape (n_instances, n_instances) + The similarity matrix organized as an n_instances * n_instances matrix. + """ + check_is_fitted(self) + X = check_array(X) + + return safe_sparse_dot(X, X.T, dense_output=dense_output) / self.n_estimators + + def transform( + self, + adjacency: Union[sp.csr_matrix, np.ndarray], + features: Union[sp.csr_matrix, np.ndarray], + h: int, + dense_output: bool = False, + ) -> Union[sp.csr_matrix, np.ndarray]: + """Compute the isolation kernel feature of a graph. + + Parameters + ---------- + adjacency : Union[sp.csr_matrix, np.ndarray] + Adjacency matrix of the graph. + features : sparse.csr_matrix, np.ndarray + Features, array of shape (n_nodes, n_features). + h : int + The number of iterations for Weisfeiler–Lehman embedding. + dense_output : bool, default=False + Whether to return a dense array. + + Returns + ------- + The finite binary features based on the kernel feature map. + The features are organized as an n_instances by h+1*psi*t matrix. + """ + check_is_fitted(self) + features = check_array(features) + adjacency = check_format(adjacency) + X_trans = self.iso_kernel_.transform(features) + embedding = self._wlembedding(adjacency, X_trans, h) + + if dense_output: + if sp.issparse(embedding) and hasattr(embedding, "toarray"): + return embedding.toarray() + else: + warn("The IsoKernel transform output is already dense.") + return embedding + + def _wlembedding( + self, + adjacency: Union[sp.csr_matrix, np.ndarray], + features: Union[sp.csr_matrix, np.ndarray], + h: int, + ) -> Union[sp.csr_matrix, np.ndarray]: + """Compute the Weisfeiler-Lehman embedding of a graph. + + Parameters + ---------- + adjacency : Union[sp.csr_matrix, np.ndarray] + Adjacency matrix of the graph. + features : Union[sp.csr_matrix, np.ndarray] + Node feature matrix. + h : int + The number of iterations. + + Returns + ------- + embedding : Union[sp.csr_matrix, np.ndarray] + The graph embedding. + """ + n_nodes = adjacency.shape[0] + degrees = get_degrees(adjacency) + tmp_embedding = features + embedding = copy.deepcopy(features) + for it in range(h + 1)[1:]: + updated_embedding = np.empty(features.shape) + for i in range(n_nodes): # TODO: Add weights + neighbors = get_neighbors(adjacency, i) + updated_embedding[i] = ( + ( + tmp_embedding[neighbors].sum(axis=0) / degrees[i] + + tmp_embedding[i] + ) + / 2 + ).A1 + tmp_embedding = check_format(updated_embedding) + embedding = sp.hstack((embedding, tmp_embedding)) + + # Calculate the mean embedding across all nodes to get the graph-level embedding + embedding = check_format(embedding.mean(axis=0)) + return embedding + + def fit_transform( + self, + adjacency: Union[np.ndarray, sp.csr_matrix], + features: Union[sp.csr_matrix, np.ndarray], + h: int, + dense_output: bool = False, + ) -> Union[sp.csr_matrix, np.ndarray]: + """Fit the model on data X and transform X. + + Parameters + ---------- + adjacency : Union[sp.csr_matrix, np.ndarray] + Adjacency matrix of the graph. + features : sparse.csr_matrix, np.ndarray + Features, array of shape (n_nodes, n_features). + h : int + The number of iterations for Weisfeiler–Lehman embedding. + dense_output : bool, default=False + Whether to return a dense array. + + Returns + ------- + embedding : Union[sp.csr_matrix, np.ndarray] + Transformed array. + """ + self.fit(features) + return self.transform(adjacency, features, h, dense_output) diff --git a/pyikt/graph/tests/test_ikgod.py b/pyikt/graph/tests/test_ikgod.py new file mode 100644 index 0000000..73b6a29 --- /dev/null +++ b/pyikt/graph/tests/test_ikgod.py @@ -0,0 +1,139 @@ +import pytest +import numpy as np +from sklearn.datasets import make_blobs +from sklearn.utils.estimator_checks import check_estimator +from pyikt.graph import IKGOD + +import scipy.sparse as sp + + +def test_ikgod_initialization(): + """Test IKGOD initialization with default and custom parameters.""" + # Default initialization + model = IKGOD() + assert model.n_estimators == 200 + assert model.max_samples == "auto" + assert model.contamination == "auto" + assert model.method == "inne" + assert model.h == 3 + + # Custom initialization + model = IKGOD( + n_estimators=100, max_samples=0.8, contamination=0.1, method="anne", h=2 + ) + assert model.n_estimators == 100 + assert model.max_samples == 0.8 + assert model.contamination == 0.1 + assert model.method == "anne" + assert model.h == 2 + + +def test_ikgod_with_synthetic_data(): + """Test IKGOD with synthetic data.""" + # Generate synthetic data + X, _ = make_blobs(n_samples=20, centers=2, random_state=42) + + # Create a simple adjacency matrix (a ring graph) + n_samples = X.shape[0] + adjacency = sp.csr_matrix((n_samples, n_samples)) + for i in range(n_samples): + adjacency[i, (i + 1) % n_samples] = 1 + adjacency[(i + 1) % n_samples, i] = 1 + + # Initialize and fit the model + model = IKGOD(n_estimators=50, random_state=42, h=2) + model.fit(adjacency, X) + + # Check if the model is fitted + assert hasattr(model, "is_fitted_") + assert model.is_fitted_ is True + + # Test prediction + labels = model.predict(X) + assert labels.shape == (n_samples,) + assert np.all(np.logical_or(labels == 1, labels == -1)) + + # Test score_samples + scores = model.score_samples(X) + assert scores.shape == (n_samples,) + + # Test decision_function + decision = model.decision_function(X) + assert decision.shape == (n_samples,) + + +def test_ikgod_with_small_graph(): + """Test IKGOD with a small graph and obvious anomaly.""" + # Create small graph where one node has very different features + features = np.array( + [ + [1.0, 1.0], # Normal + [0.9, 1.1], # Normal + [1.1, 0.9], # Normal + [5.0, 5.0], # Anomaly + ] + ) + + # Create adjacency matrix: first 3 nodes form a triangle, last one connected to first + adjacency = sp.csr_matrix([[0, 1, 1, 1], [1, 0, 1, 0], [1, 1, 0, 0], [1, 0, 0, 0]]) + + # Fit model with fixed contamination + model = IKGOD(n_estimators=50, contamination=0.25, random_state=42, h=1) + model.fit(adjacency, features) + + # Check predictions + labels = model.predict(features) + assert labels.shape == (4,) + # The last point should be labeled as anomaly (-1) + assert labels[3] == -1 + + +def test_ikgod_parameter_validation(): + """Test parameter validation in IKGOD.""" + # Invalid contamination + with pytest.raises(ValueError): + model = IKGOD(contamination=2.0) + X = np.random.rand(10, 2) + adj = sp.csr_matrix([[0, 1, 1, 1], [1, 0, 1, 0], [1, 1, 0, 0], [1, 0, 0, 0]]) + model.fit(adj, X) + + # Invalid max_samples string + with pytest.raises(ValueError): + model = IKGOD(max_samples="invalid") + X = np.random.rand(10, 2) + adj = sp.csr_matrix([[0, 1, 1, 1], [1, 0, 1, 0], [1, 1, 0, 0], [1, 0, 0, 0]]) + model.fit(adj, X) + + # Invalid max_samples float + with pytest.raises(ValueError): + model = IKGOD(max_samples=2.0) + X = np.random.rand(10, 2) + adj = sp.csr_matrix([[0, 1, 1, 1], [1, 0, 1, 0], [1, 1, 0, 0], [1, 0, 0, 0]]) + model.fit(adj, X) + + +def test_ikgod_h_hop_neighbors(): + """Test h-hop neighbor extraction.""" + # Create a path graph: 0-1-2-3-4 + adjacency = sp.csr_matrix( + [ + [0, 1, 0, 0, 0], + [1, 0, 1, 0, 0], + [0, 1, 0, 1, 0], + [0, 0, 1, 0, 1], + [0, 0, 0, 1, 0], + ] + ) + + features = np.random.rand(5, 2) + + # h=1 should see only direct neighbors + model_h1 = IKGOD(h=1, n_estimators=10) + model_h1._get_h_nodes_n_dict(adjacency) + + # h=2 should see neighbors at distance 2 + model_h2 = IKGOD(h=2, n_estimators=10) + model_h2._get_h_nodes_n_dict(adjacency) + + # The test itself is implicit since we're checking that the method runs without errors + assert True diff --git a/pyikt/graph/tests/test_isographkernel.py b/pyikt/graph/tests/test_isographkernel.py new file mode 100644 index 0000000..d14a16b --- /dev/null +++ b/pyikt/graph/tests/test_isographkernel.py @@ -0,0 +1,113 @@ +import pytest +import numpy as np +from pyikt.graph import IsoGraphKernel + +import scipy.sparse as sp + + +def test_isographkernel_initialization(): + """Test IsoGraphKernel initialization with default and custom parameters.""" + # Default initialization + igk = IsoGraphKernel() + assert igk.n_estimators == 200 + assert igk.max_samples == "auto" + assert igk.method == "anne" + assert igk.random_state is None + + # Custom initialization + igk = IsoGraphKernel( + method="inne", n_estimators=100, max_samples=0.8, random_state=42 + ) + assert igk.n_estimators == 100 + assert igk.max_samples == 0.8 + assert igk.method == "inne" + assert igk.random_state == 42 + + +def test_isographkernel_fit(): + """Test IsoGraphKernel fit method.""" + # Create sample features + features = np.random.rand(10, 5) + + # Initialize and fit the model + igk = IsoGraphKernel(n_estimators=50, random_state=42) + fitted_model = igk.fit(features) + + # Check if the model is fitted + assert hasattr(fitted_model, "is_fitted_") + assert fitted_model.is_fitted_ is True + assert hasattr(fitted_model, "iso_kernel_") + + +def test_isographkernel_transform(): + """Test IsoGraphKernel transform method.""" + # Create sample features and adjacency matrix + features = np.random.rand(10, 5) + adjacency = np.zeros((10, 10)) + for i in range(10): + adjacency[i, (i + 1) % 10] = 1 + adjacency[(i + 1) % 10, i] = 1 + adjacency = sp.csr_matrix(adjacency) + + # Initialize, fit and transform + igk = IsoGraphKernel(n_estimators=50, random_state=42) + igk.fit(features) + + # Test transform with sparse output + embedding_sparse = igk.transform(adjacency, features, h=1, dense_output=False) + assert sp.issparse(embedding_sparse) + + # Test transform with dense output + embedding_dense = igk.transform(adjacency, features, h=1, dense_output=True) + assert isinstance(embedding_dense, np.ndarray) + + +def test_isographkernel_fit_transform(): + """Test IsoGraphKernel fit_transform method.""" + # Create sample features and adjacency matrix + features = np.random.rand(10, 5) + adjacency = np.zeros((10, 10)) + for i in range(10): + adjacency[i, (i + 1) % 10] = 1 + adjacency[(i + 1) % 10, i] = 1 + adjacency = sp.csr_matrix(adjacency) + + # Test fit_transform with sparse output + igk = IsoGraphKernel(n_estimators=50, random_state=42) + embedding_sparse = igk.fit_transform(adjacency, features, h=1, dense_output=False) + assert sp.issparse(embedding_sparse) + assert igk.is_fitted_ is True + + # Test fit_transform with dense output + igk = IsoGraphKernel(n_estimators=50, random_state=42) + embedding_dense = igk.fit_transform(adjacency, features, h=1, dense_output=True) + assert isinstance(embedding_dense, np.ndarray) + assert igk.is_fitted_ is True + + +def test_isographkernel_with_different_h_values(): + """Test IsoGraphKernel with different h values for WL embedding.""" + # Create sample features and adjacency matrix + features = np.random.rand(10, 5) + adjacency = np.zeros((10, 10)) + for i in range(10): + adjacency[i, (i + 1) % 10] = 1 + adjacency[(i + 1) % 10, i] = 1 + adjacency = sp.csr_matrix(adjacency) + + igk = IsoGraphKernel(n_estimators=50, random_state=42) + igk.fit(features) + + # Test with h=0 + embedding_h0 = igk.transform(adjacency, features, h=0, dense_output=True) + + # Test with h=1 + embedding_h1 = igk.transform(adjacency, features, h=1, dense_output=True) + + # Test with h=2 + embedding_h2 = igk.transform(adjacency, features, h=2, dense_output=True) + + # Each h value should produce a different embedding size + # For each h, we add another embedding layer + assert embedding_h1.shape[1] > embedding_h0.shape[1] + assert embedding_h2.shape[1] > embedding_h1.shape[1] diff --git a/pyikt/graph/utils.py b/pyikt/graph/utils.py new file mode 100644 index 0000000..2eb5efd --- /dev/null +++ b/pyikt/graph/utils.py @@ -0,0 +1,92 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +import scipy.sparse as sp +from typing import Union + + +def get_degrees(input_matrix: sp.csr_matrix, transpose: bool = False) -> np.ndarray: + """Get the vector of degrees of a graph. + + If the graph is directed, returns the out-degrees (number of successors). Set ``transpose=True`` + to get the in-degrees (number of predecessors). + + For a biadjacency matrix, returns the degrees of rows. Set ``transpose=True`` to get the degrees of columns. + + Parameters + ---------- + input_matrix : sparse.csr_matrix + Adjacency or biadjacency matrix. + transpose : + If ``True``, transpose the input matrix. + Returns + ------- + degrees : np.ndarray + Array of degrees. + """ + if transpose: + matrix = sp.csr_matrix(input_matrix.T) + else: + matrix = input_matrix + degrees = matrix.indptr[1:] - matrix.indptr[:-1] + return degrees + + +def get_neighbors( + input_matrix: sp.csr_matrix, node: int, transpose: bool = False +) -> np.ndarray: + """Get the neighbors of a node. + + If the graph is directed, returns the vector of successors. Set ``transpose=True`` + to get the predecessors. + + For a biadjacency matrix, returns the neighbors of a row node. Set ``transpose=True`` + to get the neighbors of a column node. + + """ + if transpose: + matrix = sp.csr_matrix(input_matrix.T) + else: + matrix = input_matrix + neighbors = matrix.indices[matrix.indptr[node] : matrix.indptr[node + 1]] + return neighbors + + +def check_format( + input_matrix: Union[ + sp.csr_matrix, + sp.csc_matrix, + sp.coo_matrix, + sp.lil_matrix, + np.ndarray, + np.matrix, + ], + allow_empty: bool = False, +) -> sp.csr_matrix: + """Check whether the matrix is a NumPy array or a Scipy sparse matrix and return + the corresponding Scipy CSR matrix. + """ + formats = { + sp.csr_matrix, + sp.csc_matrix, + sp.coo_matrix, + sp.lil_matrix, + np.ndarray, + np.matrix, + } + if type(input_matrix) not in formats: + raise TypeError( + "The input matrix must be in Scipy sparse format or Numpy ndarray format." + ) + input_matrix = sp.csr_matrix(input_matrix) + if not allow_empty and input_matrix.nnz == 0: + raise ValueError("The input matrix is empty.") + return input_matrix diff --git a/pyikt/group/__init__.py b/pyikt/group/__init__.py new file mode 100644 index 0000000..e4635d8 --- /dev/null +++ b/pyikt/group/__init__.py @@ -0,0 +1,15 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from .anomaly._ikgad import IKGAD + +__all__ = [ + "IKGAD", +] diff --git a/pyikt/group/anomaly/__init__.py b/pyikt/group/anomaly/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyikt/group/anomaly/_ikgad.py b/pyikt/group/anomaly/_ikgad.py new file mode 100644 index 0000000..ea41300 --- /dev/null +++ b/pyikt/group/anomaly/_ikgad.py @@ -0,0 +1,270 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from sklearn.base import BaseEstimator, OutlierMixin +from sklearn.utils.validation import check_is_fitted +from sklearn.utils.extmath import safe_sparse_dot +from pyikt.kernel import IsoKernel +from pyikt.group.utils import check_format + + +class IKGAD(OutlierMixin, BaseEstimator): + """Isolation Kernel-based Group Anomaly Detection. + + IKGAD applies isolation kernel techniques to detect anomalies in groups of data points. + It leverages a two-step approach: first transforming the data using an isolation kernel, + then calculating kernel mean embeddings for each group to detect anomalous groups. + The algorithm is effective for detecting both global and local group anomalies. + + Parameters + ---------- + n_estimators_1 : int, default=200 + The number of base estimators in the first-level ensemble. + + max_samples_1 : int, float, or "auto", default="auto" + The number of samples to draw for training each first-level base estimator: + + - If int, draws exactly `max_samples_1` samples + - If float, draws `max_samples_1 * X.shape[0]` samples + - If "auto", uses `min(8, n_samples)` + + n_estimators_2 : int, default=200 + The number of base estimators in the second-level ensemble. + + max_samples_2 : int, float, or "auto", default="auto" + The number of samples to draw for training each second-level base estimator: + + - If int, draws exactly `max_samples_2` samples + - If float, draws `max_samples_2 * X.shape[0]` samples + - If "auto", uses `min(8, n_samples)` + + method : {"inne", "anne", "auto"}, default="inne" + Isolation method to use. The "inne" option corresponds to the approach + described in the original paper. + + contamination : "auto" or float, default="auto" + Proportion of outliers in the data set: + + - If "auto", the threshold is determined as in the original paper + - If float, should be in range (0, 0.5] + + random_state : int, RandomState instance or None, default=None + Controls the random seed for reproducibility. + + Attributes + ---------- + iso_kernel_1_ : IsoKernel + First-level trained isolation kernel. + + offset_ : float + Decision threshold for outlier detection. + + References + ---------- + .. [1] Kai Ming Ting, Bi-Cun Xu, Washio Takashi, Zhi-Hua Zhou (2022). + Isolation Distributional Kernel: A new tool for kernel based point and group anomaly detections. + IEEE Transactions on Knowledge and Data Engineering. + + Examples + -------- + >>> from pyikt.group import IKGAD + >>> import numpy as np + >>> X =[[[1.0, 1.1], [1.2, 1.3]], [[1.3, 1.2], [1.1, 1.0]], [[1.0, 1.2], [1.4, 1.3]], [[5.0, 5.1], [5.2, 5.3]]] + >>> clf = IKGAD(max_samples_1=2, max_samples_2=2, contamination=0.25, random_state=42) + >>> clf = clf.fit(X) + >>> clf.predict(X) + array([ 1, 1, 1, -1]) + """ + + def __init__( + self, + n_estimators_1=200, + max_samples_1="auto", + n_estimators_2=200, + max_samples_2="auto", + method="inne", + contamination="auto", + random_state=None, + ): + self.n_estimators_1 = n_estimators_1 + self.max_samples_1 = max_samples_1 + self.n_estimators_2 = n_estimators_2 + self.max_samples_2 = max_samples_2 + self.random_state = random_state + self.contamination = contamination + self.method = method + + def fit(self, X): + """Fit the IKGAD model. + + Parameters + ---------- + X : array-like of shape (n_groups, n_samples, n_features) + The input data, where n_groups is the number of groups, + n_samples is the number of instances per group, and + n_features is the number of features. + + Returns + ------- + self : object + Fitted estimator. + + Notes + ----- + Sets the `is_fitted_` attribute to `True`. + """ + # Validate input data + X = check_format(X) + # Fit the model + self._fit(X) + self.is_fitted_ = True + + # Set threshold + if self.contamination != "auto": + if not (0.0 < self.contamination <= 0.5): + raise ValueError( + f"contamination must be in (0, 0.5], got: {self.contamination}" + ) + # Define threshold based on contamination parameter + self.offset_ = np.percentile( + self.score_samples(X), 100.0 * self.contamination + ) + else: + # Use default threshold as described in the original paper + self.offset_ = -0.5 + + return self + + def _kernel_mean_embedding(self, X, t): + """Calculate kernel mean embedding of transformed data. + + Parameters + ---------- + X : array-like of shape (n_samples, n_estimators) + Transformed data from isolation kernel + t : int + Normalization factor (typically number of estimators) + + Returns + ------- + embedding : ndarray + Kernel mean embedding + """ + return np.mean(X, axis=0) / t + + def _fit(self, X): + """Internal method to fit the model. + + Parameters + ---------- + X : ndarray of shape (n_groups, n_samples, n_features) + Training data + """ + # Flatten all groups into a single dataset for the first isolation kernel + X_full = np.vstack(X) + + # First level isolation kernel + iso_kernel_1 = IsoKernel( + n_estimators=self.n_estimators_1, + max_samples=self.max_samples_1, + random_state=self.random_state, + method=self.method, + ) + self.iso_kernel_1_ = iso_kernel_1.fit(X_full) + + return self + + def predict(self, X): + """Predict if groups are outliers or inliers. + + Parameters + ---------- + X : array-like of shape (n_groups, n_samples, n_features) + The input groups to evaluate + + Returns + ------- + is_inlier : ndarray of shape (n_groups,) + For each group, returns whether it is an inlier (+1) or + outlier (-1) according to the fitted model. + """ + check_is_fitted(self, "is_fitted_") + decision_func = self.decision_function(X) + is_inlier = np.ones_like(decision_func, dtype=int) + is_inlier[decision_func < 0] = -1 + return is_inlier + + def decision_function(self, X): + """Compute decision scores for groups. + + Parameters + ---------- + X : array-like of shape (n_groups, n_samples, n_features) + The input groups to evaluate + + Returns + ------- + scores : ndarray of shape (n_groups,) + Decision scores. Negative scores represent outliers, + positive scores represent inliers. + """ + return self.score_samples(X) - self.offset_ + + def score_samples(self, X): + """Compute anomaly scores for groups. + + Parameters + ---------- + X : array-like of shape (n_groups, n_samples, n_features) + The input groups to evaluate + + Returns + ------- + scores : ndarray of shape (n_groups,) + Anomaly scores where lower values indicate more anomalous groups. + """ + check_is_fitted(self, "is_fitted_") + X = check_format(X) + + X_full = np.vstack(X) + # Create kernel mean embeddings for each group + split_idx = np.cumsum([len(x) for x in X]) + X_trans = self.iso_kernel_1_.transform(X_full) + group_embeddings = np.split(X_trans.toarray(), split_idx[:-1], axis=0) + X_embeddings = np.asarray( + [ + self._kernel_mean_embedding(x, self.n_estimators_1) + for x in group_embeddings + ] + ) + + # Second level isolation kernel on the embeddings + iso_kernel_2 = IsoKernel( + n_estimators=self.n_estimators_2, + max_samples=self.max_samples_2, + random_state=self.random_state, + method=self.method, + ) + + X_trans = iso_kernel_2.fit_transform(X_embeddings) + kme = self._kernel_mean_embedding(X_trans, self.n_estimators_2) + + # For sparse matrices, .A1 converts to 1D array + if hasattr(X_trans, "A1"): + scores = safe_sparse_dot(X_trans, kme.T).A1 + else: + scores = safe_sparse_dot(X_trans, kme.T) + if hasattr(scores, "A1"): + scores = scores.A1 + elif scores.ndim > 1: + scores = scores.ravel() + + return -scores diff --git a/pyikt/group/tests/test_Ikgad.py b/pyikt/group/tests/test_Ikgad.py new file mode 100644 index 0000000..ccc7085 --- /dev/null +++ b/pyikt/group/tests/test_Ikgad.py @@ -0,0 +1,148 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +import pytest +from pyikt.group import IKGAD + + +def test_IKGAD_initialization(): + clf = IKGAD( + n_estimators_1=100, + max_samples_1=0.5, + n_estimators_2=150, + max_samples_2=0.8, + method="inne", + contamination=0.1, + random_state=42, + ) + + assert clf.n_estimators_1 == 100 + assert clf.max_samples_1 == 0.5 + assert clf.n_estimators_2 == 150 + assert clf.max_samples_2 == 0.8 + assert clf.method == "inne" + assert clf.contamination == 0.1 + assert clf.random_state == 42 + + +def test_IKGAD_fit(): + # Create a sample dataset with 2D features in each group + X = np.array( + [[[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], [[4.0, 5.0], [5.0, 6.0], [6.0, 7.0]]] + ) + clf = IKGAD() + clf.fit(X) + assert clf.is_fitted_ + assert hasattr(clf, "iso_kernel_1_") + assert hasattr(clf, "offset_") + + +def test_IKGAD_predict(): + X = [ + [[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], + [[4.0, 5.0], [5.0, 6.0], [6.0, 7.0]], + [[10.0, 11.0], [11.0, 12.0], [12.0, 13.0]], + ] + clf = IKGAD(random_state=42) + clf.fit(X) + + predictions = clf.predict(X) + + assert predictions.shape == (3,) + assert np.all(np.isin(predictions, [-1, 1])) + + +def test_IKGAD_decision_function(): + X = np.array( + [[[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], [[4.0, 5.0], [5.0, 6.0], [6.0, 7.0]]] + ) + clf = IKGAD(random_state=42) + clf.fit(X) + + decision_scores = clf.decision_function(X) + + assert decision_scores.shape == (2,) + + +def test_IKGAD_score_samples(): + X = np.array( + [[[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], [[4.0, 5.0], [5.0, 6.0], [6.0, 7.0]]] + ) + clf = IKGAD(random_state=42) + clf.fit(X) + + scores = clf.score_samples(X) + + assert scores.shape == (2,) + + +def test_IKGAD_with_contamination_parameter(): + X = [ + [[1.0, 1.1], [1.2, 1.3]], + [[1.3, 1.2], [1.1, 1.0]], + [[1.0, 1.2], [1.4, 1.3]], + [[5.0, 5.1], [5.2, 5.3]], + ] + + # Test with explicit contamination parameter + clf = IKGAD(max_samples_1=2, max_samples_2=2, contamination=0.25, random_state=42) + clf.fit(X) + + # Should mark one group as anomaly (25% contamination) + predictions = clf.predict(X) + assert sum(predictions == -1) == 1 + + +def test_IKGAD_input_validation(): + # Test with invalid dimensions + X_2d = np.array([[1.0, 2.0], [3.0, 4.0]]) + clf = IKGAD() + + with pytest.raises(ValueError): + clf.fit(X_2d) + + # Test with empty groups + X_empty_group = np.array([[[]]]) + with pytest.raises(ValueError): + clf.fit(X_empty_group) + + # Test with invalid contamination + with pytest.raises(ValueError): + IKGAD(contamination=0.6).fit(np.array([[[1.0, 2.0]], [[2.0, 3.0]]])) + + +def test_IKGAD_list_input(): + # Test with list input instead of numpy array + X_list = [[[1.0, 2.0], [2.0, 3.0]], [[3.0, 4.0], [4.0, 5.0]]] + clf = IKGAD(random_state=42) + clf.fit(X_list) + + scores = clf.score_samples(X_list) + assert scores.shape == (2,) + + +def test_IKGAD_predict_new_data(): + # Train on some data + X_train = np.array( + [ + [[1.0, 1.1], [1.2, 1.3], [0.8, 0.9]], + [[0.9, 0.8], [1.1, 1.0], [1.0, 1.2]], + [[5.0, 5.1], [5.2, 5.3], [4.9, 4.8]], + ] + ) + clf = IKGAD(random_state=42) + clf.fit(X_train) + + # Predict on new data + X_test = np.array([[[1.1, 1.0], [0.9, 1.1]], [[5.1, 5.0], [4.8, 4.9]]]) + predictions = clf.predict(X_test) + + assert predictions.shape == (2,) diff --git a/pyikt/group/utils.py b/pyikt/group/utils.py new file mode 100644 index 0000000..2957c0c --- /dev/null +++ b/pyikt/group/utils.py @@ -0,0 +1,73 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from typing import Union, List, Any, Optional +from sklearn.utils.validation import check_array + + +def check_format( + X: Union[List[Any], np.ndarray], + allow_empty: bool = False, + n_features: Optional[int] = None, +) -> np.ndarray: + """ + Validates group data format. + + Parameters: + ----------- + X : array-like + Trajectory data with shape (n_trajectories, n_samples, n_features) + allow_empty : bool, default=False + Whether to allow trajectories with no samples + n_features : int, optional, default=None + Expected number of features + + Returns: + -------- + np.ndarray + Validated group data + """ + # Convert to numpy array if needed + n_group_features = [] + + if not isinstance(X, (list, np.ndarray)): + raise TypeError("X must be a list or numpy array") + elif isinstance(X, np.ndarray): + if X.ndim != 3: + raise ValueError("X must have shape (n_groups, n_samples, n_features)") + else: + for i, group in enumerate(X): + if not isinstance(group, (list, np.ndarray)): + raise ValueError( + f"Group at index {i} is not array-like. Expected shape: (n_samples, n_features)" + ) + try: + group = check_array(group, ensure_2d=True, allow_nd=False) + except ValueError as e: + raise ValueError( + f"Group at index {i} is not a valid array-like (n_samples, n_features), got error: {e}" + ) from e + + n_group_features.append(group.shape[1]) + + if n_group_features and len(set(n_group_features)) > 1: + raise ValueError("All groups must have the same number of features") + + if ( + n_features is not None + and n_group_features + and n_group_features[0] != n_features + ): + raise ValueError( + f"Expected {n_features} features but got {n_group_features[0]}" + ) + + return X diff --git a/pyikt/kernel/__init__.py b/pyikt/kernel/__init__.py new file mode 100644 index 0000000..8e37672 --- /dev/null +++ b/pyikt/kernel/__init__.py @@ -0,0 +1,17 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from ._isokernel import IsoKernel +from ._isodiskernel import IsoDisKernel + +__all__ = [ + "IsoDisKernel", + "IsoKernel", +] diff --git a/pyikt/kernel/_ik_anne.py b/pyikt/kernel/_ik_anne.py new file mode 100644 index 0000000..e281b10 --- /dev/null +++ b/pyikt/kernel/_ik_anne.py @@ -0,0 +1,159 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from scipy import sparse +from sklearn.base import BaseEstimator, TransformerMixin +from sklearn.metrics import euclidean_distances +from sklearn.utils import check_array +from sklearn.utils.validation import check_is_fitted, check_random_state + +MAX_INT = np.iinfo(np.int32).max + + +class IK_ANNE(TransformerMixin, BaseEstimator): + """Build Isolation Kernel feature vector representations via the feature map + for a given dataset. + + Isolation kernel is a data dependent kernel measure that is + adaptive to local data distribution and has more flexibility in capturing + the characteristics of the local data distribution. It has been shown promising + performance on density and distance-based classification and clustering problems. + + This version uses Voronoi diagrams to split the data space and calculate Isolation + kernel Similarity. Based on this implementation, the feature + in the Isolation kernel space is the index of the cell in Voronoi diagrams. Each + point is represented as a binary vector such that only the cell the point falling + into is 1. + + Parameters + ---------- + + n_estimators : int, default=100 + The number of base estimators in the ensemble. + + max_samples : int, default=256 + The number of samples to draw from X to train each base estimator. + + random_state : int, RandomState instance or None, default=None + Controls the pseudo-randomness of the selection of the feature + and split values for each branching step and each tree in the forest. + + Attributes + ---------- + center_data : ndarray of shape (n_unique_centers, n_features) + The unique center points data used for constructing Voronoi cells. + + unique_ids : ndarray + Indices of unique center points in the original dataset. + + center_ids : ndarray of shape (n_estimators, max_samples_) + Indices of center points selected for each estimator. + + is_fitted_ : bool + Whether the estimator has been fitted. + + References + ---------- + .. [1] Qin, X., Ting, K.M., Zhu, Y. and Lee, V.C. + "Nearest-neighbour-induced isolation similarity and its impact on density-based clustering". + In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 33, 2019, July, pp. 4755-4762 + """ + + def __init__(self, n_estimators=100, max_samples=256, random_state=None): + self.n_estimators = n_estimators + self.max_samples = max_samples + self.random_state = random_state + + def fit(self, X, y=None): + """Fit the model on data X. + Parameters + ---------- + X : np.array of shape (n_samples, n_features) + The input instances. + y : None + Ignored. Present for API consistency. + + Returns + ------- + self : object + Returns self. + """ + X = check_array(X) + n_samples = X.shape[0] + self.max_samples_ = min(self.max_samples, n_samples) + random_state = check_random_state(self.random_state) + self._seeds = random_state.randint(MAX_INT, size=self.n_estimators) + + # Select center points for each estimator + self.center_ids = np.empty( + (self.n_estimators, self.max_samples_), dtype=np.int32 + ) + for i in range(self.n_estimators): + rnd = check_random_state(self._seeds[i]) + self.center_ids[i] = rnd.choice(n_samples, self.max_samples_, replace=False) + + # Only store unique center points to save memory + self.unique_ids = np.unique(self.center_ids) + self.center_data = X[self.unique_ids] + + self.is_fitted_ = True + return self + + def transform(self, X): + """Compute the isolation kernel feature of X. + Parameters + ---------- + X: array-like of shape (n_instances, n_features) + The input instances. + Returns + ------- + sparse matrix: The finite binary features based on the kernel feature map. + The features are organized as a n_instances by (n_estimators * max_samples_) matrix. + """ + check_is_fitted(self, "is_fitted_") + X = check_array(X) + n_samples = X.shape[0] + n_features = self.n_estimators * self.max_samples_ + + # Precompute all distances to center points once + X_dists = euclidean_distances(X, self.center_data) + + # Create lookup dictionary for distances + id_to_index = {id_val: idx for idx, id_val in enumerate(self.unique_ids)} + + # Prepare for sparse matrix construction + rows = np.tile(np.arange(n_samples), self.n_estimators) + cols = np.zeros(n_samples * self.n_estimators, dtype=np.int32) + data = np.ones(n_samples * self.n_estimators, dtype=np.float64) + + # Process each estimator + for est_idx in range(self.n_estimators): + centers = self.center_ids[est_idx] + # Map center IDs to positions in unique_ids array + center_indices = np.array([id_to_index[center] for center in centers]) + + # Get distances to centers for this estimator + estimator_dists = X_dists[:, center_indices] + + # Find nearest center for each sample + nn_indices = np.argmin(estimator_dists, axis=1) + + # Calculate column indices + start_idx = est_idx * n_samples + end_idx = (est_idx + 1) * n_samples + cols[start_idx:end_idx] = nn_indices + (est_idx * self.max_samples_) + + # Create sparse matrix + embedding = sparse.csr_matrix( + (data, (rows, cols)), shape=(n_samples, n_features) + ) + + return embedding diff --git a/IsoML/kernel/_ik_iforest.py b/pyikt/kernel/_ik_iforest.py similarity index 87% rename from IsoML/kernel/_ik_iforest.py rename to pyikt/kernel/_ik_iforest.py index ab9b7a5..91c3c47 100644 --- a/IsoML/kernel/_ik_iforest.py +++ b/pyikt/kernel/_ik_iforest.py @@ -1,7 +1,11 @@ """ -Copyright 2024 Xin Han. All rights reserved. -Use of this source code is governed by a BSD-style -license that can be found in the LICENSE file. +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . """ import numbers @@ -60,4 +64,6 @@ class IK_IForest(TransformerMixin, BaseEstimator): In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 33, 2019, July, pp. 4755-4762 """ - pass + def __init__(self): + + pass diff --git a/IsoML/kernel/_ik_anne.py b/pyikt/kernel/_ik_inne.py similarity index 56% rename from IsoML/kernel/_ik_anne.py rename to pyikt/kernel/_ik_inne.py index 8b6900d..57d6209 100644 --- a/IsoML/kernel/_ik_anne.py +++ b/pyikt/kernel/_ik_inne.py @@ -1,12 +1,18 @@ """ -Copyright 2024 Xin Han. All rights reserved. -Use of this source code is governed by a BSD-style -license that can be found in the LICENSE file. +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . """ import numpy as np +from scipy import sparse from sklearn.base import BaseEstimator, TransformerMixin -from sklearn.metrics import euclidean_distances +from sklearn.metrics import pairwise_distances_argmin_min +from sklearn.metrics._pairwise_distances_reduction import ArgKmin from sklearn.utils import check_array from sklearn.utils.validation import check_is_fitted, check_random_state @@ -14,7 +20,7 @@ MIN_FLOAT = np.finfo(float).eps -class IK_ANNE(TransformerMixin, BaseEstimator): +class IK_INNE(TransformerMixin, BaseEstimator): """Build Isolation Kernel feature vector representations via the feature map for a given dataset. @@ -23,7 +29,7 @@ class IK_ANNE(TransformerMixin, BaseEstimator): the characteristics of the local data distribution. It has been shown promising performance on density and distance-based classification and clustering problems. - This version uses Voronoi diagrams to split the data space and calculate Isolation + This version uses iforest to split the data space and calculate Isolation kernel Similarity. Based on this implementation, the feature in the Isolation kernel space is the index of the cell in Voronoi diagrams. Each point is represented as a binary vector such that only the cell the point falling @@ -35,21 +41,13 @@ class IK_ANNE(TransformerMixin, BaseEstimator): n_estimators : int The number of base estimators in the ensemble. - max_samples : int The number of samples to draw from X to train each base estimator. - - If int, then draw `max_samples` samples. - - If float, then draw `max_samples` * X.shape[0]` samples. - - If "auto", then `max_samples=min(8, n_samples)`. - random_state : int, RandomState instance or None, default=None Controls the pseudo-randomness of the selection of the feature and split values for each branching step and each tree in the forest. - Pass an int for reproducible results across multiple function calls. - See :term:`Glossary `. - References ---------- .. [1] Qin, X., Ting, K.M., Zhu, Y. and Lee, V.C. @@ -57,10 +55,14 @@ class IK_ANNE(TransformerMixin, BaseEstimator): In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 33, 2019, July, pp. 4755-4762 """ - def __init__(self, n_estimators, max_samples, random_state=None) -> None: + def __init__(self, n_estimators, max_samples, random_state=None): self.n_estimators = n_estimators self.max_samples = max_samples self.random_state = random_state + self.max_samples_ = None + self._seeds = None + self._radius = None + self._centroids = None def fit(self, X, y=None): """Fit the model on data X. @@ -72,25 +74,31 @@ def fit(self, X, y=None): ------- self : object """ - X = check_array(X) self.max_samples_ = self.max_samples - n_samples = X.shape[0] - self.max_samples = min(self.max_samples_, n_samples) + n_samples, n_features = X.shape + self.max_samples_ = min(self.max_samples_, n_samples) + + self._centroids = np.empty((self.n_estimators, self.max_samples_, n_features)) + self._radius = np.empty((self.n_estimators, self.max_samples_)) random_state = check_random_state(self.random_state) self._seeds = random_state.randint(MAX_INT, size=self.n_estimators) for i in range(self.n_estimators): rnd = check_random_state(self._seeds[i]) - center_index = rnd.choice(n_samples, self.max_samples_, replace=False) - if i == 0: - self.center_index_set = np.array([center_index]) - else: - self.center_index_set = np.append( - self.center_index_set, np.array([center_index]), axis=0 - ) - self.unique_index = np.unique(self.center_index_set) - self.center_data = X[self.unique_index] + centroid_index = rnd.choice(n_samples, self.max_samples_, replace=False) + self._centroids[i] = X[centroid_index] + # radius of each hypersphere is the Nearest Neighbors distance of centroid. + nn_neighbors, _ = ArgKmin.compute( + X=self._centroids[i], + Y=self._centroids[i], + k=2, + metric="sqeuclidean", + metric_kwargs={}, + strategy="auto", + return_distance=True, + ) + self._radius[i] = nn_neighbors[:, 1] self.is_fitted_ = True return self @@ -104,22 +112,26 @@ def transform(self, X): Returns ------- The finite binary features based on the kernel feature map. - The features are organised as a n_instances by psi*t matrix. + The features are organized as a n_instances by n_estimators*t matrix. """ - check_is_fitted(self) X = check_array(X) n, m = X.shape - X_dists = euclidean_distances(X, self.center_data) - embedding = np.zeros([n, self.max_samples_ * self.n_estimators]) - - for i in range(n): - mapping_array = np.zeros(self.unique_index.max() + 1, dtype=X_dists.dtype) - mapping_array[self.unique_index] = X_dists[i] - x_center_dist_mat = mapping_array[self.center_index_set] - nearest_center_index = np.argmin(x_center_dist_mat, axis=1) - flatten_index = nearest_center_index + self.max_samples_ * np.array( - [range(self.n_estimators)] + embedding = None + for i in range(self.n_estimators): + nearest_index, nearest_values = pairwise_distances_argmin_min( + X, self._centroids[i], metric="euclidean", axis=1 ) - embedding[i][flatten_index] = 1.0 + # filter out of ball + out_index = np.array(range(n))[ + nearest_values > self._radius[i][nearest_index] + ] + ik_value = np.eye(self.max_samples)[nearest_index] + ik_value[out_index] = 0 + + ik_value_sparse = sparse.csr_matrix(ik_value) + if embedding is None: + embedding = ik_value_sparse + else: + embedding = sparse.hstack((embedding, ik_value_sparse)) return embedding diff --git a/IsoML/kernel/_isodiskernel.py b/pyikt/kernel/_isodiskernel.py similarity index 81% rename from IsoML/kernel/_isodiskernel.py rename to pyikt/kernel/_isodiskernel.py index b12b977..c6ee633 100644 --- a/IsoML/kernel/_isodiskernel.py +++ b/pyikt/kernel/_isodiskernel.py @@ -1,15 +1,20 @@ """ -Copyright 2024 Xin Han. All rights reserved. -Use of this source code is governed by a BSD-style -license that can be found in the LICENSE file. +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . """ +import math +import numpy as np +import scipy.sparse as sp from sklearn.base import BaseEstimator, TransformerMixin -from isoml.kernel import IsoKernel from sklearn.utils import check_array from sklearn.utils.validation import check_is_fitted -import numpy as np -import math +from pyikt.kernel import IsoKernel class IsoDisKernel(BaseEstimator, TransformerMixin): @@ -50,13 +55,14 @@ class IsoDisKernel(BaseEstimator, TransformerMixin): Examples -------- - >>> from IsoKernel import IsoDisKernel + >>> from pyikt.kernel import IsoDisKernel >>> import numpy as np >>> X = [[0.4,0.3], [0.3,0.8], [0.5,0.4], [0.5,0.1]] - >>> idk = IsoDisKernel.fit(X) + >>> idk = IsoDisKernel(max_samples=3,).fit(X) >>> D_i = [[0.4,0.3], [0.3,0.8]] >>> D_j = [[0.5, 0.4], [0.5, 0.1]] >>> idk.similarity(D_j, D_j) + 1.0 """ def __init__( @@ -81,20 +87,23 @@ def fit(self, X): iso_kernel = IsoKernel( self.method, self.n_estimators, self.max_samples, self.random_state ) - self.iso_kernel = iso_kernel.fit(X) + self.iso_kernel_ = iso_kernel.fit(X) self.is_fitted_ = True return self - def kernel_mean_embedding(self, X): + def kernel_mean(self, X): + """Compute the kernel mean embedding of X.""" + if sp.issparse(X): + return np.asarray(X.mean(axis=0)).ravel() return np.mean(X, axis=0) - def kme_similarity(self, kme_D_i, kme_D_j, is_normalize=False): + def kme_similarity(self, kme_D_i, kme_D_j, dense_output=True, is_normalize=False): if is_normalize: return np.dot(kme_D_i, kme_D_j) / ( math.sqrt(np.dot(kme_D_i, kme_D_i)) * math.sqrt(np.dot(kme_D_j, kme_D_j)) ) - return np.dot(kme_D_i, kme_D_j) / self.n_estimators + return np.dot(kme_D_i, kme_D_j, dense_output=dense_output) / self.n_estimators def similarity(self, D_i, D_j, is_normalize=True): """Compute the isolation distribution kernel of D_i and D_j. @@ -110,9 +119,7 @@ def similarity(self, D_i, D_j, is_normalize=True): The Isolation distribution similarity of given two dataset. """ emb_D_i, emb_D_j = self.transform(D_i, D_j) - kme_D_i, kme_D_j = self.kernel_mean_embedding( - emb_D_i - ), self.kernel_mean_embedding(emb_D_j) + kme_D_i, kme_D_j = self.kernel_mean(emb_D_i), self.kernel_mean(emb_D_j) return self.kme_similarity(kme_D_i, kme_D_j, is_normalize=is_normalize) def transform(self, D_i, D_j): @@ -131,4 +138,4 @@ def transform(self, D_i, D_j): check_is_fitted(self) D_i = check_array(D_i) D_j = check_array(D_j) - return self.iso_kernel.transform(D_i), self.iso_kernel.transform(D_j) + return self.iso_kernel_.transform(D_i), self.iso_kernel_.transform(D_j) diff --git a/IsoML/kernel/_isokernel.py b/pyikt/kernel/_isokernel.py similarity index 76% rename from IsoML/kernel/_isokernel.py rename to pyikt/kernel/_isokernel.py index 08f74d1..05cb78a 100644 --- a/IsoML/kernel/_isokernel.py +++ b/pyikt/kernel/_isokernel.py @@ -1,23 +1,29 @@ """ -Copyright 2024 Xin Han. All rights reserved. -Use of this source code is governed by a BSD-style -license that can be found in the LICENSE file. +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . """ import numbers from warnings import warn - -import numpy as np -from sklearn.base import BaseEstimator, TransformerMixin +import scipy.sparse as sp from sklearn.utils import check_array from sklearn.utils.validation import check_is_fitted -from ._ik_anne import IK_ANNE -from ._ik_iforest import IK_IForest -from ._ik_inne import IK_INNE +from sklearn.utils.extmath import safe_sparse_dot +from sklearn.base import BaseEstimator, TransformerMixin +from pyikt.kernel._ik_anne import IK_ANNE +from pyikt.kernel._ik_iforest import IK_IForest +from pyikt.kernel._ik_inne import IK_INNE class IsoKernel(TransformerMixin, BaseEstimator): - """Build Isolation Kernel feature vector representations via the feature map + """Isolation Kernel. + + Build Isolation Kernel feature vector representations via the feature map for a given dataset. Isolation kernel is a data dependent kernel measure that is @@ -25,12 +31,6 @@ class IsoKernel(TransformerMixin, BaseEstimator): the characteristics of the local data distribution. It has been shown promising performance on density and distance-based classification and clustering problems. - This version uses Voronoi diagrams to split the data space and calculate Isolation - kernel Similarity. Based on this implementation, the feature - in the Isolation kernel space is the index of the cell in Voronoi diagrams. Each - point is represented as a binary vector such that only the cell the point falling - into is 1. - Parameters ---------- method : str, default="anne" @@ -62,12 +62,12 @@ class IsoKernel(TransformerMixin, BaseEstimator): Examples -------- - >>> from IsoKernel import IsoKernel + >>> from pyikt.kernel import IsoKernel >>> import numpy as np >>> X = [[0.4,0.3], [0.3,0.8], [0.5, 0.4], [0.5, 0.1]] - >>> ik = IsoKernel.fit(X) - >>> ik.transform(X) - >>> ik.similarity(X) + >>> ik = IsoKernel().fit(X) + >>> X_trans = ik.transform(X) + >>> X_sim = ik.similarity(X) """ def __init__( @@ -141,26 +141,34 @@ def fit(self, X, y=None): self.is_fitted_ = True return self - def similarity(self, X): - """Compute the isolation kernel pairwise simalarity matrix of X. + def similarity(self, X, dense_output=True): + """Compute the isolation kernel similarity matrix of X. Parameters ---------- X: array-like of shape (n_instances, n_features) The input instances. + dense_output: bool, default=True + Whether to return dense matrix of output. Returns ------- The simalarity matrix are organised as a n_instances * n_instances matrix. """ - + check_is_fitted(self) + X = check_array(X) embed_X = self.transform(X) - return np.inner(embed_X, embed_X) / self.n_estimators + return ( + safe_sparse_dot(embed_X, embed_X.T, dense_output=dense_output) + / self.n_estimators + ) - def transform(self, X): + def transform(self, X, dense_output=False): """Compute the isolation kernel feature of X. Parameters ---------- X: array-like of shape (n_instances, n_features) The input instances. + dense_output: bool, default=False + Whether to return dense matrix of output. Returns ------- The finite binary features based on the kernel feature map. @@ -169,4 +177,10 @@ def transform(self, X): check_is_fitted(self) X = check_array(X) - return self.iso_kernel_.transform(X) + X_trans = self.iso_kernel_.transform(X) + if dense_output: + if sp.issparse(X_trans) and hasattr(X_trans, "toarray"): + return X_trans.toarray() + else: + warn("The IsoKernel transform output is already dense.") + return X_trans diff --git a/pyikt/kernel/tests/__init__.py b/pyikt/kernel/tests/__init__.py new file mode 100644 index 0000000..3c5155b --- /dev/null +++ b/pyikt/kernel/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. diff --git a/pyikt/kernel/tests/test_isodiskernel.py b/pyikt/kernel/tests/test_isodiskernel.py new file mode 100644 index 0000000..69d9df9 --- /dev/null +++ b/pyikt/kernel/tests/test_isodiskernel.py @@ -0,0 +1,48 @@ +""" +Copyright 2024 Xin Han. All rights reserved. +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file. +""" + +from sklearn.datasets import load_iris +from pyikt.kernel import IsoDisKernel +import pytest + +method = ["inne", "anne"] + + +@pytest.fixture +def data(): + return load_iris(return_X_y=True) + + +@pytest.mark.parametrize("method", method) +def test_IsoDisKernel_fit(data, method): + X = data[0] + idk = IsoDisKernel(method=method, n_estimators=200) + idk.fit(X) + assert idk.is_fitted_ + + +@pytest.mark.parametrize("method", method) +def test_IsoDisKernel_similarity(data, method): + X = data[0] + idk = IsoDisKernel(method=method, n_estimators=200) + idk.fit(X) + D_i = X[:10] + D_j = X[-10:] + similarity = idk.similarity(D_i, D_j) + assert similarity == 0.0 + + +@pytest.mark.parametrize("method", method) +def test_IsoDisKernel_transform(data, method): + X = data[0] + max_samples = 16 + idk = IsoDisKernel(method=method, n_estimators=200, max_samples=max_samples) + idk.fit(X) + D_i = X[:10] + D_j = X[-10:] + transformed_D_i, transformed_D_j = idk.transform(D_i, D_j) + assert transformed_D_i.shape == (10, idk.n_estimators * max_samples) + assert transformed_D_j.shape == (10, idk.n_estimators * max_samples) diff --git a/IsoML/kernel/tests/test_isokernel.py b/pyikt/kernel/tests/test_isokernel.py similarity index 53% rename from IsoML/kernel/tests/test_isokernel.py rename to pyikt/kernel/tests/test_isokernel.py index bce9e78..0854154 100644 --- a/IsoML/kernel/tests/test_isokernel.py +++ b/pyikt/kernel/tests/test_isokernel.py @@ -5,33 +5,39 @@ """ from sklearn.datasets import load_iris -from isoml.kernel._isokernel import IsoKernel +from pyikt import IsoKernel import pytest +method = ["inne", "anne"] + @pytest.fixture def data(): return load_iris(return_X_y=True) -def test_IsoKernel_fit(data): +@pytest.mark.parametrize("method", method) +def test_IsoKernel_fit(data, method): X = data[0] - ik = IsoKernel(method="anne", n_estimators=200, max_samples="auto") + ik = IsoKernel(method=method, n_estimators=200) ik.fit(X) assert ik.is_fitted_ -def test_IsoKernel_similarity(data): +@pytest.mark.parametrize("method", method) +def test_IsoKernel_similarity(data, method): X = data[0] - ik = IsoKernel(method="anne", n_estimators=200, max_samples="auto") + ik = IsoKernel(method=method, n_estimators=200) ik.fit(X) similarity = ik.similarity(X) assert similarity.shape == (X.shape[0], X.shape[0]) -def test_IsoKernel_transform(data): +@pytest.mark.parametrize("method", method) +def test_IsoKernel_transform(data, method): X = data[0] - ik = IsoKernel(method="anne", n_estimators=200, max_samples="auto") + max_samples = 16 + ik = IsoKernel(method=method, max_samples=max_samples) ik.fit(X) transformed_X = ik.transform(X) - assert transformed_X.shape == (X.shape[0], ik.n_estimators * ik.max_samples_) + assert transformed_X.shape == (X.shape[0], ik.n_estimators * max_samples) diff --git a/pyikt/stream/__init__.py b/pyikt/stream/__init__.py new file mode 100644 index 0000000..f8f4122 --- /dev/null +++ b/pyikt/stream/__init__.py @@ -0,0 +1,19 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from .changedetect._icid import ICID +from .cluster._streakhc import STREAMKHC + +# from .cluster._streaKHC import StreaKHC + +__all__ = [ + "ICID", + "STREAMKHC", +] diff --git a/pyikt/stream/changedetect/__init__.py b/pyikt/stream/changedetect/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyikt/stream/changedetect/_icid.py b/pyikt/stream/changedetect/_icid.py new file mode 100644 index 0000000..0df2c9e --- /dev/null +++ b/pyikt/stream/changedetect/_icid.py @@ -0,0 +1,294 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from sklearn.base import BaseEstimator +from sklearn.utils.validation import check_is_fitted +from sklearn.utils import check_array +from pyikt.kernel import IsoDisKernel +from scipy.stats import entropy + + +class ICID(BaseEstimator): + """Isolate Change Interval Detection for monitoring data stream distribution changes. + + ICID (Isolate Change Interval Detection) is designed to detect intervals in a data stream + where significant distribution changes occur. It leverages isolation-based methods to + measure similarity between consecutive data windows, identifying points where the + underlying distribution shifts. The algorithm adaptively selects the best sampling + parameters for isolation kernels based on stability metrics. + + Parameters + ---------- + n_estimators : int, default=200 + The number of base estimators in the isolation distribution kernel. + + max_samples_list : list of int, default=[2, 4, 8, 16, 32, 64] + List of candidate values for max_samples parameter. The algorithm will + select the value that yields the most stable isolation kernel. + + method : {'inne', 'anne'}, default='inne' + The isolation method to use for the kernel. + + - 'inne': Isolation-based Nearest Neighbor Ensemble + - 'anne': Approximate Nearest Neighbor Ensemble + + stability_method : {'entropy', 'variance', 'mean'}, default='entropy' + Method used to evaluate the stability of interval scores. + + - 'entropy': Use information entropy as stability measure + - 'variance': Use variance as stability measure + - 'mean': Use mean value as stability measure + + window_size : int, default=10 + The size of the sliding window for batch detection. + + adjust_rate : float, default=0.1 + Rate to adjust the threshold for anomaly detection based on + standard deviation of interval scores. + + contamination : 'auto' or float, default='auto' + The proportion of outliers in the data set. Used when fitting to define + the threshold on interval scores. + + random_state : int, RandomState instance or None, default=None + Controls the randomness of the estimator. + + Attributes + ---------- + best_iso_kernel_ : IsoDisKernel + The fitted isolation kernel with the best stability score. + + best_stability_score_ : float + The stability score of the best isolation kernel. + + interval_score_ : array-like of shape (n_intervals,) + The dissimilarity scores between consecutive intervals. + + best_max_samples_ : int + The max_samples parameter of the best isolation kernel. + + pre_interval_ : array-like + The last interval from the training data, used for online prediction. + + References + ---------- + .. [1] Y. Cao, Y. Zhu, K. M. Ting, F. D. Salim, H. X. Li, L. Yang, G. Li (2024). + Detecting change intervals with isolation distributional kernel. + Journal of Artificial Intelligence Research, 79:273–306. + + Examples + -------- + >>> from pyikt.stream import ICID + >>> import numpy as np + >>> np.random.seed(42) + >>> X_normal1 = np.random.randn(50, 2) + >>> X_anomaly = np.random.randn(10, 2) * 5 + 10 # Different distribution + >>> X_normal2 = np.random.randn(20, 2) + >>> X = np.vstack([X_normal1, X_anomaly, X_normal2]) + >>> icid = ICID( n_estimators=50, max_samples_list=[4, 8], window_size=10, random_state=42) + >>> # Batch predictions + >>> icid.fit_predict_batch(X) + array([ 1, 1, 1, 1, -1, -1, 1]) + >>> X_anomaly = np.random.randn(10, 2) * 5 + 10 + >>> X_normal = np.random.randn(10, 2) + >>> # Predict on new data online + >>> icid.predict_online(X_normal) + 1 + >>> icid.predict_online(X_anomaly) + -1 + """ + + def __init__( + self, + n_estimators=200, + max_samples_list=[2, 4, 8, 16, 32, 64], + method="inne", + stability_method="entropy", + adjust_rate=0.1, + contamination="auto", + window_size=10, + random_state=None, + ): + self.n_estimators = n_estimators + self.max_samples_list = max_samples_list + self.method = method + self.stability_method = stability_method + self.contamination = contamination + self.window_size = window_size + self.random_state = random_state + self.adjust_rate = adjust_rate + self.best_iso_kernel_ = None + self.pre_interval_ = None + self.interval_score_ = None + self.best_stability_score_ = float("inf") + + def fit(self, X, y=None): + """Fit the model on data X in batch mode. + + Parameters + ---------- + X : np.array of shape (n_samples, n_features) + The input instances. + Returns + ------- + self : object + """ + X = check_array(X) + for max_samples in self.max_samples_list: + isodiskernel = IsoDisKernel( + n_estimators=self.n_estimators, + max_samples=max_samples, + random_state=self.random_state, + method=self.method, + ) + isodiskernel.fit(X) + interval_scores = self._interval_score(X, isodiskernel, self.window_size) + stability_score = self._stability_score(interval_scores) + if stability_score < self.best_stability_score_: + self.best_iso_kernel_ = isodiskernel + self.best_stability_score_ = stability_score + self.interval_score_ = interval_scores + self.is_fitted_ = True + return self + + def fit_predict_batch(self, X): + """Fit the model on data X and predict anomalies in batch mode. + + Parameters + ---------- + X : np.array of shape (n_samples, n_features) + The input instances. + window_size : int, default=10 + The size of the sliding window. + + Returns + ------- + is_inlier : np.array of shape (n_intervals,) + Returns 1 for inliers and -1 for outliers. + """ + self.fit(X) + is_inlier = np.ones(len(self.interval_score_), dtype=int) + threshold = self._determine_anomaly_bounds() + is_inlier[self.interval_score_ > threshold] = ( + -1 + ) # Higher scores indicate change + return is_inlier + + def predict_online(self, X): + """Predict if the new data represents a change from the previous interval. + + Parameters + ---------- + X : np.array of shape (n_samples, n_features) + The new data interval to evaluate. + + Returns + ------- + int : 1 for normal (inlier), -1 for change detected (outlier) + """ + check_is_fitted(self, ["best_iso_kernel_", "pre_interval_", "interval_score_"]) + X = check_array(X) + anomaly_score = 1.0 - self.best_iso_kernel_.similarity(self.pre_interval_, X) + self.interval_score_.append(anomaly_score) + self.pre_interval_ = X + + threshold = self._determine_anomaly_bounds() + return 1 if anomaly_score <= threshold else -1 + + @property + def best_stability_score(self): + """Get the best stability score found during fitting.""" + check_is_fitted(self, ["best_stability_score_"]) + return self.best_stability_score_ + + @property + def best_iso_kernel(self): + """Get the isolation kernel with the best stability.""" + check_is_fitted(self, ["best_iso_kernel_"]) + return self.best_iso_kernel_ + + @property + def best_max_samples(self): + """Get the max_samples parameter of the best isolation kernel.""" + check_is_fitted(self, ["best_iso_kernel_"]) + return self.best_iso_kernel_.max_samples + + def _stability_score(self, scores): + """Calculate stability score based on the chosen method. + + Parameters + ---------- + scores : np.array + Array of interval scores. + + Returns + ------- + float : stability score + """ + if len(scores) <= 1: + return float("inf") + + if self.stability_method == "entropy": + # Normalize scores for entropy calculation + norm_scores = np.array(scores) / np.sum(scores) + return entropy(norm_scores) + elif self.stability_method == "variance": + return np.var(scores) + elif self.stability_method == "mean": + return np.mean(scores) + else: + raise ValueError(f"Unknown stability method: {self.stability_method}") + + def _interval_score(self, X, isodiskernel, window_size): + """Calculate dissimilarity scores between consecutive intervals. + + Parameters + ---------- + X : np.array of shape (n_samples, n_features) + The input instances. + isodiskernel : IsoDisKernel + The isolation kernel to use. + window_size : int + The size of the sliding window. + + Returns + ------- + interval_scores : list of float + Dissimilarity scores between consecutive intervals. + """ + n_samples = X.shape[0] + batch_X = [ + X[i : i + window_size] + for i in range(0, n_samples - window_size + 1, window_size) + ] + + if len(batch_X) <= 1: + return [] + + interval_scores = [] + for i in range(len(batch_X) - 1): + interval_scores.append( + 1.0 - isodiskernel.similarity(batch_X[i], batch_X[i + 1]) + ) + self.pre_interval_ = batch_X[-1] + return interval_scores + + def _determine_anomaly_bounds(self): + """Determine the threshold for anomaly detection. + + Returns + ------- + float : threshold value + """ + mean_score = np.mean(self.interval_score_) + std_score = np.std(self.interval_score_) + threshold = mean_score + self.adjust_rate * std_score + return threshold diff --git a/pyikt/stream/cluster/__init__.py b/pyikt/stream/cluster/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyikt/stream/cluster/_inode.py b/pyikt/stream/cluster/_inode.py new file mode 100644 index 0000000..328185d --- /dev/null +++ b/pyikt/stream/cluster/_inode.py @@ -0,0 +1,372 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import math +import random +import string +from collections import defaultdict, deque +from typing import List, Tuple, Dict, Optional, Any, Union, Set + +import numpy as np +from numba import jit + + +@jit(nopython=True) +def _fast_dot(x, y): + """Compute the dot product of x and y using numba. + + Args: + x: a numpy vector (or list) + y: a numpy vector (or list) + + Returns: + x_T.y: dot product result + """ + return np.dot(x, y) + + +def _normalized_dot_product(v1, v2, t: float = 1.0): + """Calculate normalized dot product between two vectors. + + Args: + v1: First vector + v2: Second vector + t: Scaling parameter + + Returns: + Normalized dot product + """ + v1_norm = math.sqrt(_fast_dot(v1, v1)) + v2_norm = math.sqrt(_fast_dot(v2, v2)) + return _fast_dot(v1, v2) / (t * v1_norm * v2_norm) + + +class INODE: + """Isolation hierarchical clustering node.""" + + def __init__(self): + self.id = "id" + "".join( + random.choice(string.ascii_uppercase + string.digits) for _ in range(15) + ) + self.children: List["INODE"] = [] + self.parent: Optional["INODE"] = None + self.pts: List[Tuple] = [] # each pt is a tuple of (label, id) + self.ikv = None # Isolation kernel value + self.point_counter: int = 0 + + def __lt__(self, other: "INODE") -> bool: + """An arbitrary way to determine an order when comparing 2 nodes.""" + return self.id < other.id + + def insert(self, p_id, p_label, p_ik, t: float = 200): + """Insert a new pt into the tree. + + Apply recurse masking and balance rotations where appropriate. + + Args: + pt: a tuple of numpy array, class label, point id + delete_node: whether to delete nodes when over capacity + L: maximum number of leaves in the tree + t: parameter of isolation kernel + + Returns: + A pointer to the root. + """ + pt = (p_label, p_id, p_ik) + if self.pts is not None and len(self.pts) == 0: + self.add_pt(pt[:2]) + self.ikv = pt[2] + return self + else: + curr_node = self.root() + x_ik = pt[2].astype(float) + curr_node = self._find_closest_leaf(t, curr_node, x_ik) + new_leaf = curr_node._split_down(pt) + new_leaf._add_node_value_recursively(pt) + return new_leaf.root() + + def _find_closest_leaf(self, t, curr_node, x_ik): + """Find the closest leaf to the given point.""" + while curr_node.is_internal(): + chl_ik = curr_node.children[0].ikv.astype(float) + chr_ik = curr_node.children[1].ikv.astype(float) + + x_dot_chl = _normalized_dot_product(x_ik, chl_ik, t) + x_dot_chr = _normalized_dot_product(x_ik, chr_ik, t) + + if x_dot_chl >= x_dot_chr: + curr_node = curr_node.children[0] + else: + curr_node = curr_node.children[1] + return curr_node + + def delete(self): + """Delete a point from the tree and reorganize structure. + + Returns: + Updated root node + """ + current_node = self.root() + if not current_node.pts: + return current_node + pt_id = current_node.pts[0] + current_node = self._find_and_delete_point(current_node, pt_id) + current_node._delete_ancestors_ikv() + sibling_node = current_node.siblings()[0] if current_node.siblings() else None + if not sibling_node: + return current_node # No siblings, return self + parent_node = current_node.parent + if parent_node and parent_node.parent: + parent_node.parent.children.remove(parent_node) + parent_node.parent.add_child(sibling_node) + return self.root() + else: + # Parent node is root, make sibling the new root + sibling_node.parent = None + return sibling_node + + def _delete_ancestors_ikv(self): + ancs = self._ancestors() + for a in ancs: + if a.ikv is not None and self.ikv is not None: + a.ikv = a.ikv - self.ikv + + def _find_and_delete_point(self, current_node, pt_id): + while current_node.is_internal(): + current_node.pts.remove(pt_id) + # assert (p_id in curr_node.children[0].pts[0]) != (p_id in curr_node.children[1].pts[0]), "Except: Exsiting only in one subtree, \ + # Get: %s %s" % (p_id in curr_node.children[0].pts[0], + # p_id in curr_node.children[1].pts[0]) + if pt_id in current_node.children[0].pts: + current_node = current_node.children[0] + elif pt_id in current_node.children[1].pts: + current_node = current_node.children[1] + else: + # Point not found in either child + break + return current_node + + def _add_ik_value(self): + """Update isolation kernel value based on children's values. + + Returns: + Updated node + """ + if self.children: + if len(self.children) == 1: + self.ikv = self.children[0].ikv + else: + self.ikv = self.children[0].ikv + self.children[1].ikv + return self + + def _add_node_value_recursively(self, pt): + """Update a node's parameters recursively up to the root. + + Returns: + A pointer to the root. + """ + current_node = self + while current_node.parent: + current_node.parent.add_pt(pt[:2]) + current_node.parent._add_ik_value() + current_node = current_node.parent + return current_node + + def add_child(self, new_child: "INODE") -> "INODE": + """Add a INode as a child of this node. + + Args: + new_child: a INode to add as a child + + Returns: + A pointer to self with modifications + """ + new_child.parent = self + self.children.append(new_child) + return self + + def add_pt(self, pt) -> "INODE": + """Add a data point to this node. + + Args: + pt: the data point to add + + Returns: + A pointer to this node + """ + self.point_counter += 1 + if self.pts is not None: + self.pts.append(pt) + return self + + def _split_down(self, pt): + """Create a new node for pt and a new parent with self and pt as children. + + Args: + pt: the pt to be added + + Returns: + A pointer to the new node containing pt + """ + new_internal_node = INODE() + if self.pts is not None: + new_internal_node.pts = self.pts[:] # Copy points to the new node + else: + new_internal_node.pts = None + new_internal_node.point_counter = self.point_counter + + if self.parent: + self.parent.add_child(new_internal_node) + self.parent.children.remove(self) + new_internal_node.add_child(self) + else: + new_internal_node.add_child(self) + + new_leaf_node = INODE() + new_leaf_node.ikv = pt[2] + new_leaf_node.add_pt(pt[:2]) # This updates the points counter + new_internal_node.add_child(new_leaf_node) + return new_leaf_node + + def purity(self, cluster=None): + """Compute the purity of this node. + + Args: + cluster: (optional) str, compute purity with respect to this cluster + + Returns: + A float representing the purity of this node + """ + if cluster: + pts = [p for l in self.leaves() for p in l.pts] + return ( + float(len([pt for pt in pts if pt[0] == cluster])) / len(pts) + if pts + else 0 + ) + else: + label_to_count = self.class_counts() + + total = sum(label_to_count.values()) + return max(label_to_count.values()) / total if total > 0 else 0 + + def clusters(self): + """Return all clusters (true leaves) in the tree. + + Returns: + List of leaf nodes + """ + return self.true_leaves() + + def class_counts(self) -> Dict: + """Produce a map from label to the # of descendant points with label.""" + label_to_count = defaultdict(float) + pts = [p for l in self.leaves() for p in l.pts] + for x in pts: + l, _ = x + label_to_count[l] += 1.0 + return label_to_count + + def pure_class(self): + """If this node has purity 1.0, return its label; else return None.""" + cc = self.class_counts() + if len(cc) == 1: + return list(cc.keys())[0] + else: + return None + + def siblings(self) -> List["INODE"]: + """Return a list of my siblings.""" + if self.parent: + return [child for child in self.parent.children if child != self] + else: + return [] + + def aunts(self) -> List["INODE"]: + """Return a list of all of my aunts.""" + if self.parent and self.parent.parent: + return [ + child for child in self.parent.parent.children if child != self.parent + ] + else: + return [] + + def _ancestors(self) -> List["INODE"]: + """Return all of this nodes ancestors in order to the root.""" + anc = [] + curr = self + while curr.parent: + anc.append(curr.parent) + curr = curr.parent + return anc + + def depth(self) -> int: + """Return the number of ancestors on the root to leaf path.""" + return len(self._ancestors()) + + def height(self) -> int: + """Return the height of this node (maximum depth of any leaf).""" + leaves = self.leaves() + return max([l.depth() for l in leaves]) if leaves else 0 + + def descendants(self) -> List["INODE"]: + """Return all descendants of the current node.""" + d = [] + queue = deque([self]) + while queue: + n = queue.popleft() + d.append(n) + if n.children: + queue.extend(n.children) + return d + + def leaves(self) -> List["INODE"]: + """Return the list of leaves under this node.""" + lvs = [] + queue = deque([self]) + while queue: + n = queue.popleft() + if n.children: + queue.extend(n.children) + else: + lvs.append(n) + return lvs + + def lca(self, other: "INODE") -> "INODE": + """Compute the lowest common ancestor between this node and other. + + Args: + other: a node in the tree + + Returns: + A node that is the lowest common ancestor + """ + ancestors = set(self._ancestors() + [self]) + curr_node = other + while curr_node not in ancestors: + if not curr_node.parent: + break # No common ancestor found + curr_node = curr_node.parent + return curr_node + + def root(self) -> "INODE": + """Return the root of the tree.""" + curr_node = self + while curr_node.parent: + curr_node = curr_node.parent + return curr_node + + def is_leaf(self) -> bool: + """Returns true if self is a leaf, else false.""" + return len(self.children) == 0 + + def is_internal(self) -> bool: + """Returns false if self is a leaf, else true.""" + return not self.is_leaf() diff --git a/pyikt/stream/cluster/_streakhc.py b/pyikt/stream/cluster/_streakhc.py new file mode 100644 index 0000000..ce9e00d --- /dev/null +++ b/pyikt/stream/cluster/_streakhc.py @@ -0,0 +1,283 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from __future__ import annotations + +from sklearn.base import BaseEstimator, ClusterMixin +from sklearn.utils.validation import check_is_fitted, check_X_y, check_array +from typing import Optional, Union, Any, Literal +import numpy as np + +from ._inode import INODE +from pyikt.kernel import IsoKernel +from .utils.dendrogram_purity import dendrogram_purity +from .utils.Graphviz import Graphviz +from .utils.serialize_trees import serliaze_tree_to_file + + +class STREAMKHC(BaseEstimator, ClusterMixin): + """Streaming Hierarchical Clustering Based on Point-Set Kernel. + + This algorithm performs hierarchical clustering on streaming data using + isolation kernel techniques. It builds a tree structure that adapts as new + data points arrive, allowing for efficient online clustering. + + Parameters + ---------- + method : str, default="anne" + The method used to calculate the Isolation Kernel. Possible values are 'inne' and 'anne'. + + n_estimators : int, default=200 + The number of base estimators in the isolation kernel. + + max_samples : str, int or float, default="auto" + The number of samples to draw from X to train each base estimator. + - If int, then draw `max_samples` samples. + - If float, then draw `max_samples * X.shape[0]` samples. + - If "auto", then `max_samples=min(8, n_samples)`. + + max_leaf : int, default=5000 + Maximum number of data points to maintain in the clustering tree. + When exceeded, the oldest points will be removed. + + random_state : int, RandomState instance or None, default=None + Controls the randomness of the estimator. + + Attributes + ---------- + tree_ : INODE + The root node of the hierarchical clustering tree. + + iso_kernel_ : IsoKernel + The isolation kernel used for data transformation. + + point_counter_ : int + Counter tracking the total number of points processed. + + n_features_in_ : int + Number of features seen during fit. + + Examples + -------- + >>> from pyikt.stream import STREAMKHC + >>> import numpy as np + >>> # Generate sample data + >>> X = np.random.rand(100, 10) # 100 samples with 10 features + >>> y = np.random.randint(0, 3, size=100) # Optional class labels + >>> # Initialize and fit the model with a batch + >>> clusterer = STREAMKHC(n_estimators=100, random_state=42) + >>> clusterer = clusterer.fit(X, y) + >>> # Process new streaming data + >>> new_data = np.random.rand(1, 10) # 10 new samples + >>> new_labels = np.random.randint(0, 3, size=1) # Optional class labels + >>> clusterer = clusterer.fit_online(new_data, new_labels) + >>> # Calculate clustering purity (if labels were provided) + >>> purity = clusterer.get_purity() + + References + ---------- + .. [1] Xin Han, Ye Zhu, Kai Ming Ting, De-Chuan Zhan, Gang Li (2022) + Streaming Hierarchical Clustering Based on Point-Set Kernel. + Proceedings of The ACM SIGKDD Conference on Knowledge Discovery and Data Mining. + """ + + def __init__( + self, + method: Literal["inne", "anne"] = "anne", + n_estimators: int = 200, + max_samples: Union[Literal["auto"], int, float] = "auto", + max_leaf: int = 5000, + random_state: Optional[Union[int, np.random.RandomState]] = None, + ): + self.method = method + self.n_estimators = n_estimators + self.max_samples = max_samples + self.max_leaf = max_leaf + self.random_state = random_state + self.tree_ = None + self.point_counter_ = 0 + self.iso_kernel_ = None + self.n_features_in_ = None + + def fit(self, X: np.ndarray, y: Optional[np.ndarray] = None) -> STREAMKHC: + """Fit the model with a batch of data points. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input data points. + y : array-like of shape (n_samples,), optional (default=None) + The labels of the data points. + Not used in clustering processing, just for calculating purity. + If not provided, the model will generate a tree with a single label. + + Returns + ------- + self : STREAMKHC + Returns self. + + Raises + ------ + ValueError + If parameters are invalid or data has incorrect shape. + """ + + if isinstance(self.max_leaf, int) and self.max_leaf <= 0: + raise ValueError(f"max_leaf must be positive, got {self.max_leaf}") + + # Process input data + X = check_array(X, accept_sparse=False) + if y is None: + y = np.ones(X.shape[0], dtype=np.int64) + else: + X, y = check_X_y(X, y, accept_sparse=False) + + self.n_features_in_ = X.shape[1] + self._initialize_tree(X, y) + return self + + def _initialize_tree(self, X: np.ndarray, y: np.ndarray) -> None: + """Initialize the hierarchical clustering tree. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input data points. + y : array-like of shape (n_samples,) + The labels of the data points. + """ + self.point_counter_ = 0 + self.iso_kernel_ = IsoKernel( + method=self.method, + n_estimators=self.n_estimators, + max_samples=self.max_samples, + random_state=self.random_state, + ) + + # Fit and transform in one step for efficiency + self.iso_kernel_.fit(X) + X_ikv = self.iso_kernel_.transform(X, dense_output=True) + + # Initialize tree structure + self.tree_ = INODE() + self._process_batch(X_ikv, y) + + def _process_batch(self, X_ikv: np.ndarray, y: np.ndarray) -> None: + """Process a batch of transformed data points. + + Parameters + ---------- + X_ikv : array-like of shape (n_samples, n_features_transformed) + The transformed input data points. + y : array-like of shape (n_samples,) + The labels of the data points. + """ + for x, label in zip(X_ikv, y): + if self.point_counter_ >= self.max_leaf: + self.tree_ = self.tree_.delete() + self.tree_ = self.tree_.insert( + p_id=self.point_counter_, p_label=label, p_ik=x, t=self.n_estimators + ) + self.point_counter_ += 1 + + def fit_online(self, X: np.ndarray, y: Optional[np.ndarray] = None) -> STREAMKHC: + """Fit the model with a stream of data points. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + The input data points. + y : array-like of shape (n_samples,), optional (default=None) + The labels of the data points. + Not used in clustering processing, just for calculating purity. + If not provided, the model will generate a tree with a single label. + + Returns + ------- + self : STREAMKHC + Returns self. + + Raises + ------ + NotFittedError + If the model has not been initialized with fit. + ValueError + If X has a different number of features than seen during fit. + """ + # Check if model is fitted + check_is_fitted(self, ["tree_", "iso_kernel_", "n_features_in_"]) + + # Process input data + X = check_array(X, accept_sparse=False) + if y is None: + y = np.ones(X.shape[0], dtype=np.int64) + else: + X, y = check_X_y(X, y, accept_sparse=False) + + # Check feature consistency + if X.shape[1] != self.n_features_in_: + raise ValueError( + f"X has {X.shape[1]} features, but STREAMKHC was trained with {self.n_features_in_} features." + ) + + # Transform and process data + X_ikv = self.iso_kernel_.transform(X, dense_output=True) + self._process_batch(X_ikv, y) + return self + + def get_purity(self) -> float: + """Calculate the purity of the clustering tree. + + Returns + ------- + float + The purity score of the clustering tree. + + Raises + ------ + NotFittedError + If the model has not been initialized. + """ + check_is_fitted(self, ["tree_"]) + if self.tree_ is None: + return 0.0 + return dendrogram_purity(self.tree_) + + def serialize_tree(self, path: str) -> None: + """Serialize the clustering tree to a file. + + Parameters + ---------- + path : str + The file path to save the serialized tree. + + Raises + ------ + NotFittedError + If the model has not been initialized. + """ + check_is_fitted(self, ["tree_"]) + serliaze_tree_to_file(self.tree_, path) + + def visualize_tree(self, path: str) -> None: + """Visualize the clustering tree using Graphviz. + + Parameters + ---------- + path : str + The file path to save the visualization. + + Raises + ------ + NotFittedError + If the model has not been initialized. + """ + check_is_fitted(self, ["tree_"]) + Graphviz.write_tree(self.tree_, path) diff --git a/pyikt/stream/cluster/utils/Graphviz.py b/pyikt/stream/cluster/utils/Graphviz.py new file mode 100644 index 0000000..9fd756c --- /dev/null +++ b/pyikt/stream/cluster/utils/Graphviz.py @@ -0,0 +1,129 @@ +class Graphviz(object): + def __init__(self): + self.internal_color = "lavenderblush4" + self.colors = [ + "aquamarine", "bisque", "blue", "blueviolet", "brown", "cadetblue", + "chartreuse", "coral", "cornflowerblue", "crimson", "darkgoldenrod", + "darkgreen", "darkkhaki", "darkmagenta", "darkorange", "darkred", + "darksalmon", "darkseagreen", "darkslateblue", "darkslategrey", + "darkviolet", "deepskyblue", "dodgerblue", "firebrick", + "forestgreen", "gainsboro", "ghostwhite", "gold", "goldenrod", + "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", + "indianred", "indigo", "ivory", "khaki", "lavender", + "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", + "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", + "lightgreen", "lightgrey", "lightpink", "lightsalmon", + "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", + "lightsteelblue", "lightyellow", "limegreen", "linen", "magenta", + "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", + "mediumpurple", "mediumseagreen", "mediumslateblue", + "mediumturquoise", "midnightblue", "mintcream", "mistyrose", + "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", + "orange", "orangered", "orchid", "palegoldenrod", "palegreen", + "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", + "pink", "powderblue", "purple", "red", "rosybrown", "royalblue", + "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", + "sienna", "silver", "skyblue", "slateblue", "slategray", + "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", + "thistle", "tomato", "violet", "wheat", "burlywood", "chocolate"] + self.color_map = {} + self.color_counter = 0 + + def format_id(self, ID): + if not ID.startswith("id"): + return ("id%s" % ID).replace('-', '')\ + .replace('#', '_HASH_').replace('.', '_DOT_') + else: + return ("%s" % ID).replace('-', '')\ + .replace('#', '_HASH_').replace('.', '_DOT_') + + def clean_label(self, s): + return s.replace("[/:.]", "_") + + def get_node_label(self, node): + lbl = [] + lbl.append(self.format_id(node.id)) + lbl.append('
') + lbl.append('num pts: %d' % len(node.leaves())) + lbl.append('
') + try: + lbl.append('purity: %f' % node.purity()) + except Exception: + pass + try: + lbl.append('
') + lbl.append('across: %s' % node.best_across_debug) + except Exception: + pass + return ''.join(lbl) + + def get_color(self, lbl): + if lbl in self.color_map: + return self.color_map[lbl] + else: + self.color_map[lbl] = self.colors[self.color_counter] + self.color_counter = (self.color_counter + 1) % len(self.colors) + return self.color_map[lbl] + + def format_graphiz_node(self, node): + """Format a graphviz node for printing.""" + s = [] + color = self.internal_color + try: + if node.purity() == 1.0: + if hasattr(node, 'pts'): + curr_node = node + while curr_node.pts == None: + curr_node = curr_node.children[0] + if len(curr_node.pts)>0: + w_gt = [x for x in curr_node.pts if x[1] and x[1] != "None"] + if w_gt: + color = self.get_color(w_gt[0][0]) + else: + color = self.get_color('None') + except Exception: + pass + shape = 'point' + + if node.parent is None: + s.append( + '\n%s[shape=%s;style=filled;width=1;color=%s;label=<%s
%s
>]' + % (self.format_id(node.id), shape, color, + self.get_node_label(node), color)) + s.append( + '\nROOTNODE[shape=star;style=filled;color=gold;label=]') + s.append('\nROOTNODE->%s' % self.format_id(node.id)) + else: + leaf_m = '' + if hasattr(node, 'pts') and node.pts and len(node.pts) > 0: + if hasattr(node.pts[0][0], 'mid'): + leaf_m = '%s|%s' % (node.pts[0][0].mid, node.pts[0][0].gt) \ + if node.is_leaf() else '' + else: + leaf_m = '%s|%s' % (node.pts[0][1], node.pts[0][0]) \ + if node.is_leaf() else '' + s.append('\n%s[shape=%s;style=filled;width=1;color=%s;label=<%s
' + '%s
%s
>]' + % (self.format_id(node.id), shape, color, + self.get_node_label(node), color, leaf_m)) + s.append('\n%s->%s' % (self.format_id(node.parent.id), + self.format_id(node.id))) + return ''.join(s) + + def graphviz_tree(self, root,): + """Return a graphviz tree as a string.""" + s = [] + s.append('digraph TreeStructure {\n') + s.append(self.format_graphiz_node(root)) + for d in root.descendants(): + s.append(self.format_graphiz_node(d)) + s.append('\n}') + return ''.join(s) + + @staticmethod + def write_tree(root,filename): + """Write a graphviz tree to a file.""" + gv = Graphviz() + tree = gv.graphviz_tree(root) + with open(filename, 'w') as fout: + fout.write(tree) diff --git a/pyikt/stream/cluster/utils/__init__.py b/pyikt/stream/cluster/utils/__init__.py new file mode 100644 index 0000000..9dbb6fa --- /dev/null +++ b/pyikt/stream/cluster/utils/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 hanxin +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/pyikt/stream/cluster/utils/deltasep_utils.py b/pyikt/stream/cluster/utils/deltasep_utils.py new file mode 100644 index 0000000..8913f35 --- /dev/null +++ b/pyikt/stream/cluster/utils/deltasep_utils.py @@ -0,0 +1,297 @@ +""" +Copyright (C) 2017 University of Massachusetts Amherst. +This file is part of "xcluster" +http://github.com/iesl/xcluster +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + + +""" +Utilities for creating delta separated data sets. +""" +import numpy as np + + +def gen_k_centers(k, dim): + """Create a k cluster data set with required separation. + + For the purposes of validating a proof, generate each cluster center such + that it is at least 4 * delta away from any other cluster for some value of + delta > 0. + + Args: + k - the number of clusters. + dim - (optional) the dimension of the points. + + Returns: + A list of 2 cluster centers and a value of delta such that the clusters + centers are 4 * delta away form each other. + """ + delta = abs(np.random.normal(0.0, 5.0)) + eps = 0.001 + centers = [] + for i in range(k): + c = np.random.multivariate_normal(np.zeros(dim), np.identity(dim)) + if len(centers): + c1 = centers[0] + x = np.random.multivariate_normal(c1, np.identity(c1.size)) - c1 + direction = x / np.linalg.norm(x) + centers.append(c1 + 2.0 * i * delta * direction + eps) + else: + centers.append(c) + return centers, delta + + + +def create_dataset(dims, size, num_clusters=20): + """Create a delta separated data set. + + Generate a set of centers for the clusters and from each center draw size + number of points that constitute the points in that cluster. Then return + a dataset of all points. + + Args: + dims - (int) the dimention of all data points. + size - (int) the number of points to generate for each cluster. + num_clusters - (int) the number of clusters. + """ + clusters, delta = gen_k_centers(num_clusters, dims) + return _create_constrained_dataset(clusters, delta, size) + + +def _create_constrained_dataset(centers, delta, size): + """Create a delta-separated dataset. + + For each of the centers draw size number of points. No two points may be + farther than delta away form each other. Thus, to generate each point, + choosea random direction and random distance from the center (of up to 0.5 + delta). + + Args: + centers - a list of cluster centers. + delta - the maximum distance between two points in the same cluster. + size - the number of points to draw per cluster. + + Returns: + A list of points that represents the dataset. + """ + dataset = [] + count = 0 + for i, c in enumerate(centers): + for j in range(size): + x = np.random.multivariate_normal(c, np.identity(np.size(c))) - c + direction = x / np.linalg.norm(x) + magnitude = np.random.uniform(0.0, 0.5 * delta) + # magnitude = np.random.uniform(0.0, delta) # NOT DEL-SEPARATED + vec = c + magnitude * direction + vec = np.append(vec, i) + vec = np.append(vec, count) + dataset.append(vec) + count += 1 + return np.array(dataset) + + +def gen_4_normal(): + """Create 4 cluster centers. + + Create gaussians centered at (1,1), (1,-1), (-1,-1) and (-1,1). Each has + standard covariance. + + Args: + None + + Returns: + A list of the four cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([1.0, 1.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]])), + np.random.multivariate_normal(mean=np.array([1.0, -1.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]])), + np.random.multivariate_normal(mean=np.array([-1.0, -1.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]])), + np.random.multivariate_normal(mean=np.array([-1.0, 1.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]]))] + + +def _4_normal_spread(): + """Create 4 cluster centers. + + Create gaussians centered at (10,10), (10,-10), (-10,-10) and (-10,10). + Each has standard covariance. + + Args: + None + + Returns: + A list of the four cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([10.0, 10.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]])), + np.random.multivariate_normal(mean=np.array([10.0, -10.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]])), + np.random.multivariate_normal(mean=np.array([-10.0, -10.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]])), + np.random.multivariate_normal(mean=np.array([-10.0, 10.0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]]))] + + +def _5x5_grid_clusters(): + """Create a 5x5 grid of cluster centers. + + Create 25 cluster centers on the grid I^{[0, 4] x [0,4]}. Each center is a + gaussian with standard covariance + + Args: + None + + Returns: + A list of cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([i, j]), cov=np.array([[1.0, 0.0], + [0.0, 1.0]])) + for i in range(5) + for j in range(5)] + + +def _5x5_grid_clusters_spread(): + """Create a 5x5 grid of cluster centers. + + Create 25 cluster centers on the grid I^{[0, 4] x [0,4]}. Each center is a + gaussian with standard covariance + + Args: + None + + Returns: + A list of cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([i * 25, j * 25]), cov=np.array([[1.0, 0.0], + [0.0, 1.0]])) + for i in range(5) + for j in range(5)] + + +def _5x5_grid_clusters_close(): + """Create a 5x5 grid of cluster centers. + + Create 25 cluster centers on the grid I^{[0, 4] x [0,4]}. Each center is a + gaussian with standard covariance + + Args: + None + + Returns: + A list of cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([i * 5, j * 5]), cov=np.array([[1.0, 0.0], + [0.0, 1.0]])) + for i in range(5) + for j in range(5)] + + +def _2x3_grid_clusters_close(): + """Create a 3x3 grid of cluster centers. + + Create 25 cluster centers on the grid I^{[0, 4] x [0,4]}. Each center is a + gaussian with standard covariance + + Args: + None + + Returns: + A list of cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([i * 5, j * 5]), cov=np.array([[1.0, 0.0], + [0.0, 1.0]])) + for i in range(2) + for j in range(3)] + + +def _2x3_grid_clusters_spread(): + """Create a 3x3 grid of cluster centers. + + Create 25 cluster centers on the grid I^{[0, 4] x [0,4]}. Each center is a + gaussian with standard covariance + + Args: + None + + Returns: + A list of cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([i * 25, j * 25]), cov=np.array([[1.0, 0.0], + [0.0, 1.0]])) + for i in range(2) + for j in range(3)] + + +def _10x10_grid_clusters_close(): + """Create a 3x3 grid of cluster centers. + + Create 25 cluster centers on the grid I^{[0, 4] x [0,4]}. Each center is a + gaussian with standard covariance + + Args: + None + + Returns: + A list of cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([i * 5, j * 5]), cov=np.array([[1.0, 0.0], + [0.0, 1.0]])) + for i in range(10) + for j in range(10)] + + +def _10x10_grid_clusters_spread(): + """Create a 3x3 grid of cluster centers. + + Create 25 cluster centers on the grid I^{[0, 4] x [0,4]}. Each center is a + gaussian with standard covariance + + Args: + None + + Returns: + A list of cluster centers. + """ + return [np.random.multivariate_normal(mean=np.array([i * 25, j * 25]), cov=np.array([[1.0, 0.0], + [0.0, 1.0]])) + for i in range(10) + for j in range(10)] + + +def _random_standard_centers(n=100): + """Create random cluster centers. + + Create n cluster centers randomly. Each cluster center is a draw from a + gaussian distribution centered at (0,0) with standard covariance. + + Args: + n - optional; the number of centers to draw (default 100). + + Returns: + A list of cluster centers. + """ + generator = np.random.multivariate_normal(mean=np.array([0, 0]), + cov=np.array([[1.0, 0.0], [0.0, 1.0]])) + return [np.random.multivariate_normal(mean=pt, cov=np.array([[1.0, 0.0], [0.0, 1.0]])) + for pt in generator.rvs(size=n)] + + +def _from_file(filename): + with open(filename, 'r') as f: + clustering = [] + for line in f: + splits = line.split('\t') + l, vec = int(splits[0]), np.array([float(x) for x in splits[1:]]) + clustering.append((vec, l)) + return clustering diff --git a/pyikt/stream/cluster/utils/dendrogram_purity.py b/pyikt/stream/cluster/utils/dendrogram_purity.py new file mode 100644 index 0000000..a70032f --- /dev/null +++ b/pyikt/stream/cluster/utils/dendrogram_purity.py @@ -0,0 +1,101 @@ +""" +Copyright (C) 2017 University of Massachusetts Amherst. +This file is part of "xcluster" +http://github.com/iesl/xcluster +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +from itertools import combinations, groupby + +import numpy as np +from tqdm import tqdm +from tqdm._tqdm import trange + + +def expected_dendrogram_purity(root): + """Compute the expected dendrogram purity. + + Sample a leaf uniformly at random. Then sample another leaf from the same + true class uniformly at random. Find their lowest common ancestor in the + tree and compute purity with respect to that class. (This is one of the + evaluations used in the Bayesian Hierarchical Clustering paper). + + Args: + root - the root with respect to which we compute purity. + + Returns: + A float [0, 1] that represents expected dendrogram purity. + """ + + # Construct a map from leaf to cluster and from cluster to a list of leaves. + # Filter out the singletons in the leaf to cluster map. + leaves = root.leaves() + def get_cluster(x): return x.pts[0][0] + cluster_to_leaves = {c: list(ls) + for c, ls in groupby(sorted(leaves, key=get_cluster), + get_cluster)} + leaf_to_cluster = {l: l.pts[0][0] for l in leaves} + non_singleton_leaves = [l for l in leaf_to_cluster.keys() + if len(cluster_to_leaves[leaf_to_cluster[l]]) > 1] + if len(non_singleton_leaves) == 0.0: + return 1.0 + assert(len(non_singleton_leaves) > 0) + + # For n samples, sample a leaf uniformly at random then select another leaf + # from the same class unformly at random. + samps = len(non_singleton_leaves) * 5 # TODO (AK): pick 5 in a better way. + unnormalized_purity = 0.0 + for i in trange(samps): + rand_leaf = np.random.choice(non_singleton_leaves) + cluster = leaf_to_cluster[rand_leaf] + rand_cluster_member = np.random.choice(cluster_to_leaves[cluster]) + # Make sure we get two distinct leaves + while rand_cluster_member == rand_leaf: + assert(leaf_to_cluster[rand_leaf] == + leaf_to_cluster[rand_cluster_member]) + rand_cluster_member = np.random.choice(cluster_to_leaves[cluster]) + + # Find their lowest common ancestor and compute cluster purity. + assert(leaf_to_cluster[rand_leaf] == + leaf_to_cluster[rand_cluster_member]) + lca = rand_leaf.lca(rand_cluster_member) + unnormalized_purity += lca.purity(cluster=cluster) + return unnormalized_purity / samps + + +def dendrogram_purity(root): + """ + Exact dendrogram purity + """ + leaves = root.leaves() + + def get_cluster(x): + return x.pts[0][0] + + sorted_lvs = sorted(leaves, key=get_cluster) + leaves_by_true_class = {c: list(ls) for c, ls in groupby(sorted_lvs, + key=get_cluster)} + leaf_pairs_by_true_class = {} + for class_lbl, lvs in leaves_by_true_class.items(): + # leaf_pairs_by_true_class[class_lbl] = combinations(leaves_by_true_class[class_lbl], 2) + leaf_pairs_by_true_class[class_lbl] = combinations(lvs, 2) + sum_purity = 0.0 + count = 0.0 + for class_lbl in leaf_pairs_by_true_class: + for pair in leaf_pairs_by_true_class[class_lbl]: + lca = pair[0].lca(pair[1]) + sum_purity += lca.purity(get_cluster(pair[0])) + assert(get_cluster(pair[0]) == get_cluster(pair[1])) + count += 1.0 + if count == 0.0: + return 1.0 + else: + return sum_purity / count diff --git a/pyikt/stream/cluster/utils/dendrogram_purity_pool.py b/pyikt/stream/cluster/utils/dendrogram_purity_pool.py new file mode 100644 index 0000000..19e1a7b --- /dev/null +++ b/pyikt/stream/cluster/utils/dendrogram_purity_pool.py @@ -0,0 +1,147 @@ +""" +Copyright (C) 2021 Xin Han. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import time +from functools import partial +from itertools import combinations, groupby +from multiprocessing import Pool, Manager + +import threading +from queue import Queue + +import numpy as np +import sys +sys.setrecursionlimit(50000) +queueLock = threading.Lock() + + +class Producer(threading.Thread): + def __init__(self, samp_queue, cluser_to_leaves, leaf_to_cluster, result_queue, non_singleton_leaves, *args, **kwargs): + super(Producer, self).__init__(*args, **kwargs) + self.samp_queue = samp_queue + self.result_queue = result_queue + self.non_singleton_leaves = non_singleton_leaves + self.cluster_to_leaves = cluser_to_leaves + self.leaf_to_cluster = leaf_to_cluster + + def run(self): + while True: + queueLock.acquire() + if self.samp_queue.empty(): + print('bye') + queueLock.release() + break + print('剩余采样数:', self.samp_queue.qsize()) + samp = self.samp_queue.get() + queueLock.release() + self.get_purity() + + def get_purity(self): + rand_leaf = np.random.choice(self.non_singleton_leaves) + cluster = self.leaf_to_cluster[rand_leaf] + rand_cluster_member = np.random.choice(self.cluster_to_leaves[cluster]) + # Make sure we get two distinct leaves + while rand_cluster_member == rand_leaf: + #assert(leaf_to_cluster[rand_leaf] == leaf_to_cluster[rand_cluster_member]) + rand_cluster_member = np.random.choice( + self.cluster_to_leaves[cluster]) + lca = rand_leaf.lca(rand_cluster_member) + purity = lca.purity(cluster=cluster) + # print(purity) + queueLock.acquire() + self.result_queue.put(purity) + queueLock.release() + # print(self.result_queue.qsize()) + + +def expected_dendrogram_purity(root): + """Compute the expected dendrogram purity. + + Sample a leaf uniformly at random. Then sample another leaf from the same + true class uniformly at random. Find their lowest common ancestor in the + tree and compute purity with respect to that class. (This is one of the + evaluations used in the Bayesian Hierarchical Clustering paper). + + Args: + root - the root with respect to which we compute purity. + + Returns: + A float [0, 1] that represents expected dendrogram purity. + """ + + # Construct a map from leaf to cluster and from cluster to a list of leaves. + # Filter out the singletons in the leaf to cluster map. + leaves = root.leaves() + + def get_cluster(x): + return x.pts[0][0] + + cluster_to_leaves = {c: list(ls) + for c, ls in groupby(sorted(leaves, key=get_cluster), + get_cluster)} + leaf_to_cluster = {l: l.pts[0][0] for l in leaves} + non_singleton_leaves = [l for l in leaf_to_cluster.keys() + if len(cluster_to_leaves[leaf_to_cluster[l]]) > 1] + if len(non_singleton_leaves) == 0.0: + return 1.0 + + # For n samples, sample a leaf uniformly at random then select another leaf + # from the same class unformly at random. + samps = len(non_singleton_leaves) * 5 # TODO (AK): pick 5 in a better way. + with Pool(processes=6) as pool: + res = pool.starmap( + process, [(non_singleton_leaves, leaf_to_cluster, cluster_to_leaves)]*samps) + return sum(res) / samps + + +def process(non_singleton_leaves, leaf_to_cluster, cluster_to_leaves): + + rand_leaf = np.random.choice(non_singleton_leaves) + cluster = leaf_to_cluster[rand_leaf] + rand_cluster_member = np.random.choice(cluster_to_leaves[cluster]) + # Make sure we get two distinct leaves + while rand_cluster_member == rand_leaf: + rand_cluster_member = np.random.choice(cluster_to_leaves[cluster]) + lca = rand_leaf.lca(rand_cluster_member) + purity = lca.purity(cluster=cluster) + return purity + + +def dendrogram_purity(root): + """ + Exact dendrogram purity + """ + leaves = root.leaves() + + def get_cluster(x): + return x.pts[0][0] + + sorted_lvs = sorted(leaves, key=get_cluster) + leaves_by_true_class = {c: list(ls) for c, ls in groupby(sorted_lvs, + key=get_cluster)} + leaf_pairs_by_true_class = {} + for class_lbl, lvs in leaves_by_true_class.items(): + # leaf_pairs_by_true_class[class_lbl] = combinations(leaves_by_true_class[class_lbl], 2) + leaf_pairs_by_true_class[class_lbl] = combinations(lvs, 2) + sum_purity = 0.0 + count = 0.0 + for class_lbl in leaf_pairs_by_true_class: + for pair in leaf_pairs_by_true_class[class_lbl]: + lca = pair[0].lca(pair[1]) + sum_purity += lca.purity(get_cluster(pair[0])) + assert(get_cluster(pair[0]) == get_cluster(pair[1])) + count += 1.0 + if count == 0.0: + return 1.0 + else: + return sum_purity / count diff --git a/pyikt/stream/cluster/utils/file_utils.py b/pyikt/stream/cluster/utils/file_utils.py new file mode 100644 index 0000000..981b532 --- /dev/null +++ b/pyikt/stream/cluster/utils/file_utils.py @@ -0,0 +1,47 @@ +# Copyright 2021 Xin Han +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# coding: utf-8 + +import errno +import os + +import numpy as np + + +def mkdir_p_safe(dir): + try: + os.makedirs(dir) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise + + +def remove_dirs(exp_dir_base, file_name): + file_path = os.path.join(exp_dir_base, file_name) + if os.path.exists(file_path): + os.removedirs(file_path) + + +def load_data(filename): + if filename.endswith(".csv"): + split_sep = "," + elif filename.endswith(".tsv"): + split_sep = '\t' + with open(filename, 'r') as f: + for line in f: + splits = line.strip().split(sep=split_sep) + pid, l, vec = splits[0], splits[1], np.array([float(x) + for x in splits[2:]]) + yield ((l, pid, vec)) \ No newline at end of file diff --git a/pyikt/stream/cluster/utils/logger.py b/pyikt/stream/cluster/utils/logger.py new file mode 100644 index 0000000..1b73494 --- /dev/null +++ b/pyikt/stream/cluster/utils/logger.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +""" + Copyright (c) 2021 Xin Han + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +""" +# coding: utf-8 + +import logging +from logging import handlers + + +class Logger(object): + level_relations = { + 'debug': logging.DEBUG, + 'info': logging.INFO, + 'warning': logging.WARNING, + 'error': logging.ERROR, + 'crit': logging.CRITICAL + } + + def __init__(self, filename, + level='info', + when='D', + backCount=25, + fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'): + self.logger = logging.getLogger(filename) + format_str = logging.Formatter(fmt) + self.logger.setLevel(self.level_relations.get(level)) + console_handler = logging.StreamHandler() + console_handler.setFormatter(format_str) + file_handler = handlers.TimedRotatingFileHandler( + filename=filename, when=when, backupCount=backCount, encoding='utf-8') + file_handler.setFormatter(format_str) + self.logger.addHandler(console_handler) + self.logger.addHandler(file_handler) + + +if __name__ == '__main__': + log = Logger('all.log', level='debug') + log.logger.debug('debug') + log.logger.info('info') + log.logger.warning('warning') + log.logger.error('error') + Logger('error.log', level='error').logger.error('error') diff --git a/pyikt/stream/cluster/utils/serialize_trees.py b/pyikt/stream/cluster/utils/serialize_trees.py new file mode 100644 index 0000000..d380bc3 --- /dev/null +++ b/pyikt/stream/cluster/utils/serialize_trees.py @@ -0,0 +1,133 @@ +""" +Copyright (C) 2017 University of Massachusetts Amherst. +This file is part of "xcluster" +http://github.com/iesl/xcluster +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" +import math + +import numpy as np +from numba import jit + + +@jit(nopython=True) +def _fast_dot(x, y): + """Compute the dot product of x and y using numba. + + Args: + x - a numpy vector (or list). + y - a numpy vector (or list). + + Returns: + x_T.y + """ + + return np.dot(x, y) + + +@jit(nopython=True) +def _fast_norm(x): + """Compute the number of x using numba. + + Args: + x - a numpy vector (or list). + + Returns: + The 2-norm of x. + """ + s = 0.0 + for i in range(len(x)): + s += x[i] ** 2 + return math.sqrt(s) + + +@jit(nopython=True) +def _fast_norm_diff(x, y): + """Compute the norm of x - y using numba. + + Args: + x - a numpy vector (or list). + y - a numpy vector (or list). + + Returns: + The 2-norm of x - y. + """ + return _fast_norm(x - y) + + +try: + from Queue import Queue +except: + pass + +try: + from queue import Queue +except: + pass + + +def serliaze_tree_to_file_with_point_ids(root, fn): + with open(fn, 'w') as fout: + queue = Queue() + queue.put(root) + while not queue.empty(): + curr_node = queue.get() + curr_node_id = curr_node.pts[0][1] if curr_node.is_leaf( + ) else curr_node.id + sibling_node_id = "None" + if curr_node.parent: + sibling_node_id = curr_node.siblings()[0].pts[0][1] if curr_node.siblings()[ + 0].is_leaf() else curr_node.siblings()[0].id + dis = getDistance(curr_node) if curr_node.parent else "None" + fout.write("%s\t%s\t%s\t%s\t%s\n" % (curr_node_id, sibling_node_id, + curr_node.parent.id if curr_node.parent else "None", dis, curr_node.pts[0][0] if curr_node.is_leaf() else "None")) + for c in curr_node.children: + queue.put(c) + + +def getDistance(curr_node): + sibling = curr_node.siblings()[0] + curr_point_count = curr_node.point_counter + sibling_point_count = sibling.point_counter + + distance = 2*(200 - (_fast_dot(sibling.ikv, curr_node.ikv) / + (curr_point_count*sibling_point_count))) + + return distance + + +def serliaze_tree_to_file(root, fn): + with open(fn, 'w') as fout: + queue = Queue() + queue.put(root) + while not queue.empty(): + curr_node = queue.get() + fout.write("%s\t%s\t%s\t%s\n" % (curr_node.id, curr_node.parent.id if curr_node.parent else "None", + curr_node.pts[0][1] if curr_node.is_leaf() else "None", len(curr_node.pts))) + for c in curr_node.children: + queue.put(c) + + +def serliaze_collapsed_tree_to_file_with_point_ids(root, fn): + with open(fn, 'w') as fout: + queue = Queue() + queue.put(root) + while not queue.empty(): + curr_node = queue.get() + curr_node_id = curr_node.pts[0][2] if curr_node.is_leaf( + ) and not curr_node.is_collapsed else curr_node.id + fout.write("%s\t%s\t%s\n" % (curr_node_id, curr_node.parent.id if curr_node.parent else "None", + curr_node.pts[0][1] if curr_node.is_leaf() and not curr_node.is_collapsed else "None")) + for c in curr_node.children: + queue.put(c) + if curr_node.collapsed_leaves is not None: + for c in curr_node.collapsed_leaves: + queue.put(c) diff --git a/pyikt/stream/tests/test_icid.py b/pyikt/stream/tests/test_icid.py new file mode 100644 index 0000000..ddc79c8 --- /dev/null +++ b/pyikt/stream/tests/test_icid.py @@ -0,0 +1,150 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +import pytest +import numpy as np +from sklearn.utils import check_random_state +from pyikt.stream import ICID + +rng = check_random_state(42) + + +def test_icid_init(): + """Test ICID initialization with default parameters.""" + icid = ICID() + assert icid.n_estimators == 200 + assert icid.max_samples_list == [2, 4, 8, 16, 32, 64] + assert icid.method == "inne" + assert icid.stability_method == "entropy" + assert icid.contamination == "auto" + assert icid.window_size == 10 + assert icid.adjust_rate == 0.1 + + +def test_icid_fit(): + """Test ICID fit method.""" + X = np.random.randn(100, 2) + icid = ICID(n_estimators=50, max_samples_list=[4, 8], random_state=42) + icid.fit(X) + assert hasattr(icid, "is_fitted_") + assert hasattr(icid, "best_iso_kernel_") + assert hasattr(icid, "best_stability_score_") + assert hasattr(icid, "interval_score_") + assert hasattr(icid, "pre_interval_") + + +def test_icid_fit_predict_batch(): + """Test ICID fit_predict_batch method.""" + # Create a dataset with distribution change + np.random.seed(42) + X_normal1 = np.random.randn(30, 2) + X_anomaly = np.random.randn(10, 2) * 5 + 10 # Different distribution + X_normal2 = np.random.randn(30, 2) + X = np.vstack([X_normal1, X_anomaly, X_normal2]) + + icid = ICID( + n_estimators=50, max_samples_list=[4, 8], window_size=10, random_state=42 + ) + predictions = icid.fit_predict_batch(X) + + # We should get predictions for intervals, not individual points + assert len(predictions) <= len(X) // 10 # Number of intervals + + +def test_icid_predict_online(): + """Test ICID predict_online method.""" + # Initial training data + X_train = np.random.randn(50, 2) + + # New intervals - one normal, one anomalous + X_normal = np.random.randn(10, 2) + X_anomaly = np.random.randn(10, 2) * 5 + 10 + + icid = ICID( + n_estimators=50, max_samples_list=[4, 8], window_size=10, random_state=42 + ) + icid.fit(X_train) + + # Predict on new data + normal_result = icid.predict_online(X_normal) + anomaly_result = icid.predict_online(X_anomaly) + + assert normal_result in [1, -1] + assert anomaly_result in [1, -1] + + +def test_icid_stability_methods(): + """Test ICID with different stability methods.""" + X = np.random.randn(100, 2) + + stability_methods = ["entropy", "variance", "mean"] + for method in stability_methods: + icid = ICID( + stability_method=method, + n_estimators=50, + max_samples_list=[4], + random_state=42, + ) + icid.fit(X) + assert isinstance(icid.best_stability_score_, float) + + +def test_icid_invalid_stability_method(): + """Test ICID with invalid stability method raises ValueError.""" + X = np.random.randn(100, 2) + icid = ICID(stability_method="invalid_method") + + with pytest.raises(ValueError): + icid.fit(X) + + +def test_icid_distribution_changes(): + """Test ICID detects distribution changes.""" + # Create data with clear distribution shift + np.random.seed(42) + X1 = np.random.randn(30, 2) + X2 = np.random.randn(30, 2) * 2 + 5 # Shifted distribution + X3 = np.random.randn(30, 2) + X = np.vstack([X1, X2, X3]) + + icid = ICID( + n_estimators=100, + max_samples_list=[4, 8], + window_size=10, + adjust_rate=0.5, + random_state=42, + ) + results = icid.fit_predict_batch(X) + + # We expect some intervals to be detected as changes + assert -1 in results + + +def test_icid_different_window_sizes(): + """Test ICID with different window sizes.""" + X = np.random.randn(100, 2) + + window_sizes = [5, 10, 20] + for window_size in window_sizes: + icid = ICID( + window_size=window_size, + n_estimators=50, + max_samples_list=[4], + random_state=42, + ) + icid.fit(X) + assert hasattr(icid, "interval_score_") + + +def test_icid_different_isolation_methods(): + """Test ICID with different isolation methods.""" + X = np.random.randn(100, 2) + + methods = ["inne", "anne"] + for method in methods: + icid = ICID( + method=method, n_estimators=50, max_samples_list=[4], random_state=42 + ) + icid.fit(X) + assert hasattr(icid, "best_iso_kernel_") diff --git a/pyikt/stream/tests/test_streakhc.py b/pyikt/stream/tests/test_streakhc.py new file mode 100644 index 0000000..bd04941 --- /dev/null +++ b/pyikt/stream/tests/test_streakhc.py @@ -0,0 +1,133 @@ +import pytest +import numpy as np +from pyikt.stream import STREAMKHC +import tempfile +import os + + +def test_streamkhc_init(): + # Test initialization with default parameters + clusterer = STREAMKHC() + assert clusterer.n_estimators == 200 + assert clusterer.max_samples == "auto" + assert clusterer.max_leaf == 5000 + assert clusterer.random_state is None + + # Test initialization with custom parameters + clusterer = STREAMKHC( + n_estimators=100, + max_samples=10, + random_state=42, + max_leaf=1000, + ) + assert clusterer.n_estimators == 100 + assert clusterer.max_samples == 10 + assert clusterer.random_state == 42 + assert clusterer.max_leaf == 1000 + + +def test_streamkhc_fit(): + # Generate sample data + np.random.seed(42) + X = np.random.rand(20, 5) + + # Fit batch + clusterer = STREAMKHC(n_estimators=50, random_state=42) + clusterer.fit(X) + + # Check that attributes are set + assert hasattr(clusterer, "tree_") + assert hasattr(clusterer, "iso_kernel_") + assert hasattr(clusterer, "point_counter_") + assert hasattr(clusterer, "n_features_in_") + + # Check attribute values + assert clusterer.n_features_in_ == 5 + assert clusterer.point_counter_ == 20 + + +def test_streamkhc_fit_online(): + # Generate sample data + np.random.seed(42) + X_batch = np.random.rand(20, 5) + X_online = np.random.rand(5, 5) + + # Fit batch first, then online + clusterer = STREAMKHC(n_estimators=50, random_state=42) + clusterer.fit(X_batch) + initial_counter = clusterer.point_counter_ + clusterer.fit_online(X_online) + + # Check that counter incremented correctly + assert clusterer.point_counter_ == initial_counter + len(X_online) + + +def test_streamkhc_max_leaf(): + # Generate sample data + np.random.seed(42) + X_batch = np.random.rand(15, 5) + X_online = np.random.rand(10, 5) + + # Create clusterer with max_depth of 20 + clusterer = STREAMKHC(n_estimators=50, max_leaf=20, random_state=42) + clusterer.fit(X_batch) + clusterer.fit_online(X_online) + + # Counter should be at max 20 + assert clusterer.point_counter_ == 25 # Total points ingested + + +def test_streamkhc_feature_mismatch(): + # Generate sample data with different dimensions + np.random.seed(42) + X_batch = np.random.rand(10, 5) + X_online = np.random.rand(5, 6) # Different number of features + + # Fit batch + clusterer = STREAMKHC(n_estimators=50, random_state=42) + clusterer.fit(X_batch) + + # Expect ValueError when fitting online with different feature count + with pytest.raises(ValueError): + clusterer.fit_online(X_online) + + +def test_streamkhc_purity(): + # Generate sample data + np.random.seed(42) + X = np.random.rand(20, 5) + + # Fit model + clusterer = STREAMKHC(n_estimators=50, random_state=42) + clusterer.fit(X) + + # Calculate purity (should return a float) + purity = clusterer.get_purity() + assert isinstance(purity, float) + assert 0 <= purity <= 1 + + +def test_streamkhc_visualization_methods(): + # Generate sample data + np.random.seed(42) + X = np.random.rand(10, 5) + + # Fit model + clusterer = STREAMKHC(n_estimators=50, random_state=42) + clusterer.fit(X) + + # Test methods without actually saving files + # Just ensure no exceptions are raised + + with tempfile.NamedTemporaryFile(suffix=".png") as temp_img: + try: + clusterer.visualize_tree(temp_img.name) + except Exception as e: + if "GraphViz's executables" in str(e): + pytest.skip("GraphViz not installed, skipping visualization test") + else: + raise + + with tempfile.NamedTemporaryFile(suffix=".json") as temp_json: + clusterer.serialize_tree(temp_json.name) + assert os.path.exists(temp_json.name) diff --git a/pyikt/timeseries/__init__.py b/pyikt/timeseries/__init__.py new file mode 100644 index 0000000..18cae9a --- /dev/null +++ b/pyikt/timeseries/__init__.py @@ -0,0 +1,16 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from .anomaly._iktod import IKTOD + + +__all__ = [ + "IKTOD", +] diff --git a/pyikt/timeseries/anomaly/__init__.py b/pyikt/timeseries/anomaly/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyikt/timeseries/anomaly/_iktod.py b/pyikt/timeseries/anomaly/_iktod.py new file mode 100644 index 0000000..d9bcf7f --- /dev/null +++ b/pyikt/timeseries/anomaly/_iktod.py @@ -0,0 +1,272 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import warnings +import numpy as np +from typing import Union, Optional +from sklearn.base import BaseEstimator, OutlierMixin +from sklearn.utils.validation import check_is_fitted, check_array +from pyikt.group import IKGAD + + +class IKTOD(OutlierMixin, BaseEstimator): + """Isolation Kernel-based Time series Subsequnce Anomaly Detection. + + IKTOD implements a distribution-based approach for anomaly time series subsequence detection. + Unlike traditional time or frequency domain approaches that rely on sliding windows, + IKTOD treats time series subsequences as distributions in R domain, enabling more + effective similarity measurements with linear time complexity. + + This approach uses Isolation Distributional Kernel (IDK) to measure similarities + between subsequences, resulting in better detection accuracy compared to + sliding-window-based detectors. + + Parameters + ---------- + n_estimators_1 : int, default=100 + Number of base estimators in the first-level ensemble. + + max_samples_1 : int, float, or "auto", default="auto" + Number of samples for training each first-level base estimator: + - int: exactly `max_samples_1` samples + - float: `max_samples_1 * X.shape[0]` samples + - "auto": `min(8, n_samples)` + + n_estimators_2 : int, default=100 + Number of base estimators in the second-level ensemble. + + max_samples_2 : int, float, or "auto", default="auto" + Number of samples for training each second-level base estimator: + - int: exactly `max_samples_2` samples + - float: `max_samples_2 * X.shape[0]` samples + - "auto": `min(8, n_samples)` + + method : {"inne", "anne"}, default="inne" + Isolation method to use: + - "inne": original Isolation Forest approach + - "anne": approximate nearest neighbor ensemble + + period_length : int, default=10 + Length of subsequences to split the time series. + + contamination : "auto" or float, default="auto" + Proportion of outliers in the dataset: + - "auto": threshold determined as in the original paper + - float: must be in range (0, 0.5] + + random_state : int, RandomState instance or None, default=None + Controls randomization for reproducibility. + + Attributes + ---------- + ikgad_ : IKGAD + Trained Isolation Kernel Group Anomaly Detector. + + offset_ : float + Decision threshold for outlier detection. + + is_fitted_ : bool + Indicates if the model has been fitted. + + References + ---------- + .. [1] Ting, K.M., Liu, Z., Zhang, H., Zhu, Y. (2022). A New Distributional + Treatment for Time Series and An Anomaly Detection Investigation. + Proceedings of The Very Large Data Bases (VLDB) Conference. + + Examples + -------- + >>> from pyikt.timeseries import IKTOD + >>> import numpy as np + >>> # Time series with length 40 (4 periods of length 10) + >>> X = np.sin(np.linspace(0, 8*np.pi, 40)).reshape(-1, 1) + >>> # Add anomaly + >>> X[25:30] = X[25:30] + 5.0 + >>> detector = IKTOD(max_samples_1=2, max_samples_2=2, contamination=0.1, random_state=42) + >>> detector = detector.fit(X) + >>> detector.predict(X) + array([ 1, 1, -1, 1]) + """ + + def __init__( + self, + n_estimators_1: int = 100, + max_samples_1: Union[int, float, str] = "auto", + n_estimators_2: int = 100, + max_samples_2: Union[int, float, str] = "auto", + method: str = "inne", + period_length: int = 10, + contamination: Union[str, float] = "auto", + random_state: Optional[Union[int, np.random.RandomState]] = None, + ): + self.n_estimators_1 = n_estimators_1 + self.max_samples_1 = max_samples_1 + self.n_estimators_2 = n_estimators_2 + self.max_samples_2 = max_samples_2 + self.period_length = period_length + self.random_state = random_state + self.contamination = contamination + self.method = method + + def fit(self, X) -> "IKTOD": + """Fit the IKTOD model. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + Input time series data where: + - n_samples: length of the time series + - n_features: number of variables (default 1 for univariate) + + Returns + ------- + self : object + Fitted estimator. + + Raises + ------ + ValueError + If time series length is less than or equal to period_length. + """ + # Validate input data + X = check_array(X) + + if len(X) <= self.period_length: + raise ValueError( + f"Time series length ({X.shape[0]}) must be greater than " + f"period_length ({self.period_length})." + ) + + # Check if time series length is compatible with period_length + rest_samples = X.shape[0] % self.period_length + if rest_samples != 0: + + warnings.warn( + f"The last sequence of series has {rest_samples} samples, " + f"which are less than other sequence." + ) + + # Fit the model + self._fit(X) + self.is_fitted_ = True + + # Set threshold + if self.contamination != "auto": + if not (0.0 < self.contamination <= 0.5): + raise ValueError( + f"contamination must be in (0, 0.5], got: {self.contamination}" + ) + # Define threshold based on contamination parameter + scores = self.score_samples(X) + self.offset_ = np.percentile(scores, 100.0 * self.contamination) + else: + # Use default threshold as described in the original paper + self.offset_ = -0.5 + + return self + + def _fit(self, X) -> "IKTOD": + """Internal method to fit the model. + + Parameters + ---------- + X : ndarray of shape (n_samples, n_features) + Time series data + + Returns + ------- + self : object + Fitted estimator. + """ + # Split time series into subsequences + X_sep = self._split_to_subsequences(X) + + # Initialize and fit IKGAD + self.ikgad_ = IKGAD( + n_estimators_1=self.n_estimators_1, + max_samples_1=self.max_samples_1, + n_estimators_2=self.n_estimators_2, + max_samples_2=self.max_samples_2, + method=self.method, + contamination=self.contamination, + random_state=self.random_state, + ) + + self.ikgad_.fit(X_sep) + return self + + def _split_to_subsequences(self, X) -> np.ndarray: + """Split time series into subsequences based on period_length. + + Parameters + ---------- + X : ndarray of shape (n_samples, n_features) + Time series data + + Returns + ------- + X_sep : ndarray + Subsequences of the original time series + """ + + indices = np.arange(self.period_length, X.shape[0], self.period_length) + return np.array_split(X, indices, 0) + + def predict(self, X) -> np.ndarray: + """Predict if subsequences contain outliers. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + Time series data to evaluate + + Returns + ------- + labels : ndarray of shape (n_subsequences,) + Returns +1 for inliers and -1 for outliers for each subsequence. + """ + check_is_fitted(self, "is_fitted_") + X = check_array(X) + X_sep = self._split_to_subsequences(X) + return self.ikgad_.predict(X_sep) + + def decision_function(self, X) -> np.ndarray: + """Compute decision scores for subsequences. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + Time series data to evaluate + + Returns + ------- + scores : ndarray of shape (n_subsequences,) + Decision scores. Negative scores represent outliers, + positive scores represent inliers. + """ + return self.score_samples(X) - self.offset_ + + def score_samples(self, X) -> np.ndarray: + """Compute anomaly scores for subsequences. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + Time series data to evaluate + + Returns + ------- + scores : ndarray of shape (n_subsequences,) + Anomaly scores where lower values indicate more anomalous subsequences. + """ + check_is_fitted(self, "is_fitted_") + X = check_array(X) + X_sep = self._split_to_subsequences(X) + return self.ikgad_.score_samples(X_sep) diff --git a/pyikt/timeseries/tests/test_iktod.py b/pyikt/timeseries/tests/test_iktod.py new file mode 100644 index 0000000..40e17c1 --- /dev/null +++ b/pyikt/timeseries/tests/test_iktod.py @@ -0,0 +1,114 @@ +import numpy as np +import pytest +from pyikt.timeseries import IKTOD + + +def test_iktod_fit_and_predict(): + # Create a simple sinusoidal time series with an anomaly + length = 40 + period_length = 10 + X = np.sin(np.linspace(0, 8 * np.pi, length)).reshape(-1, 1) + + # Add anomaly + X[25:30] = X[25:30] + 2.0 + + # Initialize and fit the model + detector = IKTOD(period_length=period_length, contamination=0.1, random_state=42) + + detector.fit(X) + + # Check if the model is fitted + assert hasattr(detector, "is_fitted_") + assert detector.is_fitted_ is True + + # Check if ikgad_ attribute exists + assert hasattr(detector, "ikgad_") + + # Test predictions + predictions = detector.predict(X) + + # Should have 4 predictions (one for each subsequence) + assert len(predictions) == length // period_length + + # Ensure predictions are either -1 or 1 + assert np.all(np.isin(predictions, [-1, 1])) + + # Test decision function + scores = detector.decision_function(X) + assert len(scores) == length // period_length + + # Test score_samples + anomaly_scores = detector.score_samples(X) + assert len(anomaly_scores) == length // period_length + + +def test_iktod_invalid_input(): + # Test with incompatible time series length + length = 5 # Less than period_length=10 + period_length = 10 + X = np.sin(np.linspace(0, 8 * np.pi, length)).reshape(-1, 1) + + detector = IKTOD(period_length=period_length) + + with pytest.raises( + ValueError, match="Time series length.*must be greater than period_length" + ): + detector.fit(X) + + +def test_iktod_warning_on_misaligned_data(): + # Test warning for misaligned data + length = 43 # Not divisible by period_length=10 + period_length = 10 + X = np.sin(np.linspace(0, 8 * np.pi, length)).reshape(-1, 1) + + detector = IKTOD(period_length=period_length) + + with pytest.warns(UserWarning, match="The last sequence of series has"): + detector.fit(X) + + +def test_iktod_invalid_contamination(): + # Test with invalid contamination value + X = np.sin(np.linspace(0, 8 * np.pi, 40)).reshape(-1, 1) + + # Contamination > 0.5 + detector = IKTOD(period_length=10, contamination=0.6) + + with pytest.raises(ValueError, match="contamination must be in"): + detector.fit(X) + + +def test_iktod_different_methods(): + # Test different isolation methods + X = np.sin(np.linspace(0, 8 * np.pi, 40)).reshape(-1, 1) + + # Test with 'anne' method + detector_anne = IKTOD(period_length=10, method="anne", random_state=42) + detector_anne.fit(X) + predictions_anne = detector_anne.predict(X) + + # Test with 'inne' method + detector_inne = IKTOD(period_length=10, method="inne", random_state=42) + detector_inne.fit(X) + predictions_inne = detector_inne.predict(X) + + # Both should produce valid predictions + assert len(predictions_anne) == 4 + assert len(predictions_inne) == 4 + + +def test_iktod_auto_contamination(): + # Test with 'auto' contamination + X = np.sin(np.linspace(0, 8 * np.pi, 40)).reshape(-1, 1) + X[25:30] = X[25:30] + 2.0 # Add anomaly + + detector = IKTOD(period_length=10, contamination="auto", random_state=42) + detector.fit(X) + + # Check if offset_ is set to -0.5 as specified in the code + assert detector.offset_ == -0.5 + + # Test predictions + predictions = detector.predict(X) + assert len(predictions) == 4 diff --git a/pyikt/trajectory/__init__.py b/pyikt/trajectory/__init__.py new file mode 100644 index 0000000..1d04e46 --- /dev/null +++ b/pyikt/trajectory/__init__.py @@ -0,0 +1,18 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +from .anomaly._ikat import IKAT +from .cluster._tidkc import TIDKC + + +__all__ = [ + "IKAT", + "TIDKC", +] diff --git a/pyikt/trajectory/anomaly/__init__.py b/pyikt/trajectory/anomaly/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyikt/trajectory/anomaly/_ikat.py b/pyikt/trajectory/anomaly/_ikat.py new file mode 100644 index 0000000..d38b31b --- /dev/null +++ b/pyikt/trajectory/anomaly/_ikat.py @@ -0,0 +1,224 @@ +import numpy as np +from typing import Optional, Union, Literal, Any +from sklearn.base import BaseEstimator, OutlierMixin +from sklearn.utils.validation import check_is_fitted +from pyikt.group import IKGAD +from pyikt.group.utils import check_format + + +class IKAT(OutlierMixin, BaseEstimator): + """Isolation-based anomaly detection for trajectory data. + + IKAT is a trajectory anomaly detection algorithm that leverages the Isolation Distribution Kernel. + Trajectory data is a sequence of points in a multi-dimensional space. + It leverages a two-step approach: first transforming the data using an isolation kernel, + then calculating kernel mean embeddings for each trajectory data to detect anomalous trajectory. + The algorithm is effective for detecting both global and local trajectory anomalies. + + Parameters + ---------- + n_estimators_1 : int, default=200 + Number of base estimators in the first step ensemble. + + max_samples_1 : int, float or "auto", default="auto" + Number of samples to draw for training each base estimator in first step: + - If int, draws exactly `max_samples_1` samples + - If float, draws `max_samples_1 * n_samples` samples + - If "auto", draws `min(8, n_samples)` samples + + n_estimators_2 : int, default=200 + Number of base estimators in the second step ensemble. + + max_samples_2 : int, float or "auto", default="auto" + Number of samples to draw for training each base estimator in second step: + - If int, draws exactly `max_samples_2` samples + - If float, draws `max_samples_2 * n_samples` samples + - If "auto", draws `min(8, n_samples)` samples + + method : {"inne", "anne"}, default="inne" + Isolation method to use. "inne" is the original algorithm from the paper. + + contamination : "auto" or float, default="auto" + Proportion of outliers in the dataset: + - If "auto", threshold is determined as in the original paper + - If float, must be in range (0, 0.5] + + random_state : int, RandomState or None, default=None + Controls randomness for reproducibility. + + Attributes + ---------- + offset_ : float + Offset used to define the decision function from the raw scores. + + ikgod_ : IKGAD + The fitted IKGAD object. + + is_fitted_ : bool + Flag indicating if the estimator is fitted. + + References + ---------- + .. [1] Wang, Y., Wang, Z., Ting, K. M., & Shang, Y. (2024). + A Principled Distributional Approach to Trajectory Similarity Measurement and + its Application to Anomaly Detection. Journal of Artificial Intelligence Research, 79, 865-893. + + Examples + -------- + >>> from pyikt.trajectory import IKAT + >>> from pyikt.trajectory.dataloader import SheepDogs + >>> sheepdogs = SheepDogs() + >>> X, y = sheepdogs.load(return_X_y=True) + >>> clf = IKAT().fit(X) + >>> predictions = clf.predict(X) + >>> anomaly_scores = clf.score_samples(X) + """ + + def __init__( + self, + n_estimators_1: int = 100, + max_samples_1: Union[int, float, str] = "auto", + n_estimators_2: int = 100, + max_samples_2: Union[int, float, str] = "auto", + contamination: Union[str, float] = "auto", + method: Literal["inne", "anne", "auto"] = "inne", + random_state: Optional[Union[int, np.random.RandomState]] = None, + ): + self.n_estimators_1 = n_estimators_1 + self.max_samples_1 = max_samples_1 + self.n_estimators_2 = n_estimators_2 + self.max_samples_2 = max_samples_2 + self.random_state = random_state + self.contamination = contamination + self.method = method + + def fit(self, X: list, y: Any = None) -> "IKAT": + """Fit the anomaly detector. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories to train on. + + y : Ignored + Not used, present for API consistency. + + Returns + ------- + self : object + Fitted estimator. + + Raises + ------ + ValueError + If contamination is outside of (0, 0.5] range or method is not valid. + """ + X = check_format(X, n_features=2) + + # Validate method parameter + if self.method not in ["inne", "anne"]: + raise ValueError( + f"method must be one of 'inne', 'anne', got: {self.method}" + ) + + # Validate contamination parameter + if self.contamination != "auto" and not (0.0 < self.contamination <= 0.5): + raise ValueError( + f"contamination must be in (0, 0.5], got: {self.contamination}" + ) + + # Fit the model + self._fit(X) + self.is_fitted_ = True + + # Set the offset for decision function + if self.contamination == "auto": + self.offset_ = -0.5 + else: + # Set threshold based on contamination level + self.offset_ = np.percentile( + self.score_samples(X), 100.0 * self.contamination + ) + + return self + + def _fit(self, X: list) -> "IKAT": + """Internal fit function for training the IKGAD model. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories to train on. + + Returns + ------- + self : object + Fitted estimator. + """ + ikgad = IKGAD( + n_estimators_1=self.n_estimators_1, + max_samples_1=self.max_samples_1, + n_estimators_2=self.n_estimators_2, + max_samples_2=self.max_samples_2, + random_state=self.random_state, + contamination=self.contamination, + method=self.method, + ) + self.ikgad_ = ikgad.fit(X) + return self + + def predict(self, X: list) -> list: + """Predict if trajectories are outliers or not. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories. + + Returns + ------- + labels : ndarray of shape (n_trajectories,) + The predicted labels: + - 1 for inliers + - -1 for outliers + """ + check_is_fitted(self, "is_fitted_") + X = check_format(X, n_features=2) + return self.ikgad_.predict(X) + + def decision_function(self, X: list) -> list: + """Compute the decision function for each trajectory. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories. + + Returns + ------- + scores : ndarray of shape (n_trajectories,) + The decision function value for each trajectory. + Negative values indicate outliers, positive values indicate inliers. + """ + check_is_fitted(self, "is_fitted_") + X = check_format(X, n_features=2) # Add format check for consistency + return self.ikgad_.decision_function(X) + + def score_samples(self, X: list) -> list: + """Compute the anomaly scores for each trajectory. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories. + + Returns + ------- + scores : ndarray of shape (n_trajectories,) + The anomaly scores for each trajectory. + Lower scores indicate more anomalous trajectories. + """ + check_is_fitted(self, "is_fitted_") + X = check_format(X, n_features=2) # Use check_format consistently + + return self.ikgad_.score_samples(X) diff --git a/pyikt/trajectory/cluster/__init__.py b/pyikt/trajectory/cluster/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyikt/trajectory/cluster/_tidkc.py b/pyikt/trajectory/cluster/_tidkc.py new file mode 100644 index 0000000..bef2d8f --- /dev/null +++ b/pyikt/trajectory/cluster/_tidkc.py @@ -0,0 +1,227 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from sklearn.base import BaseEstimator, ClusterMixin +from pyikt.kernel import IsoKernel +from pyikt.cluster import IDKC +from pyikt.group.utils import check_format +from typing import Optional, Union, Literal, Any + + +class TIDKC(BaseEstimator, ClusterMixin): + """Trajectory Isolation Distributional Kernel Clustering (TIDKC). + + TIDKC identifies non-linearly separable clusters with irregular shapes and varied + densities in trajectory data using distributional kernels. It operates in linear + time, does not rely on random initialization, and is robust to outliers. + + Parameters + ---------- + k : int + The number of clusters to form. + + kn : int + The number of nearest neighbors to consider when calculating the local contrast. + + v : float + The decay factor for reducing the threshold value. + + n_init_samples : int + The number of samples to use for initializing the cluster centers. + + n_estimators_1 : int, default=100 + Number of base estimators in the first step ensemble. + + max_samples_1 : int, float or "auto", default="auto" + Number of samples to draw for training each base estimator in first step: + - If int, draws exactly `max_samples_1` samples + - If float, draws `max_samples_1 * n_samples` samples + - If "auto", draws `min(8, n_samples)` samples + + n_estimators_2 : int, default=100 + Number of base estimators in the second step ensemble. + + max_samples_2 : int, float or "auto", default="auto" + Number of samples to draw for training each base estimator in second step: + - If int, draws exactly `max_samples_2` samples + - If float, draws `max_samples_2 * n_samples` samples + - If "auto", draws `min(8, n_samples)` samples + + method : {"inne", "anne"}, default="anne" + Isolation method to use. "anne" is the original algorithm from the paper. + + is_post_process : bool, default=True + Whether to perform post-processing to refine the clusters. + + random_state : int, RandomState instance or None, default=None + Controls the pseudo-randomness of the selection of the feature + and split values for each branching step and each tree in the forest. + + Attributes + ---------- + labels_ : ndarray of shape (n_samples,) + Cluster labels for each point in the dataset. + + iso_kernel_ : IsoKernel + The fitted isolation kernel. + + idkc_ : IDKC + The fitted IDKC clustering model. + + References + ---------- + .. [1] Z. J. Wang, Y. Zhu and K. M. Ting, "Distribution-Based Trajectory Clustering," + 2023 IEEE International Conference on Data Mining (ICDM). + + Examples + -------- + >>> from pyikt.trajectory import TIDKC + >>> from pyikt.trajectory.dataloader import SheepDogs + >>> sheepdogs = SheepDogs() + >>> X, y = sheepdogs.load(return_X_y=True) + >>> clf = TIDKC(k=2, kn=5, v=0.5, n_init_samples=10).fit(X) + >>> predictions = clf.fit_predict(X) + """ + + def __init__( + self, + k: int, + kn: int, + v: float, + n_init_samples: int, + n_estimators_1: int = 100, + max_samples_1: Union[int, float, str] = "auto", + n_estimators_2: int = 100, + max_samples_2: Union[int, float, str] = "auto", + method: Literal["inne", "anne"] = "anne", + is_post_process: bool = True, + random_state: Optional[Union[int, np.random.RandomState]] = None, + ): + self.n_estimators_1 = n_estimators_1 + self.max_samples_1 = max_samples_1 + self.n_estimators_2 = n_estimators_2 + self.max_samples_2 = max_samples_2 + self.method = method + self.k = k + self.kn = kn + self.v = v + self.n_init_samples = n_init_samples + self.is_post_process = is_post_process + self.random_state = random_state + + def fit(self, X: list, y: Any = None) -> "TIDKC": + """Fit the trajectory cluster model. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories to train on. + + y : Ignored + Not used, present for API consistency. + + Returns + ------- + self : object + Fitted estimator. + + Raises + ------ + ValueError + If method is not valid. + """ + X = check_format(X, n_features=2) + + # Validate method parameter + if self.method not in ["inne", "anne"]: + raise ValueError( + f"method must be one of 'inne', 'anne', got: {self.method}" + ) + + # Fit the model + self._fit(X) + self.is_fitted_ = True + return self + + def _kernel_mean_embedding(self, X, t): + """Calculate kernel mean embedding of transformed data. + + Parameters + ---------- + X : array-like of shape (n_samples, n_estimators) + Transformed data from isolation kernel + t : int + Normalization factor (typically number of estimators) + + Returns + ------- + embedding : ndarray + Kernel mean embedding + """ + return np.mean(X, axis=0) / t + + def _fit(self, X): + """Internal fitting method. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories to train on. + """ + X_full = np.vstack(X) + iso_kernel = IsoKernel( + n_estimators=self.n_estimators_1, + max_samples=self.max_samples_1, + method=self.method, + random_state=self.random_state, + ) + iso_kernel.fit(X_full) + split_idx = np.cumsum([len(x) for x in X]) + X_trans = iso_kernel.transform(X_full) + group_embeddings = np.split(X_trans.toarray(), split_idx[:-1], axis=0) + X_embeddings = np.asarray( + [ + self._kernel_mean_embedding(x, self.n_estimators_1) + for x in group_embeddings + ] + ) + self.idkc_ = IDKC( + n_estimators=self.n_estimators_2, + max_samples=self.max_samples_2, + method=self.method, + k=self.k, + kn=self.kn, + v=self.v, + n_init_samples=self.n_init_samples, + is_post_process=self.is_post_process, + random_state=self.random_state, + ) + + self.labels_ = self.idkc_.fit_predict(X_embeddings) + return self + + def fit_predict(self, X, y=None): + """Fit the model and predict clusters for X. + + Parameters + ---------- + X : array-like of shape (n_trajectories, n_points, n_features) + The input trajectories. + + y : Ignored + Not used, present for API consistency. + + Returns + ------- + labels : ndarray of shape (n_samples,) + Cluster labels. + """ + return super().fit_predict(X, y) diff --git a/pyikt/trajectory/dataloader/__init__.py b/pyikt/trajectory/dataloader/__init__.py new file mode 100644 index 0000000..958f020 --- /dev/null +++ b/pyikt/trajectory/dataloader/__init__.py @@ -0,0 +1,7 @@ +# Copyright 2024 Xin Han. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +from ._sheepdogs import SheepDogs + +__all__ = ["SheepDogs"] diff --git a/pyikt/trajectory/dataloader/_sheepdogs.py b/pyikt/trajectory/dataloader/_sheepdogs.py new file mode 100644 index 0000000..d14f7b0 --- /dev/null +++ b/pyikt/trajectory/dataloader/_sheepdogs.py @@ -0,0 +1,141 @@ +from .base import FileDataset +import pandas as pd +import datetime + + +class SheepDogs(FileDataset): + """SheepDogs trajectory dataset. + + A trajectory dataset collected from MoveBank containing movement patterns of sheep dogs + and other related animals. This dataset can be used for trajectory analysis and anomaly detection. + + The dataset is loaded with 2 features (longitude and latitude), and samples are classified + into 2 classes (normal and anomalous). + + Attributes + ---------- + n_features : int + Number of features in the dataset (2: longitude and latitude). + n_samples : int + Total number of trajectory samples after processing. + n_classes : int + Number of classes (2: normal and anomalous). + anomaly_ratio : float + Ratio of anomalous trajectories to total trajectories. + + References + ---------- + .. [1] Movebank: https://www.movebank.org/cms/movebank-main + + .. [2] Wang, Y., Wang, Z., Ting, K. M., & Shang, Y. (2024). + A Principled Distributional Approach to Trajectory Similarity Measurement and + its Application to Anomaly Detection. Journal of Artificial Intelligence Research, 79, 865-893. + + Examples + -------- + >>> from pyikt.trajectory.dataloader import SheepDogs + >>> sheepdogs = SheepDogs() + >>> X, y = sheepdogs.load(return_X_y=True) + """ + + def __init__(self): + super().__init__( + n_features=2, + n_samples=None, + n_classes=2, + filename="./datasets/sheepdogs.zip", + ) + self.anomaly_ratio = None + + def load(self, return_X_y=False): + """Load the SheepDogs dataset. + + Parameters + ---------- + return_X_y : bool, default=False + If True, returns a tuple (X, y) where X is the data and y is the target. + If False, returns a dict with keys 'X' and 'y'. + + Returns + ------- + dict or tuple + Either (X, y) tuple or {'X': data, 'y': target} dict where data is a list + of trajectories and target indicates normal (1) or anomalous (0) trajectories. + """ + # Load and filter data + data = pd.read_csv( + self.path, + usecols=[ + "timestamp", + "location-long", + "location-lat", + "individual-local-identifier", + ], + parse_dates=["timestamp"], + ) + + # Select specific individuals for dataset + individual_local = data["individual-local-identifier"].value_counts().index + selected_individuals = [ + 0, + 1, + 2, + 6, + 14, + ] # Individual #14 is considered anomalous + mask = data["individual-local-identifier"].isin( + individual_local[selected_individuals] + ) + sub_data = data[mask] + sub_data.dropna( + subset=["location-long", "location-lat"], how="any", inplace=True + ) + + # Define trajectory splitting parameters + gap = datetime.timedelta(hours=1) + tmp_traj = [] + anomalies = [] + normal_traj = [] + labels = [] + + # Process trajectories + for i in range(1, len(sub_data)): + previous_location = [ + sub_data["location-long"].iloc[i - 1], + sub_data["location-lat"].iloc[i - 1], + ] + previous_timestamp = sub_data["timestamp"].iloc[i - 1] + current_timestamp = sub_data["timestamp"].iloc[i] + previous_individual = sub_data["individual-local-identifier"].iloc[i - 1] + current_individual = sub_data["individual-local-identifier"].iloc[i] + tmp_traj.append(previous_location) + + # Split trajectory when there's a large time gap or different individual + if ( + current_timestamp - previous_timestamp > gap + or previous_individual != current_individual + ): + if len(tmp_traj) > 10: # Ensure minimum trajectory length + if previous_individual == individual_local[14]: + anomalies.append(tmp_traj) + labels.append(0) # 0 for anomalous + else: + normal_traj.append(tmp_traj) + labels.append(1) # 1 for normal + tmp_traj = [] + + # Filter anomalies with a minimum length requirement + filtered_anomalies = [x for x in anomalies if len(x) > 16] + all_traj = normal_traj + filtered_anomalies + + # Update object attributes + self.anomaly_ratio = len(filtered_anomalies) / len(all_traj) + self.n_samples = len(all_traj) + + if return_X_y: + return all_traj, labels + else: + return { + "X": all_traj, + "y": labels, + } diff --git a/pyikt/trajectory/dataloader/base.py b/pyikt/trajectory/dataloader/base.py new file mode 100644 index 0000000..18de853 --- /dev/null +++ b/pyikt/trajectory/dataloader/base.py @@ -0,0 +1,159 @@ +from __future__ import annotations + +import abc +import inspect +import itertools +import os +import pathlib +import re + +__all__ = ["Dataset", "FileDataset"] + +REG = "Regression" +TRANJECTORY_AD = "Trajectory anomaly detection" +MULTI_CLF = "Multi-class classification" +MO_BINARY_CLF = "Multi-output binary classification" +MO_REG = "Multi-output regression" + + +def get_data_home(): + """Return the location where remote datasets are to be stored.""" + + data_home = os.environ.get("RIVER_DATA", os.path.join("~", "river_data")) + data_home = os.path.expanduser(data_home) + if not os.path.exists(data_home): + os.makedirs(data_home) + return data_home + + +class Dataset(abc.ABC): + """Base class for all datasets. + + All datasets inherit from this class, be they stored in a file or generated on the fly. + + Parameters + ---------- + n_features + Number of features in the dataset. + n_samples + Number of samples in the dataset. + n_classes + Number of classes in the dataset, only applies to classification datasets. + n_outputs + Number of outputs the target is made of, only applies to multi-output datasets. + anomaly_ratio + The ratio of anomalies in the dataset. + sparse + Whether the dataset is sparse or not. + + """ + + def __init__( + self, + n_features, + n_samples=None, + n_classes=None, + n_outputs=None, + anomaly_ratio=None, + sparse=False, + ): + self.n_features = n_features + self.n_samples = n_samples + self.n_outputs = n_outputs + self.n_classes = n_classes + self.sparse = sparse + self.anomaly_ratio = anomaly_ratio + + # @abc.abstractmethod + # def __iter__(self): + # raise NotImplementedError + + # def take(self, k: int): + # """Iterate over the k samples.""" + # return itertools.islice(self, k) + + @property + def desc(self): + """Return the description from the docstring.""" + desc = re.split(pattern=r"\w+\n\s{4}\-{3,}", string=self.__doc__, maxsplit=0)[0] + return inspect.cleandoc(desc) + + @property + def _repr_content(self): + """The items that are displayed in the __repr__ method. + + This property can be overridden in order to modify the output of the __repr__ method. + + """ + + content = {} + content["Name"] = self.__class__.__name__ + if self.n_samples: + content["Samples"] = f"{self.n_samples:,}" + if self.n_features: + content["Features"] = f"{self.n_features:,}" + if self.n_outputs: + content["Outputs"] = f"{self.n_outputs:,}" + if self.n_classes: + content["Classes"] = f"{self.n_classes:,}" + if self.anomaly_ratio: + content["Anomaly Ratio"] = f"{self.anomaly_ratio:.2f}" + content["Sparse"] = str(self.sparse) + + return content + + def __repr__(self): + l_len = max(map(len, self._repr_content.keys())) + r_len = max(map(len, self._repr_content.values())) + + out = f"{self.desc}\n\n" + "\n".join( + k.rjust(l_len) + " " + v.ljust(r_len) + for k, v in self._repr_content.items() + ) + + if "Parameters\n ----------" in self.__doc__: + params = re.split( + r"\w+\n\s{4}\-{3,}", + re.split("Parameters\n ----------", self.__doc__)[1], + )[0].rstrip() + out += f"\n\nParameters\n----------{params}" + + return out + + +class FileDataset(Dataset): + """Base class for datasets that are stored in a local file. + + Small datasets that are part of the river package inherit from this class. + + Parameters + ---------- + filename + The file's name. + directory + The directory where the file is contained. Defaults to the location of the `datasets` + module. + desc + Extra dataset parameters to pass as keyword arguments. + + """ + + def __init__(self, filename, directory=None, **desc): + super().__init__(**desc) + self.filename = filename + self.directory = directory + + def load(self, **kwargs): + return NotImplementedError + + @property + def path(self): + if self.directory: + return pathlib.Path(self.directory).joinpath(self.filename) + return pathlib.Path(__file__).parent.joinpath(self.filename) + + @property + def _repr_content(self): + content = super()._repr_content + content["Path"] = str(self.path) + return content diff --git a/pyikt/trajectory/dataloader/datasets/flyingfox.zip b/pyikt/trajectory/dataloader/datasets/flyingfox.zip new file mode 100644 index 0000000..b195ef9 Binary files /dev/null and b/pyikt/trajectory/dataloader/datasets/flyingfox.zip differ diff --git a/pyikt/trajectory/dataloader/datasets/sheepdogs.zip b/pyikt/trajectory/dataloader/datasets/sheepdogs.zip new file mode 100644 index 0000000..8eaedf6 Binary files /dev/null and b/pyikt/trajectory/dataloader/datasets/sheepdogs.zip differ diff --git a/pyikt/trajectory/dataloader/datasets/turkey.zip b/pyikt/trajectory/dataloader/datasets/turkey.zip new file mode 100644 index 0000000..f7248f5 Binary files /dev/null and b/pyikt/trajectory/dataloader/datasets/turkey.zip differ diff --git a/pyikt/trajectory/dataloader/datasets/wildebeest.zip b/pyikt/trajectory/dataloader/datasets/wildebeest.zip new file mode 100644 index 0000000..e69090c Binary files /dev/null and b/pyikt/trajectory/dataloader/datasets/wildebeest.zip differ diff --git a/pyikt/trajectory/tests/test_ikat.py b/pyikt/trajectory/tests/test_ikat.py new file mode 100644 index 0000000..3b27745 --- /dev/null +++ b/pyikt/trajectory/tests/test_ikat.py @@ -0,0 +1,132 @@ +""" +Copyright 2024 Xin Han. All rights reserved. +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file. +""" + +import pytest +import numpy as np +from pyikt.trajectory import IKAT + + +@pytest.fixture +def trajectory_data(): + # Create simple synthetic trajectory data + # 10 trajectories, each with 5 points in 2D space + n_trajectories = 10 + n_points = 5 + n_features = 2 + + # Generate random trajectories + np.random.seed(42) + trajectories = [np.random.rand(n_points, n_features) for _ in range(n_trajectories)] + + # Make one trajectory anomalous by placing it far away + trajectories[0] = np.random.rand(n_points, n_features) + 10 + + return trajectories + + +@pytest.mark.parametrize("method", ["inne", "anne"]) +def test_IKAT_init(method): + ikat = IKAT( + n_estimators_1=100, + max_samples_1=8, + n_estimators_2=100, + max_samples_2=8, + contamination=0.1, + method=method, + ) + assert ikat.n_estimators_1 == 100 + assert ikat.max_samples_1 == 8 + assert ikat.n_estimators_2 == 100 + assert ikat.max_samples_2 == 8 + assert ikat.contamination == 0.1 + assert ikat.method == method + + +def test_IKAT_invalid_method(): + with pytest.raises(ValueError): + ikat = IKAT(method="invalid_method") + ikat.fit([np.random.rand(5, 2) for _ in range(10)]) + + +def test_IKAT_invalid_contamination(): + with pytest.raises(ValueError): + ikat = IKAT(contamination=0.6) + ikat.fit([np.random.rand(5, 2) for _ in range(10)]) + + +@pytest.mark.parametrize("method", ["inne", "anne"]) +def test_IKAT_fit(trajectory_data, method): + ikat = IKAT(n_estimators_1=50, n_estimators_2=50, method=method, random_state=42) + ikat.fit(trajectory_data) + assert hasattr(ikat, "is_fitted_") + assert ikat.is_fitted_ + assert hasattr(ikat, "ikgad_") + assert hasattr(ikat, "offset_") + + +@pytest.mark.parametrize("method", ["inne", "anne"]) +def test_IKAT_predict(trajectory_data, method): + ikat = IKAT( + n_estimators_1=100, + n_estimators_2=100, + max_samples_1=2, + max_samples_2=2, + method=method, + contamination=0.1, + random_state=42, + ) + ikat.fit(trajectory_data) + + # Test prediction + predictions = ikat.predict(trajectory_data) + assert len(predictions) == len(trajectory_data) + assert set(np.unique(predictions)).issubset({-1, 1}) + + # Should have at least one anomaly + assert -1 in predictions + + +@pytest.mark.parametrize("method", ["inne", "anne"]) +def test_IKAT_score_samples(trajectory_data, method): + ikat = IKAT( + n_estimators_1=50, + n_estimators_2=50, + method=method, + contamination="auto", + random_state=42, + ) + ikat.fit(trajectory_data) + + # Test scoring + scores = ikat.score_samples(trajectory_data) + assert len(scores) == len(trajectory_data) + + # First trajectory should have the lowest score (most anomalous) + assert scores[0] <= np.min(scores[1:]) + + +@pytest.mark.parametrize("method", ["inne", "anne"]) +def test_IKAT_decision_function(trajectory_data, method): + ikat = IKAT(n_estimators_1=50, n_estimators_2=50, method=method, random_state=42) + ikat.fit(trajectory_data) + + # Test decision function + decision_scores = ikat.decision_function(trajectory_data) + assert len(decision_scores) == len(trajectory_data) + + # Check consistency with predictions + predictions = ikat.predict(trajectory_data) + for score, pred in zip(decision_scores, predictions): + if score < 0: + assert pred == -1 + else: + assert pred == 1 + + +def test_IKAT_check_is_fitted(): + ikat = IKAT() + with pytest.raises(Exception): # Should raise some kind of not fitted error + ikat.predict([np.random.rand(5, 2)]) diff --git a/pyikt/trajectory/tests/test_tidkc.py b/pyikt/trajectory/tests/test_tidkc.py new file mode 100644 index 0000000..174acce --- /dev/null +++ b/pyikt/trajectory/tests/test_tidkc.py @@ -0,0 +1,109 @@ +import numpy as np +import pytest +from pyikt.trajectory import TIDKC + + +def test_tidkc_initialization(): + """Test TIDKC initialization with default parameters.""" + tidkc = TIDKC(k=2, kn=5, v=0.5, n_init_samples=10) + assert tidkc.k == 2 + assert tidkc.kn == 5 + assert tidkc.v == 0.5 + assert tidkc.n_init_samples == 10 + assert tidkc.method == "anne" + assert tidkc.is_post_process is True + + +def test_tidkc_invalid_method(): + """Test TIDKC with invalid method parameter.""" + tidkc = TIDKC(k=2, kn=5, v=0.5, n_init_samples=10, method="invalid_method") + + # Create some simple trajectory data + X = [np.random.rand(5, 2) for _ in range(10)] + + with pytest.raises(ValueError, match="method must be one of 'inne', 'anne'"): + tidkc.fit(X) + + +def test_tidkc_fit_predict(): + """Test TIDKC fit and predict functionality.""" + # Create sample trajectory data + n_trajectories = 20 + trajectory_length = 10 + n_features = 2 + + # Create two clusters of trajectories + X = [] + for i in range(n_trajectories): + if i < n_trajectories // 2: + # Cluster 1: trajectories in the top half of the space + trajectory = np.random.rand(trajectory_length, n_features) + trajectory[:, 1] += 1 # Move up in y-dimension + else: + # Cluster 2: trajectories in the bottom half of the space + trajectory = np.random.rand(trajectory_length, n_features) + X.append(trajectory) + + # Fit the model with a small number of estimators for quick testing + tidkc = TIDKC( + k=2, + kn=3, + v=0.5, + n_init_samples=5, + n_estimators_1=100, + max_samples_1=2, + n_estimators_2=100, + max_samples_2=2, + random_state=42, + ) + + # Test fit + tidkc.fit(X) + assert hasattr(tidkc, "labels_") + assert hasattr(tidkc, "idkc_") + + # Test predict + labels = tidkc.fit_predict(X) + assert isinstance(labels, np.ndarray) + assert labels.shape == (n_trajectories,) + assert len(np.unique(labels)) <= 2 # Should have at most 2 clusters + + +def test_tidkc_with_different_parameters(): + """Test TIDKC with different parameters.""" + # Create simple trajectory data + np.random.seed(42) + X = [np.random.rand(5, 2) for _ in range(15)] + + # Test with different method + tidkc1 = TIDKC( + k=3, + kn=4, + v=0.4, + n_init_samples=5, + method="anne", + n_estimators_1=100, + max_samples_1=2, + n_estimators_2=100, + max_samples_2=2, + random_state=42, + ) + labels1 = tidkc1.fit_predict(X) + + # Test with no post-processing + tidkc2 = TIDKC( + k=3, + kn=4, + v=0.4, + n_init_samples=5, + is_post_process=False, + n_estimators_1=100, + max_samples_1=2, + n_estimators_2=100, + max_samples_2=2, + random_state=42, + ) + labels2 = tidkc2.fit_predict(X) + + assert labels1.shape == (len(X),) + assert labels2.shape == (len(X),) diff --git a/pyikt/trajectory/utils.py b/pyikt/trajectory/utils.py new file mode 100644 index 0000000..e7b51bb --- /dev/null +++ b/pyikt/trajectory/utils.py @@ -0,0 +1,83 @@ +""" +pyikt (c) by Xin Han + +pyikt is licensed under a +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + +You should have received a copy of the license along with this +work. If not, see . +""" + +import numpy as np +from typing import Union, List, Any, Optional + + +def check_format( + X: Union[List[Any], np.ndarray], + allow_empty: bool = False, + n_features: Optional[int] = 2, +) -> np.ndarray: + """ + Validates trajectory data format. + + Parameters: + ----------- + X : array-like + Trajectory data with shape (n_trajectories, n_samples, n_features) + allow_empty : bool, default=False + Whether to allow trajectories with no samples + n_features : int, optional, default=2 + Expected number of features (e.g., 2 for longitude/latitude) + + Returns: + -------- + np.ndarray + Validated trajectory data + """ + # Convert to numpy array if needed + if not isinstance(X, (list, np.ndarray)): + raise TypeError( + "X should be array-like with 3 dimensions (n_trajectories, n_samples, n_features)" + ) + + X = np.asarray(X) + + # Validate dimensions + if X.ndim != 3: + raise ValueError(f"Expected 3D array, got shape {X.shape}") + + # Check for empty trajectories + if not allow_empty: + empty_mask = np.array([len(traj) == 0 for traj in X]) + if np.any(empty_mask): + empty_indices = np.where(empty_mask)[0] + raise ValueError( + f"Trajectories at indices {empty_indices.tolist()} have no samples" + ) + + # Extract only non-empty trajectories for further checks + non_empty_mask = np.array([len(traj) > 0 for traj in X]) + if not np.any(non_empty_mask): + # All trajectories are empty but allowed + return X + + non_empty_trajectories = X[non_empty_mask] + + # Check trajectory lengths + trajectory_lengths = np.array([len(traj) for traj in non_empty_trajectories]) + unique_lengths = np.unique(trajectory_lengths) + if len(unique_lengths) != 1: + raise ValueError( + f"All trajectories must have same length. Found lengths: {sorted(unique_lengths)}" + ) + + # Check feature dimensions + if n_features is not None: + feature_counts = np.array([traj.shape[1] for traj in non_empty_trajectories]) + if len(np.unique(feature_counts)) > 1 or feature_counts[0] != n_features: + feature_desc = "longitude, latitude" if n_features == 2 else f"{n_features}" + raise ValueError( + f"All trajectories must have {n_features} features ({feature_desc})" + ) + + return X diff --git a/pyproject.toml b/pyproject.toml index 5d7ddce..1a274ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,39 +1,75 @@ -[build-system] -requires = ["setuptools>=64", "setuptools_scm[toml]>=8"] -build-backend = "setuptools.build_meta" - [project] -name = "IsoML" +name = "pyikt" dynamic = ["version"] -authors = [ - { name="Vighnesh Birodkar", email="vighneshbirodkar@nyu.edu" }, - { name="Guillaume Lemaitre", email="g.lemaitre58@gmail.com" }, -] -description = "A template for scikit-learn compatible packages." + +description = "Isolation Kernel Toolkit in Python." readme = "README.md" -requires-python = ">=3.9" -dependencies = [ - "scikit-learn>=1.4.2", +authors = [ + { name = "Xin Han", email = "xhan197@outlook.com" }, + { name = "Yixiao Ma", email = "mayx@lamda.nju.edu.cn" }, + { name = "Ye Zhu", email = "ye.zhu@ieee.org" }, + { name = "Kaiming Ting", email = "tingkm@nju.edu.cn" }, ] + classifiers = [ + "Operating System :: MacOS", + "Operating System :: Microsoft :: Windows", + "Operating System :: POSIX", + "Operating System :: Unix", + "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "License :: OSI Approved :: BSD License", - "Operating System :: POSIX", - "Operating System :: Unix", - "Operating System :: MacOS", - "Operating System :: Microsoft :: Windows", ] +keywords = [ + "data-science", + "machine-learning", + "data-mining", + "anomaly detection", + "scikit-learn", + "cluster", + "graph embedding", + "isolation kernel", +] + +dependencies = [ + "numpy<=1.22", + "pandas>=1.5", + "scikit-learn>=1.2", + "numba>=0.54", + "tqdm >=4.62.3", +] +requires-python = ">=3.9" + [project.urls] -Homepage = "https://github.com/IsolationKernel/IsoML" -Issues = "https://github.com/IsolationKernel/IsoML/issues" +Homepage = "https://isolationkernel.github.io/pyikt/" +Repository = "https://github.com/IsolationKernel/pyikt" +Documentation = "https://isolationkernel.github.io/pyikt/" +"Release Notes" = "https://isolationkernel.github.io/pyikt/latest/releases/releases" + + +[project.license] +file = "LICENSE" + +[build-system] +requires = ["setuptools>=61", "toml", "build"] +build-backend = "setuptools.build_meta" + [tool.setuptools_scm] -version_file = "IsoML/_version.py" +version_file = "pyikt/_version.py" + +[tool.setuptools.packages.find] +where = ["."] # list of folders that contain the packages (["."] by default) +include = ["pyikt", "pyikt*"] +exclude = [ + "pyikt/**/tests/*", +] # exclude packages matching these glob patterns (empty by default) +namespaces = false # to disable scanning PEP 420 namespaces (true by default) [tool.pixi.project] channels = ["conda-forge"] @@ -42,9 +78,11 @@ platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] [tool.pixi.dependencies] python = ">=3.9" scikit-learn = ">=1.4.2" +numba = ">=0.54" +numpy = "<=1.22" [tool.pixi.pypi-dependencies] -IsoML = { path=".", editable=true } +pyikt = { path = ".", editable = true } [tool.pixi.feature.lint.dependencies] # The version below should be aligned with the one of `.pre-commit-config.yaml` @@ -53,30 +91,31 @@ pre-commit = "3.7.1" ruff = "0.4.2" [tool.pixi.feature.lint.tasks] -black = { cmd = "black --check --diff IsoML && black --check --diff examples" } -ruff = { cmd = "ruff check --output-format=full IsoML && ruff check --output-format=full examples" } -lint = { depends_on = ["black", "ruff"]} +black = { cmd = "black --check --diff pyikt && black --check --diff examples" } +ruff = { cmd = "ruff check --output-format=full pyikt && ruff check --output-format=full examples" } +lint = { depends_on = ["black", "ruff"] } [tool.pixi.feature.test.dependencies] pytest = "*" pytest-cov = "*" [tool.pixi.feature.test.tasks] -test = { cmd = "pytest -vsl --cov=IsoML --cov-report=xml IsoML" } +test = { cmd = "pytest -vsl --cov=pyikt --cov-report=xml pyikt" } [tool.pixi.feature.doc.dependencies] -matplotlib = "*" -numpydoc = "*" -pydata-sphinx-theme = "*" -setuptools-scm = ">=8" # needed for the versioning -sphinx = "*" -sphinx-design = "*" -sphinx-gallery = "*" -sphinx-prompt = "*" +mike = "2.1.3" +mkdocs = "1.6.1" +mkdocs-jupyter = "0.25.0" +mkdocs-material = "9.5.39" +mkdocstrings = "0.26.1" +mkdocstrings-python = "1.11.1" +notebook = "6.4.12" +jupyter_contrib_nbextensions = "0.7.0" +black = "23.3.0" [tool.pixi.feature.doc.tasks] -build-doc = { cmd = "make html", cwd = "doc" } -clean-doc = { cmd = "rm -rf _build", cwd = "doc" } +clean-doc = { cmd = "rm -rf site" } +build-doc = { cmd = "mkdocs build" } [tool.pixi.environments] doc = ["doc"] @@ -95,26 +134,26 @@ exclude = ''' | \.vscode )/ ''' -force-exclude = "IsoML/_version.py" +force-exclude = "pyikt/_version.py" [tool.ruff] # max line length for black line-length = 88 target-version = "py38" -exclude=[ +exclude = [ ".git", "__pycache__", "dist", "doc/_build", "doc/auto_examples", "build", - "IsoML/_version.py", + "pyikt/_version.py", ] [tool.ruff.lint] # all rules can be found here: https://beta.ruff.rs/docs/rules/ select = ["E", "F", "W", "I"] -ignore=[ +ignore = [ # space before : (needed for how black formats slicing) "E203", # do not assign a lambda expression, use a def @@ -126,9 +165,9 @@ ignore=[ [tool.ruff.lint.per-file-ignores] # It's fine not to put the import at the top of the file in the examples # folder. -"examples/*"=["E402"] -"doc/conf.py"=["E402"] -"doc/_templates/numpydoc_docstring.py"=["F821", "W292"] +"examples/*" = ["E402"] +"doc/conf.py" = ["E402"] +"doc/_templates/numpydoc_docstring.py" = ["F821", "W292"] [tool.pytest.ini_options] addopts = "--doctest-modules --color=yes" diff --git a/qodana.yaml b/qodana.yaml new file mode 100644 index 0000000..76fb7ad --- /dev/null +++ b/qodana.yaml @@ -0,0 +1,29 @@ +#-------------------------------------------------------------------------------# +# Qodana analysis is configured by qodana.yaml file # +# https://www.jetbrains.com/help/qodana/qodana-yaml.html # +#-------------------------------------------------------------------------------# +version: "1.0" + +#Specify inspection profile for code analysis +profile: + name: qodana.starter + +#Enable inspections +#include: +# - name: + +#Disable inspections +#exclude: +# - name: +# paths: +# - + +#Execute shell command before Qodana execution (Applied in CI/CD pipeline) +#bootstrap: sh ./prepare-qodana.sh + +#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline) +#plugins: +# - id: #(plugin id can be found at https://plugins.jetbrains.com) + +#Specify Qodana linter for analysis (Applied in CI/CD pipeline) +linter: jetbrains/qodana-:latest