mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-08 19:44:57 -05:00
feat: add GLM example and benchmark, improve quantization (#1115)
Starting from sklearn tutorial on PoissonRegression, quantize the regressor and compile to FHE Closes #979, #599, #1132
This commit is contained in:
276
benchmarks/glm.py
Normal file
276
benchmarks/glm.py
Normal file
@@ -0,0 +1,276 @@
|
||||
# bench: Full Target: Generalized Linear Model
|
||||
|
||||
from copy import deepcopy
|
||||
from typing import Any, Dict
|
||||
|
||||
import numpy as np
|
||||
from common import BENCHMARK_CONFIGURATION
|
||||
from sklearn.compose import ColumnTransformer
|
||||
from sklearn.datasets import fetch_openml
|
||||
from sklearn.decomposition import PCA
|
||||
from sklearn.linear_model import PoissonRegressor
|
||||
from sklearn.metrics import mean_poisson_deviance
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.pipeline import Pipeline, make_pipeline
|
||||
from sklearn.preprocessing import (
|
||||
FunctionTransformer,
|
||||
KBinsDiscretizer,
|
||||
OneHotEncoder,
|
||||
StandardScaler,
|
||||
)
|
||||
from tqdm import tqdm
|
||||
|
||||
from concrete.quantization import QuantizedArray, QuantizedLinear, QuantizedModule
|
||||
from concrete.quantization.quantized_activations import QuantizedActivation
|
||||
|
||||
|
||||
class QuantizedExp(QuantizedActivation):
|
||||
"""
|
||||
Quantized Exponential function
|
||||
|
||||
This class will build a quantized lookup table for the exp function
|
||||
applied to input calibration data
|
||||
"""
|
||||
|
||||
def calibrate(self, x: np.ndarray):
|
||||
self.q_out = QuantizedArray(self.n_bits, np.exp(x))
|
||||
|
||||
def __call__(self, q_input: QuantizedArray) -> QuantizedArray:
|
||||
"""Process the forward pass of the exponential.
|
||||
|
||||
Args:
|
||||
q_input (QuantizedArray): Quantized input.
|
||||
|
||||
Returns:
|
||||
q_out (QuantizedArray): Quantized output.
|
||||
"""
|
||||
|
||||
quant_exp = np.exp(self.dequant_input(q_input))
|
||||
|
||||
q_out = self.quant_output(quant_exp)
|
||||
return q_out
|
||||
|
||||
|
||||
class QuantizedGLM(QuantizedModule):
|
||||
"""
|
||||
Quantized Generalized Linear Model
|
||||
|
||||
Building on top of QuantizedModule, this class will chain together a linear transformation
|
||||
and an inverse-link function
|
||||
"""
|
||||
|
||||
def __init__(self, n_bits, sklearn_model, calibration_data) -> None:
|
||||
self.n_bits = n_bits
|
||||
|
||||
# We need to calibrate to a sufficiently low number of bits
|
||||
# so that the output of the Linear layer (w . x + b)
|
||||
# does not exceed 7 bits
|
||||
self.q_calibration_data = QuantizedArray(self.n_bits, calibration_data)
|
||||
|
||||
# Quantize the weights and create the quantized linear layer
|
||||
q_weights = QuantizedArray(self.n_bits, np.expand_dims(sklearn_model.coef_, 1))
|
||||
q_bias = QuantizedArray(self.n_bits, sklearn_model.intercept_)
|
||||
q_layer = QuantizedLinear(self.n_bits, q_weights, q_bias)
|
||||
|
||||
# Store quantized layers
|
||||
quant_layers_dict: Dict[str, Any] = {}
|
||||
|
||||
# Calibrate the linear layer and obtain calibration_data for the next layers
|
||||
calibration_data = self._calibrate_and_store_layers_activation(
|
||||
"linear", q_layer, calibration_data, quant_layers_dict
|
||||
)
|
||||
|
||||
# Add the inverse-link for inference.
|
||||
# This function needs to be quantized since it's computed in FHE.
|
||||
# However, we can use 7 bits of output since, in this case,
|
||||
# the result of the inverse-link is not processed by any further layers
|
||||
# Seven bits is the maximum precision but this could be lowered to improve speed
|
||||
# at the possible expense of higher deviance of the regressor
|
||||
q_exp = QuantizedExp(n_bits=7)
|
||||
|
||||
# Now calibrate the inverse-link function with the linear layer's output data
|
||||
calibration_data = self._calibrate_and_store_layers_activation(
|
||||
"invlink", q_exp, calibration_data, quant_layers_dict
|
||||
)
|
||||
|
||||
# Finally construct out Module using the quantized layers
|
||||
super().__init__(quant_layers_dict)
|
||||
|
||||
def _calibrate_and_store_layers_activation(
|
||||
self, name, q_function, calibration_data, quant_layers_dict
|
||||
):
|
||||
# Calibrate the output of the layer
|
||||
q_function.calibrate(calibration_data)
|
||||
# Store the learned quantized layer
|
||||
quant_layers_dict[name] = q_function
|
||||
# Create new calibration data (output of the previous layer)
|
||||
q_calibration_data = QuantizedArray(self.n_bits, calibration_data)
|
||||
# Dequantize to have the value in clear and ready for next calibration
|
||||
return q_function(q_calibration_data).dequant()
|
||||
|
||||
def quantize_input(self, x):
|
||||
q_input_arr = deepcopy(self.q_calibration_data)
|
||||
q_input_arr.update_values(x)
|
||||
return q_input_arr
|
||||
|
||||
|
||||
def score_estimator(y_pred, y_gt, gt_weight):
|
||||
"""Score an estimator on the test set."""
|
||||
|
||||
y_pred = np.squeeze(y_pred)
|
||||
# Ignore non-positive predictions, as they are invalid for
|
||||
# the Poisson deviance. We want to issue a warning if for some reason
|
||||
# (e.g. FHE noise, bad quantization, user error), the regressor predictions are negative
|
||||
|
||||
# Find all strictly positive values
|
||||
mask = y_pred > 0
|
||||
# If any non-positive values are found, issue a warning
|
||||
if (~mask).any():
|
||||
n_masked, n_samples = (~mask).sum(), mask.shape[0]
|
||||
print(
|
||||
"WARNING: Estimator yields invalid, non-positive predictions "
|
||||
f" for {n_masked} samples out of {n_samples}. These predictions "
|
||||
"are ignored when computing the Poisson deviance."
|
||||
)
|
||||
|
||||
# Compute the Poisson Deviance for all valid values
|
||||
dev = mean_poisson_deviance(
|
||||
y_gt[mask],
|
||||
y_pred[mask],
|
||||
sample_weight=gt_weight[mask],
|
||||
)
|
||||
print(f"mean Poisson deviance: {dev}")
|
||||
return dev
|
||||
|
||||
|
||||
def score_sklearn_estimator(estimator, df_test):
|
||||
"""A wrapper to score a sklearn pipeline on a dataframe"""
|
||||
return score_estimator(estimator.predict(df_test), df_test["Frequency"], df_test["Exposure"])
|
||||
|
||||
|
||||
def score_concrete_glm_estimator(poisson_glm_pca, q_glm, df_test):
|
||||
"""A wrapper to score QuantizedGLM on a dataframe, transforming the dataframe using
|
||||
a sklearn pipeline
|
||||
"""
|
||||
test_data = poisson_glm_pca["pca"].transform(poisson_glm_pca["preprocessor"].transform(df_test))
|
||||
q_test_data = q_glm.quantize_input(test_data)
|
||||
y_pred = q_glm.forward_and_dequant(q_test_data)
|
||||
return score_estimator(y_pred, df_test["Frequency"], df_test["Exposure"])
|
||||
|
||||
|
||||
def run_glm_benchmark():
|
||||
"""
|
||||
This is our main benchmark function. It gets a dataset, trains a GLM model,
|
||||
then trains a GLM model on PCA reduced features, a QuantizedGLM model
|
||||
and finally compiles the QuantizedGLM to FHE. All models are evaluated and poisson deviance
|
||||
is computed to determine the increase in deviance from quantization and to verify
|
||||
that the FHE compiled model acheives the same deviance as the quantized model in the 'clear'
|
||||
"""
|
||||
|
||||
df, _ = fetch_openml(
|
||||
data_id=41214, as_frame=True, cache=True, data_home="~/.cache/sklean", return_X_y=True
|
||||
)
|
||||
df = df.head(50000)
|
||||
|
||||
df["Frequency"] = df["ClaimNb"] / df["Exposure"]
|
||||
|
||||
log_scale_transformer = make_pipeline(
|
||||
FunctionTransformer(np.log, validate=False), StandardScaler()
|
||||
)
|
||||
|
||||
linear_model_preprocessor = ColumnTransformer(
|
||||
[
|
||||
("passthrough_numeric", "passthrough", ["BonusMalus"]),
|
||||
("binned_numeric", KBinsDiscretizer(n_bins=10), ["VehAge", "DrivAge"]),
|
||||
("log_scaled_numeric", log_scale_transformer, ["Density"]),
|
||||
(
|
||||
"onehot_categorical",
|
||||
OneHotEncoder(sparse=False),
|
||||
["VehBrand", "VehPower", "VehGas", "Region", "Area"],
|
||||
),
|
||||
],
|
||||
remainder="drop",
|
||||
)
|
||||
|
||||
df_train, df_test = train_test_split(df, test_size=0.2, random_state=0)
|
||||
df_calib, df_test = train_test_split(df_test, test_size=100, random_state=0)
|
||||
|
||||
poisson_glm = Pipeline(
|
||||
[
|
||||
("preprocessor", linear_model_preprocessor),
|
||||
("regressor", PoissonRegressor(alpha=1e-12, max_iter=300)),
|
||||
]
|
||||
)
|
||||
|
||||
poisson_glm_pca = Pipeline(
|
||||
[
|
||||
("preprocessor", linear_model_preprocessor),
|
||||
("pca", PCA(n_components=15, whiten=True)),
|
||||
("regressor", PoissonRegressor(alpha=1e-12, max_iter=300)),
|
||||
]
|
||||
)
|
||||
|
||||
poisson_glm.fit(df_train, df_train["Frequency"], regressor__sample_weight=df_train["Exposure"])
|
||||
|
||||
poisson_glm_pca.fit(
|
||||
df_train, df_train["Frequency"], regressor__sample_weight=df_train["Exposure"]
|
||||
)
|
||||
|
||||
# Let's check what prediction performance we lose due to PCA
|
||||
print("PoissonRegressor evaluation:")
|
||||
_ = score_sklearn_estimator(poisson_glm, df_test)
|
||||
print("PoissonRegressor+PCA evaluation:")
|
||||
_ = score_sklearn_estimator(poisson_glm_pca, df_test)
|
||||
|
||||
# Now, get calibration data from the held out set
|
||||
calib_data = poisson_glm_pca["pca"].transform(
|
||||
poisson_glm_pca["preprocessor"].transform(df_calib)
|
||||
)
|
||||
|
||||
# Let's see how performance decreases with bit-depth.
|
||||
# This is just a test of our quantized model, not in FHE
|
||||
for n_bits in [28, 16, 6, 5, 4, 3, 2]:
|
||||
q_glm = QuantizedGLM(n_bits, poisson_glm_pca["regressor"], calib_data)
|
||||
print(f"{n_bits}b Quantized PoissonRegressor evaluation:")
|
||||
score_concrete_glm_estimator(poisson_glm_pca, q_glm, df_test)
|
||||
|
||||
q_glm = QuantizedGLM(2, poisson_glm_pca["regressor"], calib_data)
|
||||
dev_pca_quantized = score_concrete_glm_estimator(poisson_glm_pca, q_glm, df_test)
|
||||
test_data = poisson_glm_pca["pca"].transform(poisson_glm_pca["preprocessor"].transform(df_test))
|
||||
q_test_data = q_glm.quantize_input(test_data)
|
||||
|
||||
# bench: Measure: Compilation Time (ms)
|
||||
engine = q_glm.compile(
|
||||
q_test_data,
|
||||
BENCHMARK_CONFIGURATION,
|
||||
show_mlir=False,
|
||||
)
|
||||
# bench: Measure: End
|
||||
|
||||
y_pred_fhe = np.zeros((test_data.shape[0],), np.float32)
|
||||
for i, test_sample in enumerate(tqdm(q_test_data.qvalues)):
|
||||
# bench: Measure: Evaluation Time (ms)
|
||||
q_sample = np.expand_dims(test_sample, 1).transpose([1, 0]).astype(np.uint8)
|
||||
q_pred_fhe = engine.run(q_sample)
|
||||
y_pred_fhe[i] = q_glm.dequantize_output(q_pred_fhe)
|
||||
# bench: Measure: End
|
||||
|
||||
dev_pca_quantized_fhe = score_estimator(y_pred_fhe, df_test["Frequency"], df_test["Exposure"])
|
||||
|
||||
if dev_pca_quantized_fhe > 0.001:
|
||||
difference = abs(dev_pca_quantized - dev_pca_quantized_fhe) * 100 / dev_pca_quantized_fhe
|
||||
else:
|
||||
difference = 0
|
||||
|
||||
print(f"Quantized deviance: {dev_pca_quantized}")
|
||||
print(f"FHE Quantized deviance: {dev_pca_quantized_fhe}")
|
||||
print(f"Percentage difference: {difference}%")
|
||||
|
||||
# bench: Measure: Non Homomorphic Loss = dev_pca_quantized
|
||||
# bench: Measure: Homomorphic Loss = dev_pca_quantized_fhe
|
||||
# bench: Measure: Relative Loss Difference (%) = difference
|
||||
# bench: Alert: Relative Loss Difference (%) > 7.5
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_glm_benchmark()
|
||||
@@ -40,13 +40,28 @@ class QuantizedArray:
|
||||
rmin = numpy.min(self.values)
|
||||
|
||||
if rmax - rmin < STABILITY_CONST:
|
||||
scale = 1
|
||||
# In this case there is a single unique value to quantize
|
||||
# This value could be multiplied with inputs at some point in the model
|
||||
# Since zero points need to be integers, if this value is a small float (ex: 0.01)
|
||||
# it will be quantized to 0 with a 0 zero-point, thus becoming useless in multiplication
|
||||
|
||||
# Ideally we should get rid of round here but it is risky
|
||||
# regarding the FHE compilation.
|
||||
# Indeed, the zero_point value for the weights has to be an integer
|
||||
# for the compilation to work.
|
||||
zero_point = numpy.round(-rmin)
|
||||
if numpy.abs(rmax) < STABILITY_CONST:
|
||||
# If the value is a 0 we cannot do it since the scale would become 0 as well
|
||||
# resulting in division by 0
|
||||
scale = 1
|
||||
# Ideally we should get rid of round here but it is risky
|
||||
# regarding the FHE compilation.
|
||||
# Indeed, the zero_point value for the weights has to be an integer
|
||||
# for the compilation to work.
|
||||
zero_point = numpy.round(-rmin)
|
||||
else:
|
||||
# If the value is not a 0 we can tweak the scale factor so that
|
||||
# the value quantizes to 2^b - 1, the highest possible quantized value
|
||||
|
||||
# TODO: should we quantize it to the value of 1 what ever the number of bits
|
||||
# in order to save some precision bits ?
|
||||
scale = rmax / (2 ** self.n_bits - 1)
|
||||
zero_point = 0
|
||||
else:
|
||||
scale = (rmax - rmin) / (2 ** self.n_bits - 1) if rmax != rmin else 1.0
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
228
poetry.lock
generated
228
poetry.lock
generated
@@ -16,20 +16,35 @@ python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "argon2-cffi"
|
||||
version = "21.1.0"
|
||||
version = "21.2.0"
|
||||
description = "The secure Argon2 password hashing algorithm."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
cffi = ">=1.0.0"
|
||||
argon2-cffi-bindings = "*"
|
||||
|
||||
[package.extras]
|
||||
dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "furo", "wheel", "pre-commit"]
|
||||
docs = ["sphinx", "furo"]
|
||||
dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"]
|
||||
docs = ["sphinx", "sphinx-notfound-page", "furo"]
|
||||
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"]
|
||||
|
||||
[[package]]
|
||||
name = "argon2-cffi-bindings"
|
||||
version = "21.2.0"
|
||||
description = "Low-level CFFI bindings for Argon2"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
cffi = ">=1.0.1"
|
||||
|
||||
[package.extras]
|
||||
dev = ["pytest", "cogapp", "pre-commit", "wheel"]
|
||||
tests = ["pytest"]
|
||||
|
||||
[[package]]
|
||||
name = "astroid"
|
||||
version = "2.8.6"
|
||||
@@ -568,6 +583,14 @@ MarkupSafe = ">=2.0"
|
||||
[package.extras]
|
||||
i18n = ["Babel (>=2.7)"]
|
||||
|
||||
[[package]]
|
||||
name = "joblib"
|
||||
version = "1.1.0"
|
||||
description = "Lightweight pipelining with Python functions"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "4.2.1"
|
||||
@@ -1027,6 +1050,26 @@ python-versions = ">=3.6"
|
||||
[package.dependencies]
|
||||
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
||||
|
||||
[[package]]
|
||||
name = "pandas"
|
||||
version = "1.3.4"
|
||||
description = "Powerful data structures for data analysis, time series, and statistics"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7.1"
|
||||
|
||||
[package.dependencies]
|
||||
numpy = [
|
||||
{version = ">=1.17.3", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""},
|
||||
{version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""},
|
||||
{version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""},
|
||||
]
|
||||
python-dateutil = ">=2.7.3"
|
||||
pytz = ">=2017.3"
|
||||
|
||||
[package.extras]
|
||||
test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"]
|
||||
|
||||
[[package]]
|
||||
name = "pandocfilters"
|
||||
version = "1.5.0"
|
||||
@@ -1144,7 +1187,7 @@ twisted = ["twisted"]
|
||||
|
||||
[[package]]
|
||||
name = "prompt-toolkit"
|
||||
version = "3.0.23"
|
||||
version = "3.0.24"
|
||||
description = "Library for building powerful interactive command lines in Python"
|
||||
category = "dev"
|
||||
optional = false
|
||||
@@ -1592,6 +1635,37 @@ python-versions = "*"
|
||||
[package.extras]
|
||||
idna2008 = ["idna"]
|
||||
|
||||
[[package]]
|
||||
name = "scikit-learn"
|
||||
version = "1.0.1"
|
||||
description = "A set of python modules for machine learning and data mining"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.dependencies]
|
||||
joblib = ">=0.11"
|
||||
numpy = ">=1.14.6"
|
||||
scipy = ">=1.1.0"
|
||||
threadpoolctl = ">=2.0.0"
|
||||
|
||||
[package.extras]
|
||||
benchmark = ["matplotlib (>=2.2.3)", "pandas (>=0.25.0)", "memory-profiler (>=0.57.0)"]
|
||||
docs = ["matplotlib (>=2.2.3)", "scikit-image (>=0.14.5)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)", "memory-profiler (>=0.57.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "numpydoc (>=1.0.0)", "Pillow (>=7.1.2)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"]
|
||||
examples = ["matplotlib (>=2.2.3)", "scikit-image (>=0.14.5)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)"]
|
||||
tests = ["matplotlib (>=2.2.3)", "scikit-image (>=0.14.5)", "pandas (>=0.25.0)", "pytest (>=5.0.1)", "pytest-cov (>=2.9.0)", "flake8 (>=3.8.2)", "black (>=21.6b0)", "mypy (>=0.770)", "pyamg (>=4.0.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "scipy"
|
||||
version = "1.7.3"
|
||||
description = "SciPy: Scientific Library for Python"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7,<3.11"
|
||||
|
||||
[package.dependencies]
|
||||
numpy = ">=1.16.5,<1.23.0"
|
||||
|
||||
[[package]]
|
||||
name = "secretstorage"
|
||||
version = "3.3.1"
|
||||
@@ -1831,6 +1905,14 @@ python-versions = ">= 3.5"
|
||||
[package.extras]
|
||||
test = ["pytest", "pathlib2"]
|
||||
|
||||
[[package]]
|
||||
name = "threadpoolctl"
|
||||
version = "3.0.0"
|
||||
description = "threadpoolctl"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.10.2"
|
||||
@@ -1991,7 +2073,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = ">=3.8,<3.9"
|
||||
content-hash = "061349291b83bd3051337a6001008126a5eb3b84e0da8b30851fe64a6ff55eb9"
|
||||
content-hash = "0eda99f80ae5bffae54208ac20656600483ab277c061326392d338b1c931d391"
|
||||
|
||||
[metadata.files]
|
||||
alabaster = [
|
||||
@@ -2003,17 +2085,31 @@ appnope = [
|
||||
{file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"},
|
||||
]
|
||||
argon2-cffi = [
|
||||
{file = "argon2-cffi-21.1.0.tar.gz", hash = "sha256:f710b61103d1a1f692ca3ecbd1373e28aa5e545ac625ba067ff2feca1b2bb870"},
|
||||
{file = "argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl", hash = "sha256:217b4f0f853ccbbb5045242946ad2e162e396064575860141b71a85eb47e475a"},
|
||||
{file = "argon2_cffi-21.1.0-cp35-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fa7e7d1fc22514a32b1761fdfa1882b6baa5c36bb3ef557bdd69e6fc9ba14a41"},
|
||||
{file = "argon2_cffi-21.1.0-cp35-abi3-win32.whl", hash = "sha256:e4d8f0ae1524b7b0372a3e574a2561cbdddb3fdb6c28b70a72868189bda19659"},
|
||||
{file = "argon2_cffi-21.1.0-cp35-abi3-win_amd64.whl", hash = "sha256:65213a9174320a1aee03fe826596e0620783966b49eb636955958b3074e87ff9"},
|
||||
{file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-macosx_10_7_x86_64.whl", hash = "sha256:245f64a203012b144b7b8c8ea6d468cb02b37caa5afee5ba4a10c80599334f6a"},
|
||||
{file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4ad152c418f7eb640eac41ac815534e6aa61d1624530b8e7779114ecfbf327f8"},
|
||||
{file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:bc513db2283c385ea4da31a2cd039c33380701f376f4edd12fe56db118a3b21a"},
|
||||
{file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c7a7c8cc98ac418002090e4add5bebfff1b915ea1cb459c578cd8206fef10378"},
|
||||
{file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:165cadae5ac1e26644f5ade3bd9c18d89963be51d9ea8817bd671006d7909057"},
|
||||
{file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:566ffb581bbd9db5562327aee71b2eda24a1c15b23a356740abe3c011bbe0dcb"},
|
||||
{file = "argon2-cffi-21.2.0.tar.gz", hash = "sha256:50936e5ad9e860c5a6678063c5ac732c2fc8a178994cca9e1e7220351f930e9a"},
|
||||
{file = "argon2_cffi-21.2.0-py3-none-any.whl", hash = "sha256:d5d7b9d38963c2769cd0dbfc5901ae00eb9bb98a9cb5a2ea0c9c7c4fec3e6b98"},
|
||||
]
|
||||
argon2-cffi-bindings = [
|
||||
{file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"},
|
||||
{file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"},
|
||||
]
|
||||
astroid = [
|
||||
{file = "astroid-2.8.6-py3-none-any.whl", hash = "sha256:cd8326b424c971e7d87678609cf6275d22028afd37d6ac59c16d47f1245882f6"},
|
||||
@@ -2318,6 +2414,10 @@ jinja2 = [
|
||||
{file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
|
||||
{file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"},
|
||||
]
|
||||
joblib = [
|
||||
{file = "joblib-1.1.0-py2.py3-none-any.whl", hash = "sha256:f21f109b3c7ff9d95f8387f752d0d9c34a02aa2f7060c2135f465da0e5160ff6"},
|
||||
{file = "joblib-1.1.0.tar.gz", hash = "sha256:4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35"},
|
||||
]
|
||||
jsonschema = [
|
||||
{file = "jsonschema-4.2.1-py3-none-any.whl", hash = "sha256:2a0f162822a64d95287990481b45d82f096e99721c86534f48201b64ebca6e8c"},
|
||||
{file = "jsonschema-4.2.1.tar.gz", hash = "sha256:390713469ae64b8a58698bb3cbc3859abe6925b565a973f87323ef21b09a27a8"},
|
||||
@@ -2654,6 +2754,32 @@ packaging = [
|
||||
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
||||
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
||||
]
|
||||
pandas = [
|
||||
{file = "pandas-1.3.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9707bdc1ea9639c886b4d3be6e2a45812c1ac0c2080f94c31b71c9fa35556f9b"},
|
||||
{file = "pandas-1.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c2f44425594ae85e119459bb5abb0748d76ef01d9c08583a667e3339e134218e"},
|
||||
{file = "pandas-1.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a"},
|
||||
{file = "pandas-1.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99d2350adb7b6c3f7f8f0e5dfb7d34ff8dd4bc0a53e62c445b7e43e163fce63"},
|
||||
{file = "pandas-1.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:4acc28364863127bca1029fb72228e6f473bb50c32e77155e80b410e2068eeac"},
|
||||
{file = "pandas-1.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c2646458e1dce44df9f71a01dc65f7e8fa4307f29e5c0f2f92c97f47a5bf22f5"},
|
||||
{file = "pandas-1.3.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5298a733e5bfbb761181fd4672c36d0c627320eb999c59c65156c6a90c7e1b4f"},
|
||||
{file = "pandas-1.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22808afb8f96e2269dcc5b846decacb2f526dd0b47baebc63d913bf847317c8f"},
|
||||
{file = "pandas-1.3.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b528e126c13816a4374e56b7b18bfe91f7a7f6576d1aadba5dee6a87a7f479ae"},
|
||||
{file = "pandas-1.3.4-cp37-cp37m-win32.whl", hash = "sha256:fe48e4925455c964db914b958f6e7032d285848b7538a5e1b19aeb26ffaea3ec"},
|
||||
{file = "pandas-1.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaca36a80acaacb8183930e2e5ad7f71539a66805d6204ea88736570b2876a7b"},
|
||||
{file = "pandas-1.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:42493f8ae67918bf129869abea8204df899902287a7f5eaf596c8e54e0ac7ff4"},
|
||||
{file = "pandas-1.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a388960f979665b447f0847626e40f99af8cf191bce9dc571d716433130cb3a7"},
|
||||
{file = "pandas-1.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba0aac1397e1d7b654fccf263a4798a9e84ef749866060d19e577e927d66e1b"},
|
||||
{file = "pandas-1.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f567e972dce3bbc3a8076e0b675273b4a9e8576ac629149cf8286ee13c259ae5"},
|
||||
{file = "pandas-1.3.4-cp38-cp38-win32.whl", hash = "sha256:c1aa4de4919358c5ef119f6377bc5964b3a7023c23e845d9db7d9016fa0c5b1c"},
|
||||
{file = "pandas-1.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:dd324f8ee05925ee85de0ea3f0d66e1362e8c80799eb4eb04927d32335a3e44a"},
|
||||
{file = "pandas-1.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d47750cf07dee6b55d8423471be70d627314277976ff2edd1381f02d52dbadf9"},
|
||||
{file = "pandas-1.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d1dc09c0013d8faa7474574d61b575f9af6257ab95c93dcf33a14fd8d2c1bab"},
|
||||
{file = "pandas-1.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10e10a2527db79af6e830c3d5842a4d60383b162885270f8cffc15abca4ba4a9"},
|
||||
{file = "pandas-1.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35c77609acd2e4d517da41bae0c11c70d31c87aae8dd1aabd2670906c6d2c143"},
|
||||
{file = "pandas-1.3.4-cp39-cp39-win32.whl", hash = "sha256:003ba92db58b71a5f8add604a17a059f3068ef4e8c0c365b088468d0d64935fd"},
|
||||
{file = "pandas-1.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:a51528192755f7429c5bcc9e80832c517340317c861318fea9cea081b57c9afd"},
|
||||
{file = "pandas-1.3.4.tar.gz", hash = "sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc"},
|
||||
]
|
||||
pandocfilters = [
|
||||
{file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"},
|
||||
{file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"},
|
||||
@@ -2738,8 +2864,8 @@ prometheus-client = [
|
||||
{file = "prometheus_client-0.12.0.tar.gz", hash = "sha256:1b12ba48cee33b9b0b9de64a1047cbd3c5f2d0ab6ebcead7ddda613a750ec3c5"},
|
||||
]
|
||||
prompt-toolkit = [
|
||||
{file = "prompt_toolkit-3.0.23-py3-none-any.whl", hash = "sha256:5f29d62cb7a0ecacfa3d8ceea05a63cd22500543472d64298fc06ddda906b25d"},
|
||||
{file = "prompt_toolkit-3.0.23.tar.gz", hash = "sha256:7053aba00895473cb357819358ef33f11aa97e4ac83d38efb123e5649ceeecaf"},
|
||||
{file = "prompt_toolkit-3.0.24-py3-none-any.whl", hash = "sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"},
|
||||
{file = "prompt_toolkit-3.0.24.tar.gz", hash = "sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6"},
|
||||
]
|
||||
psutil = [
|
||||
{file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"},
|
||||
@@ -3039,6 +3165,64 @@ rfc3986 = [
|
||||
{file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
|
||||
{file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
|
||||
]
|
||||
scikit-learn = [
|
||||
{file = "scikit-learn-1.0.1.tar.gz", hash = "sha256:ac2ca9dbb754d61cfe1c83ba8483498ef951d29b93ec09d6f002847f210a99da"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:116e05fd990d9b363fc29bd3699ec2117d7da9088f6ca9a90173b240c5a063f1"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bd78a2442c948536f677e2744917c37cff014559648102038822c23863741c27"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32d941f12fd7e245f01da2b82943c5ce6f1133fa5375eb80caa51457532b3e7e"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb7214103f6c36c1371dd8c166897e3528264a28f2e2e42573ba8c61ed4d7142"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:46248cc6a8b72490f723c73ff2e65e62633d14cafe9d2df3a7b3f87d332a6f7e"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fecb5102f0a36c16c1361ec519a7bb0260776ef40e17393a81f530569c916a7b"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-win32.whl", hash = "sha256:02aee3b257617da0ec98dee9572b10523dc00c25b68c195ddf100c1a93b1854b"},
|
||||
{file = "scikit_learn-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:538f3a85c4980c7572f3e754f0ba8489363976ef3e7f6a94e8f1af5ae45f6f6a"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:59b1d6df8724003fa16b7365a3b43449ee152aa6e488dd7a19f933640bb2d7fb"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:515b227f01f569145dc9f86e56f4cea9f00a613fc4d074bbfc0a92ca00bff467"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc75f81571137b39f9b31766e15a0e525331637e7fe8f8000a3fbfba7da3add9"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:648f4dbfdd0a1b45bf6e2e4afe3f431774c55dee05e2d28f8394d6648296f373"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53bb7c605427ab187869d7a05cd3f524a3015a90e351c1788fc3a662e7f92b69"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a800665527c1a63f7395a0baae3c89b0d97b54d2c23769c1c9879061bb80bc19"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-win32.whl", hash = "sha256:ee59da47e18b703f6de17d5d51b16ce086c50969d5a83db5217f0ae9372de232"},
|
||||
{file = "scikit_learn-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:ebbe4275556d3c02707bd93ae8b96d9651acd4165126e0ae64b336afa2a6dcb1"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:11a57405c1c3514227d0c6a0bee561c94cd1284b41e236f7a1d76b3975f77593"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a51fdbc116974d9715957366df73e5ec6f0a7a2afa017864c2e5f5834e6f494d"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:944f47b2d881b9d24aee40d643bfdc4bd2b6dc3d25b62964411c6d8882f940a1"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc60e0371e521995a6af2ef3f5d911568506124c272889b318b8b6e497251231"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:62ce4e3ddb6e6e9dcdb3e5ac7f0575dbaf56f79ce2b2edee55192b12b52df5be"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:059c5be0c0365321ddbcac7abf0db806fad8ecb64ee6c7cbcd58313c7d61634d"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-win32.whl", hash = "sha256:c6b9510fd2e1642314efb7aa951a0d05d963f3523e01c30b2dadde2395ebe6b4"},
|
||||
{file = "scikit_learn-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:c604a813df8e7d6dfca3ae0db0a8fd7e5dff4ea9d94081ab263c81bf0b61ab4b"},
|
||||
]
|
||||
scipy = [
|
||||
{file = "scipy-1.7.3-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c9e04d7e9b03a8a6ac2045f7c5ef741be86727d8f49c45db45f244bdd2bcff17"},
|
||||
{file = "scipy-1.7.3-1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b0e0aeb061a1d7dcd2ed59ea57ee56c9b23dd60100825f98238c06ee5cc4467e"},
|
||||
{file = "scipy-1.7.3-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b78a35c5c74d336f42f44106174b9851c783184a85a3fe3e68857259b37b9ffb"},
|
||||
{file = "scipy-1.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:173308efba2270dcd61cd45a30dfded6ec0085b4b6eb33b5eb11ab443005e088"},
|
||||
{file = "scipy-1.7.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:21b66200cf44b1c3e86495e3a436fc7a26608f92b8d43d344457c54f1c024cbc"},
|
||||
{file = "scipy-1.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceebc3c4f6a109777c0053dfa0282fddb8893eddfb0d598574acfb734a926168"},
|
||||
{file = "scipy-1.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7eaea089345a35130bc9a39b89ec1ff69c208efa97b3f8b25ea5d4c41d88094"},
|
||||
{file = "scipy-1.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:304dfaa7146cffdb75fbf6bb7c190fd7688795389ad060b970269c8576d038e9"},
|
||||
{file = "scipy-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:033ce76ed4e9f62923e1f8124f7e2b0800db533828c853b402c7eec6e9465d80"},
|
||||
{file = "scipy-1.7.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4d242d13206ca4302d83d8a6388c9dfce49fc48fdd3c20efad89ba12f785bf9e"},
|
||||
{file = "scipy-1.7.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8499d9dd1459dc0d0fe68db0832c3d5fc1361ae8e13d05e6849b358dc3f2c279"},
|
||||
{file = "scipy-1.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca36e7d9430f7481fc7d11e015ae16fbd5575615a8e9060538104778be84addf"},
|
||||
{file = "scipy-1.7.3-cp37-cp37m-win32.whl", hash = "sha256:e2c036492e673aad1b7b0d0ccdc0cb30a968353d2c4bf92ac8e73509e1bf212c"},
|
||||
{file = "scipy-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:866ada14a95b083dd727a845a764cf95dd13ba3dc69a16b99038001b05439709"},
|
||||
{file = "scipy-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:65bd52bf55f9a1071398557394203d881384d27b9c2cad7df9a027170aeaef93"},
|
||||
{file = "scipy-1.7.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:f99d206db1f1ae735a8192ab93bd6028f3a42f6fa08467d37a14eb96c9dd34a3"},
|
||||
{file = "scipy-1.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5f2cfc359379c56b3a41b17ebd024109b2049f878badc1e454f31418c3a18436"},
|
||||
{file = "scipy-1.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb7ae2c4dbdb3c9247e07acc532f91077ae6dbc40ad5bd5dca0bb5a176ee9bda"},
|
||||
{file = "scipy-1.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c2d250074cfa76715d58830579c64dff7354484b284c2b8b87e5a38321672c"},
|
||||
{file = "scipy-1.7.3-cp38-cp38-win32.whl", hash = "sha256:87069cf875f0262a6e3187ab0f419f5b4280d3dcf4811ef9613c605f6e4dca95"},
|
||||
{file = "scipy-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:7edd9a311299a61e9919ea4192dd477395b50c014cdc1a1ac572d7c27e2207fa"},
|
||||
{file = "scipy-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eef93a446114ac0193a7b714ce67659db80caf940f3232bad63f4c7a81bc18df"},
|
||||
{file = "scipy-1.7.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:eb326658f9b73c07081300daba90a8746543b5ea177184daed26528273157294"},
|
||||
{file = "scipy-1.7.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:93378f3d14fff07572392ce6a6a2ceb3a1f237733bd6dcb9eb6a2b29b0d19085"},
|
||||
{file = "scipy-1.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edad1cf5b2ce1912c4d8ddad20e11d333165552aba262c882e28c78bbc09dbf6"},
|
||||
{file = "scipy-1.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d1cc2c19afe3b5a546ede7e6a44ce1ff52e443d12b231823268019f608b9b12"},
|
||||
{file = "scipy-1.7.3-cp39-cp39-win32.whl", hash = "sha256:2c56b820d304dffcadbbb6cbfbc2e2c79ee46ea291db17e288e73cd3c64fefa9"},
|
||||
{file = "scipy-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f78181a153fa21c018d346f595edd648344751d7f03ab94b398be2ad083ed3e"},
|
||||
{file = "scipy-1.7.3.tar.gz", hash = "sha256:ab5875facfdef77e0a47d5fd39ea178b58e60e454a4c85aa1e52fcb80db7babf"},
|
||||
]
|
||||
secretstorage = [
|
||||
{file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"},
|
||||
{file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"},
|
||||
@@ -3114,6 +3298,10 @@ testpath = [
|
||||
{file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"},
|
||||
{file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"},
|
||||
]
|
||||
threadpoolctl = [
|
||||
{file = "threadpoolctl-3.0.0-py3-none-any.whl", hash = "sha256:4fade5b3b48ae4b1c30f200b28f39180371104fccc642e039e0f2435ec8cc211"},
|
||||
{file = "threadpoolctl-3.0.0.tar.gz", hash = "sha256:d03115321233d0be715f0d3a5ad1d6c065fe425ddc2d671ca8e45e9fd5d7a52a"},
|
||||
]
|
||||
toml = [
|
||||
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
||||
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||
|
||||
@@ -43,6 +43,8 @@ pygments-style-tomorrow = "^1.0.0"
|
||||
beautifulsoup4 = "^4.10.0"
|
||||
pip-licenses = "^3.5.3"
|
||||
sphinx-zama-theme = "2.0.6"
|
||||
scikit-learn = "1.0.1"
|
||||
pandas = "1.3.4"
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
|
||||
Reference in New Issue
Block a user