From 4ac80dd161b73e4e2104dfe7053cdd38f41a4624 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Mon, 3 Nov 2025 14:34:58 -0500 Subject: [PATCH 01/29] Initial commit --- src/midst_toolkit/attacks/ept/feature_extraction.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/midst_toolkit/attacks/ept/feature_extraction.py diff --git a/src/midst_toolkit/attacks/ept/feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py new file mode 100644 index 00000000..e69de29b From 3a74ac9c39e9367c6a2416ffda3110d7148600a6 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Tue, 4 Nov 2025 12:44:31 -0500 Subject: [PATCH 02/29] Finalized run_ept_attack for feature extraction. --- examples/ept_attack/config.yaml | 44 ++++++++ examples/ept_attack/run_ept_attack.py | 103 ++++++++++++++++++ .../attacks/ept/feature_extraction.py | 0 .../attacks/ept/run_feature_extraction.py | 12 ++ 4 files changed, 159 insertions(+) create mode 100644 examples/ept_attack/config.yaml create mode 100644 examples/ept_attack/run_ept_attack.py delete mode 100644 src/midst_toolkit/attacks/ept/feature_extraction.py create mode 100644 src/midst_toolkit/attacks/ept/run_feature_extraction.py diff --git a/examples/ept_attack/config.yaml b/examples/ept_attack/config.yaml new file mode 100644 index 00000000..e5dd3c73 --- /dev/null +++ b/examples/ept_attack/config.yaml @@ -0,0 +1,44 @@ +# Ensemble example configuration +# Base data directory (can be overridden from command line) +base_data_dir: examples/ept_attack/data/ +base_example_dir: examples/ept_attack + +# Data paths (relative to base_data_dir) +data_paths: + input_data_path: ${base_data_dir}/midst_data_black_box_attacks # Read-only input data directory + output_data_path: ${base_data_dir}/output # Directory to save processed data and results + +# Pipeline control +pipeline: + run_data_processing: false # Set this to false if you have already saved the processed data + run_shadow_model_training: false # Set this to false if shadow models are pre-trained + run_attribute_prediction_model_training: true # Whether to run attribute prediction model training + run_attack_classifier_training: false # Whether to run attack classifier training + +# Experiment settings +attack_settings: + single_table: true # Whether the data is single-table or multi-table + attack_classifier_model_type: "xgb" # Type of model to use for the attack classifier Options: "xgb" for XGBoost, "cat" for CatBoost, or "mlp" for MLP + + +# Dataset specific information used for processing in this example +data_processing_config: + collect_attack_data_types: + [ + "tabddpm_black_box", + "tabsyn_black_box", + "clavaddpm_black_box", + ] + # The column name in the data to be used for stratified splitting. + column_to_stratify: "trans_type" # Attention: This value is not documented in the original codebase. + folder_ranges: + train: [[1, 31]] + dev: [[51, 61], [91, 101]] + final: [[61, 71], [101, 111]] + # File names in MIDST data directories. + single_table_train_data_file_name: "train_with_id.csv" + multi_table_train_data_file_name: "trans.csv" + challenge_data_file_name: "challenge_with_id.csv" + +# General settings +random_seed: 42 diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py new file mode 100644 index 00000000..8802a9e2 --- /dev/null +++ b/examples/ept_attack/run_ept_attack.py @@ -0,0 +1,103 @@ +""" +This file is an uncompleted example script for running the EPT-MIA Attack on MIDST challenge +provided resources and data. +""" +from logging import INFO +from pathlib import Path + +import hydra +from omegaconf import DictConfig + +from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe +from midst_toolkit.attacks.ept import run_feature_extraction +from midst_toolkit.common.logger import log + + + +# Step 2 and 3: Attribute prediction model training and feature extraction +def attribute_prediction_train_and_extract(config: DictConfig) -> None: + """ + Train attribute prediction models and extract features for EPT-MIA attack. + The function is specifically designed to work with the MIDST challenge data structure, + and the shadow models provided by the competition organizers. + All the reading and writing of data is handled within this function. + + Args: + config: Configuration object set in config.yaml. + """ + + log(INFO, "Running attribute prediction model training.") + + if config.attack_settings.single_table: + diffusion_model_names = [ + "tabddpm", + "tabsyn",] + else: + diffusion_model_names = [ + "clavaddpm",] + modes = ["train", "dev", "final"] + input_data_path = Path(config.data_paths.input_data_path) + output_features_path = Path(config.data_paths.output_data_path, "attribute_prediction_features") + + # Iterating over directories specific to the shadow models folder structure in the competition + for model_name in diffusion_model_names: + model_path = Path(input_data_path / f"{model_name}_black_box") + for mode in modes: + current_path = Path(model_path / mode) + model_folders = [ + entry.name for entry in current_path.iterdir() if entry.is_dir() + ] + for model_folder in model_folders: + # Load the "trans_synthetic.csv" file as a dataframe + input_data_path = current_path / model_folder + + df_syntehtic_data = load_dataframe(input_data_path, "trans_synthetic.csv") + df_challenge_data = load_dataframe(input_data_path, "challenge_with_id.csv") + df_challenge_labels = load_dataframe(input_data_path, "challenge_label.csv") + + # Run feature extraction + df_extracted_features = run_feature_extraction.main( + synthetic_data=df_syntehtic_data, + challenge_data=df_challenge_data, + challenge_labels=df_challenge_labels, + ) + + final_output_dir = Path( + output_features_path / f"{model_name}_black_box" / mode / + f"{model_folder}" + ) + final_output_dir.mkdir(parents=True, exist_ok=True) + + save_dataframe( + df=df_extracted_features, + file_path=final_output_dir, + file_name="attribute_prediction_features.csv", + ) + + + +@hydra.main(config_path=".", config_name="config", version_base=None) +def main(config: DictConfig) -> None: + """ + Run the EPT-MIA Attack example pipeline. + First step has yet to be implemented: shadow model training. + Second and third steps are attribute prediction model training and feature extraction. + + Args: + config: Attack configuration as an OmegaConf DictConfig object. + """ + + log(INFO, "Running EPT-MIA Attack Example Pipeline.") + + if config.attack_settings.single_table: + log(INFO, "Data: Single-table.") + else: + log(INFO, "Data: Multi-table.") + + #TODO: Implement shadow model training step. + + if config.pipeline.run_attribute_prediction_model_training: + attribute_prediction_train_and_extract(config) + +if __name__ == "__main__": + main() diff --git a/src/midst_toolkit/attacks/ept/feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/midst_toolkit/attacks/ept/run_feature_extraction.py b/src/midst_toolkit/attacks/ept/run_feature_extraction.py new file mode 100644 index 00000000..30d32385 --- /dev/null +++ b/src/midst_toolkit/attacks/ept/run_feature_extraction.py @@ -0,0 +1,12 @@ +import pandas as pd + + + + + +def main(synthetic_data: pd.DataFrame, challenge_data: pd.DataFrame, challenge_labels: pd.DataFrame) -> pd.DataFrame: + """Extract features for attribute prediction attack.""" + # Placeholder for actual feature extraction logic + # For demonstration, we will just merge the dataframes + features = synthetic_data.merge(challenge_data, on='id').merge(challenge_labels, on='id') + return features From d1bdd9cd2af1d6a406446359ad5822afd6fb7fc9 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Tue, 4 Nov 2025 14:26:44 -0500 Subject: [PATCH 03/29] Add pre_process_and_train in feature extraction --- examples/ept_attack/config.yaml | 1 + examples/ept_attack/run_ept_attack.py | 29 +++++-- .../attacks/ept/run_feature_extraction.py | 81 ++++++++++++++++++- 3 files changed, 102 insertions(+), 9 deletions(-) diff --git a/examples/ept_attack/config.yaml b/examples/ept_attack/config.yaml index e5dd3c73..6598555f 100644 --- a/examples/ept_attack/config.yaml +++ b/examples/ept_attack/config.yaml @@ -7,6 +7,7 @@ base_example_dir: examples/ept_attack data_paths: input_data_path: ${base_data_dir}/midst_data_black_box_attacks # Read-only input data directory output_data_path: ${base_data_dir}/output # Directory to save processed data and results + data_types_file_path: ${base_data_dir}/data_configs/data_types.json # Path to the JSON file defining column types # Pipeline control pipeline: diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 8802a9e2..9247916d 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -4,6 +4,7 @@ """ from logging import INFO from pathlib import Path +import json import hydra from omegaconf import DictConfig @@ -48,30 +49,44 @@ def attribute_prediction_train_and_extract(config: DictConfig) -> None: entry.name for entry in current_path.iterdir() if entry.is_dir() ] for model_folder in model_folders: - # Load the "trans_synthetic.csv" file as a dataframe - input_data_path = current_path / model_folder + # Load the data files as dataframes + input_data_path = Path(current_path / model_folder) - df_syntehtic_data = load_dataframe(input_data_path, "trans_synthetic.csv") + df_synthetic_data = load_dataframe(input_data_path, "trans_synthetic.csv") df_challenge_data = load_dataframe(input_data_path, "challenge_with_id.csv") df_challenge_labels = load_dataframe(input_data_path, "challenge_label.csv") + + # Load column types specific to the competition dataset + with open(config.data_paths.data_types_file_path, "r") as f: + column_types = json.load(f) + # Drop columns in df_syntehtic_data that end with '_id' + df_synthetic_data = df_synthetic_data.drop(columns=[col for col in df_synthetic_data.columns if col.endswith('_id')]) + df_challenge_data = df_challenge_data.drop(columns=[col for col in df_challenge_data.columns if col.endswith('_id')]) + # Run feature extraction df_extracted_features = run_feature_extraction.main( - synthetic_data=df_syntehtic_data, + synthetic_data=df_synthetic_data, challenge_data=df_challenge_data, challenge_labels=df_challenge_labels, + column_types=column_types, + random_seed=config.random_seed, ) final_output_dir = Path( - output_features_path / f"{model_name}_black_box" / mode / - f"{model_folder}" + output_features_path / f"{model_name}_black_box" ) + final_output_dir.mkdir(parents=True, exist_ok=True) + # Extract the number at the end of model_folder + model_folder_number = int(model_folder.split('_')[-1]) + file_name = f"attribute_prediction_features_{model_folder_number}.csv" + save_dataframe( df=df_extracted_features, file_path=final_output_dir, - file_name="attribute_prediction_features.csv", + file_name=file_name ) diff --git a/src/midst_toolkit/attacks/ept/run_feature_extraction.py b/src/midst_toolkit/attacks/ept/run_feature_extraction.py index 30d32385..d392aae6 100644 --- a/src/midst_toolkit/attacks/ept/run_feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/run_feature_extraction.py @@ -1,12 +1,89 @@ +from enum import Enum +from logging import INFO +from midst_toolkit.common.logger import log + +from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier +from sklearn.preprocessing import StandardScaler, OneHotEncoder +from sklearn.compose import ColumnTransformer +from sklearn.pipeline import Pipeline + import pandas as pd +import numpy as np +from typing import Any + + +class TaskType(Enum): + CLASSIFICATION = "classification" + REGRESSION = "regression" + + +def preprocess_and_train(train_points: pd.DataFrame, test_points: pd.DataFrame, target_col: str, column_types: dict[str, Any], random_seed: int | None = None) -> tuple[np.ndarray, pd.Series, TaskType]: + + train_points['is_train'] = 1 + test_points['is_train'] = 0 + + # Ensure columns in train_points and test_points match + assert set(train_points.columns) == set(test_points.columns), "Columns in train_points and test_points do not match" + combined = pd.concat([train_points, test_points], axis=0) + + numeric_columns = column_types["numerical_columns"] + categorical_columns = column_types["categorical_columns"] + + # Assert that the union of numeric_columns and categorical_columns matches the columns in the combined dataframe, except for 'is_train' + assert set(numeric_columns + categorical_columns) == set(combined.columns) - {'is_train'}, \ + "The union of numeric_columns and categorical_columns must match the columns in the combined dataframe, except for 'is_train'" + + numeric_transformer = StandardScaler() + categorical_transformer = OneHotEncoder(drop='first') + + preprocessor = ColumnTransformer( + transformers=[ + ('num', numeric_transformer, numeric_columns), + ('cat', categorical_transformer, categorical_columns) + ] + ) + + task_type = TaskType.CLASSIFICATION if target_col in categorical_columns else TaskType.REGRESSION + + model = RandomForestClassifier(random_state=random_seed) if task_type == TaskType.CLASSIFICATION else RandomForestRegressor(random_state=random_seed) + + model_pipeline = Pipeline(steps=[ + ('preprocessor', preprocessor), + ('model', model) + ]) + + # Split combined back to train/test + train_data = combined[combined['is_train'] == 1].drop(['is_train'], axis=1) + test_data = combined[combined['is_train'] == 0].drop(['is_train'], axis=1) + + X_train = train_data.drop([target_col], axis=1) + y_train = train_data[target_col] + X_test = test_data.drop([target_col], axis=1) + y_test = test_data[target_col] + + # Train the model + model_pipeline.fit(X_train, y_train) + + # Generate predictions + predictions = model_pipeline.predict(X_test) + + return predictions, y_test, task_type + + + +def main(synthetic_data: pd.DataFrame, challenge_data: pd.DataFrame, challenge_labels: pd.DataFrame, column_types: dict[str, Any], random_seed: int | None = None) -> pd.DataFrame: + features = [] + columns = [] + for column in synthetic_data.columns: + log(INFO, f"Extracting features for column: {column}") + predictions, y_test, task_type = preprocess_and_train(train_points=synthetic_data, test_points=challenge_data, target_col=column, column_types=column_types) -def main(synthetic_data: pd.DataFrame, challenge_data: pd.DataFrame, challenge_labels: pd.DataFrame) -> pd.DataFrame: - """Extract features for attribute prediction attack.""" # Placeholder for actual feature extraction logic # For demonstration, we will just merge the dataframes + import pdb; pdb.set_trace() features = synthetic_data.merge(challenge_data, on='id').merge(challenge_labels, on='id') return features From c9fbb790bb5dee8afd6157a6cd2f67290c46a4ce Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Wed, 5 Nov 2025 10:27:26 -0500 Subject: [PATCH 04/29] First draft of attribute prediction train and test --- examples/ept_attack/config.yaml | 2 +- examples/ept_attack/run_ept_attack.py | 47 ++--- .../attacks/ept/run_feature_extraction.py | 173 ++++++++++++++---- 3 files changed, 151 insertions(+), 71 deletions(-) diff --git a/examples/ept_attack/config.yaml b/examples/ept_attack/config.yaml index 6598555f..abf6d14f 100644 --- a/examples/ept_attack/config.yaml +++ b/examples/ept_attack/config.yaml @@ -1,6 +1,6 @@ # Ensemble example configuration # Base data directory (can be overridden from command line) -base_data_dir: examples/ept_attack/data/ +base_data_dir: examples/ept_attack/data/ base_example_dir: examples/ept_attack # Data paths (relative to base_data_dir) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 9247916d..31611de6 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -2,9 +2,10 @@ This file is an uncompleted example script for running the EPT-MIA Attack on MIDST challenge provided resources and data. """ + +import json from logging import INFO from pathlib import Path -import json import hydra from omegaconf import DictConfig @@ -14,7 +15,6 @@ from midst_toolkit.common.logger import log - # Step 2 and 3: Attribute prediction model training and feature extraction def attribute_prediction_train_and_extract(config: DictConfig) -> None: """ @@ -26,16 +26,9 @@ def attribute_prediction_train_and_extract(config: DictConfig) -> None: Args: config: Configuration object set in config.yaml. """ - log(INFO, "Running attribute prediction model training.") - if config.attack_settings.single_table: - diffusion_model_names = [ - "tabddpm", - "tabsyn",] - else: - diffusion_model_names = [ - "clavaddpm",] + diffusion_model_names = ["tabddpm", "tabsyn"] if config.attack_settings.single_table else ["clavaddpm"] modes = ["train", "dev", "final"] input_data_path = Path(config.data_paths.input_data_path) output_features_path = Path(config.data_paths.output_data_path, "attribute_prediction_features") @@ -45,9 +38,7 @@ def attribute_prediction_train_and_extract(config: DictConfig) -> None: model_path = Path(input_data_path / f"{model_name}_black_box") for mode in modes: current_path = Path(model_path / mode) - model_folders = [ - entry.name for entry in current_path.iterdir() if entry.is_dir() - ] + model_folders = [entry.name for entry in current_path.iterdir() if entry.is_dir()] for model_folder in model_folders: # Load the data files as dataframes input_data_path = Path(current_path / model_folder) @@ -59,36 +50,32 @@ def attribute_prediction_train_and_extract(config: DictConfig) -> None: # Load column types specific to the competition dataset with open(config.data_paths.data_types_file_path, "r") as f: column_types = json.load(f) - + # Drop columns in df_syntehtic_data that end with '_id' - df_synthetic_data = df_synthetic_data.drop(columns=[col for col in df_synthetic_data.columns if col.endswith('_id')]) - df_challenge_data = df_challenge_data.drop(columns=[col for col in df_challenge_data.columns if col.endswith('_id')]) + df_synthetic_data = df_synthetic_data.drop( + columns=[col for col in df_synthetic_data.columns if col.endswith("_id")] + ) + df_challenge_data = df_challenge_data.drop( + columns=[col for col in df_challenge_data.columns if col.endswith("_id")] + ) # Run feature extraction df_extracted_features = run_feature_extraction.main( synthetic_data=df_synthetic_data, challenge_data=df_challenge_data, - challenge_labels=df_challenge_labels, column_types=column_types, random_seed=config.random_seed, ) - final_output_dir = Path( - output_features_path / f"{model_name}_black_box" - ) + final_output_dir = Path(output_features_path / f"{model_name}_black_box") final_output_dir.mkdir(parents=True, exist_ok=True) # Extract the number at the end of model_folder - model_folder_number = int(model_folder.split('_')[-1]) + model_folder_number = int(model_folder.split("_")[-1]) file_name = f"attribute_prediction_features_{model_folder_number}.csv" - save_dataframe( - df=df_extracted_features, - file_path=final_output_dir, - file_name=file_name - ) - + save_dataframe(df=df_extracted_features, file_path=final_output_dir, file_name=file_name) @hydra.main(config_path=".", config_name="config", version_base=None) @@ -101,18 +88,18 @@ def main(config: DictConfig) -> None: Args: config: Attack configuration as an OmegaConf DictConfig object. """ - log(INFO, "Running EPT-MIA Attack Example Pipeline.") - + if config.attack_settings.single_table: log(INFO, "Data: Single-table.") else: log(INFO, "Data: Multi-table.") - #TODO: Implement shadow model training step. + # TODO: Implement shadow model training step. if config.pipeline.run_attribute_prediction_model_training: attribute_prediction_train_and_extract(config) + if __name__ == "__main__": main() diff --git a/src/midst_toolkit/attacks/ept/run_feature_extraction.py b/src/midst_toolkit/attacks/ept/run_feature_extraction.py index d392aae6..88e93080 100644 --- a/src/midst_toolkit/attacks/ept/run_feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/run_feature_extraction.py @@ -1,15 +1,22 @@ +""" +Module to run feature extraction for EPT attack steps 2 and 3. +Overall workflow and decisions are taken with from the BGU team's attack implementation at +https://github.com/eyalgerman/MIA-EPT. + +""" + from enum import Enum from logging import INFO -from midst_toolkit.common.logger import log +from typing import Any -from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier -from sklearn.preprocessing import StandardScaler, OneHotEncoder +import numpy as np +import pandas as pd from sklearn.compose import ColumnTransformer +from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor from sklearn.pipeline import Pipeline +from sklearn.preprocessing import OneHotEncoder, StandardScaler -import pandas as pd -import numpy as np -from typing import Any +from midst_toolkit.common.logger import log class TaskType(Enum): @@ -17,73 +24,159 @@ class TaskType(Enum): REGRESSION = "regression" -def preprocess_and_train(train_points: pd.DataFrame, test_points: pd.DataFrame, target_col: str, column_types: dict[str, Any], random_seed: int | None = None) -> tuple[np.ndarray, pd.Series, TaskType]: +def preprocess_train_predict( + train_points: pd.DataFrame, + test_points: pd.DataFrame, + target_col: str, + column_types: dict[str, Any], + random_seed: int | None = None, +) -> tuple[np.ndarray, pd.Series, TaskType]: + """ + Preprocess the data, train an attribute prediction model, and generate predictions. + + Args: + train_points: Data to train the attribute prediction model on. Must include the target column. + test_points: Data to test the attribute prediction model on. Must include the target column. + target_col: Name of the target column to predict. + column_types: Types of columns in the data. Relevant keys are "numerical", "categorical". + random_seed: Seed for model reproducibility. Defaults to None. - train_points['is_train'] = 1 - test_points['is_train'] = 0 + Returns: + predictions: Predicted values for the target column on the test data. + y_test: True values for the target column on the test data. + task_type: Whether the attribution prediction model was a classification or regression model. + """ + df_train = train_points.copy() + df_test = test_points.copy() - # Ensure columns in train_points and test_points match - assert set(train_points.columns) == set(test_points.columns), "Columns in train_points and test_points do not match" - combined = pd.concat([train_points, test_points], axis=0) + df_train["is_train"] = 1 + df_test["is_train"] = 0 - numeric_columns = column_types["numerical_columns"] - categorical_columns = column_types["categorical_columns"] + assert set(df_train.columns) == set(df_test.columns), "Columns in df_train and df_test do not match" - # Assert that the union of numeric_columns and categorical_columns matches the columns in the combined dataframe, except for 'is_train' - assert set(numeric_columns + categorical_columns) == set(combined.columns) - {'is_train'}, \ + # Original code combines the dataframes to ensure consistent preprocessing + combined = pd.concat([df_train, df_test], axis=0) + + numeric_columns = column_types["numerical"] + categorical_columns = column_types["categorical"] + + import pdb + + pdb.set_trace() + + # Assert that the target column appears exactly once in numeric_columns + categorical_columns + assert (numeric_columns + categorical_columns).count(target_col) == 1, ( + f"The target column '{target_col}' must appear exactly once in numeric_columns + categorical_columns" + ) + + # Assert that the union of numeric_columns and categorical_columns matches + # the columns in the combined dataframe, except for 'is_train' + assert set(numeric_columns + categorical_columns) == set(combined.columns) - {"is_train"}, ( "The union of numeric_columns and categorical_columns must match the columns in the combined dataframe, except for 'is_train'" + ) + + # Remove target column from feature columns + numeric_columns = [col for col in numeric_columns if col != target_col] + categorical_columns = [col for col in categorical_columns if col != target_col] numeric_transformer = StandardScaler() - categorical_transformer = OneHotEncoder(drop='first') + categorical_transformer = OneHotEncoder(drop="first") preprocessor = ColumnTransformer( transformers=[ - ('num', numeric_transformer, numeric_columns), - ('cat', categorical_transformer, categorical_columns) + ("num", numeric_transformer, numeric_columns), + ("cat", categorical_transformer, categorical_columns), ] ) task_type = TaskType.CLASSIFICATION if target_col in categorical_columns else TaskType.REGRESSION - model = RandomForestClassifier(random_state=random_seed) if task_type == TaskType.CLASSIFICATION else RandomForestRegressor(random_state=random_seed) + model = ( + RandomForestClassifier(random_state=random_seed) + if task_type == TaskType.CLASSIFICATION + else RandomForestRegressor(random_state=random_seed) + ) - model_pipeline = Pipeline(steps=[ - ('preprocessor', preprocessor), - ('model', model) - ]) + model_pipeline = Pipeline(steps=[("preprocessor", preprocessor), ("model", model)]) # Split combined back to train/test - train_data = combined[combined['is_train'] == 1].drop(['is_train'], axis=1) - test_data = combined[combined['is_train'] == 0].drop(['is_train'], axis=1) + train_data = combined[combined["is_train"] == 1].drop(["is_train"], axis=1) + test_data = combined[combined["is_train"] == 0].drop(["is_train"], axis=1) - X_train = train_data.drop([target_col], axis=1) + x_train = train_data.drop([target_col], axis=1) y_train = train_data[target_col] - X_test = test_data.drop([target_col], axis=1) + x_test = test_data.drop([target_col], axis=1) y_test = test_data[target_col] - # Train the model - model_pipeline.fit(X_train, y_train) + model_pipeline.fit(x_train, y_train) - # Generate predictions - predictions = model_pipeline.predict(X_test) + predictions = model_pipeline.predict(x_test) return predictions, y_test, task_type +def main( + synthetic_data: pd.DataFrame, + challenge_data: pd.DataFrame, + column_types: dict[str, Any], + random_seed: int | None = None, +) -> pd.DataFrame: + """ + Run feature extraction for EPT attack steps 2 and 3. -def main(synthetic_data: pd.DataFrame, challenge_data: pd.DataFrame, challenge_labels: pd.DataFrame, column_types: dict[str, Any], random_seed: int | None = None) -> pd.DataFrame: + Args: + synthetic_data: _description_ + challenge_data: _description_ + column_types: _description_ + random_seed: _description_. Defaults to None. + Returns: + _description_ + """ features = [] columns = [] for column in synthetic_data.columns: log(INFO, f"Extracting features for column: {column}") - predictions, y_test, task_type = preprocess_and_train(train_points=synthetic_data, test_points=challenge_data, target_col=column, column_types=column_types) - - # Placeholder for actual feature extraction logic - # For demonstration, we will just merge the dataframes - import pdb; pdb.set_trace() - features = synthetic_data.merge(challenge_data, on='id').merge(challenge_labels, on='id') - return features + predictions, y_test, task_type = preprocess_train_predict( + train_points=synthetic_data, + test_points=challenge_data, + target_col=column, + column_types=column_types, + random_seed=random_seed, + ) + + # __________ tested till here ___________ + + features.append(y_test) + columns.append(column) + + if task_type == TaskType.CLASSIFICATION: + # Calculate accuracy + accuracy = predictions == y_test + accuracy = accuracy.astype(int) + features.append(accuracy) + columns.append(f"{column}_accuracy") + else: + # Calculate errors + errors = np.abs(predictions - y_test) + # Calculate the ratio of the error + error_ratio = errors / y_test + + # Save the error and the ratio error + features.append(errors) + features.append(error_ratio) + columns.append(f"{column}_error") + columns.append(f"{column}_error_ratio") + + # predictions from the model + features.append(predictions) + columns.append(f"{column}_prediction") + + # Create a DataFrame with the results + df_results = pd.DataFrame(features).T + df_results.columns = columns + + return df_results From 171643fedcb34984669501237b7d7a6147c39b41 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Thu, 6 Nov 2025 18:40:01 -0500 Subject: [PATCH 05/29] Add tests --- examples/ept_attack/run_ept_attack.py | 23 ++-- ...re_extraction.py => feature_extraction.py} | 53 +++++--- .../ept_attack/test_feature_extraction.py | 126 ++++++++++++++++++ 3 files changed, 173 insertions(+), 29 deletions(-) rename src/midst_toolkit/attacks/ept/{run_feature_extraction.py => feature_extraction.py} (70%) create mode 100644 tests/unit/attacks/ept_attack/test_feature_extraction.py diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 31611de6..d5fcb5f4 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -1,6 +1,9 @@ """ This file is an uncompleted example script for running the EPT-MIA Attack on MIDST challenge provided resources and data. +Overall workflow and decisions are taken with from the Cyber@BGU team's attack implementation at +https://github.com/eyalgerman/MIA-EPT. + """ import json @@ -11,12 +14,12 @@ from omegaconf import DictConfig from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe -from midst_toolkit.attacks.ept import run_feature_extraction +from midst_toolkit.attacks.ept import feature_extraction from midst_toolkit.common.logger import log # Step 2 and 3: Attribute prediction model training and feature extraction -def attribute_prediction_train_and_extract(config: DictConfig) -> None: +def run_attribute_prediction(config: DictConfig) -> None: """ Train attribute prediction models and extract features for EPT-MIA attack. The function is specifically designed to work with the MIDST challenge data structure, @@ -33,6 +36,10 @@ def attribute_prediction_train_and_extract(config: DictConfig) -> None: input_data_path = Path(config.data_paths.input_data_path) output_features_path = Path(config.data_paths.output_data_path, "attribute_prediction_features") + # Load column types specific to the competition dataset + with open(config.data_paths.data_types_file_path, "r") as f: + column_types = json.load(f) + # Iterating over directories specific to the shadow models folder structure in the competition for model_name in diffusion_model_names: model_path = Path(input_data_path / f"{model_name}_black_box") @@ -45,13 +52,9 @@ def attribute_prediction_train_and_extract(config: DictConfig) -> None: df_synthetic_data = load_dataframe(input_data_path, "trans_synthetic.csv") df_challenge_data = load_dataframe(input_data_path, "challenge_with_id.csv") - df_challenge_labels = load_dataframe(input_data_path, "challenge_label.csv") - - # Load column types specific to the competition dataset - with open(config.data_paths.data_types_file_path, "r") as f: - column_types = json.load(f) + # df_challenge_labels = load_dataframe(input_data_path, "challenge_label.csv") - # Drop columns in df_syntehtic_data that end with '_id' + # Drop columns in df_syntehtic_data that end with '_id', as they do not create meaningful features df_synthetic_data = df_synthetic_data.drop( columns=[col for col in df_synthetic_data.columns if col.endswith("_id")] ) @@ -60,7 +63,7 @@ def attribute_prediction_train_and_extract(config: DictConfig) -> None: ) # Run feature extraction - df_extracted_features = run_feature_extraction.main( + df_extracted_features = feature_extraction.main( synthetic_data=df_synthetic_data, challenge_data=df_challenge_data, column_types=column_types, @@ -98,7 +101,7 @@ def main(config: DictConfig) -> None: # TODO: Implement shadow model training step. if config.pipeline.run_attribute_prediction_model_training: - attribute_prediction_train_and_extract(config) + run_attribute_prediction(config) if __name__ == "__main__": diff --git a/src/midst_toolkit/attacks/ept/run_feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py similarity index 70% rename from src/midst_toolkit/attacks/ept/run_feature_extraction.py rename to src/midst_toolkit/attacks/ept/feature_extraction.py index 88e93080..6f9caaa7 100644 --- a/src/midst_toolkit/attacks/ept/run_feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/feature_extraction.py @@ -1,6 +1,6 @@ """ Module to run feature extraction for EPT attack steps 2 and 3. -Overall workflow and decisions are taken with from the BGU team's attack implementation at +Overall workflow and decisions are taken with from the Cyber@BGU team's attack implementation at https://github.com/eyalgerman/MIA-EPT. """ @@ -32,7 +32,16 @@ def preprocess_train_predict( random_seed: int | None = None, ) -> tuple[np.ndarray, pd.Series, TaskType]: """ - Preprocess the data, train an attribute prediction model, and generate predictions. + An attribute prediction model is trained on `train_points` to predict the `target_col`. + + We determine the nature of the prediction task based on the data type of the target column. + If the `target_col` is categorical, the model uses a classification approach. Otherwise, if + the `target_col` is numerical, a regression model is used. This allows the + model to effectively learn the relationship between the `target_col` and the other attributes + present in the training data. + + After the model is trained on `train_points`, it is then used to generate predictions for the `target_col` + on `test_points`. Args: train_points: Data to train the attribute prediction model on. Must include the target column. @@ -60,10 +69,6 @@ def preprocess_train_predict( numeric_columns = column_types["numerical"] categorical_columns = column_types["categorical"] - import pdb - - pdb.set_trace() - # Assert that the target column appears exactly once in numeric_columns + categorical_columns assert (numeric_columns + categorical_columns).count(target_col) == 1, ( f"The target column '{target_col}' must appear exactly once in numeric_columns + categorical_columns" @@ -75,6 +80,8 @@ def preprocess_train_predict( "The union of numeric_columns and categorical_columns must match the columns in the combined dataframe, except for 'is_train'" ) + task_type = TaskType.CLASSIFICATION if target_col in categorical_columns else TaskType.REGRESSION + # Remove target column from feature columns numeric_columns = [col for col in numeric_columns if col != target_col] categorical_columns = [col for col in categorical_columns if col != target_col] @@ -89,8 +96,6 @@ def preprocess_train_predict( ] ) - task_type = TaskType.CLASSIFICATION if target_col in categorical_columns else TaskType.REGRESSION - model = ( RandomForestClassifier(random_state=random_seed) if task_type == TaskType.CLASSIFICATION @@ -122,17 +127,28 @@ def main( random_seed: int | None = None, ) -> pd.DataFrame: """ - Run feature extraction for EPT attack steps 2 and 3. - + Orchestrator function to run feature extraction for EPT attack: + 1. For each attribute (column) in the synthetic data, train an attribute prediction model using the synthetic data. + 2. Use the trained model to predict the values of that attribute in the challenge data. + 3. Compute relevant metrics (accuracy for categorical data, error and error ratio for numerical data). + 4. Compile the results into a DataFrame. Args: - synthetic_data: _description_ - challenge_data: _description_ - column_types: _description_ - random_seed: _description_. Defaults to None. + synthetic_data: Synthetic data generated by the target model. This is the data we want to extract features from. + challenge_data: The data the predictions are compared against. Using this data, we can compute prediction accuracy/errors. + column_types: A dictionary specifying the types of columns (numerical or categorical) in the data. + random_seed: Random seed for reproducability. Defaults to None. Returns: - _description_ + A DataFrame containing the extracted features for each attribute in the challenge data. + It includes the following columns: + - : The true values for the attribute. + - _prediction: The predicted values for the attribute. + If the data is categorical: + - _accuracy: The accuracy of the predictions. + If the data is numerical: + - _error (if regression): The absolute errors of the predictions. + - _error_ratio (if regression): The ratio of the errors to the true values. """ features = [] columns = [] @@ -148,8 +164,6 @@ def main( random_seed=random_seed, ) - # __________ tested till here ___________ - features.append(y_test) columns.append(column) @@ -159,7 +173,8 @@ def main( accuracy = accuracy.astype(int) features.append(accuracy) columns.append(f"{column}_accuracy") - else: + + elif task_type == TaskType.REGRESSION: # Calculate errors errors = np.abs(predictions - y_test) # Calculate the ratio of the error @@ -172,7 +187,7 @@ def main( columns.append(f"{column}_error_ratio") # predictions from the model - features.append(predictions) + features.append(pd.Series(predictions, index=y_test.index)) columns.append(f"{column}_prediction") # Create a DataFrame with the results diff --git a/tests/unit/attacks/ept_attack/test_feature_extraction.py b/tests/unit/attacks/ept_attack/test_feature_extraction.py new file mode 100644 index 00000000..693ec2e6 --- /dev/null +++ b/tests/unit/attacks/ept_attack/test_feature_extraction.py @@ -0,0 +1,126 @@ +import pytest +import pandas as pd +import numpy as np +from midst_toolkit.attacks.ept.feature_extraction import preprocess_train_predict, main as run_feature_extraction_main, TaskType + +@pytest.fixture +def sample_column_types() -> dict: + """Provides a sample column_types dictionary.""" + return { + "numerical": ["num_col_1", "num_col_2"], + "categorical": ["cat_col_1", "cat_col_2"], + } + +@pytest.fixture +def sample_dataframes() -> tuple[pd.DataFrame, pd.DataFrame]: + """Provides sample synthetic and challenge dataframes.""" + synthetic_data = pd.DataFrame({ + "num_col_1": [1.0, 2.5, 3.0, 4.1, 5.8], + "num_col_2": [10, 20, 30, 40, 50], + "cat_col_1": ["A", "B", "A", "C", "B"], + "cat_col_2": ["X", "X", "Y", "Y", "X"], + }) + + challenge_data = pd.DataFrame({ + "num_col_1": [1.2, 2.3, 3.1, 4.0, 5.5], + "num_col_2": [11, 22, 33, 44, 55], + "cat_col_1": ["A", "B", "B", "C", "A"], + "cat_col_2": ["X", "Y", "Y", "X", "Y"], + }) + return synthetic_data, challenge_data + +def test_preprocess_train_predict_classification(sample_dataframes, sample_column_types): + """ + Tests the preprocess_train_predict function for a classification task. + """ + train_df, test_df = sample_dataframes + target_col = "cat_col_1" + + predictions, y_test, task_type = preprocess_train_predict( + train_points=train_df, + test_points=test_df, + target_col=target_col, + column_types=sample_column_types, + random_seed=42, + ) + + assert task_type == TaskType.CLASSIFICATION + assert len(predictions) == len(test_df) + assert predictions.dtype == 'object' # RandomForestClassifier predicts original class + pd.testing.assert_series_equal(y_test, test_df[target_col], check_dtype=False, check_names=False) + +def test_preprocess_train_predict_regression(sample_dataframes, sample_column_types): + """ + Tests the preprocess_train_predict function for a regression task. + """ + train_df, test_df = sample_dataframes + target_col = "num_col_1" + + predictions, y_test, task_type = preprocess_train_predict( + train_points=train_df, + test_points=test_df, + target_col=target_col, + column_types=sample_column_types, + random_seed=42, + ) + + assert task_type == TaskType.REGRESSION + assert len(predictions) == len(test_df) + assert np.issubdtype(predictions.dtype, np.number) # Should be numeric + pd.testing.assert_series_equal(y_test, test_df[target_col], check_dtype=False, check_names=False) + +def test_preprocess_train_predict_assertions(sample_dataframes, sample_column_types): + """ + Tests that the assertions within preprocess_train_predict fire correctly. + """ + train_df, test_df = sample_dataframes + + # Test mismatching columns + test_df_mismatch = test_df.drop(columns=["num_col_1"]) + with pytest.raises(AssertionError, match="Columns in df_train and df_test do not match"): + preprocess_train_predict(train_df, test_df_mismatch, "cat_col_1", sample_column_types) + + # Test target_col not in column_types + with pytest.raises(AssertionError, match="must appear exactly once"): + preprocess_train_predict(train_df, test_df, "missing_col", sample_column_types) + + # Test column_types not matching dataframe columns + bad_column_types = {"numerical": ["num_col_1"], "categorical": []} + with pytest.raises(AssertionError, match="must match the columns in the combined dataframe"): + preprocess_train_predict(train_df, test_df, "num_col_1", bad_column_types) + + +def test_main_feature_extraction(sample_dataframes, sample_column_types): + """ + Tests the main orchestrator function for feature extraction. + """ + synthetic_data, challenge_data = sample_dataframes + + df_results = run_feature_extraction_main( + synthetic_data=synthetic_data, + challenge_data=challenge_data, + column_types=sample_column_types, + random_seed=42 + ) + + assert isinstance(df_results, pd.DataFrame) + assert len(df_results) == len(challenge_data) + + # Check for expected columns + expected_columns = [ + # Numerical 1 + "num_col_1", "num_col_1_error", "num_col_1_error_ratio", "num_col_1_prediction", + # Numerical 2 + "num_col_2", "num_col_2_error", "num_col_2_error_ratio", "num_col_2_prediction", + # Categorical 1 + "cat_col_1", "cat_col_1_accuracy", "cat_col_1_prediction", + # Categorical 2 + "cat_col_2", "cat_col_2_accuracy", "cat_col_2_prediction", + ] + + assert sorted(list(df_results.columns)) == sorted(expected_columns) + + # Check that accuracy is 0 or 1 + assert df_results["cat_col_1_accuracy"].isin([0, 1]).all() + # Check that error is non-negative + assert (df_results["num_col_1_error"] >= 0).all() \ No newline at end of file From c8c0c398d9417032feb34addbffea95572040307 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 7 Nov 2025 08:26:15 -0500 Subject: [PATCH 06/29] Minor change --- examples/ept_attack/run_ept_attack.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index d5fcb5f4..fec1eb73 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -45,14 +45,16 @@ def run_attribute_prediction(config: DictConfig) -> None: model_path = Path(input_data_path / f"{model_name}_black_box") for mode in modes: current_path = Path(model_path / mode) + model_folders = [entry.name for entry in current_path.iterdir() if entry.is_dir()] for model_folder in model_folders: + # Load the data files as dataframes - input_data_path = Path(current_path / model_folder) + model_data_path = Path(current_path / model_folder) - df_synthetic_data = load_dataframe(input_data_path, "trans_synthetic.csv") - df_challenge_data = load_dataframe(input_data_path, "challenge_with_id.csv") - # df_challenge_labels = load_dataframe(input_data_path, "challenge_label.csv") + df_synthetic_data = load_dataframe(model_data_path, "trans_synthetic.csv") + df_challenge_data = load_dataframe(model_data_path, "challenge_with_id.csv") + # df_challenge_labels = load_dataframe(model_data_path, "challenge_label.csv") # Drop columns in df_syntehtic_data that end with '_id', as they do not create meaningful features df_synthetic_data = df_synthetic_data.drop( @@ -84,7 +86,7 @@ def run_attribute_prediction(config: DictConfig) -> None: @hydra.main(config_path=".", config_name="config", version_base=None) def main(config: DictConfig) -> None: """ - Run the EPT-MIA Attack example pipeline. + Main orchestrator of the EPT-MIA Attack example pipeline. First step has yet to be implemented: shadow model training. Second and third steps are attribute prediction model training and feature extraction. From c7645987dc2bf64ca92dd15cd9ac9401078689b5 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 7 Nov 2025 08:30:48 -0500 Subject: [PATCH 07/29] mypy fix --- examples/ept_attack/run_ept_attack.py | 1 - .../attacks/ept/feature_extraction.py | 8 +- .../ept_attack/test_feature_extraction.py | 104 ++++++++++-------- 3 files changed, 63 insertions(+), 50 deletions(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index fec1eb73..bda5d89f 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -48,7 +48,6 @@ def run_attribute_prediction(config: DictConfig) -> None: model_folders = [entry.name for entry in current_path.iterdir() if entry.is_dir()] for model_folder in model_folders: - # Load the data files as dataframes model_data_path = Path(current_path / model_folder) diff --git a/src/midst_toolkit/attacks/ept/feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py index 6f9caaa7..99d1c6c7 100644 --- a/src/midst_toolkit/attacks/ept/feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/feature_extraction.py @@ -32,14 +32,14 @@ def preprocess_train_predict( random_seed: int | None = None, ) -> tuple[np.ndarray, pd.Series, TaskType]: """ - An attribute prediction model is trained on `train_points` to predict the `target_col`. + An attribute prediction model is trained on `train_points` to predict the `target_col`. We determine the nature of the prediction task based on the data type of the target column. If the `target_col` is categorical, the model uses a classification approach. Otherwise, if the `target_col` is numerical, a regression model is used. This allows the model to effectively learn the relationship between the `target_col` and the other attributes present in the training data. - + After the model is trained on `train_points`, it is then used to generate predictions for the `target_col` on `test_points`. @@ -134,8 +134,8 @@ def main( 4. Compile the results into a DataFrame. Args: - synthetic_data: Synthetic data generated by the target model. This is the data we want to extract features from. - challenge_data: The data the predictions are compared against. Using this data, we can compute prediction accuracy/errors. + synthetic_data: Synthetic data generated by the target model, the data we want to extract features from. + challenge_data: The data the predictions are compared against, to compute prediction accuracy/errors. column_types: A dictionary specifying the types of columns (numerical or categorical) in the data. random_seed: Random seed for reproducability. Defaults to None. diff --git a/tests/unit/attacks/ept_attack/test_feature_extraction.py b/tests/unit/attacks/ept_attack/test_feature_extraction.py index 693ec2e6..af1ceea4 100644 --- a/tests/unit/attacks/ept_attack/test_feature_extraction.py +++ b/tests/unit/attacks/ept_attack/test_feature_extraction.py @@ -1,7 +1,10 @@ -import pytest -import pandas as pd import numpy as np -from midst_toolkit.attacks.ept.feature_extraction import preprocess_train_predict, main as run_feature_extraction_main, TaskType +import pandas as pd +import pytest + +from midst_toolkit.attacks.ept.feature_extraction import TaskType, preprocess_train_predict +from midst_toolkit.attacks.ept.feature_extraction import main as run_feature_extraction_main + @pytest.fixture def sample_column_types() -> dict: @@ -11,28 +14,33 @@ def sample_column_types() -> dict: "categorical": ["cat_col_1", "cat_col_2"], } + @pytest.fixture def sample_dataframes() -> tuple[pd.DataFrame, pd.DataFrame]: """Provides sample synthetic and challenge dataframes.""" - synthetic_data = pd.DataFrame({ - "num_col_1": [1.0, 2.5, 3.0, 4.1, 5.8], - "num_col_2": [10, 20, 30, 40, 50], - "cat_col_1": ["A", "B", "A", "C", "B"], - "cat_col_2": ["X", "X", "Y", "Y", "X"], - }) - - challenge_data = pd.DataFrame({ - "num_col_1": [1.2, 2.3, 3.1, 4.0, 5.5], - "num_col_2": [11, 22, 33, 44, 55], - "cat_col_1": ["A", "B", "B", "C", "A"], - "cat_col_2": ["X", "Y", "Y", "X", "Y"], - }) + synthetic_data = pd.DataFrame( + { + "num_col_1": [1.0, 2.5, 3.0, 4.1, 5.8], + "num_col_2": [10, 20, 30, 40, 50], + "cat_col_1": ["A", "B", "A", "C", "B"], + "cat_col_2": ["X", "X", "Y", "Y", "X"], + } + ) + + challenge_data = pd.DataFrame( + { + "num_col_1": [1.2, 2.3, 3.1, 4.0, 5.5], + "num_col_2": [11, 22, 33, 44, 55], + "cat_col_1": ["A", "B", "B", "C", "A"], + "cat_col_2": ["X", "Y", "Y", "X", "Y"], + } + ) return synthetic_data, challenge_data + def test_preprocess_train_predict_classification(sample_dataframes, sample_column_types): - """ - Tests the preprocess_train_predict function for a classification task. - """ + # Tests the preprocess_train_predict function for a classification task. + train_df, test_df = sample_dataframes target_col = "cat_col_1" @@ -46,13 +54,13 @@ def test_preprocess_train_predict_classification(sample_dataframes, sample_colum assert task_type == TaskType.CLASSIFICATION assert len(predictions) == len(test_df) - assert predictions.dtype == 'object' # RandomForestClassifier predicts original class + assert predictions.dtype == "object" # RandomForestClassifier predicts original class pd.testing.assert_series_equal(y_test, test_df[target_col], check_dtype=False, check_names=False) + def test_preprocess_train_predict_regression(sample_dataframes, sample_column_types): - """ - Tests the preprocess_train_predict function for a regression task. - """ + # Tests the preprocess_train_predict function for a regression task. + train_df, test_df = sample_dataframes target_col = "num_col_1" @@ -66,13 +74,13 @@ def test_preprocess_train_predict_regression(sample_dataframes, sample_column_ty assert task_type == TaskType.REGRESSION assert len(predictions) == len(test_df) - assert np.issubdtype(predictions.dtype, np.number) # Should be numeric + assert np.issubdtype(predictions.dtype, np.number) # Should be numeric pd.testing.assert_series_equal(y_test, test_df[target_col], check_dtype=False, check_names=False) + def test_preprocess_train_predict_assertions(sample_dataframes, sample_column_types): - """ - Tests that the assertions within preprocess_train_predict fire correctly. - """ + # Tests that the assertions within preprocess_train_predict fire correctly. + train_df, test_df = sample_dataframes # Test mismatching columns @@ -91,36 +99,42 @@ def test_preprocess_train_predict_assertions(sample_dataframes, sample_column_ty def test_main_feature_extraction(sample_dataframes, sample_column_types): - """ - Tests the main orchestrator function for feature extraction. - """ + # Tests the main orchestrator function for feature extraction. + synthetic_data, challenge_data = sample_dataframes - + df_results = run_feature_extraction_main( - synthetic_data=synthetic_data, - challenge_data=challenge_data, - column_types=sample_column_types, - random_seed=42 + synthetic_data=synthetic_data, challenge_data=challenge_data, column_types=sample_column_types, random_seed=42 ) - + assert isinstance(df_results, pd.DataFrame) assert len(df_results) == len(challenge_data) - + # Check for expected columns expected_columns = [ # Numerical 1 - "num_col_1", "num_col_1_error", "num_col_1_error_ratio", "num_col_1_prediction", + "num_col_1", + "num_col_1_error", + "num_col_1_error_ratio", + "num_col_1_prediction", # Numerical 2 - "num_col_2", "num_col_2_error", "num_col_2_error_ratio", "num_col_2_prediction", + "num_col_2", + "num_col_2_error", + "num_col_2_error_ratio", + "num_col_2_prediction", # Categorical 1 - "cat_col_1", "cat_col_1_accuracy", "cat_col_1_prediction", + "cat_col_1", + "cat_col_1_accuracy", + "cat_col_1_prediction", # Categorical 2 - "cat_col_2", "cat_col_2_accuracy", "cat_col_2_prediction", + "cat_col_2", + "cat_col_2_accuracy", + "cat_col_2_prediction", ] - - assert sorted(list(df_results.columns)) == sorted(expected_columns) - + + assert sorted(df_results.columns) == sorted(expected_columns) + # Check that accuracy is 0 or 1 assert df_results["cat_col_1_accuracy"].isin([0, 1]).all() # Check that error is non-negative - assert (df_results["num_col_1_error"] >= 0).all() \ No newline at end of file + assert (df_results["num_col_1_error"] >= 0).all() From 0f562be4785fb925aaa46e6f0462d29bed078457 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 7 Nov 2025 09:14:47 -0500 Subject: [PATCH 08/29] Resolve applicable coderabbit comments --- examples/ept_attack/run_ept_attack.py | 8 +++++++- .../attacks/ept/feature_extraction.py | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index bda5d89f..3b1db809 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -40,6 +40,12 @@ def run_attribute_prediction(config: DictConfig) -> None: with open(config.data_paths.data_types_file_path, "r") as f: column_types = json.load(f) + # Drop columns that end with '_id' from column_types, as they do not create meaningful features + feature_column_types = { + "numerical": [col for col in column_types.get("numerical", []) if not col.endswith("_id")], + "categorical": [col for col in column_types.get("categorical", []) if not col.endswith("_id")], + } + # Iterating over directories specific to the shadow models folder structure in the competition for model_name in diffusion_model_names: model_path = Path(input_data_path / f"{model_name}_black_box") @@ -67,7 +73,7 @@ def run_attribute_prediction(config: DictConfig) -> None: df_extracted_features = feature_extraction.main( synthetic_data=df_synthetic_data, challenge_data=df_challenge_data, - column_types=column_types, + column_types=feature_column_types, random_seed=config.random_seed, ) diff --git a/src/midst_toolkit/attacks/ept/feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py index 99d1c6c7..4fef609a 100644 --- a/src/midst_toolkit/attacks/ept/feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/feature_extraction.py @@ -175,14 +175,27 @@ def main( columns.append(f"{column}_accuracy") elif task_type == TaskType.REGRESSION: + # # Calculate errors + # errors = np.abs(predictions - y_test) + # # Calculate the ratio of the error + # error_ratio = errors / y_test + + # # Save the error and the ratio error + # features.append(errors) + # features.append(error_ratio) + + # ______________________# # Calculate errors - errors = np.abs(predictions - y_test) - # Calculate the ratio of the error - error_ratio = errors / y_test + errors = pd.Series(np.abs(predictions - y_test), index=y_test.index) + # Calculate the ratio of the error in a zero-safe manner + denominator = y_test.replace(0, np.nan) + error_ratio = errors / denominator + error_ratio = error_ratio.replace([np.inf, -np.inf], np.nan).fillna(0) # Save the error and the ratio error features.append(errors) features.append(error_ratio) + columns.append(f"{column}_error") columns.append(f"{column}_error_ratio") From f67a58cc653be2fed360590ab893d5e189761543 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Mon, 10 Nov 2025 11:10:26 -0500 Subject: [PATCH 09/29] First draft --- examples/ept_attack/run_ept_attack.py | 33 ++++++++++++------- .../attacks/ept/feature_extraction.py | 2 +- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 3b1db809..fcf9313c 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -1,5 +1,5 @@ """ -This file is an uncompleted example script for running the EPT-MIA Attack on MIDST challenge +This file is an incomplete example script for running the EPT-MIA Attack on MIDST challenge provided resources and data. Overall workflow and decisions are taken with from the Cyber@BGU team's attack implementation at https://github.com/eyalgerman/MIA-EPT. @@ -14,7 +14,7 @@ from omegaconf import DictConfig from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe -from midst_toolkit.attacks.ept import feature_extraction +from midst_toolkit.attacks.ept.feature_extraction import extract_features from midst_toolkit.common.logger import log @@ -59,18 +59,14 @@ def run_attribute_prediction(config: DictConfig) -> None: df_synthetic_data = load_dataframe(model_data_path, "trans_synthetic.csv") df_challenge_data = load_dataframe(model_data_path, "challenge_with_id.csv") - # df_challenge_labels = load_dataframe(model_data_path, "challenge_label.csv") - # Drop columns in df_syntehtic_data that end with '_id', as they do not create meaningful features - df_synthetic_data = df_synthetic_data.drop( - columns=[col for col in df_synthetic_data.columns if col.endswith("_id")] - ) - df_challenge_data = df_challenge_data.drop( - columns=[col for col in df_challenge_data.columns if col.endswith("_id")] - ) + # Keep only the columns that are present in feature_column_types + columns_to_keep = feature_column_types["numerical"] + feature_column_types["categorical"] + df_synthetic_data = df_synthetic_data[columns_to_keep] + df_challenge_data = df_challenge_data[columns_to_keep] # Run feature extraction - df_extracted_features = feature_extraction.main( + df_extracted_features = extract_features( synthetic_data=df_synthetic_data, challenge_data=df_challenge_data, column_types=feature_column_types, @@ -87,6 +83,18 @@ def run_attribute_prediction(config: DictConfig) -> None: save_dataframe(df=df_extracted_features, file_path=final_output_dir, file_name=file_name) +def run_attack_classifier_training(config: DictConfig) -> None: + """ + #TODO function description + + Args: + config: Configuration object set in config.yaml. + """ + log(INFO, "Running attack classifier training.") + + features_path = Path(config.data_paths.output_data_path, "attribute_prediction_features") + + @hydra.main(config_path=".", config_name="config", version_base=None) def main(config: DictConfig) -> None: @@ -94,6 +102,7 @@ def main(config: DictConfig) -> None: Main orchestrator of the EPT-MIA Attack example pipeline. First step has yet to be implemented: shadow model training. Second and third steps are attribute prediction model training and feature extraction. + Fourth step is attack classifier training. Args: config: Attack configuration as an OmegaConf DictConfig object. @@ -109,6 +118,8 @@ def main(config: DictConfig) -> None: if config.pipeline.run_attribute_prediction_model_training: run_attribute_prediction(config) + if config.pipeline.run_attack_classifier_training: + run_attack_classifier_training(config) if __name__ == "__main__": diff --git a/src/midst_toolkit/attacks/ept/feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py index 4fef609a..37b7b649 100644 --- a/src/midst_toolkit/attacks/ept/feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/feature_extraction.py @@ -120,7 +120,7 @@ def preprocess_train_predict( return predictions, y_test, task_type -def main( +def extract_features( synthetic_data: pd.DataFrame, challenge_data: pd.DataFrame, column_types: dict[str, Any], From 045181dc67cd1cc5e94c400e741e4c76ed15d372 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Mon, 10 Nov 2025 13:04:51 -0500 Subject: [PATCH 10/29] Applied first round of reviews --- examples/ept_attack/run_ept_attack.py | 21 ++++----- .../attacks/ept/feature_extraction.py | 47 ++++++++++--------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 3b1db809..1e49491d 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -1,5 +1,5 @@ """ -This file is an uncompleted example script for running the EPT-MIA Attack on MIDST challenge +This file is an incomplete example script for running the EPT-MIA Attack on MIDST challenge provided resources and data. Overall workflow and decisions are taken with from the Cyber@BGU team's attack implementation at https://github.com/eyalgerman/MIA-EPT. @@ -14,7 +14,7 @@ from omegaconf import DictConfig from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe -from midst_toolkit.attacks.ept import feature_extraction +from midst_toolkit.attacks.ept.feature_extraction import extract_features from midst_toolkit.common.logger import log @@ -59,18 +59,14 @@ def run_attribute_prediction(config: DictConfig) -> None: df_synthetic_data = load_dataframe(model_data_path, "trans_synthetic.csv") df_challenge_data = load_dataframe(model_data_path, "challenge_with_id.csv") - # df_challenge_labels = load_dataframe(model_data_path, "challenge_label.csv") - # Drop columns in df_syntehtic_data that end with '_id', as they do not create meaningful features - df_synthetic_data = df_synthetic_data.drop( - columns=[col for col in df_synthetic_data.columns if col.endswith("_id")] - ) - df_challenge_data = df_challenge_data.drop( - columns=[col for col in df_challenge_data.columns if col.endswith("_id")] - ) + # Keep only the columns that are present in feature_column_types + columns_to_keep = feature_column_types["numerical"] + feature_column_types["categorical"] + df_synthetic_data = df_synthetic_data[columns_to_keep] + df_challenge_data = df_challenge_data[columns_to_keep] # Run feature extraction - df_extracted_features = feature_extraction.main( + df_extracted_features = extract_features( synthetic_data=df_synthetic_data, challenge_data=df_challenge_data, column_types=feature_column_types, @@ -105,11 +101,14 @@ def main(config: DictConfig) -> None: else: log(INFO, "Data: Multi-table.") + # TODO: Implement potential data preprocessing step. # TODO: Implement shadow model training step. if config.pipeline.run_attribute_prediction_model_training: run_attribute_prediction(config) + # TODO: Implement attack classifier training step. + if __name__ == "__main__": main() diff --git a/src/midst_toolkit/attacks/ept/feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py index 4fef609a..5a0483c2 100644 --- a/src/midst_toolkit/attacks/ept/feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/feature_extraction.py @@ -7,7 +7,6 @@ from enum import Enum from logging import INFO -from typing import Any import numpy as np import pandas as pd @@ -28,7 +27,7 @@ def preprocess_train_predict( train_points: pd.DataFrame, test_points: pd.DataFrame, target_col: str, - column_types: dict[str, Any], + column_types: dict[str, list[str]], random_seed: int | None = None, ) -> tuple[np.ndarray, pd.Series, TaskType]: """ @@ -64,7 +63,7 @@ def preprocess_train_predict( assert set(df_train.columns) == set(df_test.columns), "Columns in df_train and df_test do not match" # Original code combines the dataframes to ensure consistent preprocessing - combined = pd.concat([df_train, df_test], axis=0) + train_and_test_data = pd.concat([df_train, df_test], axis=0) numeric_columns = column_types["numerical"] categorical_columns = column_types["categorical"] @@ -76,7 +75,7 @@ def preprocess_train_predict( # Assert that the union of numeric_columns and categorical_columns matches # the columns in the combined dataframe, except for 'is_train' - assert set(numeric_columns + categorical_columns) == set(combined.columns) - {"is_train"}, ( + assert set(numeric_columns + categorical_columns) == set(train_and_test_data.columns) - {"is_train"}, ( "The union of numeric_columns and categorical_columns must match the columns in the combined dataframe, except for 'is_train'" ) @@ -105,8 +104,8 @@ def preprocess_train_predict( model_pipeline = Pipeline(steps=[("preprocessor", preprocessor), ("model", model)]) # Split combined back to train/test - train_data = combined[combined["is_train"] == 1].drop(["is_train"], axis=1) - test_data = combined[combined["is_train"] == 0].drop(["is_train"], axis=1) + train_data = train_and_test_data[train_and_test_data["is_train"] == 1].drop(["is_train"], axis=1) + test_data = train_and_test_data[train_and_test_data["is_train"] == 0].drop(["is_train"], axis=1) x_train = train_data.drop([target_col], axis=1) y_train = train_data[target_col] @@ -120,16 +119,18 @@ def preprocess_train_predict( return predictions, y_test, task_type -def main( +def extract_features( synthetic_data: pd.DataFrame, challenge_data: pd.DataFrame, - column_types: dict[str, Any], + column_types: dict[str, list[str]], random_seed: int | None = None, ) -> pd.DataFrame: """ Orchestrator function to run feature extraction for EPT attack: - 1. For each attribute (column) in the synthetic data, train an attribute prediction model using the synthetic data. - 2. Use the trained model to predict the values of that attribute in the challenge data. + 1. For each attribute (column) in the synthetic data that is not an ID, train an attribute prediction model + using the synthetic data. + 2. Use the trained model to predict the values of that attribute in the challenge data, which also doesn't + contain IDs. 3. Compute relevant metrics (accuracy for categorical data, error and error ratio for numerical data). 4. Compile the results into a DataFrame. @@ -137,7 +138,7 @@ def main( synthetic_data: Synthetic data generated by the target model, the data we want to extract features from. challenge_data: The data the predictions are compared against, to compute prediction accuracy/errors. column_types: A dictionary specifying the types of columns (numerical or categorical) in the data. - random_seed: Random seed for reproducability. Defaults to None. + random_seed: Random seed for reproducibility. Defaults to None. Returns: A DataFrame containing the extracted features for each attribute in the challenge data. @@ -145,10 +146,12 @@ def main( - : The true values for the attribute. - _prediction: The predicted values for the attribute. If the data is categorical: - - _accuracy: The accuracy of the predictions. + - _accuracy: The element-wise accuracy of the predictions. 0 for incorrect prediction, + 1 for correct. If the data is numerical: - _error (if regression): The absolute errors of the predictions. - - _error_ratio (if regression): The ratio of the errors to the true values. + - _error_ratio (if regression): The ratio of the errors to the true values, which is + derived by dividing the absolute error by the true value in a zero-safe manner. """ features = [] columns = [] @@ -175,22 +178,17 @@ def main( columns.append(f"{column}_accuracy") elif task_type == TaskType.REGRESSION: - # # Calculate errors - # errors = np.abs(predictions - y_test) - # # Calculate the ratio of the error - # error_ratio = errors / y_test - # # Save the error and the ratio error - # features.append(errors) - # features.append(error_ratio) - - # ______________________# # Calculate errors errors = pd.Series(np.abs(predictions - y_test), index=y_test.index) + # Calculate the ratio of the error in a zero-safe manner denominator = y_test.replace(0, np.nan) error_ratio = errors / denominator - error_ratio = error_ratio.replace([np.inf, -np.inf], np.nan).fillna(0) + + # Replace infs and NaNs with a large number. If all values are NaN, replace with 1e9. + finite_max = error_ratio[np.isfinite(error_ratio)].max() + error_ratio = error_ratio.replace([np.inf, -np.inf], np.nan).fillna(finite_max if pd.notna(finite_max) else 1e9) # Save the error and the ratio error features.append(errors) @@ -198,6 +196,9 @@ def main( columns.append(f"{column}_error") columns.append(f"{column}_error_ratio") + + else: + raise ValueError(f"Unsupported task type: {task_type}") # predictions from the model features.append(pd.Series(predictions, index=y_test.index)) From d50b250d38f2f8ca208c63b8050e532b02b851fa Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Mon, 10 Nov 2025 13:06:59 -0500 Subject: [PATCH 11/29] Fix test --- src/midst_toolkit/attacks/ept/feature_extraction.py | 7 ++++--- tests/unit/attacks/ept_attack/test_feature_extraction.py | 5 ++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/midst_toolkit/attacks/ept/feature_extraction.py b/src/midst_toolkit/attacks/ept/feature_extraction.py index 5a0483c2..ddbf2e29 100644 --- a/src/midst_toolkit/attacks/ept/feature_extraction.py +++ b/src/midst_toolkit/attacks/ept/feature_extraction.py @@ -178,7 +178,6 @@ def extract_features( columns.append(f"{column}_accuracy") elif task_type == TaskType.REGRESSION: - # Calculate errors errors = pd.Series(np.abs(predictions - y_test), index=y_test.index) @@ -188,7 +187,9 @@ def extract_features( # Replace infs and NaNs with a large number. If all values are NaN, replace with 1e9. finite_max = error_ratio[np.isfinite(error_ratio)].max() - error_ratio = error_ratio.replace([np.inf, -np.inf], np.nan).fillna(finite_max if pd.notna(finite_max) else 1e9) + error_ratio = error_ratio.replace([np.inf, -np.inf], np.nan).fillna( + finite_max if pd.notna(finite_max) else 1e9 + ) # Save the error and the ratio error features.append(errors) @@ -196,7 +197,7 @@ def extract_features( columns.append(f"{column}_error") columns.append(f"{column}_error_ratio") - + else: raise ValueError(f"Unsupported task type: {task_type}") diff --git a/tests/unit/attacks/ept_attack/test_feature_extraction.py b/tests/unit/attacks/ept_attack/test_feature_extraction.py index af1ceea4..ce2ef09b 100644 --- a/tests/unit/attacks/ept_attack/test_feature_extraction.py +++ b/tests/unit/attacks/ept_attack/test_feature_extraction.py @@ -2,8 +2,7 @@ import pandas as pd import pytest -from midst_toolkit.attacks.ept.feature_extraction import TaskType, preprocess_train_predict -from midst_toolkit.attacks.ept.feature_extraction import main as run_feature_extraction_main +from midst_toolkit.attacks.ept.feature_extraction import TaskType, extract_features, preprocess_train_predict @pytest.fixture @@ -103,7 +102,7 @@ def test_main_feature_extraction(sample_dataframes, sample_column_types): synthetic_data, challenge_data = sample_dataframes - df_results = run_feature_extraction_main( + df_results = extract_features( synthetic_data=synthetic_data, challenge_data=challenge_data, column_types=sample_column_types, random_seed=42 ) From 41e1c46da0b127a44121986e53ab0c73046b59ef Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Tue, 18 Nov 2025 11:29:40 -0500 Subject: [PATCH 12/29] Fix feature extraction tests --- .../ept_attack/test_feature_extraction.py | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/tests/unit/attacks/ept_attack/test_feature_extraction.py b/tests/unit/attacks/ept_attack/test_feature_extraction.py index e991a283..5a27292a 100644 --- a/tests/unit/attacks/ept_attack/test_feature_extraction.py +++ b/tests/unit/attacks/ept_attack/test_feature_extraction.py @@ -2,12 +2,8 @@ import pandas as pd import pytest -<<<<<<< HEAD -from midst_toolkit.attacks.ept.feature_extraction import TaskType, extract_features, preprocess_train_predict -======= from midst_toolkit.attacks.ept.feature_extraction import extract_features, preprocess_train_predict from midst_toolkit.common.enumerations import TaskType ->>>>>>> main @pytest.fixture @@ -56,11 +52,7 @@ def test_preprocess_train_predict_classification(sample_dataframes, sample_colum random_seed=42, ) -<<<<<<< HEAD - assert task_type == TaskType.CLASSIFICATION -======= assert task_type == TaskType.MULTICLASS_CLASSIFICATION ->>>>>>> main assert len(predictions) == len(test_df) assert predictions.dtype == "object" # RandomForestClassifier predicts original class pd.testing.assert_series_equal(y_test, test_df[target_col], check_dtype=False, check_names=False) @@ -90,22 +82,6 @@ def test_preprocess_train_predict_assertions(sample_dataframes, sample_column_ty # Tests that the assertions within preprocess_train_predict fire correctly. train_df, test_df = sample_dataframes -<<<<<<< HEAD - - # Test mismatching columns - test_df_mismatch = test_df.drop(columns=["num_col_1"]) - with pytest.raises(AssertionError, match="Columns in df_train and df_test do not match"): - preprocess_train_predict(train_df, test_df_mismatch, "cat_col_1", sample_column_types) - - # Test target_col not in column_types - with pytest.raises(AssertionError, match="must appear exactly once"): - preprocess_train_predict(train_df, test_df, "missing_col", sample_column_types) - - # Test column_types not matching dataframe columns - bad_column_types = {"numerical": ["num_col_1"], "categorical": []} - with pytest.raises(AssertionError, match="must match the columns in the combined dataframe"): - preprocess_train_predict(train_df, test_df, "num_col_1", bad_column_types) -======= target_col = "num_col_1" # 1. Target column not in train_points @@ -133,7 +109,6 @@ def test_preprocess_train_predict_assertions(sample_dataframes, sample_column_ty column_types_mismatch["numerical"] = ["num_col_1"] # Missing num_col_2 with pytest.raises(AssertionError, match="The union of numeric_columns and categorical_columns must match"): preprocess_train_predict(train_df, test_df, target_col, column_types_mismatch) ->>>>>>> main def test_main_feature_extraction(sample_dataframes, sample_column_types): From 3a8edd5d913ddd8e6e29f7cdfbaf506c47fad06e Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 21 Nov 2025 12:58:24 -0500 Subject: [PATCH 13/29] Initial label handling --- examples/common/utils.py | 5 +-- examples/ept_attack/config.yaml | 2 +- examples/ept_attack/run_ept_attack.py | 47 +++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/examples/common/utils.py b/examples/common/utils.py index c8c27137..16fbc401 100644 --- a/examples/common/utils.py +++ b/examples/common/utils.py @@ -13,7 +13,8 @@ def iterate_model_folders(input_data_path: Path, diffusion_model_names: list[str diffusion_model_names: A list of diffusion model names to iterate over. Yields: - A tuple containing the model name, the path to the model's data, and the model folder name. + A tuple containing the model name (e.g. tabddpm), the path to the model's data, + the model folder name (e.g. tabddpm_1), and mode (train, dev, final). """ modes = ["train", "dev", "final"] for model_name in diffusion_model_names: @@ -25,4 +26,4 @@ def iterate_model_folders(input_data_path: Path, diffusion_model_names: list[str model_folders = [entry for entry in current_path.iterdir() if entry.is_dir()] for model_folder_path in model_folders: - yield model_name, model_folder_path, model_folder_path.name + yield model_name, model_folder_path, model_folder_path.name, mode diff --git a/examples/ept_attack/config.yaml b/examples/ept_attack/config.yaml index f7b06a07..96f76d84 100644 --- a/examples/ept_attack/config.yaml +++ b/examples/ept_attack/config.yaml @@ -14,7 +14,7 @@ pipeline: run_data_processing: false # Whether to run data processing run_shadow_model_training: false # Whether to run shadow model training run_feature_extraction: true # Whether to run attribute prediction model training - run_attack_classifier_training: false # Whether to run attack classifier training + run_attack_classifier_training: true # Whether to run attack classifier training attack_settings: single_table: true # Whether the data is single-table diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index a8accf81..1f74ddc3 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -47,7 +47,10 @@ def run_attribute_prediction(config: DictConfig) -> None: } # Iterating over directories specific to the shadow models folder structure in the competition - for model_name, model_data_path, model_folder in iterate_model_folders(input_data_path, diffusion_model_names): + for model_name, model_data_path, model_folder, mode in iterate_model_folders(input_data_path, diffusion_model_names): + + import pdb; pdb.set_trace() + # Load the data files as dataframes df_synthetic_data = load_dataframe(model_data_path, "trans_synthetic.csv") df_challenge_data = load_dataframe(model_data_path, "challenge_with_id.csv") @@ -73,9 +76,48 @@ def run_attribute_prediction(config: DictConfig) -> None: model_folder_number = int(model_folder.split("_")[-1]) file_name = f"attribute_prediction_features_{model_folder_number}.csv" + if mode == "train": + file_name = f"attribute_prediction_features_with_labels_{model_folder_number}.csv" + + # Load the challenge labels and add them to the features dataframe + df_labels = load_dataframe(model_data_path, "challenge_label.csv") + + # Check that the number of rows align + assert len(df_extracted_features) == len(df_labels), ( + f"The number of rows in the extracted features ({len(df_extracted_features)}) " + f"does not match the number of labels ({len(df_labels)})." + ) + df_extracted_features["is_train"] = df_labels.values + save_dataframe(df=df_extracted_features, file_path=final_output_dir, file_name=file_name) +# Step 4: Attack classifier training +def run_attack_classifier_training(config: DictConfig) -> None: + """ + Train the attack classifier for EPT-MIA attack. + + Args: + config: Configuration object set in config.yaml. + """ + log(INFO, "Running attack classifier training.") + + # Read all the files from the attribute prediction features directory + features_data_path = Path(config.data_paths.output_data_path, "attribute_prediction_features") + + models = ["tabddpm", "tabsyn"] if config.attack_settings.single_table else ["clavaddpm"] + + for model_name in models: + model_features_path = features_data_path / f"{model_name}_black_box" + + assert model_features_path.exists() and model_features_path.is_dir(), ( + f"Directory not found: {model_features_path}. Make sure to run feature extraction first." + ) + assert any(model_features_path.iterdir()), ( + f"Directory is empty: {model_features_path}. Make sure to run feature extraction first." + ) + + @hydra.main(config_path=".", config_name="config", version_base=None) def main(config: DictConfig) -> None: """ @@ -99,7 +141,8 @@ def main(config: DictConfig) -> None: if config.pipeline.run_feature_extraction: run_attribute_prediction(config) - # TODO: Implement attack classifier training step. + if config.pipeline.run_attack_classifier_training: + run_attack_classifier_training(config) if __name__ == "__main__": From a3d433b2c12fbcdb8e130dc379757ac262e7ae20 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Thu, 18 Dec 2025 15:55:23 -0500 Subject: [PATCH 14/29] Initial classifying process implementation --- examples/common/utils.py | 4 +- examples/ept_attack/config.yaml | 9 ++- examples/ept_attack/run_ept_attack.py | 75 +++++++++++++++---- .../attacks/ept/classification.py | 69 +++++++++++++++++ 4 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 src/midst_toolkit/attacks/ept/classification.py diff --git a/examples/common/utils.py b/examples/common/utils.py index 16fbc401..8a04571d 100644 --- a/examples/common/utils.py +++ b/examples/common/utils.py @@ -4,7 +4,9 @@ from pathlib import Path -def iterate_model_folders(input_data_path: Path, diffusion_model_names: list[str]) -> Generator[tuple[str, Path, str]]: +def iterate_model_folders( + input_data_path: Path, diffusion_model_names: list[str] +) -> Generator[tuple[str, Path, str, str]]: """ Iterates over the competition's shadow model folder structure and yields model information. diff --git a/examples/ept_attack/config.yaml b/examples/ept_attack/config.yaml index 96f76d84..4a059f34 100644 --- a/examples/ept_attack/config.yaml +++ b/examples/ept_attack/config.yaml @@ -1,6 +1,6 @@ # Ensemble example configuration # Base data directory (can be overridden from command line) -base_data_dir: examples/ept_attack/data/ +base_data_dir: examples/ept_attack/data base_example_dir: examples/ept_attack # Data paths (relative to base_data_dir) @@ -8,14 +8,17 @@ data_paths: input_data_path: ${base_data_dir}/midst_data_black_box_attacks # Read-only input data directory output_data_path: ${base_data_dir}/output # Directory to save processed data and results data_types_file_path: ${base_data_dir}/data_configs/data_types.json # Path to the JSON file defining column types - + attribute_features_path: ${base_data_dir}/output/attribute_prediction_features # Path to save attribute prediction features # Pipeline control pipeline: run_data_processing: false # Whether to run data processing run_shadow_model_training: false # Whether to run shadow model training - run_feature_extraction: true # Whether to run attribute prediction model training + run_feature_extraction: false # Whether to run attribute prediction model training run_attack_classifier_training: true # Whether to run attack classifier training +classifier_settings: + results_output_path: ${data_paths.output_data_path}/evaluation_ML + attack_settings: single_table: true # Whether the data is single-table diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 1f74ddc3..2ceae963 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -7,14 +7,17 @@ """ import json +from datetime import datetime from logging import INFO from pathlib import Path import hydra +import pandas as pd from omegaconf import DictConfig from examples.common.utils import iterate_model_folders from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe +from midst_toolkit.attacks.ept.classification import train_attack_classifier from midst_toolkit.attacks.ept.feature_extraction import extract_features from midst_toolkit.common.logger import log @@ -34,7 +37,7 @@ def run_attribute_prediction(config: DictConfig) -> None: diffusion_model_names = ["tabddpm", "tabsyn"] if config.attack_settings.single_table else ["clavaddpm"] input_data_path = Path(config.data_paths.input_data_path) - output_features_path = Path(config.data_paths.output_data_path, "attribute_prediction_features") + output_features_path = Path(config.data_paths.attribute_features_path) # Load column types specific to the competition dataset with open(config.data_paths.data_types_file_path, "r") as f: @@ -46,11 +49,16 @@ def run_attribute_prediction(config: DictConfig) -> None: "categorical": [col for col in column_types.get("categorical", []) if not col.endswith("_id")], } + # Assert that the input data path exists and is not empty + assert input_data_path.exists() and input_data_path.is_dir(), f"Input data directory not found: {input_data_path}" + assert any(input_data_path.iterdir()), f"Input data directory is empty: {input_data_path}" + # Iterating over directories specific to the shadow models folder structure in the competition - for model_name, model_data_path, model_folder, mode in iterate_model_folders(input_data_path, diffusion_model_names): + for model_name, model_data_path, model_folder, mode in iterate_model_folders( + input_data_path, diffusion_model_names + ): + print(f"Processing model: {model_name}, path: {model_data_path}, folder: {model_folder}, mode: {mode}") - import pdb; pdb.set_trace() - # Load the data files as dataframes df_synthetic_data = load_dataframe(model_data_path, "trans_synthetic.csv") df_challenge_data = load_dataframe(model_data_path, "challenge_with_id.csv") @@ -68,7 +76,7 @@ def run_attribute_prediction(config: DictConfig) -> None: random_seed=config.random_seed, ) - final_output_dir = output_features_path / f"{model_name}_black_box" + final_output_dir = output_features_path / f"{model_name}_black_box" / mode final_output_dir.mkdir(parents=True, exist_ok=True) @@ -78,7 +86,7 @@ def run_attribute_prediction(config: DictConfig) -> None: if mode == "train": file_name = f"attribute_prediction_features_with_labels_{model_folder_number}.csv" - + # Load the challenge labels and add them to the features dataframe df_labels = load_dataframe(model_data_path, "challenge_label.csv") @@ -102,21 +110,62 @@ def run_attack_classifier_training(config: DictConfig) -> None: """ log(INFO, "Running attack classifier training.") + data_format, models = ( + ("single_table", ["tabddpm", "tabsyn"]) + if config.attack_settings.single_table + else ("multi_table", ["clavaddpm"]) + ) + # Read all the files from the attribute prediction features directory - features_data_path = Path(config.data_paths.output_data_path, "attribute_prediction_features") + features_data_path = Path(config.data_paths.attribute_features_path) - models = ["tabddpm", "tabsyn"] if config.attack_settings.single_table else ["clavaddpm"] + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") for model_name in models: - model_features_path = features_data_path / f"{model_name}_black_box" + train_features_path = features_data_path / f"{model_name}_black_box" / "train" - assert model_features_path.exists() and model_features_path.is_dir(), ( - f"Directory not found: {model_features_path}. Make sure to run feature extraction first." + assert train_features_path.exists() and train_features_path.is_dir(), ( + f"Directory not found: {train_features_path}. Make sure to run feature extraction first." + ) + assert any(train_features_path.iterdir()), ( + f"Directory is empty: {train_features_path}. Make sure to run feature extraction first." ) - assert any(model_features_path.iterdir()), ( - f"Directory is empty: {model_features_path}. Make sure to run feature extraction first." + + sorted_feature_files = sorted(train_features_path.glob("*.csv")) + + # Get the first 25 feature files + train_feature_files = sorted_feature_files[:25] + # Concatenate all the train feature files into a single dataframe + df_train_features = pd.concat([pd.read_csv(f) for f in train_feature_files], ignore_index=True) + train_labels = df_train_features["is_train"] + df_train_features = df_train_features.drop(columns=["is_train"]) + + test_feature_files = sorted_feature_files[26:] + df_test_features = pd.concat([pd.read_csv(f) for f in test_feature_files], ignore_index=True) + test_labels = df_test_features["is_train"] + df_test_features = df_test_features.drop(columns=["is_train"]) + + classifier_types = ["XGBoost", "CatBoost", "MLP"] + column_types = ["actual", "error", "error_ratio", "accuracy", "prediction"] + + results = train_attack_classifier( + classifier_types=classifier_types, + column_types=column_types, + x_train=df_train_features, + y_train=train_labels, + x_test=df_test_features, + y_test=test_labels, ) + summary_file_name = "attack_classifier_summary.txt" + output_summary_path = Path(config.classifier_settings.results_output_path) / data_format / f"{timestamp}_train" + output_summary_path.mkdir(parents=True, exist_ok=True) + + with open(output_summary_path / summary_file_name, "w") as f: + json.dump(results, f, indent=4) + + log(INFO, f"Saved attack classifier summary to {output_summary_path / summary_file_name}") + @hydra.main(config_path=".", config_name="config", version_base=None) def main(config: DictConfig) -> None: diff --git a/src/midst_toolkit/attacks/ept/classification.py b/src/midst_toolkit/attacks/ept/classification.py new file mode 100644 index 00000000..d5a6adca --- /dev/null +++ b/src/midst_toolkit/attacks/ept/classification.py @@ -0,0 +1,69 @@ +from logging import INFO +import itertools +import pandas as pd +import numpy as np + +import hydra +from datetime import datetime + +from midst_toolkit.common.logger import log + + +def filter_data(features_df: pd.DataFrame, columns_list: list[str]) -> np.ndarray: + """ + Filters columns from a single DataFrame based on specified suffixes. + + This function processes a pandas DataFrame, selecting columns based on + suffixes that correspond to the types specified in `columns_list` (e.g., + 'actual', 'error'). It then returns the data from these selected columns + as a NumPy array. + + Args: + features_df: The pandas DataFrame to process. + columns_lst: A list of strings specifying the types of columns + to select. + + Returns: + np.ndarray: A NumPy array containing the data from the selected columns. + """ + + suffix_mapping = { + 'actual': lambda x: not (x.endswith('error') or x.endswith('error_ratio') or x.endswith('accuracy') or x.endswith('prediction')), + 'error': lambda x: x.endswith('error'), + 'error_ratio': lambda x: x.endswith('error_ratio'), + 'accuracy': lambda x: x.endswith('accuracy'), + 'prediction': lambda x: x.endswith('prediction'), + } + + # Filter columns for each type in args.columns_lst + selected_columns = [col for col_type in columns_list for col in features_df.columns if suffix_mapping[col_type](col)] + + return features_df[selected_columns].values + + + +def train_attack_classifier(classifier_types: list[str], column_types: list[str], x_train: pd.DataFrame, y_train: pd.Series, x_test: pd.DataFrame, y_test: pd.Series) -> list[dict]: + + all_results = [] + for classifier in classifier_types: + for r in range(1, len(column_types) + 1): + for selected_columns_tuple in itertools.combinations(column_types, r): + + # import pdb; pdb.set_trace() + # x_train is a dataframe of 5000 rows and 28 columns (account is included). 5000 rows correspond to 25 shadow models * 200 records each. + + selected_columns = list(selected_columns_tuple) + + x_train_filtered = filter_data(x_train, selected_columns) + + log(INFO, f"Training {classifier} classifier using features from columns: {selected_columns}") + + results = { + "classifier": classifier, + "columns_lst": " ".join(selected_columns) + } + + all_results.append(results) + + return all_results + From 346a982ba2043b0de6a233a53daefb8096037941 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Wed, 14 Jan 2026 13:43:27 -0500 Subject: [PATCH 15/29] Full classifier training first draft --- catboost_info/catboost_training.json | 1004 +++++++++++++++++ catboost_info/learn/events.out.tfevents | Bin 0 -> 54870 bytes catboost_info/learn_error.tsv | 1001 ++++++++++++++++ catboost_info/time_left.tsv | 1001 ++++++++++++++++ examples/ept_attack/config.yaml | 2 +- examples/ept_attack/run_ept_attack.py | 56 +- mypy.ini | 3 + pyproject.toml | 1 + .../attacks/ept/classification.py | 176 ++- uv.lock | 31 + 10 files changed, 3231 insertions(+), 44 deletions(-) create mode 100644 catboost_info/catboost_training.json create mode 100644 catboost_info/learn/events.out.tfevents create mode 100644 catboost_info/learn_error.tsv create mode 100644 catboost_info/time_left.tsv diff --git a/catboost_info/catboost_training.json b/catboost_info/catboost_training.json new file mode 100644 index 00000000..d189bbb0 --- /dev/null +++ b/catboost_info/catboost_training.json @@ -0,0 +1,1004 @@ +{ +"meta":{"test_sets":[],"test_metrics":[],"learn_metrics":[{"best_value":"Min","name":"Logloss"}],"launch_mode":"Train","parameters":"","iteration_count":1000,"learn_sets":["learn"],"name":"experiment"}, +"iterations":[ +{"learn":[0.6928813762],"iteration":0,"passed_time":0.05867216667,"remaining_time":58.6134945}, +{"learn":[0.6927705684],"iteration":1,"passed_time":0.05961491667,"remaining_time":29.74784342}, +{"learn":[0.6925971801],"iteration":2,"passed_time":0.06051420833,"remaining_time":20.11088857}, +{"learn":[0.6922455935],"iteration":3,"passed_time":0.06148229167,"remaining_time":15.30909062}, +{"learn":[0.6921065986],"iteration":4,"passed_time":0.06235725,"remaining_time":12.40909275}, +{"learn":[0.6919532647],"iteration":5,"passed_time":0.06322304167,"remaining_time":10.47395057}, +{"learn":[0.6917604238],"iteration":6,"passed_time":0.06411983333,"remaining_time":9.095856357}, +{"learn":[0.6914900993],"iteration":7,"passed_time":0.06500029167,"remaining_time":8.060036167}, +{"learn":[0.6913674357],"iteration":8,"passed_time":0.06589558333,"remaining_time":7.255835898}, +{"learn":[0.6912118273],"iteration":9,"passed_time":0.06677104167,"remaining_time":6.610333125}, +{"learn":[0.6909499099],"iteration":10,"passed_time":0.06776704167,"remaining_time":6.09287311}, +{"learn":[0.6908325175],"iteration":11,"passed_time":0.068630875,"remaining_time":5.650608708}, +{"learn":[0.6905856299],"iteration":12,"passed_time":0.06965054167,"remaining_time":5.288083433}, +{"learn":[0.6903327674],"iteration":13,"passed_time":0.07049879167,"remaining_time":4.965129185}, +{"learn":[0.6901495654],"iteration":14,"passed_time":0.071333875,"remaining_time":4.684257792}, +{"learn":[0.6899851009],"iteration":15,"passed_time":0.07216491667,"remaining_time":4.438142375}, +{"learn":[0.689805002],"iteration":16,"passed_time":0.07297316667,"remaining_time":4.219566049}, +{"learn":[0.6896438315],"iteration":17,"passed_time":0.073832875,"remaining_time":4.027993514}, +{"learn":[0.6894644175],"iteration":18,"passed_time":0.07467304167,"remaining_time":3.855487046}, +{"learn":[0.6893579758],"iteration":19,"passed_time":0.07553008333,"remaining_time":3.700974083}, +{"learn":[0.6892922886],"iteration":20,"passed_time":0.076332125,"remaining_time":3.55853097}, +{"learn":[0.6891095639],"iteration":21,"passed_time":0.07724825,"remaining_time":3.434035841}, +{"learn":[0.6889441399],"iteration":22,"passed_time":0.07809166667,"remaining_time":3.317198188}, +{"learn":[0.6888966863],"iteration":23,"passed_time":0.07880670833,"remaining_time":3.204806139}, +{"learn":[0.6887419932],"iteration":24,"passed_time":0.0802965,"remaining_time":3.1315635}, +{"learn":[0.6886235566],"iteration":25,"passed_time":0.081151125,"remaining_time":3.04004599}, +{"learn":[0.6884747749],"iteration":26,"passed_time":0.08196854167,"remaining_time":2.953903372}, +{"learn":[0.6883228153],"iteration":27,"passed_time":0.08279716667,"remaining_time":2.8742445}, +{"learn":[0.688067851],"iteration":28,"passed_time":0.08366016667,"remaining_time":2.801173167}, +{"learn":[0.6879232525],"iteration":29,"passed_time":0.08453154167,"remaining_time":2.733186514}, +{"learn":[0.6876759838],"iteration":30,"passed_time":0.08537220833,"remaining_time":2.668569996}, +{"learn":[0.6875918587],"iteration":31,"passed_time":0.08624770833,"remaining_time":2.608993177}, +{"learn":[0.6874656612],"iteration":32,"passed_time":0.08713533333,"remaining_time":2.553329313}, +{"learn":[0.6873087217],"iteration":33,"passed_time":0.08799758333,"remaining_time":2.500166632}, +{"learn":[0.6871237069],"iteration":34,"passed_time":0.08883720833,"remaining_time":2.449368744}, +{"learn":[0.6869757717],"iteration":35,"passed_time":0.08964579167,"remaining_time":2.400515088}, +{"learn":[0.6868291181],"iteration":36,"passed_time":0.09043833333,"remaining_time":2.353840946}, +{"learn":[0.6867156963],"iteration":37,"passed_time":0.09122379167,"remaining_time":2.309402305}, +{"learn":[0.686571403],"iteration":38,"passed_time":0.09215033333,"remaining_time":2.270678726}, +{"learn":[0.6864704558],"iteration":39,"passed_time":0.09296679167,"remaining_time":2.231203}, +{"learn":[0.6863497381],"iteration":40,"passed_time":0.093780375,"remaining_time":2.193545845}, +{"learn":[0.6862397246],"iteration":41,"passed_time":0.094648875,"remaining_time":2.158895768}, +{"learn":[0.6859510082],"iteration":42,"passed_time":0.095529125,"remaining_time":2.126078433}, +{"learn":[0.6858363546],"iteration":43,"passed_time":0.09638525,"remaining_time":2.094188614}, +{"learn":[0.6855842458],"iteration":44,"passed_time":0.09729566667,"remaining_time":2.064830259}, +{"learn":[0.6854340555],"iteration":45,"passed_time":0.0981145,"remaining_time":2.034809413}, +{"learn":[0.6852941722],"iteration":46,"passed_time":0.09972445833,"remaining_time":2.022072527}, +{"learn":[0.6851449425],"iteration":47,"passed_time":0.1005315,"remaining_time":1.99387475}, +{"learn":[0.6850428887],"iteration":48,"passed_time":0.1014757917,"remaining_time":1.969458732}, +{"learn":[0.6848561421],"iteration":49,"passed_time":0.1024744583,"remaining_time":1.947014708}, +{"learn":[0.6845848016],"iteration":50,"passed_time":0.1033057083,"remaining_time":1.922296416}, +{"learn":[0.6844226892],"iteration":51,"passed_time":0.1042358333,"remaining_time":1.900299423}, +{"learn":[0.6843131013],"iteration":52,"passed_time":0.105096875,"remaining_time":1.877863031}, +{"learn":[0.6842112438],"iteration":53,"passed_time":0.1059185,"remaining_time":1.855535204}, +{"learn":[0.6840723621],"iteration":54,"passed_time":0.10679225,"remaining_time":1.834885023}, +{"learn":[0.6839852128],"iteration":55,"passed_time":0.1076962083,"remaining_time":1.815450369}, +{"learn":[0.6837811598],"iteration":56,"passed_time":0.1085375417,"remaining_time":1.795629856}, +{"learn":[0.6836023572],"iteration":57,"passed_time":0.109430125,"remaining_time":1.777296168}, +{"learn":[0.6835238284],"iteration":58,"passed_time":0.110342,"remaining_time":1.75986139}, +{"learn":[0.6833452052],"iteration":59,"passed_time":0.1112064583,"remaining_time":1.742234514}, +{"learn":[0.6831353933],"iteration":60,"passed_time":0.1120504583,"remaining_time":1.724842301}, +{"learn":[0.6829558136],"iteration":61,"passed_time":0.1129015833,"remaining_time":1.708091696}, +{"learn":[0.6827519777],"iteration":62,"passed_time":0.1137409167,"remaining_time":1.691670459}, +{"learn":[0.6826025139],"iteration":63,"passed_time":0.114554625,"remaining_time":1.675361391}, +{"learn":[0.6824474282],"iteration":64,"passed_time":0.1153629167,"remaining_time":1.659451186}, +{"learn":[0.6822112413],"iteration":65,"passed_time":0.1161904583,"remaining_time":1.644271032}, +{"learn":[0.6820719868],"iteration":66,"passed_time":0.117047,"remaining_time":1.629923149}, +{"learn":[0.6818904516],"iteration":67,"passed_time":0.117892125,"remaining_time":1.615815596}, +{"learn":[0.6818180028],"iteration":68,"passed_time":0.118738625,"remaining_time":1.602111013}, +{"learn":[0.681679262],"iteration":69,"passed_time":0.119585875,"remaining_time":1.588783768}, +{"learn":[0.6815709723],"iteration":70,"passed_time":0.1204287917,"remaining_time":1.575751373}, +{"learn":[0.681290941],"iteration":71,"passed_time":0.1212335,"remaining_time":1.562565111}, +{"learn":[0.681085327],"iteration":72,"passed_time":0.12205925,"remaining_time":1.549985271}, +{"learn":[0.6808785482],"iteration":73,"passed_time":0.1229569583,"remaining_time":1.53862356}, +{"learn":[0.6807458838],"iteration":74,"passed_time":0.12379325,"remaining_time":1.526783417}, +{"learn":[0.6806092224],"iteration":75,"passed_time":0.1246666667,"remaining_time":1.515684211}, +{"learn":[0.6805341354],"iteration":76,"passed_time":0.125511875,"remaining_time":1.504512476}, +{"learn":[0.6802799994],"iteration":77,"passed_time":0.1263409583,"remaining_time":1.493414918}, +{"learn":[0.6801452075],"iteration":78,"passed_time":0.1272406667,"remaining_time":1.483400684}, +{"learn":[0.6799885087],"iteration":79,"passed_time":0.1280527917,"remaining_time":1.472607104}, +{"learn":[0.6798814015],"iteration":80,"passed_time":0.1289484583,"remaining_time":1.463007817}, +{"learn":[0.6797575743],"iteration":81,"passed_time":0.1297715417,"remaining_time":1.452808235}, +{"learn":[0.679654775],"iteration":82,"passed_time":0.130587625,"remaining_time":1.442757255}, +{"learn":[0.6795704853],"iteration":83,"passed_time":0.1313717083,"remaining_time":1.4325772}, +{"learn":[0.6794271274],"iteration":84,"passed_time":0.1322038333,"remaining_time":1.423135382}, +{"learn":[0.6792394004],"iteration":85,"passed_time":0.133096,"remaining_time":1.414531907}, +{"learn":[0.6791521743],"iteration":86,"passed_time":0.13399975,"remaining_time":1.406227261}, +{"learn":[0.6790378211],"iteration":87,"passed_time":0.1348456667,"remaining_time":1.397491455}, +{"learn":[0.6788650462],"iteration":88,"passed_time":0.1356789583,"remaining_time":1.38880372}, +{"learn":[0.6787676444],"iteration":89,"passed_time":0.136498375,"remaining_time":1.380150236}, +{"learn":[0.6785299664],"iteration":90,"passed_time":0.1373625833,"remaining_time":1.372116354}, +{"learn":[0.6784151028],"iteration":91,"passed_time":0.1383023333,"remaining_time":1.364983899}, +{"learn":[0.6783052451],"iteration":92,"passed_time":0.1391354583,"remaining_time":1.356944739}, +{"learn":[0.6781839108],"iteration":93,"passed_time":0.140063625,"remaining_time":1.349974939}, +{"learn":[0.6780728173],"iteration":94,"passed_time":0.1409144167,"remaining_time":1.342395232}, +{"learn":[0.6778939225],"iteration":95,"passed_time":0.1417278333,"remaining_time":1.334603764}, +{"learn":[0.6777267347],"iteration":96,"passed_time":0.14257025,"remaining_time":1.327226142}, +{"learn":[0.6776418466],"iteration":97,"passed_time":0.143430375,"remaining_time":1.32014488}, +{"learn":[0.6774645732],"iteration":98,"passed_time":0.1442831667,"remaining_time":1.313122557}, +{"learn":[0.6773457516],"iteration":99,"passed_time":0.1451127917,"remaining_time":1.306015125}, +{"learn":[0.6772239848],"iteration":100,"passed_time":0.1460104583,"remaining_time":1.299637644}, +{"learn":[0.6771305672],"iteration":101,"passed_time":0.1468199583,"remaining_time":1.292591398}, +{"learn":[0.6769795653],"iteration":102,"passed_time":0.1476614167,"remaining_time":1.28594457}, +{"learn":[0.6767967175],"iteration":103,"passed_time":0.1484924583,"remaining_time":1.279319641}, +{"learn":[0.6766538948],"iteration":104,"passed_time":0.1493474583,"remaining_time":1.273009288}, +{"learn":[0.6764472172],"iteration":105,"passed_time":0.1501957083,"remaining_time":1.266744936}, +{"learn":[0.6762686407],"iteration":106,"passed_time":0.1510007917,"remaining_time":1.26022156}, +{"learn":[0.6761461684],"iteration":107,"passed_time":0.1518664583,"remaining_time":1.254304452}, +{"learn":[0.6759860643],"iteration":108,"passed_time":0.1527155,"remaining_time":1.248344133}, +{"learn":[0.6757604502],"iteration":109,"passed_time":0.1536722083,"remaining_time":1.243347867}, +{"learn":[0.675669165],"iteration":110,"passed_time":0.15454275,"remaining_time":1.237734277}, +{"learn":[0.6755053743],"iteration":111,"passed_time":0.1553501667,"remaining_time":1.231704893}, +{"learn":[0.6753498571],"iteration":112,"passed_time":0.1562262917,"remaining_time":1.226307263}, +{"learn":[0.6752725754],"iteration":113,"passed_time":0.157053375,"remaining_time":1.220607809}, +{"learn":[0.6750365461],"iteration":114,"passed_time":0.1579120417,"remaining_time":1.215236147}, +{"learn":[0.6749116988],"iteration":115,"passed_time":0.1587330417,"remaining_time":1.209655249}, +{"learn":[0.674781043],"iteration":116,"passed_time":0.1596065833,"remaining_time":1.204552249}, +{"learn":[0.6746396213],"iteration":117,"passed_time":0.1604513333,"remaining_time":1.199305729}, +{"learn":[0.6744671803],"iteration":118,"passed_time":0.161275,"remaining_time":1.193977101}, +{"learn":[0.674325657],"iteration":119,"passed_time":0.16216275,"remaining_time":1.1891935}, +{"learn":[0.6742081932],"iteration":120,"passed_time":0.1630232083,"remaining_time":1.184276034}, +{"learn":[0.6741158781],"iteration":121,"passed_time":0.1639465,"remaining_time":1.17987727}, +{"learn":[0.6740179337],"iteration":122,"passed_time":0.1648080833,"remaining_time":1.175095033}, +{"learn":[0.6738082214],"iteration":123,"passed_time":0.165646625,"remaining_time":1.170213254}, +{"learn":[0.6737089871],"iteration":124,"passed_time":0.1664865833,"remaining_time":1.165406083}, +{"learn":[0.6735671667],"iteration":125,"passed_time":0.1672935417,"remaining_time":1.160432979}, +{"learn":[0.6734045366],"iteration":126,"passed_time":0.168125,"remaining_time":1.155693898}, +{"learn":[0.6733722294],"iteration":127,"passed_time":0.168885,"remaining_time":1.150529062}, +{"learn":[0.6733095879],"iteration":128,"passed_time":0.1697376667,"remaining_time":1.146058199}, +{"learn":[0.6732068875],"iteration":129,"passed_time":0.1705810417,"remaining_time":1.141580817}, +{"learn":[0.6730879651],"iteration":130,"passed_time":0.171404,"remaining_time":1.137023481}, +{"learn":[0.6729871979],"iteration":131,"passed_time":0.172249125,"remaining_time":1.132668489}, +{"learn":[0.6727685327],"iteration":132,"passed_time":0.1730835417,"remaining_time":1.128296471}, +{"learn":[0.6726143164],"iteration":133,"passed_time":0.1739277083,"remaining_time":1.124040264}, +{"learn":[0.6725360058],"iteration":134,"passed_time":0.1747441667,"remaining_time":1.119657068}, +{"learn":[0.6724362691],"iteration":135,"passed_time":0.1756107083,"remaining_time":1.1156445}, +{"learn":[0.6723756637],"iteration":136,"passed_time":0.17643825,"remaining_time":1.111432188}, +{"learn":[0.6722683745],"iteration":137,"passed_time":0.1773248333,"remaining_time":1.107637727}, +{"learn":[0.6721582182],"iteration":138,"passed_time":0.1781739167,"remaining_time":1.103652822}, +{"learn":[0.6719563025],"iteration":139,"passed_time":0.179007625,"remaining_time":1.099618268}, +{"learn":[0.6717853603],"iteration":140,"passed_time":0.1798435833,"remaining_time":1.095642823}, +{"learn":[0.6717031276],"iteration":141,"passed_time":0.1806888333,"remaining_time":1.091767739}, +{"learn":[0.6715383504],"iteration":142,"passed_time":0.1815092083,"remaining_time":1.087785955}, +{"learn":[0.6714334822],"iteration":143,"passed_time":0.1823629583,"remaining_time":1.084046475}, +{"learn":[0.6712567829],"iteration":144,"passed_time":0.1832514167,"remaining_time":1.080551457}, +{"learn":[0.6711694978],"iteration":145,"passed_time":0.1841272083,"remaining_time":1.077018054}, +{"learn":[0.6711064928],"iteration":146,"passed_time":0.1849270833,"remaining_time":1.073080286}, +{"learn":[0.6710450426],"iteration":147,"passed_time":0.1857626667,"remaining_time":1.069390486}, +{"learn":[0.6709995306],"iteration":148,"passed_time":0.1866347083,"remaining_time":1.065947227}, +{"learn":[0.6709483541],"iteration":149,"passed_time":0.18745275,"remaining_time":1.06223225}, +{"learn":[0.6708624641],"iteration":150,"passed_time":0.18825575,"remaining_time":1.058471071}, +{"learn":[0.6706881852],"iteration":151,"passed_time":0.1891086667,"remaining_time":1.055027298}, +{"learn":[0.6705949593],"iteration":152,"passed_time":0.1899318333,"remaining_time":1.051452698}, +{"learn":[0.6704783294],"iteration":153,"passed_time":0.1907548333,"remaining_time":1.047912916}, +{"learn":[0.6703158421],"iteration":154,"passed_time":0.1915670833,"remaining_time":1.044349583}, +{"learn":[0.670221545],"iteration":155,"passed_time":0.1924185417,"remaining_time":1.041033649}, +{"learn":[0.6700858751],"iteration":156,"passed_time":0.1932406667,"remaining_time":1.037591605}, +{"learn":[0.6699566438],"iteration":157,"passed_time":0.1940582083,"remaining_time":1.0341583}, +{"learn":[0.6698952551],"iteration":158,"passed_time":0.1949352083,"remaining_time":1.031072391}, +{"learn":[0.6698089935],"iteration":159,"passed_time":0.19575675,"remaining_time":1.027722937}, +{"learn":[0.6696558171],"iteration":160,"passed_time":0.1966063333,"remaining_time":1.024551017}, +{"learn":[0.6695847448],"iteration":161,"passed_time":0.1975026667,"remaining_time":1.021649597}, +{"learn":[0.6693364214],"iteration":162,"passed_time":0.19831625,"remaining_time":1.01834786}, +{"learn":[0.6691797984],"iteration":163,"passed_time":0.1991177083,"remaining_time":1.01501466}, +{"learn":[0.6690823532],"iteration":164,"passed_time":0.1999819167,"remaining_time":1.012029699}, +{"learn":[0.6689134698],"iteration":165,"passed_time":0.200863875,"remaining_time":1.009159468}, +{"learn":[0.6688364554],"iteration":166,"passed_time":0.2017267917,"remaining_time":1.006218069}, +{"learn":[0.6686552727],"iteration":167,"passed_time":0.20256275,"remaining_time":1.003167905}, +{"learn":[0.6685990561],"iteration":168,"passed_time":0.20336025,"remaining_time":0.9999548388}, +{"learn":[0.6685967999],"iteration":169,"passed_time":0.2039174583,"remaining_time":0.9955970025}, +{"learn":[0.6685480334],"iteration":170,"passed_time":0.2047486667,"remaining_time":0.9926119571}, +{"learn":[0.6684578575],"iteration":171,"passed_time":0.2055770833,"remaining_time":0.9896385174}, +{"learn":[0.668339763],"iteration":172,"passed_time":0.206427375,"remaining_time":0.9867944458}, +{"learn":[0.6682208795],"iteration":173,"passed_time":0.2072524583,"remaining_time":0.983853624}, +{"learn":[0.6681028404],"iteration":174,"passed_time":0.2080845833,"remaining_time":0.9809701786}, +{"learn":[0.667965681],"iteration":175,"passed_time":0.2089108333,"remaining_time":0.9780825379}, +{"learn":[0.6678856254],"iteration":176,"passed_time":0.2097556667,"remaining_time":0.975304597}, +{"learn":[0.667794658],"iteration":177,"passed_time":0.2105997917,"remaining_time":0.9725451053}, +{"learn":[0.6677252781],"iteration":178,"passed_time":0.2114235,"remaining_time":0.9697133715}, +{"learn":[0.6676019745],"iteration":179,"passed_time":0.2122879583,"remaining_time":0.967089588}, +{"learn":[0.6675230521],"iteration":180,"passed_time":0.2131032917,"remaining_time":0.9642629606}, +{"learn":[0.6674291671],"iteration":181,"passed_time":0.2139443333,"remaining_time":0.9615739817}, +{"learn":[0.6672993569],"iteration":182,"passed_time":0.2148125,"remaining_time":0.9590262978}, +{"learn":[0.6671821038],"iteration":183,"passed_time":0.2156653333,"remaining_time":0.9564288696}, +{"learn":[0.6670561823],"iteration":184,"passed_time":0.2164531667,"remaining_time":0.9535639505}, +{"learn":[0.6669913125],"iteration":185,"passed_time":0.2173006667,"remaining_time":0.9509824875}, +{"learn":[0.6669167408],"iteration":186,"passed_time":0.2181529583,"remaining_time":0.9484404017}, +{"learn":[0.6668515394],"iteration":187,"passed_time":0.219023375,"remaining_time":0.9459945771}, +{"learn":[0.6667220162],"iteration":188,"passed_time":0.219882125,"remaining_time":0.9435153618}, +{"learn":[0.6666120767],"iteration":189,"passed_time":0.2207797083,"remaining_time":0.9412187566}, +{"learn":[0.6664567035],"iteration":190,"passed_time":0.221627625,"remaining_time":0.9387264326}, +{"learn":[0.6663726434],"iteration":191,"passed_time":0.2224835417,"remaining_time":0.9362849045}, +{"learn":[0.6662914224],"iteration":192,"passed_time":0.2233881667,"remaining_time":0.9340634741}, +{"learn":[0.6661740095],"iteration":193,"passed_time":0.22421925,"remaining_time":0.9315500799}, +{"learn":[0.6660529216],"iteration":194,"passed_time":0.2250625417,"remaining_time":0.9291043387}, +{"learn":[0.6659565228],"iteration":195,"passed_time":0.2259101667,"remaining_time":0.9266927245}, +{"learn":[0.6658462719],"iteration":196,"passed_time":0.2268114167,"remaining_time":0.9245155715}, +{"learn":[0.6657833717],"iteration":197,"passed_time":0.22768125,"remaining_time":0.922224053}, +{"learn":[0.6656402926],"iteration":198,"passed_time":0.2284892917,"remaining_time":0.9196981036}, +{"learn":[0.6654518232],"iteration":199,"passed_time":0.22931575,"remaining_time":0.917263}, +{"learn":[0.6653489792],"iteration":200,"passed_time":0.230184125,"remaining_time":0.9150105267}, +{"learn":[0.6652424683],"iteration":201,"passed_time":0.2309772917,"remaining_time":0.9124746473}, +{"learn":[0.6651288387],"iteration":202,"passed_time":0.2317984583,"remaining_time":0.9100658684}, +{"learn":[0.6649545537],"iteration":203,"passed_time":0.2326806667,"remaining_time":0.9079108366}, +{"learn":[0.6648760552],"iteration":204,"passed_time":0.2335327917,"remaining_time":0.9056515579}, +{"learn":[0.664747628],"iteration":205,"passed_time":0.2343905417,"remaining_time":0.9034276218}, +{"learn":[0.6646900544],"iteration":206,"passed_time":0.235286125,"remaining_time":0.9013618219}, +{"learn":[0.6646357749],"iteration":207,"passed_time":0.2361262917,"remaining_time":0.8990962644}, +{"learn":[0.6645287935],"iteration":208,"passed_time":0.2369630417,"remaining_time":0.8968314161}, +{"learn":[0.6643522952],"iteration":209,"passed_time":0.237797875,"remaining_time":0.8945729583}, +{"learn":[0.6642867185],"iteration":210,"passed_time":0.2386956667,"remaining_time":0.8925634171}, +{"learn":[0.664195321],"iteration":211,"passed_time":0.2394984583,"remaining_time":0.8902112508}, +{"learn":[0.6640450386],"iteration":212,"passed_time":0.240321125,"remaining_time":0.8879470675}, +{"learn":[0.6639689398],"iteration":213,"passed_time":0.241142375,"remaining_time":0.885691153}, +{"learn":[0.6638775353],"iteration":214,"passed_time":0.2420187917,"remaining_time":0.8836500068}, +{"learn":[0.6638321369],"iteration":215,"passed_time":0.2428313333,"remaining_time":0.8813878025}, +{"learn":[0.6637643901],"iteration":216,"passed_time":0.2436659167,"remaining_time":0.8792184919}, +{"learn":[0.6637023278],"iteration":217,"passed_time":0.2445356667,"remaining_time":0.8771875749}, +{"learn":[0.6635913011],"iteration":218,"passed_time":0.2453980417,"remaining_time":0.8751409614}, +{"learn":[0.6634753576],"iteration":219,"passed_time":0.2462327917,"remaining_time":0.8730071705}, +{"learn":[0.6634014965],"iteration":220,"passed_time":0.24707625,"remaining_time":0.8709158314}, +{"learn":[0.6632969382],"iteration":221,"passed_time":0.2478638333,"remaining_time":0.8686399204}, +{"learn":[0.6631727915],"iteration":222,"passed_time":0.2487159167,"remaining_time":0.8666020953}, +{"learn":[0.6631256538],"iteration":223,"passed_time":0.249516375,"remaining_time":0.8643960134}, +{"learn":[0.6630035776],"iteration":224,"passed_time":0.2503286667,"remaining_time":0.8622431852}, +{"learn":[0.6629278487],"iteration":225,"passed_time":0.2512409583,"remaining_time":0.860444698}, +{"learn":[0.6628845016],"iteration":226,"passed_time":0.2520864167,"remaining_time":0.8584264321}, +{"learn":[0.6628045977],"iteration":227,"passed_time":0.2529204167,"remaining_time":0.8563796564}, +{"learn":[0.6627338264],"iteration":228,"passed_time":0.253739375,"remaining_time":0.8542928302}, +{"learn":[0.6626049676],"iteration":229,"passed_time":0.2545904167,"remaining_time":0.8523244384}, +{"learn":[0.6624874762],"iteration":230,"passed_time":0.255452625,"remaining_time":0.8504028945}, +{"learn":[0.6624023551],"iteration":231,"passed_time":0.25627425,"remaining_time":0.8483561379}, +{"learn":[0.6623000568],"iteration":232,"passed_time":0.2571020417,"remaining_time":0.8463401972}, +{"learn":[0.6621571588],"iteration":233,"passed_time":0.2580681667,"remaining_time":0.8447872464}, +{"learn":[0.6620831436],"iteration":234,"passed_time":0.2591205833,"remaining_time":0.8435201968}, +{"learn":[0.6620481338],"iteration":235,"passed_time":0.260296125,"remaining_time":0.8426535572}, +{"learn":[0.6619658571],"iteration":236,"passed_time":0.26150075,"remaining_time":0.841877942}, +{"learn":[0.6618816897],"iteration":237,"passed_time":0.2625454167,"remaining_time":0.8405865861}, +{"learn":[0.6617049279],"iteration":238,"passed_time":0.2634067917,"remaining_time":0.8387136756}, +{"learn":[0.6616285733],"iteration":239,"passed_time":0.2643239583,"remaining_time":0.8370258681}, +{"learn":[0.6614885346],"iteration":240,"passed_time":0.2651799167,"remaining_time":0.8351516878}, +{"learn":[0.6614642929],"iteration":241,"passed_time":0.2661273333,"remaining_time":0.8335723912}, +{"learn":[0.6613863502],"iteration":242,"passed_time":0.2670088333,"remaining_time":0.8317929499}, +{"learn":[0.6613087341],"iteration":243,"passed_time":0.2680896667,"remaining_time":0.8306384754}, +{"learn":[0.6612515177],"iteration":244,"passed_time":0.2689373333,"remaining_time":0.828766068}, +{"learn":[0.6611452681],"iteration":245,"passed_time":0.2697846667,"remaining_time":0.8269009702}, +{"learn":[0.6610199446],"iteration":246,"passed_time":0.2706145417,"remaining_time":0.8249908902}, +{"learn":[0.6609045425],"iteration":247,"passed_time":0.2715172083,"remaining_time":0.8233102446}, +{"learn":[0.6607958095],"iteration":248,"passed_time":0.2724729583,"remaining_time":0.8217959506}, +{"learn":[0.6607277157],"iteration":249,"passed_time":0.2733245417,"remaining_time":0.819973625}, +{"learn":[0.6606118727],"iteration":250,"passed_time":0.2741768333,"remaining_time":0.8181611481}, +{"learn":[0.6605497883],"iteration":251,"passed_time":0.2750030833,"remaining_time":0.8162789934}, +{"learn":[0.6604913238],"iteration":252,"passed_time":0.275863625,"remaining_time":0.8145064343}, +{"learn":[0.6604120247],"iteration":253,"passed_time":0.2767342083,"remaining_time":0.8127705489}, +{"learn":[0.6603301416],"iteration":254,"passed_time":0.27761175,"remaining_time":0.8110617794}, +{"learn":[0.6602117831],"iteration":255,"passed_time":0.2784780417,"remaining_time":0.8093268086}, +{"learn":[0.6600655237],"iteration":256,"passed_time":0.2793027083,"remaining_time":0.8074782579}, +{"learn":[0.659980612],"iteration":257,"passed_time":0.2801757917,"remaining_time":0.8057768892}, +{"learn":[0.6599115781],"iteration":258,"passed_time":0.2809944167,"remaining_time":0.803926111}, +{"learn":[0.6598449489],"iteration":259,"passed_time":0.2818235,"remaining_time":0.8021130385}, +{"learn":[0.6597648618],"iteration":260,"passed_time":0.2826300833,"remaining_time":0.8002437992}, +{"learn":[0.6596656338],"iteration":261,"passed_time":0.283547125,"remaining_time":0.7986938101}, +{"learn":[0.6595835164],"iteration":262,"passed_time":0.2843868333,"remaining_time":0.7969319246}, +{"learn":[0.6594721441],"iteration":263,"passed_time":0.2852294583,"remaining_time":0.7951851566}, +{"learn":[0.6593112923],"iteration":264,"passed_time":0.2860671667,"remaining_time":0.7934315755}, +{"learn":[0.659267603],"iteration":265,"passed_time":0.2869354167,"remaining_time":0.7917691573}, +{"learn":[0.6592159433],"iteration":266,"passed_time":0.2877672083,"remaining_time":0.7900125982}, +{"learn":[0.6591083452],"iteration":267,"passed_time":0.2886120417,"remaining_time":0.7882985616}, +{"learn":[0.6590749423],"iteration":268,"passed_time":0.2895200833,"remaining_time":0.7867627543}, +{"learn":[0.6589959542],"iteration":269,"passed_time":0.2903972083,"remaining_time":0.7851480077}, +{"learn":[0.6589005933],"iteration":270,"passed_time":0.2912645833,"remaining_time":0.7835124769}, +{"learn":[0.658876613],"iteration":271,"passed_time":0.2921035417,"remaining_time":0.781806538}, +{"learn":[0.6588015218],"iteration":272,"passed_time":0.2929502083,"remaining_time":0.7801274779}, +{"learn":[0.6587079641],"iteration":273,"passed_time":0.293797875,"remaining_time":0.7784571432}, +{"learn":[0.658675387],"iteration":274,"passed_time":0.2946948333,"remaining_time":0.7769227424}, +{"learn":[0.6585594005],"iteration":275,"passed_time":0.2955301667,"remaining_time":0.7752313068}, +{"learn":[0.6584995091],"iteration":276,"passed_time":0.2965508333,"remaining_time":0.7740297924}, +{"learn":[0.6584066709],"iteration":277,"passed_time":0.2973974167,"remaining_time":0.7723774634}, +{"learn":[0.6583090334],"iteration":278,"passed_time":0.29823575,"remaining_time":0.7707095905}, +{"learn":[0.6581861269],"iteration":279,"passed_time":0.299078875,"remaining_time":0.7690599643}, +{"learn":[0.6581019615],"iteration":280,"passed_time":0.2999204583,"remaining_time":0.7674121336}, +{"learn":[0.65804852],"iteration":281,"passed_time":0.3007680417,"remaining_time":0.7657852976}, +{"learn":[0.6579546998],"iteration":282,"passed_time":0.3016498333,"remaining_time":0.7642506378}, +{"learn":[0.657855023],"iteration":283,"passed_time":0.3024748333,"remaining_time":0.7625773967}, +{"learn":[0.6577164641],"iteration":284,"passed_time":0.303316375,"remaining_time":0.7609516075}, +{"learn":[0.657642921],"iteration":285,"passed_time":0.304217875,"remaining_time":0.7594809886}, +{"learn":[0.6575528485],"iteration":286,"passed_time":0.305064625,"remaining_time":0.7578783193}, +{"learn":[0.6574618776],"iteration":287,"passed_time":0.3060330833,"remaining_time":0.7565817894}, +{"learn":[0.657314761],"iteration":288,"passed_time":0.3069012083,"remaining_time":0.755040689}, +{"learn":[0.657207417],"iteration":289,"passed_time":0.307760875,"remaining_time":0.7534835216}, +{"learn":[0.6570827416],"iteration":290,"passed_time":0.308626875,"remaining_time":0.7519465786}, +{"learn":[0.6570805508],"iteration":291,"passed_time":0.3092669583,"remaining_time":0.7498664606}, +{"learn":[0.6569698428],"iteration":292,"passed_time":0.3101342083,"remaining_time":0.7483443184}, +{"learn":[0.6569242297],"iteration":293,"passed_time":0.311002875,"remaining_time":0.7468300332}, +{"learn":[0.6568222231],"iteration":294,"passed_time":0.3119032083,"remaining_time":0.745395803}, +{"learn":[0.6567737521],"iteration":295,"passed_time":0.3127275417,"remaining_time":0.7437844234}, +{"learn":[0.6566820688],"iteration":296,"passed_time":0.3135814167,"remaining_time":0.7422482691}, +{"learn":[0.6566306963],"iteration":297,"passed_time":0.3144195417,"remaining_time":0.7406795914}, +{"learn":[0.6565289163],"iteration":298,"passed_time":0.3152347083,"remaining_time":0.7390619751}, +{"learn":[0.6564283715],"iteration":299,"passed_time":0.31608125,"remaining_time":0.7375229167}, +{"learn":[0.6563825594],"iteration":300,"passed_time":0.3169622083,"remaining_time":0.7360683841}, +{"learn":[0.6562322953],"iteration":301,"passed_time":0.317881625,"remaining_time":0.7347065373}, +{"learn":[0.656110587],"iteration":302,"passed_time":0.318772,"remaining_time":0.7332808053}, +{"learn":[0.6560004418],"iteration":303,"passed_time":0.3196169583,"remaining_time":0.7317546151}, +{"learn":[0.6559111442],"iteration":304,"passed_time":0.3204956667,"remaining_time":0.7303097978}, +{"learn":[0.6559111666],"iteration":305,"passed_time":0.3209743333,"remaining_time":0.7279613965}, +{"learn":[0.6558563705],"iteration":306,"passed_time":0.3216856667,"remaining_time":0.7261503811}, +{"learn":[0.6557820481],"iteration":307,"passed_time":0.322480625,"remaining_time":0.7245343912}, +{"learn":[0.6557026149],"iteration":308,"passed_time":0.3234026667,"remaining_time":0.7232079051}, +{"learn":[0.655587157],"iteration":309,"passed_time":0.3243157083,"remaining_time":0.721863996}, +{"learn":[0.6554800571],"iteration":310,"passed_time":0.32519925,"remaining_time":0.7204575024}, +{"learn":[0.6554036732],"iteration":311,"passed_time":0.32603325,"remaining_time":0.7189451154}, +{"learn":[0.6553150878],"iteration":312,"passed_time":0.3275151667,"remaining_time":0.7188591677}, +{"learn":[0.6552289288],"iteration":313,"passed_time":0.3283622083,"remaining_time":0.7173773087}, +{"learn":[0.6551125375],"iteration":314,"passed_time":0.329184,"remaining_time":0.7158445714}, +{"learn":[0.6550528612],"iteration":315,"passed_time":0.3300330417,"remaining_time":0.714375318}, +{"learn":[0.6549986765],"iteration":316,"passed_time":0.330884,"remaining_time":0.7129141073}, +{"learn":[0.654881015],"iteration":317,"passed_time":0.331745,"remaining_time":0.7114782704}, +{"learn":[0.6548192043],"iteration":318,"passed_time":0.3326307083,"remaining_time":0.7100987849}, +{"learn":[0.6547097735],"iteration":319,"passed_time":0.3334866667,"remaining_time":0.7086591667}, +{"learn":[0.6545751383],"iteration":320,"passed_time":0.334326625,"remaining_time":0.7071893407}, +{"learn":[0.6545016783],"iteration":321,"passed_time":0.33522575,"remaining_time":0.7058480078}, +{"learn":[0.6544042973],"iteration":322,"passed_time":0.33607225,"remaining_time":0.7043991122}, +{"learn":[0.6543673179],"iteration":323,"passed_time":0.3369117917,"remaining_time":0.7029394172}, +{"learn":[0.6542927477],"iteration":324,"passed_time":0.33775175,"remaining_time":0.7014844038}, +{"learn":[0.6542482113],"iteration":325,"passed_time":0.3385705,"remaining_time":0.699989316}, +{"learn":[0.6542039034],"iteration":326,"passed_time":0.3394275833,"remaining_time":0.6985772587}, +{"learn":[0.6540639019],"iteration":327,"passed_time":0.340372125,"remaining_time":0.6973477683}, +{"learn":[0.6538708026],"iteration":328,"passed_time":0.3411945417,"remaining_time":0.6958709345}, +{"learn":[0.6537917647],"iteration":329,"passed_time":0.3420342083,"remaining_time":0.6944330896}, +{"learn":[0.6537091256],"iteration":330,"passed_time":0.342899375,"remaining_time":0.6930503984}, +{"learn":[0.6536589121],"iteration":331,"passed_time":0.3437949583,"remaining_time":0.6917320246}, +{"learn":[0.6535602797],"iteration":332,"passed_time":0.3446304167,"remaining_time":0.6902957595}, +{"learn":[0.6535005487],"iteration":333,"passed_time":0.3455119167,"remaining_time":0.6889548997}, +{"learn":[0.6534109431],"iteration":334,"passed_time":0.34634175,"remaining_time":0.6875142201}, +{"learn":[0.6533329026],"iteration":335,"passed_time":0.3472555833,"remaining_time":0.6862431766}, +{"learn":[0.6531947152],"iteration":336,"passed_time":0.3481049167,"remaining_time":0.6848473583}, +{"learn":[0.6530412041],"iteration":337,"passed_time":0.34896075,"remaining_time":0.6834675044}, +{"learn":[0.6529501117],"iteration":338,"passed_time":0.3498015417,"remaining_time":0.6820614131}, +{"learn":[0.6528444022],"iteration":339,"passed_time":0.3506322083,"remaining_time":0.6806389926}, +{"learn":[0.6527567171],"iteration":340,"passed_time":0.3514577083,"remaining_time":0.679210058}, +{"learn":[0.6526753551],"iteration":341,"passed_time":0.3522953333,"remaining_time":0.6778079805}, +{"learn":[0.6526239765],"iteration":342,"passed_time":0.353138875,"remaining_time":0.6764205273}, +{"learn":[0.652478045],"iteration":343,"passed_time":0.3539776667,"remaining_time":0.6750271783}, +{"learn":[0.6523240742],"iteration":344,"passed_time":0.35478925,"remaining_time":0.6735853877}, +{"learn":[0.6521893894],"iteration":345,"passed_time":0.3556125833,"remaining_time":0.6721694494}, +{"learn":[0.6520842527],"iteration":346,"passed_time":0.3564220417,"remaining_time":0.6707308162}, +{"learn":[0.6520330575],"iteration":347,"passed_time":0.3572406667,"remaining_time":0.6693129732}, +{"learn":[0.6519834798],"iteration":348,"passed_time":0.3580944167,"remaining_time":0.6679640838}, +{"learn":[0.6518428081],"iteration":349,"passed_time":0.3589214583,"remaining_time":0.6665684226}, +{"learn":[0.6517073039],"iteration":350,"passed_time":0.3597453333,"remaining_time":0.6651701462}, +{"learn":[0.6516040688],"iteration":351,"passed_time":0.360589625,"remaining_time":0.6638127187}, +{"learn":[0.6515031768],"iteration":352,"passed_time":0.36138675,"remaining_time":0.6623717486}, +{"learn":[0.6513973568],"iteration":353,"passed_time":0.3622503333,"remaining_time":0.661055693}, +{"learn":[0.651278663],"iteration":354,"passed_time":0.363051125,"remaining_time":0.6596281004}, +{"learn":[0.6512368762],"iteration":355,"passed_time":0.3639242917,"remaining_time":0.6583349546}, +{"learn":[0.6511093432],"iteration":356,"passed_time":0.3647824583,"remaining_time":0.6570171448}, +{"learn":[0.6510329226],"iteration":357,"passed_time":0.365662,"remaining_time":0.6557402346}, +{"learn":[0.6508837447],"iteration":358,"passed_time":0.3666140833,"remaining_time":0.6545950624}, +{"learn":[0.6507842001],"iteration":359,"passed_time":0.36744825,"remaining_time":0.6532413333}, +{"learn":[0.6507174709],"iteration":360,"passed_time":0.3682600417,"remaining_time":0.6518508771}, +{"learn":[0.650640263],"iteration":361,"passed_time":0.3691066667,"remaining_time":0.6505250092}, +{"learn":[0.6505656674],"iteration":362,"passed_time":0.3699319167,"remaining_time":0.6491642725}, +{"learn":[0.650504538],"iteration":363,"passed_time":0.3708659167,"remaining_time":0.6479964918}, +{"learn":[0.6504365248],"iteration":364,"passed_time":0.3717044167,"remaining_time":0.6466638482}, +{"learn":[0.6502783578],"iteration":365,"passed_time":0.3725345417,"remaining_time":0.6453193973}, +{"learn":[0.6501411924],"iteration":366,"passed_time":0.3733957083,"remaining_time":0.6440312899}, +{"learn":[0.6501001198],"iteration":367,"passed_time":0.3743222917,"remaining_time":0.6428578487}, +{"learn":[0.6500519265],"iteration":368,"passed_time":0.3751660833,"remaining_time":0.6415441696}, +{"learn":[0.649898024],"iteration":369,"passed_time":0.3760250833,"remaining_time":0.6402589257}, +{"learn":[0.6498355148],"iteration":370,"passed_time":0.3768451667,"remaining_time":0.6389099996}, +{"learn":[0.6497782806],"iteration":371,"passed_time":0.3776900833,"remaining_time":0.6376058396}, +{"learn":[0.6496639327],"iteration":372,"passed_time":0.3785039583,"remaining_time":0.6362519621}, +{"learn":[0.6495923372],"iteration":373,"passed_time":0.3793429167,"remaining_time":0.6349429568}, +{"learn":[0.6495199254],"iteration":374,"passed_time":0.3801982917,"remaining_time":0.6336638194}, +{"learn":[0.6494821272],"iteration":375,"passed_time":0.3810142083,"remaining_time":0.6323214521}, +{"learn":[0.649405755],"iteration":376,"passed_time":0.3818450417,"remaining_time":0.6310065277}, +{"learn":[0.6492798659],"iteration":377,"passed_time":0.3827209167,"remaining_time":0.6297682809}, +{"learn":[0.649197004],"iteration":378,"passed_time":0.3835657083,"remaining_time":0.6284810155}, +{"learn":[0.6491406129],"iteration":379,"passed_time":0.3844065417,"remaining_time":0.6271896206}, +{"learn":[0.6490583347],"iteration":380,"passed_time":0.3852387917,"remaining_time":0.6258866458}, +{"learn":[0.648981716],"iteration":381,"passed_time":0.386081,"remaining_time":0.6246022461}, +{"learn":[0.6488443636],"iteration":382,"passed_time":0.3869464583,"remaining_time":0.6233576104}, +{"learn":[0.6487312852],"iteration":383,"passed_time":0.3877959583,"remaining_time":0.6220893498}, +{"learn":[0.6485826],"iteration":384,"passed_time":0.388679625,"remaining_time":0.6208778425}, +{"learn":[0.6485108434],"iteration":385,"passed_time":0.3894870833,"remaining_time":0.6195468113}, +{"learn":[0.6484226819],"iteration":386,"passed_time":0.39048275,"remaining_time":0.618516604}, +{"learn":[0.6484031156],"iteration":387,"passed_time":0.3913134583,"remaining_time":0.6172263827}, +{"learn":[0.6483066563],"iteration":388,"passed_time":0.3921605417,"remaining_time":0.6159642441}, +{"learn":[0.6482508564],"iteration":389,"passed_time":0.393085125,"remaining_time":0.6148254519}, +{"learn":[0.6481457704],"iteration":390,"passed_time":0.3938774583,"remaining_time":0.6134817701}, +{"learn":[0.6480298032],"iteration":391,"passed_time":0.3948124583,"remaining_time":0.6123621803}, +{"learn":[0.6479658454],"iteration":392,"passed_time":0.395673875,"remaining_time":0.6111298782}, +{"learn":[0.6478794691],"iteration":393,"passed_time":0.3965270833,"remaining_time":0.6098868338}, +{"learn":[0.6477774282],"iteration":394,"passed_time":0.3973680417,"remaining_time":0.6086270005}, +{"learn":[0.647670539],"iteration":395,"passed_time":0.3982385,"remaining_time":0.6074142778}, +{"learn":[0.6475312039],"iteration":396,"passed_time":0.3991062083,"remaining_time":0.6061991023}, +{"learn":[0.6474218488],"iteration":397,"passed_time":0.3999222917,"remaining_time":0.6049075869}, +{"learn":[0.647362138],"iteration":398,"passed_time":0.400754125,"remaining_time":0.6036421783}, +{"learn":[0.6472711118],"iteration":399,"passed_time":0.4016364583,"remaining_time":0.6024546875}, +{"learn":[0.6471258649],"iteration":400,"passed_time":0.402511,"remaining_time":0.6012570798}, +{"learn":[0.6470334762],"iteration":401,"passed_time":0.4033300417,"remaining_time":0.5999785197}, +{"learn":[0.6470192304],"iteration":402,"passed_time":0.4039932917,"remaining_time":0.5984714519}, +{"learn":[0.6469025512],"iteration":403,"passed_time":0.4048337083,"remaining_time":0.5972299262}, +{"learn":[0.6468155466],"iteration":404,"passed_time":0.4056967083,"remaining_time":0.5960235592}, +{"learn":[0.6466898271],"iteration":405,"passed_time":0.406526625,"remaining_time":0.5947704809}, +{"learn":[0.6465834701],"iteration":406,"passed_time":0.407336375,"remaining_time":0.5934900992}, +{"learn":[0.6464857115],"iteration":407,"passed_time":0.408161375,"remaining_time":0.592234152}, +{"learn":[0.6463780895],"iteration":408,"passed_time":0.4090309167,"remaining_time":0.5910446742}, +{"learn":[0.6462388182],"iteration":409,"passed_time":0.4098950833,"remaining_time":0.5898490224}, +{"learn":[0.6461181037],"iteration":410,"passed_time":0.410709,"remaining_time":0.5885829708}, +{"learn":[0.6460125399],"iteration":411,"passed_time":0.41153375,"remaining_time":0.5873345752}, +{"learn":[0.6458767396],"iteration":412,"passed_time":0.4123290833,"remaining_time":0.5860464211}, +{"learn":[0.6457928059],"iteration":413,"passed_time":0.4131519167,"remaining_time":0.5847995729}, +{"learn":[0.6457080924],"iteration":414,"passed_time":0.4141215833,"remaining_time":0.58376175}, +{"learn":[0.645617138],"iteration":415,"passed_time":0.4149581667,"remaining_time":0.5825374263}, +{"learn":[0.6455334881],"iteration":416,"passed_time":0.4158413333,"remaining_time":0.5813800895}, +{"learn":[0.6454711046],"iteration":417,"passed_time":0.4166774583,"remaining_time":0.5801585664}, +{"learn":[0.6453626044],"iteration":418,"passed_time":0.4175357917,"remaining_time":0.5789696777}, +{"learn":[0.645308594],"iteration":419,"passed_time":0.4183612917,"remaining_time":0.5777370218}, +{"learn":[0.6451927692],"iteration":420,"passed_time":0.419175375,"remaining_time":0.5764905989}, +{"learn":[0.6451016287],"iteration":421,"passed_time":0.42013825,"remaining_time":0.5754500201}, +{"learn":[0.6449661868],"iteration":422,"passed_time":0.420953625,"remaining_time":0.574208609}, +{"learn":[0.644866127],"iteration":423,"passed_time":0.4219075833,"remaining_time":0.5731574717}, +{"learn":[0.6447896317],"iteration":424,"passed_time":0.4228165417,"remaining_time":0.5720459093}, +{"learn":[0.6447126428],"iteration":425,"passed_time":0.423739875,"remaining_time":0.5709546673}, +{"learn":[0.6446496806],"iteration":426,"passed_time":0.4245895,"remaining_time":0.5697653009}, +{"learn":[0.6445599823],"iteration":427,"passed_time":0.4254168333,"remaining_time":0.5685477305}, +{"learn":[0.644486129],"iteration":428,"passed_time":0.426316,"remaining_time":0.5674275897}, +{"learn":[0.6443782472],"iteration":429,"passed_time":0.4271740417,"remaining_time":0.5662539622}, +{"learn":[0.6443037051],"iteration":430,"passed_time":0.4280352083,"remaining_time":0.5650859247}, +{"learn":[0.6441554195],"iteration":431,"passed_time":0.4288723333,"remaining_time":0.5638876975}, +{"learn":[0.6440947458],"iteration":432,"passed_time":0.4297535417,"remaining_time":0.562748864}, +{"learn":[0.6439528917],"iteration":433,"passed_time":0.43064225,"remaining_time":0.5616209988}, +{"learn":[0.6438918787],"iteration":434,"passed_time":0.431491625,"remaining_time":0.5604431451}, +{"learn":[0.6438308794],"iteration":435,"passed_time":0.4323464167,"remaining_time":0.559273805}, +{"learn":[0.6437270892],"iteration":436,"passed_time":0.4331837083,"remaining_time":0.5580833588}, +{"learn":[0.6436544281],"iteration":437,"passed_time":0.4340381667,"remaining_time":0.5569165518}, +{"learn":[0.6435214201],"iteration":438,"passed_time":0.4349051667,"remaining_time":0.5557671948}, +{"learn":[0.6434448977],"iteration":439,"passed_time":0.4358224167,"remaining_time":0.5546830758}, +{"learn":[0.6433579104],"iteration":440,"passed_time":0.4366480833,"remaining_time":0.5534836249}, +{"learn":[0.6431948082],"iteration":441,"passed_time":0.4375255833,"remaining_time":0.552351302}, +{"learn":[0.6431344932],"iteration":442,"passed_time":0.4383974583,"remaining_time":0.5512130571}, +{"learn":[0.6430528126],"iteration":443,"passed_time":0.4392345,"remaining_time":0.5500323919}, +{"learn":[0.6429968012],"iteration":444,"passed_time":0.4401749167,"remaining_time":0.5489821994}, +{"learn":[0.642861806],"iteration":445,"passed_time":0.4410303333,"remaining_time":0.5478269163}, +{"learn":[0.6427939774],"iteration":446,"passed_time":0.4418816667,"remaining_time":0.5466679232}, +{"learn":[0.6427363547],"iteration":447,"passed_time":0.4426942917,"remaining_time":0.5454626094}, +{"learn":[0.6425794491],"iteration":448,"passed_time":0.4435437083,"remaining_time":0.5443041944}, +{"learn":[0.6424987426],"iteration":449,"passed_time":0.4444217917,"remaining_time":0.5431821898}, +{"learn":[0.6424080589],"iteration":450,"passed_time":0.4452880833,"remaining_time":0.542046913}, +{"learn":[0.6422963944],"iteration":451,"passed_time":0.4461859167,"remaining_time":0.5409510671}, +{"learn":[0.642175415],"iteration":452,"passed_time":0.4470997917,"remaining_time":0.5398754659}, +{"learn":[0.642050619],"iteration":453,"passed_time":0.4479469167,"remaining_time":0.5387203007}, +{"learn":[0.6418774465],"iteration":454,"passed_time":0.448787125,"remaining_time":0.5375582047}, +{"learn":[0.6417544679],"iteration":455,"passed_time":0.449668,"remaining_time":0.5364460351}, +{"learn":[0.6416362703],"iteration":456,"passed_time":0.4504775417,"remaining_time":0.5352501206}, +{"learn":[0.6415294714],"iteration":457,"passed_time":0.4513299167,"remaining_time":0.5341065826}, +{"learn":[0.6414061291],"iteration":458,"passed_time":0.4522279583,"remaining_time":0.5330181383}, +{"learn":[0.6413244024],"iteration":459,"passed_time":0.4530925833,"remaining_time":0.5318912935}, +{"learn":[0.6412004657],"iteration":460,"passed_time":0.4539735833,"remaining_time":0.5307847319}, +{"learn":[0.6410947682],"iteration":461,"passed_time":0.45480775,"remaining_time":0.5296246093}, +{"learn":[0.6409739614],"iteration":462,"passed_time":0.455681125,"remaining_time":0.5285113696}, +{"learn":[0.6408636114],"iteration":463,"passed_time":0.4565130833,"remaining_time":0.5273513204}, +{"learn":[0.6407522756],"iteration":464,"passed_time":0.4573832917,"remaining_time":0.5262366904}, +{"learn":[0.6406546622],"iteration":465,"passed_time":0.4582325,"remaining_time":0.5250990451}, +{"learn":[0.6405507114],"iteration":466,"passed_time":0.45914875,"remaining_time":0.5240391515}, +{"learn":[0.6403399735],"iteration":467,"passed_time":0.4600685,"remaining_time":0.5229838504}, +{"learn":[0.6402696947],"iteration":468,"passed_time":0.46091325,"remaining_time":0.5218442127}, +{"learn":[0.6401570267],"iteration":469,"passed_time":0.4617787917,"remaining_time":0.5207292757}, +{"learn":[0.6400653003],"iteration":470,"passed_time":0.4626703333,"remaining_time":0.5196445994}, +{"learn":[0.6399097238],"iteration":471,"passed_time":0.4635137083,"remaining_time":0.5185068602}, +{"learn":[0.639842285],"iteration":472,"passed_time":0.4644340417,"remaining_time":0.5174561098}, +{"learn":[0.639799426],"iteration":473,"passed_time":0.4653260833,"remaining_time":0.5163745144}, +{"learn":[0.6397163901],"iteration":474,"passed_time":0.466149375,"remaining_time":0.5152177303}, +{"learn":[0.6396276094],"iteration":475,"passed_time":0.4670110833,"remaining_time":0.514104638}, +{"learn":[0.6394969199],"iteration":476,"passed_time":0.4678789583,"remaining_time":0.512999361}, +{"learn":[0.6394128913],"iteration":477,"passed_time":0.4687530417,"remaining_time":0.5119018572}, +{"learn":[0.6392412702],"iteration":478,"passed_time":0.4695799167,"remaining_time":0.5107539386}, +{"learn":[0.6391334379],"iteration":479,"passed_time":0.4704555833,"remaining_time":0.5096602153}, +{"learn":[0.6390480382],"iteration":480,"passed_time":0.4713654167,"remaining_time":0.5086042646}, +{"learn":[0.6389413084],"iteration":481,"passed_time":0.4722321667,"remaining_time":0.5075026189}, +{"learn":[0.6388329704],"iteration":482,"passed_time":0.4730629167,"remaining_time":0.5063634118}, +{"learn":[0.6387424616],"iteration":483,"passed_time":0.4738849167,"remaining_time":0.5052161508}, +{"learn":[0.6386683644],"iteration":484,"passed_time":0.4747396667,"remaining_time":0.5041050069}, +{"learn":[0.6385485944],"iteration":485,"passed_time":0.4755855,"remaining_time":0.5029854877}, +{"learn":[0.6384503416],"iteration":486,"passed_time":0.4764433333,"remaining_time":0.5018797331}, +{"learn":[0.638260197],"iteration":487,"passed_time":0.4773149167,"remaining_time":0.5007894208}, +{"learn":[0.6381927172],"iteration":488,"passed_time":0.478174875,"remaining_time":0.4996878551}, +{"learn":[0.6380962012],"iteration":489,"passed_time":0.47899625,"remaining_time":0.4985471173}, +{"learn":[0.6379909251],"iteration":490,"passed_time":0.47986625,"remaining_time":0.4974580881}, +{"learn":[0.6378474539],"iteration":491,"passed_time":0.4807323333,"remaining_time":0.4963659051}, +{"learn":[0.6377359495],"iteration":492,"passed_time":0.4816680417,"remaining_time":0.4953462416}, +{"learn":[0.6376286944],"iteration":493,"passed_time":0.4825479167,"remaining_time":0.4942697284}, +{"learn":[0.6375168861],"iteration":494,"passed_time":0.4833979583,"remaining_time":0.4931635737}, +{"learn":[0.6374096027],"iteration":495,"passed_time":0.484221,"remaining_time":0.4920310161}, +{"learn":[0.6373206452],"iteration":496,"passed_time":0.4850395,"remaining_time":0.4908951076}, +{"learn":[0.6371775996],"iteration":497,"passed_time":0.4858964167,"remaining_time":0.4897991991}, +{"learn":[0.6370771129],"iteration":498,"passed_time":0.486738125,"remaining_time":0.4886889792}, +{"learn":[0.6369397389],"iteration":499,"passed_time":0.4875999583,"remaining_time":0.4875999583}, +{"learn":[0.6368328637],"iteration":500,"passed_time":0.4884541667,"remaining_time":0.4865042498}, +{"learn":[0.6367415009],"iteration":501,"passed_time":0.489289125,"remaining_time":0.4853904069}, +{"learn":[0.6366775186],"iteration":502,"passed_time":0.490754375,"remaining_time":0.4849004461}, +{"learn":[0.6365143976],"iteration":503,"passed_time":0.4916245833,"remaining_time":0.4838210185}, +{"learn":[0.6363644397],"iteration":504,"passed_time":0.4924847917,"remaining_time":0.4827326176}, +{"learn":[0.6362721351],"iteration":505,"passed_time":0.4934596667,"remaining_time":0.4817570659}, +{"learn":[0.6361524848],"iteration":506,"passed_time":0.494301875,"remaining_time":0.4806525136}, +{"learn":[0.6360488517],"iteration":507,"passed_time":0.4952812083,"remaining_time":0.4796818002}, +{"learn":[0.6358690577],"iteration":508,"passed_time":0.4961139583,"remaining_time":0.4785696533}, +{"learn":[0.6357704912],"iteration":509,"passed_time":0.496988125,"remaining_time":0.4774983946}, +{"learn":[0.6357028739],"iteration":510,"passed_time":0.4978620417,"remaining_time":0.4764276681}, +{"learn":[0.6356091559],"iteration":511,"passed_time":0.4987575,"remaining_time":0.4753782422}, +{"learn":[0.6354848954],"iteration":512,"passed_time":0.4996715833,"remaining_time":0.4743470976}, +{"learn":[0.6353332827],"iteration":513,"passed_time":0.50050175,"remaining_time":0.4732370632}, +{"learn":[0.6351958501],"iteration":514,"passed_time":0.5013453333,"remaining_time":0.4721407508}, +{"learn":[0.6350798619],"iteration":515,"passed_time":0.5022064583,"remaining_time":0.4710618718}, +{"learn":[0.6349471676],"iteration":516,"passed_time":0.503100875,"remaining_time":0.4700149374}, +{"learn":[0.6348462684],"iteration":517,"passed_time":0.50409675,"remaining_time":0.469062999}, +{"learn":[0.6347263289],"iteration":518,"passed_time":0.5049604167,"remaining_time":0.467988363}, +{"learn":[0.6345859887],"iteration":519,"passed_time":0.5058380833,"remaining_time":0.4669274615}, +{"learn":[0.6344811509],"iteration":520,"passed_time":0.5067389167,"remaining_time":0.4658885625}, +{"learn":[0.6343743761],"iteration":521,"passed_time":0.507598125,"remaining_time":0.4648120761}, +{"learn":[0.6342094082],"iteration":522,"passed_time":0.5084794583,"remaining_time":0.4637565997}, +{"learn":[0.6340919601],"iteration":523,"passed_time":0.5093290417,"remaining_time":0.4626729462}, +{"learn":[0.6339735031],"iteration":524,"passed_time":0.5102164167,"remaining_time":0.461624377}, +{"learn":[0.6337635047],"iteration":525,"passed_time":0.5110749167,"remaining_time":0.4605504002}, +{"learn":[0.6337201733],"iteration":526,"passed_time":0.5120193333,"remaining_time":0.4595543542}, +{"learn":[0.63357504],"iteration":527,"passed_time":0.5129155833,"remaining_time":0.4585154457}, +{"learn":[0.6334555542],"iteration":528,"passed_time":0.5137462917,"remaining_time":0.4574187209}, +{"learn":[0.6333003155],"iteration":529,"passed_time":0.51467775,"remaining_time":0.4564123443}, +{"learn":[0.6332287575],"iteration":530,"passed_time":0.5155197917,"remaining_time":0.4553272736}, +{"learn":[0.6331149041],"iteration":531,"passed_time":0.5163504167,"remaining_time":0.4542330733}, +{"learn":[0.6329386363],"iteration":532,"passed_time":0.5171955417,"remaining_time":0.4531525665}, +{"learn":[0.6328613311],"iteration":533,"passed_time":0.518053125,"remaining_time":0.4520838132}, +{"learn":[0.6327629963],"iteration":534,"passed_time":0.5189798333,"remaining_time":0.4510759299}, +{"learn":[0.6326155973],"iteration":535,"passed_time":0.5198146667,"remaining_time":0.4499888159}, +{"learn":[0.6325550339],"iteration":536,"passed_time":0.5206850833,"remaining_time":0.4489333214}, +{"learn":[0.6324497074],"iteration":537,"passed_time":0.5215025417,"remaining_time":0.4478330376}, +{"learn":[0.6323765804],"iteration":538,"passed_time":0.5224047917,"remaining_time":0.4468063246}, +{"learn":[0.6322556835],"iteration":539,"passed_time":0.523213125,"remaining_time":0.4457000694}, +{"learn":[0.6321161761],"iteration":540,"passed_time":0.5240855833,"remaining_time":0.4446493212}, +{"learn":[0.6319724116],"iteration":541,"passed_time":0.52491825,"remaining_time":0.4435656061}, +{"learn":[0.631890329],"iteration":542,"passed_time":0.5258379583,"remaining_time":0.4425560717}, +{"learn":[0.6318086138],"iteration":543,"passed_time":0.5267144583,"remaining_time":0.4415106489}, +{"learn":[0.6317530605],"iteration":544,"passed_time":0.527634875,"remaining_time":0.4405025103}, +{"learn":[0.6316490186],"iteration":545,"passed_time":0.528466,"remaining_time":0.4394204469}, +{"learn":[0.6315127343],"iteration":546,"passed_time":0.529310375,"remaining_time":0.438350274}, +{"learn":[0.6313655159],"iteration":547,"passed_time":0.53022375,"remaining_time":0.4373378376}, +{"learn":[0.6312192706],"iteration":548,"passed_time":0.5311270417,"remaining_time":0.4363174787}, +{"learn":[0.6310263809],"iteration":549,"passed_time":0.5319750833,"remaining_time":0.4352523409}, +{"learn":[0.6309320378],"iteration":550,"passed_time":0.5328907917,"remaining_time":0.4342431315}, +{"learn":[0.6308050567],"iteration":551,"passed_time":0.533756875,"remaining_time":0.4331939855}, +{"learn":[0.6306837863],"iteration":552,"passed_time":0.53459325,"remaining_time":0.4321214878}, +{"learn":[0.630492781],"iteration":553,"passed_time":0.5354690833,"remaining_time":0.4310816086}, +{"learn":[0.6304097708],"iteration":554,"passed_time":0.5363899167,"remaining_time":0.4300784017}, +{"learn":[0.6302761415],"iteration":555,"passed_time":0.5373109583,"remaining_time":0.4290756574}, +{"learn":[0.6302110205],"iteration":556,"passed_time":0.538201625,"remaining_time":0.4280490482}, +{"learn":[0.6301250977],"iteration":557,"passed_time":0.5390502083,"remaining_time":0.4269895915}, +{"learn":[0.6299860854],"iteration":558,"passed_time":0.5399270833,"remaining_time":0.4259532089}, +{"learn":[0.6299090389],"iteration":559,"passed_time":0.5408325833,"remaining_time":0.4249398869}, +{"learn":[0.6297831727],"iteration":560,"passed_time":0.5416884167,"remaining_time":0.4238880836}, +{"learn":[0.629679111],"iteration":561,"passed_time":0.542521875,"remaining_time":0.4228195396}, +{"learn":[0.6295834329],"iteration":562,"passed_time":0.54333975,"remaining_time":0.4217397349}, +{"learn":[0.6295367313],"iteration":563,"passed_time":0.5441609583,"remaining_time":0.4206634359}, +{"learn":[0.6294441722],"iteration":564,"passed_time":0.5450120833,"remaining_time":0.419611073}, +{"learn":[0.6292933413],"iteration":565,"passed_time":0.5458285417,"remaining_time":0.4185328394}, +{"learn":[0.6291314013],"iteration":566,"passed_time":0.5466690417,"remaining_time":0.417473889}, +{"learn":[0.6290189714],"iteration":567,"passed_time":0.5475089167,"remaining_time":0.4164152324}, +{"learn":[0.6289368531],"iteration":568,"passed_time":0.5483162083,"remaining_time":0.415332664}, +{"learn":[0.6288462229],"iteration":569,"passed_time":0.549209375,"remaining_time":0.4143158443}, +{"learn":[0.6287147421],"iteration":570,"passed_time":0.5500817917,"remaining_time":0.413283868}, +{"learn":[0.6286351228],"iteration":571,"passed_time":0.5509415,"remaining_time":0.4122429406}, +{"learn":[0.6284827572],"iteration":572,"passed_time":0.551838375,"remaining_time":0.4112303423}, +{"learn":[0.6283897609],"iteration":573,"passed_time":0.552743125,"remaining_time":0.4102239917}, +{"learn":[0.628287767],"iteration":574,"passed_time":0.5537422083,"remaining_time":0.4092877192}, +{"learn":[0.6281601836],"iteration":575,"passed_time":0.55463625,"remaining_time":0.4082739062}, +{"learn":[0.6279889828],"iteration":576,"passed_time":0.5554460833,"remaining_time":0.4071987751}, +{"learn":[0.6278752527],"iteration":577,"passed_time":0.556323125,"remaining_time":0.4061736311}, +{"learn":[0.6277687136],"iteration":578,"passed_time":0.5571374167,"remaining_time":0.405103372}, +{"learn":[0.627668386],"iteration":579,"passed_time":0.5579640417,"remaining_time":0.4040429267}, +{"learn":[0.6275302106],"iteration":580,"passed_time":0.5588252917,"remaining_time":0.4030082568}, +{"learn":[0.6274097455],"iteration":581,"passed_time":0.5597099167,"remaining_time":0.4019909711}, +{"learn":[0.6272799974],"iteration":582,"passed_time":0.5605397083,"remaining_time":0.40093492}, +{"learn":[0.6271669978],"iteration":583,"passed_time":0.561415875,"remaining_time":0.3999126781}, +{"learn":[0.6270423157],"iteration":584,"passed_time":0.5622665833,"remaining_time":0.3988728754}, +{"learn":[0.6269308866],"iteration":585,"passed_time":0.5632231667,"remaining_time":0.3979085171}, +{"learn":[0.6268392247],"iteration":586,"passed_time":0.5648543333,"remaining_time":0.3974188069}, +{"learn":[0.626715537],"iteration":587,"passed_time":0.565711625,"remaining_time":0.3963829753}, +{"learn":[0.6265772881],"iteration":588,"passed_time":0.566654,"remaining_time":0.3954071205}, +{"learn":[0.6264594577],"iteration":589,"passed_time":0.5675008333,"remaining_time":0.3943649859}, +{"learn":[0.6263123275],"iteration":590,"passed_time":0.568363625,"remaining_time":0.393334556}, +{"learn":[0.6262133604],"iteration":591,"passed_time":0.5692172917,"remaining_time":0.3922984037}, +{"learn":[0.6261036495],"iteration":592,"passed_time":0.5701004583,"remaining_time":0.3912831139}, +{"learn":[0.6259059188],"iteration":593,"passed_time":0.5709907917,"remaining_time":0.3902731674}, +{"learn":[0.6257523926],"iteration":594,"passed_time":0.5718525833,"remaining_time":0.3892441954}, +{"learn":[0.6256626475],"iteration":595,"passed_time":0.5727003333,"remaining_time":0.3882062662}, +{"learn":[0.6255739968],"iteration":596,"passed_time":0.5735434167,"remaining_time":0.387165824}, +{"learn":[0.625471779],"iteration":597,"passed_time":0.5743677083,"remaining_time":0.3861134093}, +{"learn":[0.6253633844],"iteration":598,"passed_time":0.5751884167,"remaining_time":0.3850593574}, +{"learn":[0.6252629908],"iteration":599,"passed_time":0.576037625,"remaining_time":0.3840250833}, +{"learn":[0.6252055383],"iteration":600,"passed_time":0.576902625,"remaining_time":0.3830019091}, +{"learn":[0.6250767463],"iteration":601,"passed_time":0.5777682083,"remaining_time":0.381979646}, +{"learn":[0.6249901113],"iteration":602,"passed_time":0.5787036667,"remaining_time":0.3810039066}, +{"learn":[0.6249460209],"iteration":603,"passed_time":0.5795180833,"remaining_time":0.3799489421}, +{"learn":[0.6248968142],"iteration":604,"passed_time":0.5804229583,"remaining_time":0.3789538323}, +{"learn":[0.6247970399],"iteration":605,"passed_time":0.581196375,"remaining_time":0.3778735507}, +{"learn":[0.6246682503],"iteration":606,"passed_time":0.5821137917,"remaining_time":0.3768875126}, +{"learn":[0.6245230492],"iteration":607,"passed_time":0.5829463333,"remaining_time":0.3758469781}, +{"learn":[0.6244243911],"iteration":608,"passed_time":0.5837934167,"remaining_time":0.3748164629}, +{"learn":[0.6243509135],"iteration":609,"passed_time":0.5847035,"remaining_time":0.3738268279}, +{"learn":[0.6242728069],"iteration":610,"passed_time":0.585532375,"remaining_time":0.372785751}, +{"learn":[0.6242359789],"iteration":611,"passed_time":0.5863718333,"remaining_time":0.3717520773}, +{"learn":[0.6241544412],"iteration":612,"passed_time":0.5872407083,"remaining_time":0.3707376087}, +{"learn":[0.6240728094],"iteration":613,"passed_time":0.5880809583,"remaining_time":0.3697056188}, +{"learn":[0.6239570602],"iteration":614,"passed_time":0.58900875,"remaining_time":0.3687290549}, +{"learn":[0.6238223496],"iteration":615,"passed_time":0.5898722083,"remaining_time":0.3677125455}, +{"learn":[0.6236999651],"iteration":616,"passed_time":0.590733,"remaining_time":0.3666948768}, +{"learn":[0.6236371245],"iteration":617,"passed_time":0.591610125,"remaining_time":0.3656878119}, +{"learn":[0.6235355488],"iteration":618,"passed_time":0.5924959167,"remaining_time":0.3646865012}, +{"learn":[0.6234165964],"iteration":619,"passed_time":0.5933915,"remaining_time":0.3636915645}, +{"learn":[0.6232437071],"iteration":620,"passed_time":0.5942469167,"remaining_time":0.3626724338}, +{"learn":[0.6231823926],"iteration":621,"passed_time":0.5952288333,"remaining_time":0.3617307058}, +{"learn":[0.6230291297],"iteration":622,"passed_time":0.5961462917,"remaining_time":0.3607498426}, +{"learn":[0.622997177],"iteration":623,"passed_time":0.5970388333,"remaining_time":0.3597541688}, +{"learn":[0.6229496011],"iteration":624,"passed_time":0.5979300833,"remaining_time":0.35875805}, +{"learn":[0.6228121811],"iteration":625,"passed_time":0.5988258333,"remaining_time":0.3577649547}, +{"learn":[0.6226861413],"iteration":626,"passed_time":0.599663125,"remaining_time":0.3567373933}, +{"learn":[0.6226244729],"iteration":627,"passed_time":0.6005455417,"remaining_time":0.355737168}, +{"learn":[0.6225595178],"iteration":628,"passed_time":0.6013856667,"remaining_time":0.3547123725}, +{"learn":[0.6224827756],"iteration":629,"passed_time":0.602256,"remaining_time":0.3537059048}, +{"learn":[0.6223680111],"iteration":630,"passed_time":0.6030630417,"remaining_time":0.3526628564}, +{"learn":[0.6222540007],"iteration":631,"passed_time":0.6039235417,"remaining_time":0.3516516825}, +{"learn":[0.6221538415],"iteration":632,"passed_time":0.604796875,"remaining_time":0.3506484252}, +{"learn":[0.6220762578],"iteration":633,"passed_time":0.6056305,"remaining_time":0.3496226546}, +{"learn":[0.6219660335],"iteration":634,"passed_time":0.6065775,"remaining_time":0.3486626575}, +{"learn":[0.62188634],"iteration":635,"passed_time":0.607441125,"remaining_time":0.3476549835}, +{"learn":[0.6218020551],"iteration":636,"passed_time":0.60833175,"remaining_time":0.346663148}, +{"learn":[0.6216555363],"iteration":637,"passed_time":0.60914125,"remaining_time":0.3456255995}, +{"learn":[0.6215575745],"iteration":638,"passed_time":0.6100025833,"remaining_time":0.3446180479}, +{"learn":[0.6214663845],"iteration":639,"passed_time":0.6108417917,"remaining_time":0.3435985078}, +{"learn":[0.6213875579],"iteration":640,"passed_time":0.6117429583,"remaining_time":0.342614231}, +{"learn":[0.6213345572],"iteration":641,"passed_time":0.6126240417,"remaining_time":0.3416190139}, +{"learn":[0.6212789289],"iteration":642,"passed_time":0.613561125,"remaining_time":0.3406552436}, +{"learn":[0.6211349209],"iteration":643,"passed_time":0.614421375,"remaining_time":0.3396490831}, +{"learn":[0.6210476278],"iteration":644,"passed_time":0.6152490833,"remaining_time":0.3386254645}, +{"learn":[0.6208814405],"iteration":645,"passed_time":0.616136125,"remaining_time":0.3376349663}, +{"learn":[0.6207879568],"iteration":646,"passed_time":0.6170049167,"remaining_time":0.3366348309}, +{"learn":[0.6206961904],"iteration":647,"passed_time":0.6178855,"remaining_time":0.3356415062}, +{"learn":[0.6205756362],"iteration":648,"passed_time":0.6186845833,"remaining_time":0.3346044511}, +{"learn":[0.620489714],"iteration":649,"passed_time":0.619567,"remaining_time":0.333613}, +{"learn":[0.6203560498],"iteration":650,"passed_time":0.6204354167,"remaining_time":0.3326143785}, +{"learn":[0.6201900917],"iteration":651,"passed_time":0.62127425,"remaining_time":0.3316003666}, +{"learn":[0.6200948954],"iteration":652,"passed_time":0.6221871667,"remaining_time":0.3306262586}, +{"learn":[0.6199593443],"iteration":653,"passed_time":0.6230258333,"remaining_time":0.3296130556}, +{"learn":[0.6198125256],"iteration":654,"passed_time":0.623864375,"remaining_time":0.3286003197}, +{"learn":[0.6196710602],"iteration":655,"passed_time":0.6247112917,"remaining_time":0.3275925066}, +{"learn":[0.6196207402],"iteration":656,"passed_time":0.6255725417,"remaining_time":0.3265926663}, +{"learn":[0.6195696658],"iteration":657,"passed_time":0.6264435,"remaining_time":0.3255982933}, +{"learn":[0.6194968475],"iteration":658,"passed_time":0.627324625,"remaining_time":0.3246095556}, +{"learn":[0.6194141635],"iteration":659,"passed_time":0.628151625,"remaining_time":0.3235932614}, +{"learn":[0.61935944],"iteration":660,"passed_time":0.6290048333,"remaining_time":0.3225909811}, +{"learn":[0.6192651336],"iteration":661,"passed_time":0.6300189167,"remaining_time":0.3216712898}, +{"learn":[0.619161837],"iteration":662,"passed_time":0.6309228333,"remaining_time":0.3206953165}, +{"learn":[0.619100053],"iteration":663,"passed_time":0.6318079167,"remaining_time":0.3197100301}, +{"learn":[0.6189102509],"iteration":664,"passed_time":0.632651,"remaining_time":0.3187038872}, +{"learn":[0.6187836399],"iteration":665,"passed_time":0.63348625,"remaining_time":0.3176943056}, +{"learn":[0.6186752696],"iteration":666,"passed_time":0.634283125,"remaining_time":0.3166660879}, +{"learn":[0.6185793207],"iteration":667,"passed_time":0.6351313333,"remaining_time":0.3156640758}, +{"learn":[0.6184556644],"iteration":668,"passed_time":0.636007125,"remaining_time":0.314676171}, +{"learn":[0.6183547598],"iteration":669,"passed_time":0.6368517083,"remaining_time":0.3136732295}, +{"learn":[0.6182543311],"iteration":670,"passed_time":0.6376957917,"remaining_time":0.3126705148}, +{"learn":[0.6181447023],"iteration":671,"passed_time":0.638646,"remaining_time":0.3117200714}, +{"learn":[0.6180756722],"iteration":672,"passed_time":0.6395057917,"remaining_time":0.3107256967}, +{"learn":[0.6179628263],"iteration":673,"passed_time":0.640407875,"remaining_time":0.3097521769}, +{"learn":[0.6178767191],"iteration":674,"passed_time":0.6412378333,"remaining_time":0.308744142}, +{"learn":[0.6177457197],"iteration":675,"passed_time":0.6420738333,"remaining_time":0.3077395296}, +{"learn":[0.6175885438],"iteration":676,"passed_time":0.6429148333,"remaining_time":0.3067378008}, +{"learn":[0.6175131774],"iteration":677,"passed_time":0.6437360833,"remaining_time":0.3057271664}, +{"learn":[0.6173813339],"iteration":678,"passed_time":0.644591875,"remaining_time":0.3047334196}, +{"learn":[0.6172965125],"iteration":679,"passed_time":0.6454354167,"remaining_time":0.3037343137}, +{"learn":[0.6172250901],"iteration":680,"passed_time":0.6463154583,"remaining_time":0.3027527624}, +{"learn":[0.6170926518],"iteration":681,"passed_time":0.6471819167,"remaining_time":0.3017651752}, +{"learn":[0.616973324],"iteration":682,"passed_time":0.6480337917,"remaining_time":0.3007711742}, +{"learn":[0.6169183634],"iteration":683,"passed_time":0.6489113333,"remaining_time":0.2997894464}, +{"learn":[0.6167861017],"iteration":684,"passed_time":0.649859625,"remaining_time":0.2988405575}, +{"learn":[0.6167087958],"iteration":685,"passed_time":0.6507582083,"remaining_time":0.2978689175}, +{"learn":[0.6166320669],"iteration":686,"passed_time":0.6515955833,"remaining_time":0.2968696035}, +{"learn":[0.616536298],"iteration":687,"passed_time":0.6524415833,"remaining_time":0.2958746715}, +{"learn":[0.6164080717],"iteration":688,"passed_time":0.6533106667,"remaining_time":0.2948905912}, +{"learn":[0.616287606],"iteration":689,"passed_time":0.6541902917,"remaining_time":0.2939115803}, +{"learn":[0.6162332563],"iteration":690,"passed_time":0.655123375,"remaining_time":0.2929567625}, +{"learn":[0.6161250832],"iteration":691,"passed_time":0.6560125417,"remaining_time":0.2919824607}, +{"learn":[0.6160210474],"iteration":692,"passed_time":0.6568712917,"remaining_time":0.2909949301}, +{"learn":[0.6159276634],"iteration":693,"passed_time":0.6577257917,"remaining_time":0.2900058966}, +{"learn":[0.615874583],"iteration":694,"passed_time":0.658538375,"remaining_time":0.2889988552}, +{"learn":[0.615746811],"iteration":695,"passed_time":0.6595298333,"remaining_time":0.2880705019}, +{"learn":[0.6156979757],"iteration":696,"passed_time":0.6604519583,"remaining_time":0.2871118269}, +{"learn":[0.6156281876],"iteration":697,"passed_time":0.6613020417,"remaining_time":0.2861220868}, +{"learn":[0.6155299974],"iteration":698,"passed_time":0.6622415833,"remaining_time":0.2851712684}, +{"learn":[0.61541052],"iteration":699,"passed_time":0.6631658333,"remaining_time":0.2842139286}, +{"learn":[0.6153276474],"iteration":700,"passed_time":0.6640329583,"remaining_time":0.2832323175}, +{"learn":[0.6152041366],"iteration":701,"passed_time":0.6648829583,"remaining_time":0.2822437629}, +{"learn":[0.6151300774],"iteration":702,"passed_time":0.66578225,"remaining_time":0.2812764271}, +{"learn":[0.6149737492],"iteration":703,"passed_time":0.666714375,"remaining_time":0.2803230895}, +{"learn":[0.6148346042],"iteration":704,"passed_time":0.6675789583,"remaining_time":0.2793415499}, +{"learn":[0.6147754102],"iteration":705,"passed_time":0.6684313333,"remaining_time":0.2783552578}, +{"learn":[0.6146369332],"iteration":706,"passed_time":0.6692458333,"remaining_time":0.277353648}, +{"learn":[0.6144883355],"iteration":707,"passed_time":0.6701590417,"remaining_time":0.2763932771}, +{"learn":[0.6143737231],"iteration":708,"passed_time":0.6709925,"remaining_time":0.2754003068}, +{"learn":[0.6142649151],"iteration":709,"passed_time":0.6717869583,"remaining_time":0.2743918562}, +{"learn":[0.6141459941],"iteration":710,"passed_time":0.6726079583,"remaining_time":0.273394796}, +{"learn":[0.6139975423],"iteration":711,"passed_time":0.6734695833,"remaining_time":0.2724146629}, +{"learn":[0.613855914],"iteration":712,"passed_time":0.6742677083,"remaining_time":0.271409302}, +{"learn":[0.613678782],"iteration":713,"passed_time":0.675126,"remaining_time":0.2704286218}, +{"learn":[0.6135928058],"iteration":714,"passed_time":0.67596825,"remaining_time":0.2694418899}, +{"learn":[0.6135311722],"iteration":715,"passed_time":0.6768229583,"remaining_time":0.268460503}, +{"learn":[0.6134451919],"iteration":716,"passed_time":0.6776765833,"remaining_time":0.267479042}, +{"learn":[0.6133056337],"iteration":717,"passed_time":0.6785389167,"remaining_time":0.2665013572}, +{"learn":[0.6132658941],"iteration":718,"passed_time":0.6793984167,"remaining_time":0.2655228861}, +{"learn":[0.6131619598],"iteration":719,"passed_time":0.680295375,"remaining_time":0.2645593125}, +{"learn":[0.6131005904],"iteration":720,"passed_time":0.6811607083,"remaining_time":0.263583686}, +{"learn":[0.6129929298],"iteration":721,"passed_time":0.6820442083,"remaining_time":0.26261536}, +{"learn":[0.6128732939],"iteration":722,"passed_time":0.6829186667,"remaining_time":0.2616438045}, +{"learn":[0.6127641474],"iteration":723,"passed_time":0.6837775417,"remaining_time":0.2606665767}, +{"learn":[0.6126318318],"iteration":724,"passed_time":0.684616625,"remaining_time":0.2596821681}, +{"learn":[0.6125384369],"iteration":725,"passed_time":0.68549325,"remaining_time":0.2587123285}, +{"learn":[0.6124106601],"iteration":726,"passed_time":0.6863904167,"remaining_time":0.2577504591}, +{"learn":[0.6123654172],"iteration":727,"passed_time":0.6872264167,"remaining_time":0.2567659139}, +{"learn":[0.6122788128],"iteration":728,"passed_time":0.6881484167,"remaining_time":0.2558137461}, +{"learn":[0.6122126108],"iteration":729,"passed_time":0.6890134583,"remaining_time":0.2548405942}, +{"learn":[0.6121104225],"iteration":730,"passed_time":0.6899081667,"remaining_time":0.253878655}, +{"learn":[0.6120130881],"iteration":731,"passed_time":0.6908475417,"remaining_time":0.252933253}, +{"learn":[0.6119112927],"iteration":732,"passed_time":0.691678875,"remaining_time":0.2519485124}, +{"learn":[0.6118246638],"iteration":733,"passed_time":0.69263075,"remaining_time":0.251007874}, +{"learn":[0.6117177565],"iteration":734,"passed_time":0.6935211667,"remaining_time":0.2500450465}, +{"learn":[0.6116389763],"iteration":735,"passed_time":0.6943914583,"remaining_time":0.249075197}, +{"learn":[0.6114579229],"iteration":736,"passed_time":0.6952369167,"remaining_time":0.2480967559}, +{"learn":[0.6113895881],"iteration":737,"passed_time":0.69625775,"remaining_time":0.2471809356}, +{"learn":[0.6113396696],"iteration":738,"passed_time":0.697195625,"remaining_time":0.246235532}, +{"learn":[0.6112891405],"iteration":739,"passed_time":0.698084625,"remaining_time":0.2452729764}, +{"learn":[0.6112067316],"iteration":740,"passed_time":0.6989770417,"remaining_time":0.2443118135}, +{"learn":[0.6111778767],"iteration":741,"passed_time":0.6998454583,"remaining_time":0.2433424909}, +{"learn":[0.6110938966],"iteration":742,"passed_time":0.7006858333,"remaining_time":0.2423637405}, +{"learn":[0.6110588958],"iteration":743,"passed_time":0.701543125,"remaining_time":0.2413911828}, +{"learn":[0.6110345082],"iteration":744,"passed_time":0.7024291667,"remaining_time":0.2404287752}, +{"learn":[0.6109203042],"iteration":745,"passed_time":0.7033755,"remaining_time":0.2394871005}, +{"learn":[0.6108124605],"iteration":746,"passed_time":0.7042810417,"remaining_time":0.2385315978}, +{"learn":[0.6106891767],"iteration":747,"passed_time":0.7051778333,"remaining_time":0.2375732807}, +{"learn":[0.6105830088],"iteration":748,"passed_time":0.7060598333,"remaining_time":0.2366101711}, +{"learn":[0.6104668042],"iteration":749,"passed_time":0.70701675,"remaining_time":0.23567225}, +{"learn":[0.6103335407],"iteration":750,"passed_time":0.7078719167,"remaining_time":0.2347005423}, +{"learn":[0.6102476438],"iteration":751,"passed_time":0.7086905833,"remaining_time":0.2337171073}, +{"learn":[0.6101576684],"iteration":752,"passed_time":0.7096325417,"remaining_time":0.2327745522}, +{"learn":[0.6100299836],"iteration":753,"passed_time":0.7104922083,"remaining_time":0.2318051502}, +{"learn":[0.6099106607],"iteration":754,"passed_time":0.7113880417,"remaining_time":0.2308477751}, +{"learn":[0.6097946837],"iteration":755,"passed_time":0.7122717083,"remaining_time":0.229886636}, +{"learn":[0.6096914954],"iteration":756,"passed_time":0.7131004583,"remaining_time":0.2289080732}, +{"learn":[0.6095701024],"iteration":757,"passed_time":0.71394325,"remaining_time":0.2279343885}, +{"learn":[0.6094605049],"iteration":758,"passed_time":0.7147775833,"remaining_time":0.2269583631}, +{"learn":[0.6093697682],"iteration":759,"passed_time":0.7156485417,"remaining_time":0.2259942763}, +{"learn":[0.6092899688],"iteration":760,"passed_time":0.7165489167,"remaining_time":0.2250396729}, +{"learn":[0.6092042421],"iteration":761,"passed_time":0.717489625,"remaining_time":0.2240978094}, +{"learn":[0.6091257097],"iteration":762,"passed_time":0.7183723333,"remaining_time":0.2231379332}, +{"learn":[0.6090299559],"iteration":763,"passed_time":0.719213125,"remaining_time":0.2221653109}, +{"learn":[0.6089423349],"iteration":764,"passed_time":0.7200561667,"remaining_time":0.2211937244}, +{"learn":[0.6088834909],"iteration":765,"passed_time":0.7209439583,"remaining_time":0.2202361439}, +{"learn":[0.6087828286],"iteration":766,"passed_time":0.7217654167,"remaining_time":0.2192585946}, +{"learn":[0.608689057],"iteration":767,"passed_time":0.722579625,"remaining_time":0.2182792617}, +{"learn":[0.6085700604],"iteration":768,"passed_time":0.7234702083,"remaining_time":0.2173233006}, +{"learn":[0.608439473],"iteration":769,"passed_time":0.7243243333,"remaining_time":0.216356619}, +{"learn":[0.608359382],"iteration":770,"passed_time":0.7252335417,"remaining_time":0.2154065902}, +{"learn":[0.6082689384],"iteration":771,"passed_time":0.7261444167,"remaining_time":0.2144571593}, +{"learn":[0.6081907179],"iteration":772,"passed_time":0.72702075,"remaining_time":0.2134976847}, +{"learn":[0.6080718779],"iteration":773,"passed_time":0.7279461667,"remaining_time":0.2125527567}, +{"learn":[0.6079545844],"iteration":774,"passed_time":0.728792125,"remaining_time":0.2115848105}, +{"learn":[0.6078928627],"iteration":775,"passed_time":0.729671125,"remaining_time":0.2106267165}, +{"learn":[0.6078142075],"iteration":776,"passed_time":0.7304837917,"remaining_time":0.2096497883}, +{"learn":[0.6076877936],"iteration":777,"passed_time":0.731356875,"remaining_time":0.2086905222}, +{"learn":[0.6075586835],"iteration":778,"passed_time":0.732248625,"remaining_time":0.2077367729}, +{"learn":[0.6074776794],"iteration":779,"passed_time":0.7331587083,"remaining_time":0.2067883536}, +{"learn":[0.6073698886],"iteration":780,"passed_time":0.7340482083,"remaining_time":0.2058342607}, +{"learn":[0.6072989674],"iteration":781,"passed_time":0.7349200833,"remaining_time":0.2048754197}, +{"learn":[0.6072177464],"iteration":782,"passed_time":0.7359413333,"remaining_time":0.2039581984}, +{"learn":[0.6070946205],"iteration":783,"passed_time":0.736829625,"remaining_time":0.2030040804}, +{"learn":[0.6070088132],"iteration":784,"passed_time":0.737699875,"remaining_time":0.2020451887}, +{"learn":[0.6068112623],"iteration":785,"passed_time":0.738555625,"remaining_time":0.2010825747}, +{"learn":[0.6066953812],"iteration":786,"passed_time":0.739432875,"remaining_time":0.2001260513}, +{"learn":[0.6065614126],"iteration":787,"passed_time":0.7403120417,"remaining_time":0.1991702447}, +{"learn":[0.6064676059],"iteration":788,"passed_time":0.74115825,"remaining_time":0.1982058184}, +{"learn":[0.6063495792],"iteration":789,"passed_time":0.7420425833,"remaining_time":0.1972518259}, +{"learn":[0.6062228485],"iteration":790,"passed_time":0.742968875,"remaining_time":0.1963090959}, +{"learn":[0.6060937846],"iteration":791,"passed_time":0.7438357083,"remaining_time":0.1953507921}, +{"learn":[0.6060014667],"iteration":792,"passed_time":0.7446884583,"remaining_time":0.1943890427}, +{"learn":[0.6058886423],"iteration":793,"passed_time":0.7454995417,"remaining_time":0.1934167577}, +{"learn":[0.6057141355],"iteration":794,"passed_time":0.746333125,"remaining_time":0.19245068}, +{"learn":[0.605632333],"iteration":795,"passed_time":0.7471766667,"remaining_time":0.1914874874}, +{"learn":[0.6055230529],"iteration":796,"passed_time":0.7480674167,"remaining_time":0.1905366193}, +{"learn":[0.6053841295],"iteration":797,"passed_time":0.7489005,"remaining_time":0.1895713045}, +{"learn":[0.6053323372],"iteration":798,"passed_time":0.7497743333,"remaining_time":0.188616572}, +{"learn":[0.6052619534],"iteration":799,"passed_time":0.750594125,"remaining_time":0.1876485313}, +{"learn":[0.6051896956],"iteration":800,"passed_time":0.7514947083,"remaining_time":0.1867009325}, +{"learn":[0.6051446857],"iteration":801,"passed_time":0.7523584583,"remaining_time":0.1857443575}, +{"learn":[0.6050448247],"iteration":802,"passed_time":0.7533304583,"remaining_time":0.1848145707}, +{"learn":[0.6049600147],"iteration":803,"passed_time":0.7541478333,"remaining_time":0.1838469842}, +{"learn":[0.6048282451],"iteration":804,"passed_time":0.7550132083,"remaining_time":0.1828913983}, +{"learn":[0.6047487123],"iteration":805,"passed_time":0.755943125,"remaining_time":0.181951571}, +{"learn":[0.604604094],"iteration":806,"passed_time":0.756818625,"remaining_time":0.1809987542}, +{"learn":[0.6044734619],"iteration":807,"passed_time":0.757691375,"remaining_time":0.1800454752}, +{"learn":[0.6043585512],"iteration":808,"passed_time":0.7585872917,"remaining_time":0.1790978649}, +{"learn":[0.6042819435],"iteration":809,"passed_time":0.7594910833,"remaining_time":0.1781522294}, +{"learn":[0.6041891818],"iteration":810,"passed_time":0.7603317917,"remaining_time":0.1771919958}, +{"learn":[0.6040979288],"iteration":811,"passed_time":0.7612197917,"remaining_time":0.176243006}, +{"learn":[0.6039702464],"iteration":812,"passed_time":0.7620856667,"remaining_time":0.1752890771}, +{"learn":[0.6038717824],"iteration":813,"passed_time":0.7629103333,"remaining_time":0.1743259484}, +{"learn":[0.6037687691],"iteration":814,"passed_time":0.7638888333,"remaining_time":0.1733980787}, +{"learn":[0.6036619193],"iteration":815,"passed_time":0.7647368333,"remaining_time":0.1724406585}, +{"learn":[0.6035915912],"iteration":816,"passed_time":0.7656070417,"remaining_time":0.1714884806}, +{"learn":[0.6034922993],"iteration":817,"passed_time":0.7665289167,"remaining_time":0.1705479986}, +{"learn":[0.6034118605],"iteration":818,"passed_time":0.7674675417,"remaining_time":0.1696112638}, +{"learn":[0.6033064571],"iteration":819,"passed_time":0.7683005,"remaining_time":0.1686513293}, +{"learn":[0.603251048],"iteration":820,"passed_time":0.7691102917,"remaining_time":0.1676866531}, +{"learn":[0.6031280312],"iteration":821,"passed_time":0.7700459583,"remaining_time":0.1667496114}, +{"learn":[0.6030161761],"iteration":822,"passed_time":0.77094075,"remaining_time":0.1658037822}, +{"learn":[0.6028591274],"iteration":823,"passed_time":0.771777375,"remaining_time":0.1648456529}, +{"learn":[0.6027928212],"iteration":824,"passed_time":0.7726381667,"remaining_time":0.1638929444}, +{"learn":[0.6026817944],"iteration":825,"passed_time":0.77348875,"remaining_time":0.1629383081}, +{"learn":[0.6025456726],"iteration":826,"passed_time":0.77432975,"remaining_time":0.1619819187}, +{"learn":[0.6024532742],"iteration":827,"passed_time":0.775288875,"remaining_time":0.161050346}, +{"learn":[0.6023474292],"iteration":828,"passed_time":0.776172375,"remaining_time":0.1601031075}, +{"learn":[0.6022556889],"iteration":829,"passed_time":0.777052625,"remaining_time":0.1591553569}, +{"learn":[0.6021177215],"iteration":830,"passed_time":0.7778994583,"remaining_time":0.1582009729}, +{"learn":[0.6020755036],"iteration":831,"passed_time":0.7788144583,"remaining_time":0.1572606118}, +{"learn":[0.6020117073],"iteration":832,"passed_time":0.7797717083,"remaining_time":0.1563287819}, +{"learn":[0.6019502868],"iteration":833,"passed_time":0.7806800417,"remaining_time":0.1553871546}, +{"learn":[0.6018480088],"iteration":834,"passed_time":0.7815754583,"remaining_time":0.1544430546}, +{"learn":[0.6017694455],"iteration":835,"passed_time":0.7824990417,"remaining_time":0.1535045967}, +{"learn":[0.60170259],"iteration":836,"passed_time":0.7833045417,"remaining_time":0.1525431784}, +{"learn":[0.6015910268],"iteration":837,"passed_time":0.7841851667,"remaining_time":0.1515966551}, +{"learn":[0.6015245886],"iteration":838,"passed_time":0.7851024583,"remaining_time":0.1506573251}, +{"learn":[0.6014938932],"iteration":839,"passed_time":0.786048125,"remaining_time":0.1497234524}, +{"learn":[0.6014357534],"iteration":840,"passed_time":0.786916,"remaining_time":0.1487748442}, +{"learn":[0.6013370417],"iteration":841,"passed_time":0.7878287917,"remaining_time":0.1478348564}, +{"learn":[0.6013015619],"iteration":842,"passed_time":0.7887409167,"remaining_time":0.1468948089}, +{"learn":[0.6012103707],"iteration":843,"passed_time":0.7897045417,"remaining_time":0.1459643466}, +{"learn":[0.6011104296],"iteration":844,"passed_time":0.790604375,"remaining_time":0.1450221043}, +{"learn":[0.6009857425],"iteration":845,"passed_time":0.7914500833,"remaining_time":0.1440701097}, +{"learn":[0.6009384028],"iteration":846,"passed_time":0.7923135833,"remaining_time":0.14312158}, +{"learn":[0.6008769001],"iteration":847,"passed_time":0.7931865417,"remaining_time":0.1421749461}, +{"learn":[0.600723994],"iteration":848,"passed_time":0.79404125,"remaining_time":0.14122524}, +{"learn":[0.6005725792],"iteration":849,"passed_time":0.7949336667,"remaining_time":0.1402824118}, +{"learn":[0.6004173276],"iteration":850,"passed_time":0.795782125,"remaining_time":0.1393320054}, +{"learn":[0.6003554873],"iteration":851,"passed_time":0.7966835,"remaining_time":0.1383910305}, +{"learn":[0.6002822832],"iteration":852,"passed_time":0.7975607083,"remaining_time":0.1374459837}, +{"learn":[0.6002519847],"iteration":853,"passed_time":0.7984800417,"remaining_time":0.1365082975}, +{"learn":[0.6001101203],"iteration":854,"passed_time":0.7993060417,"remaining_time":0.1355548258}, +{"learn":[0.600026324],"iteration":855,"passed_time":0.800225625,"remaining_time":0.1346173949}, +{"learn":[0.5999059997],"iteration":856,"passed_time":0.801103625,"remaining_time":0.1336730669}, +{"learn":[0.5997826751],"iteration":857,"passed_time":0.8019577917,"remaining_time":0.1327249492}, +{"learn":[0.5996946214],"iteration":858,"passed_time":0.8028097083,"remaining_time":0.1317766809}, +{"learn":[0.5996372571],"iteration":859,"passed_time":0.8037239583,"remaining_time":0.1308387839}, +{"learn":[0.5995671529],"iteration":860,"passed_time":0.8045672083,"remaining_time":0.1298894796}, +{"learn":[0.5994830837],"iteration":861,"passed_time":0.8054008333,"remaining_time":0.1289388805}, +{"learn":[0.5994070327],"iteration":862,"passed_time":0.8063535833,"remaining_time":0.1280074634}, +{"learn":[0.599291588],"iteration":863,"passed_time":0.807240875,"remaining_time":0.1270656933}, +{"learn":[0.5991555529],"iteration":864,"passed_time":0.808073625,"remaining_time":0.1261155368}, +{"learn":[0.5990512189],"iteration":865,"passed_time":0.8089779583,"remaining_time":0.125176728}, +{"learn":[0.5989449257],"iteration":866,"passed_time":0.80982675,"remaining_time":0.1242294784}, +{"learn":[0.5987995471],"iteration":867,"passed_time":0.8106805833,"remaining_time":0.1232832224}, +{"learn":[0.5986596191],"iteration":868,"passed_time":0.8115848333,"remaining_time":0.1223447792}, +{"learn":[0.5984596],"iteration":869,"passed_time":0.8124724167,"remaining_time":0.1214039243}, +{"learn":[0.5983708614],"iteration":870,"passed_time":0.8133187083,"remaining_time":0.1204570762}, +{"learn":[0.5982659758],"iteration":871,"passed_time":0.8141499167,"remaining_time":0.1195082446}, +{"learn":[0.5981914491],"iteration":872,"passed_time":0.8150022083,"remaining_time":0.1185627497}, +{"learn":[0.5980372406],"iteration":873,"passed_time":0.8158679583,"remaining_time":0.1176194082}, +{"learn":[0.5979616497],"iteration":874,"passed_time":0.8167729583,"remaining_time":0.1166818512}, +{"learn":[0.5978349599],"iteration":875,"passed_time":0.8176350833,"remaining_time":0.1157382995}, +{"learn":[0.5977471907],"iteration":876,"passed_time":0.818550625,"remaining_time":0.1148024252}, +{"learn":[0.5976357923],"iteration":877,"passed_time":0.8194545417,"remaining_time":0.1138649819}, +{"learn":[0.597539397],"iteration":878,"passed_time":0.8203150833,"remaining_time":0.112921644}, +{"learn":[0.5974475337],"iteration":879,"passed_time":0.8211387083,"remaining_time":0.1119734602}, +{"learn":[0.5973648148],"iteration":880,"passed_time":0.822098625,"remaining_time":0.1110439686}, +{"learn":[0.5972881113],"iteration":881,"passed_time":0.8229774167,"remaining_time":0.1101035546}, +{"learn":[0.5972097551],"iteration":882,"passed_time":0.8238649583,"remaining_time":0.1091644396}, +{"learn":[0.5971028695],"iteration":883,"passed_time":0.8247139167,"remaining_time":0.1082203782}, +{"learn":[0.5970075276],"iteration":884,"passed_time":0.8256132083,"remaining_time":0.1072830723}, +{"learn":[0.5969448085],"iteration":885,"passed_time":0.8264575417,"remaining_time":0.1063387808}, +{"learn":[0.5968829332],"iteration":886,"passed_time":0.8273245833,"remaining_time":0.1053976076}, +{"learn":[0.5968335648],"iteration":887,"passed_time":0.8282341667,"remaining_time":0.104461967}, +{"learn":[0.5967692857],"iteration":888,"passed_time":0.8291255833,"remaining_time":0.1035241167}, +{"learn":[0.5966935535],"iteration":889,"passed_time":0.82995775,"remaining_time":0.1025790478}, +{"learn":[0.5966234683],"iteration":890,"passed_time":0.8308470417,"remaining_time":0.1016412206}, +{"learn":[0.5965520128],"iteration":891,"passed_time":0.831935375,"remaining_time":0.1007276015}, +{"learn":[0.5964774556],"iteration":892,"passed_time":0.832822125,"remaining_time":0.09978943715}, +{"learn":[0.5964001453],"iteration":893,"passed_time":0.8336955,"remaining_time":0.09884980201}, +{"learn":[0.5963597499],"iteration":894,"passed_time":0.8346064583,"remaining_time":0.09791472416}, +{"learn":[0.5962594803],"iteration":895,"passed_time":0.8354746667,"remaining_time":0.0969747381}, +{"learn":[0.5961441503],"iteration":896,"passed_time":0.836385375,"remaining_time":0.09603979222}, +{"learn":[0.5960515286],"iteration":897,"passed_time":0.8372344583,"remaining_time":0.09509790061}, +{"learn":[0.5959631666],"iteration":898,"passed_time":0.8381841667,"remaining_time":0.09416752039}, +{"learn":[0.5958549249],"iteration":899,"passed_time":0.8391097083,"remaining_time":0.09323441204}, +{"learn":[0.5958251023],"iteration":900,"passed_time":0.8399942083,"remaining_time":0.0922968109}, +{"learn":[0.5957247475],"iteration":901,"passed_time":0.840837375,"remaining_time":0.09135483675}, +{"learn":[0.5956181786],"iteration":902,"passed_time":0.8416924583,"remaining_time":0.09041436153}, +{"learn":[0.5955217787],"iteration":903,"passed_time":0.8425678333,"remaining_time":0.08947623009}, +{"learn":[0.5953823552],"iteration":904,"passed_time":0.8434293333,"remaining_time":0.08853678085}, +{"learn":[0.5952485511],"iteration":905,"passed_time":0.8442760833,"remaining_time":0.08759597333}, +{"learn":[0.5951395035],"iteration":906,"passed_time":0.8451188333,"remaining_time":0.08665496307}, +{"learn":[0.5950566675],"iteration":907,"passed_time":0.845961875,"remaining_time":0.08571419879}, +{"learn":[0.5949382392],"iteration":908,"passed_time":0.846875625,"remaining_time":0.08478072814}, +{"learn":[0.5948631696],"iteration":909,"passed_time":0.8478230417,"remaining_time":0.08385063049}, +{"learn":[0.5947775742],"iteration":910,"passed_time":0.8487059167,"remaining_time":0.08291418944}, +{"learn":[0.5946450491],"iteration":911,"passed_time":0.849536625,"remaining_time":0.08197283224}, +{"learn":[0.5945927187],"iteration":912,"passed_time":0.8504662917,"remaining_time":0.08104114718}, +{"learn":[0.5944767771],"iteration":913,"passed_time":0.8512885833,"remaining_time":0.08009936342}, +{"learn":[0.594375845],"iteration":914,"passed_time":0.8521580417,"remaining_time":0.07916222245}, +{"learn":[0.5942287995],"iteration":915,"passed_time":0.8530177083,"remaining_time":0.07822433133}, +{"learn":[0.594189855],"iteration":916,"passed_time":0.8538657917,"remaining_time":0.07728556239}, +{"learn":[0.5940514923],"iteration":917,"passed_time":0.8546859583,"remaining_time":0.07634449737}, +{"learn":[0.5939805504],"iteration":918,"passed_time":0.8555402083,"remaining_time":0.07540669954}, +{"learn":[0.5938739906],"iteration":919,"passed_time":0.8563802083,"remaining_time":0.0744678442}, +{"learn":[0.5938174928],"iteration":920,"passed_time":0.8573428333,"remaining_time":0.07353972186}, +{"learn":[0.5937350345],"iteration":921,"passed_time":0.8581869583,"remaining_time":0.07260149973}, +{"learn":[0.5936636322],"iteration":922,"passed_time":0.859066,"remaining_time":0.07166639437}, +{"learn":[0.5935815184],"iteration":923,"passed_time":0.85989725,"remaining_time":0.07072747944}, +{"learn":[0.5934893421],"iteration":924,"passed_time":0.8607494167,"remaining_time":0.06979049324}, +{"learn":[0.593449219],"iteration":925,"passed_time":0.8617271667,"remaining_time":0.06886372606}, +{"learn":[0.5933491024],"iteration":926,"passed_time":0.8625928333,"remaining_time":0.06792802247}, +{"learn":[0.5932453746],"iteration":927,"passed_time":0.8634812917,"remaining_time":0.06699423815}, +{"learn":[0.593154078],"iteration":928,"passed_time":0.8643215,"remaining_time":0.06605686383}, +{"learn":[0.5930957201],"iteration":929,"passed_time":0.865213,"remaining_time":0.06512355914}, +{"learn":[0.593017525],"iteration":930,"passed_time":0.8660666667,"remaining_time":0.06418754028}, +{"learn":[0.5929123713],"iteration":931,"passed_time":0.866877125,"remaining_time":0.0632485456}, +{"learn":[0.5928582934],"iteration":932,"passed_time":0.8678081667,"remaining_time":0.06231848571}, +{"learn":[0.5927365436],"iteration":933,"passed_time":0.868666875,"remaining_time":0.06138331237}, +{"learn":[0.592679295],"iteration":934,"passed_time":0.8695045833,"remaining_time":0.06044684269}, +{"learn":[0.5925512165],"iteration":935,"passed_time":0.8703714167,"remaining_time":0.0595125755}, +{"learn":[0.5924919592],"iteration":936,"passed_time":0.8712627083,"remaining_time":0.05858009672}, +{"learn":[0.5924054122],"iteration":937,"passed_time":0.8721310833,"remaining_time":0.05764619101}, +{"learn":[0.5923346481],"iteration":938,"passed_time":0.8729755833,"remaining_time":0.05671087389}, +{"learn":[0.5922318225],"iteration":939,"passed_time":0.87398475,"remaining_time":0.05578626064}, +{"learn":[0.5921497125],"iteration":940,"passed_time":0.8748503333,"remaining_time":0.05485246511}, +{"learn":[0.5920512215],"iteration":941,"passed_time":0.87572475,"remaining_time":0.05391935828}, +{"learn":[0.591994926],"iteration":942,"passed_time":0.8766001667,"remaining_time":0.05298643637}, +{"learn":[0.5918975164],"iteration":943,"passed_time":0.87747425,"remaining_time":0.0520535572}, +{"learn":[0.5917693795],"iteration":944,"passed_time":0.8783917917,"remaining_time":0.05112333179}, +{"learn":[0.5917194456],"iteration":945,"passed_time":0.8793845833,"remaining_time":0.05019742865}, +{"learn":[0.5916583656],"iteration":946,"passed_time":0.8802786667,"remaining_time":0.04926585991}, +{"learn":[0.591580854],"iteration":947,"passed_time":0.8811242083,"remaining_time":0.04833170763}, +{"learn":[0.5915253687],"iteration":948,"passed_time":0.8820177917,"remaining_time":0.04740032389}, +{"learn":[0.5914398758],"iteration":949,"passed_time":0.8828759167,"remaining_time":0.04646715351}, +{"learn":[0.5913587762],"iteration":950,"passed_time":0.88371475,"remaining_time":0.04553314695}, +{"learn":[0.5913216292],"iteration":951,"passed_time":0.8847088333,"remaining_time":0.04460716807}, +{"learn":[0.5912173708],"iteration":952,"passed_time":0.8855774583,"remaining_time":0.04367485891}, +{"learn":[0.5911216593],"iteration":953,"passed_time":0.886479,"remaining_time":0.04274427044}, +{"learn":[0.5910419119],"iteration":954,"passed_time":0.887397625,"remaining_time":0.04181454777}, +{"learn":[0.5909652365],"iteration":955,"passed_time":0.8882579583,"remaining_time":0.04088216545}, +{"learn":[0.5908915942],"iteration":956,"passed_time":0.889102,"remaining_time":0.03994920167}, +{"learn":[0.5908010204],"iteration":957,"passed_time":0.889981125,"remaining_time":0.03901796164}, +{"learn":[0.5906865771],"iteration":958,"passed_time":0.890816,"remaining_time":0.03808493848}, +{"learn":[0.5905654737],"iteration":959,"passed_time":0.8916815,"remaining_time":0.03715339583}, +{"learn":[0.5904341965],"iteration":960,"passed_time":0.8925140833,"remaining_time":0.03622065479}, +{"learn":[0.5903113144],"iteration":961,"passed_time":0.8933801667,"remaining_time":0.03528944525}, +{"learn":[0.5902120949],"iteration":962,"passed_time":0.8942666667,"remaining_time":0.03435915542}, +{"learn":[0.5901522946],"iteration":963,"passed_time":0.8951554167,"remaining_time":0.03342904046}, +{"learn":[0.5900856096],"iteration":964,"passed_time":0.8960375,"remaining_time":0.03249876943}, +{"learn":[0.5899826952],"iteration":965,"passed_time":0.8969290833,"remaining_time":0.03156893254}, +{"learn":[0.5898385582],"iteration":966,"passed_time":0.897803125,"remaining_time":0.03063857614}, +{"learn":[0.5897849396],"iteration":967,"passed_time":0.8987314583,"remaining_time":0.02971013085}, +{"learn":[0.5896595068],"iteration":968,"passed_time":0.899615125,"remaining_time":0.02878025684}, +{"learn":[0.5895739305],"iteration":969,"passed_time":0.90053225,"remaining_time":0.02785151289}, +{"learn":[0.5895022224],"iteration":970,"passed_time":0.901440375,"remaining_time":0.02692252407}, +{"learn":[0.5893844171],"iteration":971,"passed_time":0.9023563333,"remaining_time":0.02599380384}, +{"learn":[0.589284196],"iteration":972,"passed_time":0.9032532083,"remaining_time":0.02506458029}, +{"learn":[0.5891785801],"iteration":973,"passed_time":0.904184125,"remaining_time":0.02413633188}, +{"learn":[0.5891223598],"iteration":974,"passed_time":0.9050166667,"remaining_time":0.02320555556}, +{"learn":[0.5890188244],"iteration":975,"passed_time":0.9058810417,"remaining_time":0.02227576332}, +{"learn":[0.5889523527],"iteration":976,"passed_time":0.9067448333,"remaining_time":0.02134609127}, +{"learn":[0.5888453469],"iteration":977,"passed_time":0.9076269167,"remaining_time":0.02041696541}, +{"learn":[0.5887064685],"iteration":978,"passed_time":0.9084969167,"remaining_time":0.01948767646}, +{"learn":[0.5886411903],"iteration":979,"passed_time":0.90936575,"remaining_time":0.01855848469}, +{"learn":[0.588510144],"iteration":980,"passed_time":0.9102329167,"remaining_time":0.01762938371}, +{"learn":[0.5883941504],"iteration":981,"passed_time":0.91110375,"remaining_time":0.01670047607}, +{"learn":[0.5883016216],"iteration":982,"passed_time":0.9120130833,"remaining_time":0.01577235241}, +{"learn":[0.5882688712],"iteration":983,"passed_time":0.9129241667,"remaining_time":0.01484429539}, +{"learn":[0.5881616955],"iteration":984,"passed_time":0.9137523333,"remaining_time":0.01391501015}, +{"learn":[0.5880908841],"iteration":985,"passed_time":0.9145471667,"remaining_time":0.01298545673}, +{"learn":[0.5879911494],"iteration":986,"passed_time":0.9154051667,"remaining_time":0.01205700827}, +{"learn":[0.5878546188],"iteration":987,"passed_time":0.9162403333,"remaining_time":0.0111284251}, +{"learn":[0.5878286823],"iteration":988,"passed_time":0.917131,"remaining_time":0.01020064813}, +{"learn":[0.5877494643],"iteration":989,"passed_time":0.9180367917,"remaining_time":0.009273098906}, +{"learn":[0.5876096324],"iteration":990,"passed_time":0.9189062083,"remaining_time":0.008345263244}, +{"learn":[0.5874841349],"iteration":991,"passed_time":0.919794875,"remaining_time":0.007417700605}, +{"learn":[0.5873866008],"iteration":992,"passed_time":0.9206342083,"remaining_time":0.006489868538}, +{"learn":[0.587266743],"iteration":993,"passed_time":0.9215325833,"remaining_time":0.005562570926}, +{"learn":[0.5871444457],"iteration":994,"passed_time":0.9224122917,"remaining_time":0.004635237647}, +{"learn":[0.5870732271],"iteration":995,"passed_time":0.9232960833,"remaining_time":0.003708016399}, +{"learn":[0.5869590978],"iteration":996,"passed_time":0.9241671667,"remaining_time":0.002780844032}, +{"learn":[0.58691796],"iteration":997,"passed_time":0.925030875,"remaining_time":0.001853769289}, +{"learn":[0.5868353451],"iteration":998,"passed_time":0.9259231667,"remaining_time":0.0009268500167}, +{"learn":[0.5867894654],"iteration":999,"passed_time":0.9268122083,"remaining_time":0} +]} \ No newline at end of file diff --git a/catboost_info/learn/events.out.tfevents b/catboost_info/learn/events.out.tfevents new file mode 100644 index 0000000000000000000000000000000000000000..18f91a65b8a8eef308a7444f32074200b8dbb731 GIT binary patch literal 54870 zcmaLgcU+Hc_&0DXvS(IC$e!7o5OE_bq5GEX8IcsBk~C-tO=+r-Q5xEcrWR#|6p=Jk zltg}iJUvgJ>-Zh#<3E4AU!U{3zSs9WkMlUMFN)3n&z}XOjaRg7*34MFa^q{|QGMF= zYS(7@!Cm_g9yuZxxJ7B+%>Vm0Px+%&!y3&IwGYkypXt(Es`hLIRb4c9 z8*De&@T#R$wU`E~Y|LU6UbT{{Ph&x4g&5@UN=B+)4FPo~zxpn(T1(Z`UZCdXcpLGm zjZ~eM0oAL^YGYo>O4ZRn6PiA++cE`jdDT{`7F2^;-|=f#UbT~|-i4rsZB)C;tM*d0 z^EIeT{U#0KRR^h>o(d|`GSY`v9i{5}15hnZ<~H!ElT`Txf~uBVKaf|QrRuF0C@;C5 ziM;9}Rb3oGd7Sd@!Kf9R2$-uewXsBSTP;C+5cTs)tnR z9|bjO)be~@$w`&b9#Fxp7svCer&RfF26gDwxn{iTB~_N1pyDE~&gE5asoJp`)G+Oy z?|Icns=Sth8u+`go>zUPs&F1ClXl%l@Je2)%BFyNXXRPLtA0{7Z73*v?{0;>>MvE% z@}Qd4M!N87fK*ww2PL;i#^buJ2&>$TNKc{M_+-0y>GRjVo(;Yg|49SEv;xzl|38JS7^ym93hGY$X+2(zl`2;QP_}A2M)PW%R2@19N_qIN0A7uk zs(>A!vT_bM@M?lo)olh98|$%`S4vV9xdxP4QvZ{@nkZG(^Fh6R(^;_UO_Hj$Q$Z!G zl)d4zCQH@O@t|7o*KW?MDNc=(Bz0FM{t@x~2QWaVOD#O+~mshi;s-^(c znm(QNc{N9>l%9ifkkw1z)m*8{O$K$f)%A(InkQB5VnH3t(7(*9`BL@%KBzG>Yy|T> z*|qKP1-0$ialr@|NV8PjKpAX$BBRi+J1GhC$E-BmE0asgC82D@=8^z+%!RbjI$R!hfAfZ(@IdE{A7CZ zS<9sAKNV22yWg(o)jv|Tdp0O1h1(^(S}s*a(?B(Z8>#bZg;eDX1GVtUo8G)yDOG>_ zgWA1v#Xr1Kld6dBpe`OgsmZHVQWeqxl%86DLDp)ia%u%CJStO*&srl@d4I+>&4-UJ z*8btuTB%b12`YP=ilBS2PO83@gOYEXWWr~uOO;n4sNDJ_XI`zBs;_TAU2~i%SSvN8 zYJV;$cb%(y`K%36)i)KCRl^buUTu`Bumn((-zT2t)h4M@ybo&PU*C7U(v+&Jw?H{` z%oKbp|COq}zMvw_{dV$M|4EhpRZy23HWlz{vs8_{0&4%(Lw>x{lB%Otpc;Bk9mT6H zQe}J^R7zar172xM)i*;>O5rj;d9_ulR_lP;KI!JayxJyJ7CS)&E&M6yZ)}&U3!6dB zRqz?kXYG(GoeiMWy=yk{YNu3LtOT`lQsvz+ zrfJ45NFVf-S2|MV{}WW|gVL$IIw)18WuUG{7>4lbkW@u{0JW$3!4Y2RO4W^bpgeLW zjpfy0shXGxYW2*~+jwa(lp3$OH~>PQTzb2Aq#;?+^98Xp2mw@;7RywaDd z!T?b9I))LvIwn=F9-tgTj|*lS1F0%@0+pFRQgEJPC{=GRf|AR6n$C~#xKtfF59;NY z2T{B_Ayq-AKn*tACU_2wq)N#ERD+J*6+Y{vRDIF`wZkjm60c54)tv31f;xH#=BU$B zHE=5^v!@g4hBuyMMHbv!+;oyN~JDYM&SL%!aUUUx2+UF<#0uTf(}20JiDBdPknw5oYuP z*u2&jA9-d^*rRMRywib&_wcyLGY7)lQh>><>bH((mk9Gn1ol{|eiqLz z6Q+^??BD?>51w5i%qJSyZu!2(JaZ&$Mi8)jiYLbM%!#mmw}35PRk)02&V(8G08_45 zevoG_ggtczc1BHhFV9>F^Kk%HRIw-WFJ6{sR|#8U3e3&6?Ps336Q+C$ z*wWD>*YNBbVJ-&1G}I5j;+Y3wb~?Zc0}|Tt%#*OLof({2*hNdZ`1XS3%#yG7XQ z-oOroY!?(yfrOcN0jA!+yAz*wo3K<_U|nzM2=3$^!qWeaYFdPk?wk?Fr`;v&!Y^RC zp$dXW`5s}8-+@i?*bu;{1rgT%8?f-JNgH?;Ojzw_U>a$`K|H%pSZX1#${mq{v=G9) z-vCp|*eEDxLJ1p`18mQr30C|d!w5V41en*u3f+uq^Fv1vX-^3Y>I7_g_#;6<|BSHvvcN|7Fzn2y4>8(09$y?b}T_92h3v#)@e?OiM=vELAOI|o?S^(%sXz+1v{(t*iGqzS%n?+Cm1 z7})sMAF}vcl24dRJg`@rbh`5FJ!KKVj$1hiHkk#4`Gf##@!jPSpH@iNlOSNnY86lL z>;qwTfxzPSp6|}HkA#)^1MBqJEuUvagq`pJ=CXUvex7|IEXfJjVXvU0Jo`-8BnMzI zO5+#tteCLV=YbXcuvpErFN6&~15CT;quo3!Ax!lYu#t-0)Oq%mus7pU05)m3Ycii!LDKg>pMafv*<&c5c9yVL`M}2eydTLkbHa|j2G+6JlpLO& zBW(0DU=w7T8}ZD7Fpp$lJEAT`@ywF2gvY=R?>?WzGb_Tj!~;utUl+|YYr@t>0_!(d zzL;m{2^;bN*mGH<(LB3A*pFafE5^v|;h7C#p@G1jTZQE;x|6LRh6aFb#9#Tt3Z_un(tzDO$G?On6R&X&D0Bnf4@sPje>h-BDnt zgZszw%!RPB&4;kD<00+em`{Sr+?TKkV}NDuDp<~^T_?(vV03r#qz6Y%9>FICyK}HeQ5C}|Jb?QGnizZCvOKHpwnAKSnnIaZZ4WNpHKTl*lG`8 zo$f5%&9l#hr8xt0d}Cn7vtq*bUj}y4!6BSyUkLlx4p@;*uwalSgc(``yItIN9iR4< zuw&<^aB3w;az6P+#(-O||gZxg| zmQ}#q((c6b><3|Y{sFerKvZJa5cX{`uugkBR`O}Jgy}B=me`^5AfEjs?C3mT6Er6Z zI=yv-O_>I4uenz@KJ6D_iAun>ZyF@nztt1gV;nH!jW#}f+Hb<{jsO;4Rxa4T{UPke z5MXtuRgL(x2Fm&ZOVf1_?5O?{rraG^xXC4XKFyf?^NOZzfhiwvZo)GY!ZKO`Gx|AA zaBgZ!Sew5?o2sDq9&x+)v@?Xo{sFe(`~txXK4yd+s0DWTXD`74=vl%ZR|8uyXKfZg zNOQspOM%TFS0mU_og+-O2-rNiA&dAl3&MI80Lz*(Q!oWt5~h;}tktpt!IE!9SWFHu zqn-AJ{2;9fi%ti&b%*jLo}DMm^${@rSkadD0%3=ufpuP-DfpV&5N7@WSg?Wa9e$9u zgxLlIYnx;`m}ho`wYvfALe<-Bp4k)j+Z)(`yv~AV+(p7VB2&`S{Ets_AZ)iQqg->%Ntfw)sNIQ4IQL+9Rqv%XcQM_#m)5Z(Z8)gLEP6?=E0{3Zq1KkXEl#fVr!oH5VmPFu+Dk21cyz&glP{2rkwHM z51)3OFq3}3TE{J$%rig2s^oy_<}ZH9Gk?M=x&SNd6)E^3TL57n+5=k?+W9V@c7w2l zHo#QYYYWb(ZW3159N5B(mj%0yTZFa$qu5jh=>``FK7c^N>V5$G_IRP73c5{L&q`qb zX(;sNZ^<3Pv_1p#+qd>R&+Zbo;{&jchwiQC**(JgyatvW*~X1$L6kiQ=CJEOLGct! zSl_3>7W-xg@M-r6Tb>3ia^R@}JPRSrG7;Fz)Zc>lf&NhE4+z`q5A4TgS#6$05T@?~tVDHLFP=pb*6$jySc5)-=0Fr- zhg^Y;s2O9*r$rOycoA50^ZP$}7DL!j8(?dSOLp=smM|?VVBKc8p5j>?VLgq36~qP& z<=I2Ro*W0}S79rdOX3O3(*ssKqi8ChmOz;00bn2H+m7JbBf{Kv0Gl&ERL~85OqkAp zz>0q@6>NCxnF!1$KMKbiu1q>4c>W0H)U?L$HC)AS}Np zF!SjX-T6Ug66W0*n9r^!20Y6mOhXn}_O<()d6rFBRdZmfB?0ew_LQ)}^+TE}1=Z)q zg8kbw!q$`lt5_#`dn|{ruwq~;39kgFM!AHk7XYhszW0{Dw&#Sc$pdCO>P`^PUJ#~` z4eV&b<99rJN!a}-z)ZG>3wHUh2rEhf*5~UA!CC%m!t@>iD>3cxmmg#vVcs#ow1%#b z!6UtsQSw|MX@pRoDvz!G=rFXP#J!u*_o z?OSMX#Ipjz{Oy7L`~0lnP8JeoYXz)A)B7Bs_JJ@DGhi9%W-WO3k+8?7fsGrPtj@C{ z!b*<;`)em}!Lv_uYeN?6@eV5vK&2>M*5gxy#GEHvwEHJ?^SnAa>|pI&qlOy=c; zsZ9pft)tm!KCObVC1Zi*>E>_e**C%t4+oa^c8Oq1TS-{A0l=1Z_%WYPt0K&(7qGnp zHVKyeYRWnR8*w5kk5Btf*oij4F3mL&6!bp`JJlSRS~Hg+d|C}*%l`~+TDx85y4>Vh zEn#j|z;bPZJMru%Vadh7Oslfq@T`uo$UvtNXLd=2bdsD&!e>Iv(U18khT zr{Hw`H({%jfn79G*~X{+AuR79u!s2`f?iMqVf&+j%}w~L#HalwOf?Kx&C2_NNx_)> zM`c6q04u9Z7Mur|5H{HtSXzU&pwnwg*hDvASrcZC=dbMyVNRETl}K3M}( zJNQ)adz`a`EjH)Lroid5PHVeWu4*=VITTigd zw!2Beqhve6hK>TZ#U)%&E87$Hb0Dx?{cPs) zgS<$XsywjQKDG`#b093cJ22H&<$^uVCBhcT0;^5<6;{I@XU>{%};?1K4)srv#W$vB?C+7;!?mfcf#xwfW7|XBUn1F5jHgj zSmtqcL08R#u!|AEDx=3}@PqUuEG`(>IIHq7o_P`W^aim0y|)Rj&6}_>p1`)YN)ntc z`Ve--5t!`iMW*~9eF>|w0#=aN)0b!02}>{oHaaEi1<(8l(=`G%G{IW1Tl6RFlpe6p z@}ifj0|@)I3s{@a5rQr44Z zgcYa(b3J(aD4%wlu*ZvmHJkcH@VVU~EL<5_+nuXN@o9GnGnfIa-3k8@JiABO^@+d? z9l8igwIIT@#{l#CQf9)Z1rxSrB(R;c90j|@`-CYE0hWDDOK@lrLfGa$z=~fF{K^k9 zl(2`LfXUw6@Q7z&gl%gB%*|!`C7y*7*1QF`T2>zws^vhgaA|Ruu(86BoOxg zHZb>S2LXFT*i&C%ri#r4U!2E;m0bmP_u5gxYMMyc{>#8TZf_dL-;yN4TG;@*;Z-0g z=#vS1c@~(X)^1NeErl@aQ^3v}=?Y4|UzqU-m&Z+_1ctTEamY+q~I#pmH?iQ!{ zv~0q(W&w-5srQ>_PYF{~0_NBG>wca+BkaIvU~;dONAfI(F!!OrM%u0S;aM(WUk3pD zID6p@o;@clyBDy81a(1U{{>;Qy8;{LKfWEG_L4Azj=c5>s{E5c-DfVsN{2_EIw zgl+meuxVKgzpXrlPs<}r|2MGyRVsod{|#Yt>VV0H?h>4vz9lTU3RuUN>dp8;z9Vcw z39w7PiGriJRR84LWk~r+DF2!Bm-M{YNry!WY8sTnDzLOzR?_Rzg@C4`3BjMQYehOHUd8yz9)(XO6jDT&hNxsex@*80uhQP+m zFcB2=m4vw;0(QV;ieM*PMcBW)fo)oMT#!~x*y`=TEb_W)^VjyBur6DG9WdA3!m}TQ z$!Y?NFq?giXElVKSqrRB&$)srsFtvH%Yj9mcrVzl|0K*%1z5D6wqW~EN7(lHz{1uJ z6;wgL2pcs6*u5Mh!P;F`CYJoQT_DUq1eku+w{<+TA*}5!U^9D}De}ygummq)^}F^8 zmJU0@j$H#bq2ucBe40IB1KfbAwn`JcJ9Ck+4UWK)@5ssVX%2*y*#qn1v*bCa_;ij5B%WNm$lIV96SCwmkD9 zZ1h-Q)1xf}=ce9-T~-9KpRi*sfQ>z1B`9YC2urE!-?ZdsCwe^R({2z}TM2BDM~Yy{ zze(7C<-k^3AI;&@ZV?t#1gyuQBEd5mNSNn)V86RMMDl6333JW^W>*|*!?Qbtt<43N z?fBnhp4}zv>l0wk=Z4qu>>gpQ9|QXk>{`pSAj0$?0vo4h8~ic`0iR&q4|N5ddt^^N)gNTo_@OJ%NSQY6<4aaKg5_1Jm@a z7{d?p0b!ZWz|`%^1aIm@5Vpku*sX>@r1qF04#X)j>~*n0%85sfGO`S7Szg*2y^`n0CPKJlQ^+XX%7FHwR{5A=jE`8H6=7 z^lMu3_a1uMjc1vJjsFR(jk=Ev&$0*``5oB%4|nL&(fDy^6DD5-P>={7Gk8nKuqHhcMk-U^)|gkMe1`gssU0=JfiZJBR&H5up`;(0yKptTq zZvmTOvqHe$5H|ffFr{g_f{*(xVb&hN6tvC=(%unf=?v_K?V~IFEy*WL>k_cESa!8}<&SQ|57r*==HMQ>wTAz|^xz;2Zy&2Dn35(wk zEWY2W3Z8u-Z1E0YM_OE?8?nY~Dg2Cy~5-qU)rk$ofVpGm;ZYq`;S zvXNC1RyGRQCYQQ6{@SVtlOF=i{n*A>o>dcOA`i?gQC9FZ{Z3d+4`3TqqSN@aAB3fJ z09NjpLw`2ccuQ&sbCm&>sIco5pH@ql|6lp0a^~m1A@o(L#dFTM>zfr}wHCmlVs;3Y z4r{{v&j34qeNtO~kmm_=G6L47nKkWVH+};y5LR^zSnCs^i}*Af!mb?#rtCGAp5rv8 z*%D^67nsZM5_vw&j(nI;iG<(8+YXGYW8%$g6jqD;}+g1Tni8vzI2|Ezx zwggzs$p6;!*LI08ePv+o)uKCjnXrf%z|Mvz`tfO32-~j&Y}~$XCwb;bSj`AvtD=qw zYAz?jN(KY#waDC+Pje>htURzT4&NX0%!M$yF2FXoo8`bWSHi;E0n-fX|D9)UgxR(P z_T%S9dP>{)a9t%#?^oZZN+D{P!vj9eov_Ze!1j#G*~GJJgdM2@mJqL>&NC0fLd$?< zZVm0lGf%=2N`RG(zA4yIc@Z}KBe0GxMo;-PZ^8oJ0o!HP?iSB{2y6Wu*tl{f`dUik z=jKaTRu(Xw;2B@|wCjYaCjo0YtU&O^@gpoT2AH*V=azh$KVfsjfZgh)-j`GduEw zyiJ&+9k4T#Wayg%jZeuP!md~X^F2B;kWafySiKprr=cN&LEa?JJ z83IcV_S(m@V8Z@64D8^M2YYySpRfQOV9|5*F7PabFz21fuB@NWvrxiRw18b~5weD7 zVTAo!2TWNdNl^5L6Xv-J*gU^Kf~DgDVVX;Uo&9)eG(X4)!Vb;{HecSZhG&t4Y0m`K z|8YNAo<$L+I|NESfN#vB0{W@QvnK3}M?8f!!FmY6{O{3A;83*gc~{eV)Y; zcBntF6Y45Yc=nL6y?ub?hmBdyvv|Tny8&C6zJtD0-8h#d5N6jA*c_$P^h~&sJtAye zTVU$FPU`Z5d`wt=b6~~iqMdn`NSN85K27D!tK!M~d6q<&Nj)$x?>s>ZDVeaKT3|IZ zeFalc3Sl!Ufo)bZP~r!fO4z4zV8OFe1zXxQ!b*#Q=?pCU#-}|YY)c`qE_c^D@+_UO z$*+Oge;5(Ovkb!eya1+|xJ=Mf$Rw=WGhk<1Z=YgjR78lU!>uq$VQ zoej+I$Fn@ba!i2D-hH*0XKx6beG*uJs@GPYy(R3yFfTCc=my?vSq-E zE3^eY^N)nZD+AN}{=a@H-#7&o5q5ntFzqrk`bJ|T`$SmoIAG6L92e|_KND6n99Wp@ zH!uE{6cg5c2(aYadj+%d7s7t_2IfCH^D>`SLRhOFzy{9@?7_3IgoU;TwpC@E5zk5q ztC0a#aKu+oy_OLc(9pZ7z}OZT?8~Q>6SmU1 z`t-kEm1=yrDhYf48JL;=)ye#|RS_0l2u#=h{7#-#6Bd;RY{J(MS9tcFFr!>xrsInN1 z2TUPXZy3*h5whih>>JoFp4ju=#vdDEV zpLUM00eZmd2aFlQGYi6g?FE+I{-B_ou_SEjR$$F`7#8tqR)lrY1g6nmPEdwg6XvB3 z?6ca-6h7@dVfib7wdnA10M9NE_FWa2!|}jQJhLHe!$M#`-1OV<%$6|!nZR~fl?!f( z9bq%40n<90!t5Rcli8tgjAy=tU5*Ck|HiM9XV(eKeE=+G zQ7gf&!;i2-_keBJG!(QV{0XxO1om;cXzdOltk4fw=bK@I?fMPE=6VC`kUC#*-hGoW z6E|Q-XL<{oI=2W@a0J%3-$+5t6-d}kJ78VcToNoDw+X9156t%IaY6I@4q;B_zzSDy zFz26=yM#?T1#F(Pp8<2rJbGwtT&{;F%02?4>TSt(_M|@M-r6 zo1z13;?AP0JPRSrbvLjxwr_j#ER?Wi+kh3Ud*sctFv9Y-0Gpw;@e>3!Sln7*J==+1@QEPId?hfWfGok=W08cNUJ7iA;%ULRJBqMdi+~MEh*ROOEt;^X zxxnUc^*O_{7{X>x1JC%r3^U=`Bf?&H2DX2Z=nbpKgvqxBmhVy`sJRje3;5f! zsZ?`rTU*T!GKsLEzkv;U8ZOvTB@&m`8dP3A-2rtgu0~fM-t$GYA3Zt2M`yXU_;YY-zy{@-<6%y7*4cLl}qXbL-2f}og0sE%9Z#19wk+AOzfNkzEra#Y$2veR9%qg{DD$hO< Y_F^Wm=aC9#Jo`-8^J&2PU-4Y None: for model_name, model_data_path, model_folder, mode in iterate_model_folders( input_data_path, diffusion_model_names ): - print(f"Processing model: {model_name}, path: {model_data_path}, folder: {model_folder}, mode: {mode}") + log(INFO, f"Processing model: {model_name}, path: {model_data_path}, folder: {model_folder}, mode: {mode}") # Load the data files as dataframes df_synthetic_data = load_dataframe(model_data_path, "trans_synthetic.csv") @@ -110,7 +111,7 @@ def run_attack_classifier_training(config: DictConfig) -> None: """ log(INFO, "Running attack classifier training.") - data_format, models = ( + data_format, diffusion_models = ( ("single_table", ["tabddpm", "tabsyn"]) if config.attack_settings.single_table else ("multi_table", ["clavaddpm"]) @@ -121,8 +122,8 @@ def run_attack_classifier_training(config: DictConfig) -> None: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - for model_name in models: - train_features_path = features_data_path / f"{model_name}_black_box" / "train" + for diffusion_model_name in diffusion_models: + train_features_path = features_data_path / f"{diffusion_model_name}_black_box" / "train" assert train_features_path.exists() and train_features_path.is_dir(), ( f"Directory not found: {train_features_path}. Make sure to run feature extraction first." @@ -148,19 +149,46 @@ def run_attack_classifier_training(config: DictConfig) -> None: classifier_types = ["XGBoost", "CatBoost", "MLP"] column_types = ["actual", "error", "error_ratio", "accuracy", "prediction"] - results = train_attack_classifier( - classifier_types=classifier_types, - column_types=column_types, - x_train=df_train_features, - y_train=train_labels, - x_test=df_test_features, - y_test=test_labels, - ) - - summary_file_name = "attack_classifier_summary.txt" output_summary_path = Path(config.classifier_settings.results_output_path) / data_format / f"{timestamp}_train" output_summary_path.mkdir(parents=True, exist_ok=True) + for classifier in classifier_types: # XGBoost, CatBoost, MLP + for r in range(1, len(column_types) + 1): + for selected_columns_tuple in itertools.combinations(column_types, r): + + + results = train_attack_classifier( + classifier_type=classifier, + columns_list=list(selected_columns_tuple), + x_train=df_train_features, + y_train=train_labels, + x_test=df_test_features, + y_test=test_labels, + ) + + trianing_directory_name = f"{classifier}_" + "_".join(selected_columns_tuple) + trianing_output_path = output_summary_path / trianing_directory_name + trianing_output_path.mkdir(parents=True, exist_ok=True) + + # Save prediction results + prediction_results_df = results["prediction_results"] + prediction_results_file_name = f"{diffusion_model_name}_prediction_results.csv" + save_dataframe( + df=pd.DataFrame(prediction_results_df), + file_path=trianing_output_path, + file_name=prediction_results_file_name, + ) + + # Save scores + scores_file_name = f"{diffusion_model_name}_results.txt" + with open(trianing_output_path / scores_file_name, "w") as f: + for score_name, score_value in results["scores"].items(): + f.write(f"{score_name}: {score_value}\n") + + # _________________________________________________________________________________ + + summary_file_name = "attack_classifier_summary.txt" + with open(output_summary_path / summary_file_name, "w") as f: json.dump(results, f, indent=4) diff --git a/mypy.ini b/mypy.ini index 10466223..9854213e 100644 --- a/mypy.ini +++ b/mypy.ini @@ -42,3 +42,6 @@ ignore_missing_imports = True [mypy-faiss.*] ignore_missing_imports = True + +[mypy-catboost.*] +ignore_missing_imports = True diff --git a/pyproject.toml b/pyproject.toml index f55eb2d2..00fdad2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dependencies = [ "pydantic>=2.12.3", "filelock>=3.20.1", "sdv>=1.18.0", + "catboost>=1.2.8", ] [build-system] diff --git a/src/midst_toolkit/attacks/ept/classification.py b/src/midst_toolkit/attacks/ept/classification.py index d5a6adca..3574ec17 100644 --- a/src/midst_toolkit/attacks/ept/classification.py +++ b/src/midst_toolkit/attacks/ept/classification.py @@ -1,10 +1,13 @@ from logging import INFO -import itertools -import pandas as pd + import numpy as np +import pandas as pd +import torch +from catboost import CatBoostClassifier +from torch import nn, optim +from xgboost import XGBClassifier +from sklearn.metrics import accuracy_score, roc_curve, auc -import hydra -from datetime import datetime from midst_toolkit.common.logger import log @@ -21,49 +24,164 @@ def filter_data(features_df: pd.DataFrame, columns_list: list[str]) -> np.ndarra Args: features_df: The pandas DataFrame to process. columns_lst: A list of strings specifying the types of columns - to select. + to select. Returns: np.ndarray: A NumPy array containing the data from the selected columns. """ - suffix_mapping = { - 'actual': lambda x: not (x.endswith('error') or x.endswith('error_ratio') or x.endswith('accuracy') or x.endswith('prediction')), - 'error': lambda x: x.endswith('error'), - 'error_ratio': lambda x: x.endswith('error_ratio'), - 'accuracy': lambda x: x.endswith('accuracy'), - 'prediction': lambda x: x.endswith('prediction'), + "actual": lambda x: not ( + x.endswith("error") or x.endswith("error_ratio") or x.endswith("accuracy") or x.endswith("prediction") + ), + "error": lambda x: x.endswith("error"), + "error_ratio": lambda x: x.endswith("error_ratio"), + "accuracy": lambda x: x.endswith("accuracy"), + "prediction": lambda x: x.endswith("prediction"), } # Filter columns for each type in args.columns_lst - selected_columns = [col for col_type in columns_list for col in features_df.columns if suffix_mapping[col_type](col)] + selected_columns = [ + col for col_type in columns_list for col in features_df.columns if suffix_mapping[col_type](col) + ] return features_df[selected_columns].values +class MLPClassifier(nn.Module): + """ + Multi-Layer Perceptron (MLP) classifier. + """ + + def __init__(self, input_size=100, hidden_size=64, output_size=1): + super(MLPClassifier, self).__init__() + self.layers = nn.Sequential( + nn.Linear(input_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, output_size), nn.Sigmoid() + ) -def train_attack_classifier(classifier_types: list[str], column_types: list[str], x_train: pd.DataFrame, y_train: pd.Series, x_test: pd.DataFrame, y_test: pd.Series) -> list[dict]: + def forward(self, x): + return self.layers(x) - all_results = [] - for classifier in classifier_types: - for r in range(1, len(column_types) + 1): - for selected_columns_tuple in itertools.combinations(column_types, r): - # import pdb; pdb.set_trace() - # x_train is a dataframe of 5000 rows and 28 columns (account is included). 5000 rows correspond to 25 shadow models * 200 records each. +def train_mlp(x_train, y_train, x_test, y_test, device, eval): + """ + Train an MLP classifier and evaluate it on the test set. + """ + epochs = 10 + input_size = x_train.shape[1] + model = MLPClassifier(input_size=input_size).to(device) + criterion = nn.BCELoss() + optimizer = optim.Adam(model.parameters(), lr=0.001) + + x_train, y_train = ( + torch.tensor(x_train, dtype=torch.float32).to(device), + torch.tensor(y_train, dtype=torch.float32).to(device), + ) + if eval: + x_test, y_test = ( + torch.tensor(x_test, dtype=torch.float32).to(device), + torch.tensor(y_test, dtype=torch.float32).to(device), + ) + + # Train the model + for _ in range(epochs): + model.train() + optimizer.zero_grad() + outputs = model(x_train).squeeze() + loss = criterion(outputs, y_train) + loss.backward() + optimizer.step() + + y_pred, y_proba = None, None + if eval: + model.eval() + with torch.no_grad(): + # Get probabilities + y_proba = model(x_test).squeeze().cpu().numpy() + # Convert probabilities to binary predictions + y_pred = (y_proba > 0.5).astype(float) + + return model, y_pred, y_proba + +def get_scores(y_true, y_proba, y_pred, fpr_thresholds=[0.1, 0.01, 0.001]) -> dict[str, float]: + """ + Calculate evaluation scores for the classifier. + """ + accuracy = accuracy_score(y_true, y_pred) + fpr, tpr, _ = roc_curve(y_true, y_proba) + auc_roc = auc(fpr, tpr) + + # Compute TPR at specific FPR thresholds + tpr_at_fpr = {} + for threshold in fpr_thresholds: + tpr_at_fpr[threshold] = max(tpr[fpr < threshold]) + + scores = { + "accuracy": accuracy, + "AUC-ROC": auc_roc, + } + for threshold, tpr_value in tpr_at_fpr.items(): + scores[f"TPR at FPR {threshold}"] = tpr_value + + return scores + +def train_attack_classifier( + classifier_type: str, + columns_list: list[str], + x_train: pd.DataFrame, + y_train: pd.Series, + x_test: pd.DataFrame, + y_test: pd.Series, +) -> dict[dict]: + """ + Train an attack classifier for EPT-MIA attack using specified classifier and specific selection of columns. + """ + log(INFO, f"Training {classifier_type} classifier using features from columns: {columns_list}") + + all_results = { + prediction_results := {}, + scores := {} + } - selected_columns = list(selected_columns_tuple) + x_train = filter_data(x_train, columns_list) + y_train = np.hstack(y_train) + + x_test = filter_data(x_test, columns_list) + y_test = np.hstack(y_test) + + assert x_train.shape[0] == y_train.shape[0], "Mismatch in number of training samples and labels" + assert x_test.shape[0] == y_test.shape[0], "Mismatch in number of test samples and labels" + assert x_train.shape[1] == x_test.shape[1], "Mismatch in number of features between train and test sets" + + assert classifier_type in ["XGBoost", "CatBoost", "MLP"], f"Unsupported classifier type: {classifier_type}" + + if classifier_type == "XGBoost": + model = XGBClassifier() + model.fit(x_train, y_train) + y_pred = model.predict(x_test) + y_proba = model.predict_proba(x_test)[:, 1] + elif classifier_type == "CatBoost": + model = CatBoostClassifier(verbose=0) + model.fit(x_train, y_train) + y_pred = model.predict(x_test) + y_proba = model.predict_proba(x_test)[:, 1] + import pdb; pdb.set_trace() + + elif classifier_type == "MLP": + model, y_pred, y_proba = train_mlp( + x_train, y_train, x_test, y_test, torch.device("cuda" if torch.cuda.is_available() else "cpu"), eval=True + ) + + prediction_results = { + "y_true": y_test, + "y_proba": y_proba, + "y_pred": y_pred, + } - x_train_filtered = filter_data(x_train, selected_columns) - - log(INFO, f"Training {classifier} classifier using features from columns: {selected_columns}") - results = { - "classifier": classifier, - "columns_lst": " ".join(selected_columns) - } + fpr_thresholds = [0.1, 0.01, 0.001] - all_results.append(results) + all_results.prediction_results = prediction_results + all_results.scores = get_scores(y_test, y_proba, y_pred, fpr_thresholds) + return all_results - diff --git a/uv.lock b/uv.lock index c7985e19..d5433ebf 100644 --- a/uv.lock +++ b/uv.lock @@ -143,6 +143,31 @@ filecache = [ { name = "filelock" }, ] +[[package]] +name = "catboost" +version = "1.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "graphviz" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "plotly" }, + { name = "scipy" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/ee/8f146ee0b5c6321d4699edd90a036fe68b2c5fad910fa2b369f14043c192/catboost-1.2.8.tar.gz", hash = "sha256:4a1d1aca5caecd919ec476f72c7abd98a704c24fda35506d4d7d71f77f07cb29", size = 58080776, upload-time = "2025-04-13T10:14:19.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/88/ebc0a95d92b9090e6b17a55ceda950d3cbd1ee545286798e8355590501a6/catboost-1.2.8-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:29f93b4a89ef807e74c16882623c89f1fb781346e1f4fafb29b6949ab4603e14", size = 27843240, upload-time = "2025-04-13T10:12:52.6Z" }, + { url = "https://files.pythonhosted.org/packages/be/d1/06142eecc68405b1ded7691fedc6639c6ae35b1d1d9e322ed45f6ee1ded3/catboost-1.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:932542f8b416b43ee07f912a9a964635ccca7397da16b61475c76ae4ae96a1df", size = 98726147, upload-time = "2025-04-13T10:12:57.038Z" }, + { url = "https://files.pythonhosted.org/packages/ce/39/22643f61f2b6526f5fe5985b4e3ea1596fc5c8dbe635cd88e8ebbd2dfcb7/catboost-1.2.8-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:35a70d32809a21d06dc0ba161bafdd0450ea71fe176a12ee85d7535883b22624", size = 99167436, upload-time = "2025-04-13T10:13:05.31Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9e/feae59f6226f742fa3fa30ae126e0941f443d460e7c0fa9f79cdf3ee488f/catboost-1.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:319086796084fee5e4254300dc81aad1ae0b201cb576a9e87e6c7d030483be7e", size = 102425363, upload-time = "2025-04-13T10:13:10.826Z" }, + { url = "https://files.pythonhosted.org/packages/f0/5a/077dd8f35de4f10c934da703bd186b2e85223372886d285edae8f42f75d1/catboost-1.2.8-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:777987e1483824f93b9cb904860ef46dfb3cd184f879e47413bc7163b9514830", size = 27789594, upload-time = "2025-04-13T10:13:15.704Z" }, + { url = "https://files.pythonhosted.org/packages/6f/73/06959c42d797c3e207c352f6050180b2217c6709d261e5f4a3d77dcdd067/catboost-1.2.8-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:a72681c50cbfe2fa4a6f85934bc707e0f7ff50a10a51801317418adf09d57cef", size = 98718946, upload-time = "2025-04-13T10:13:19.714Z" }, + { url = "https://files.pythonhosted.org/packages/0c/4b/d04e067df4401902cb2249df241bc1502bf90e990c6a3da5f82ba7de60fa/catboost-1.2.8-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:8d2b58781c7ff2f974bde857da0d10d867366979193a4e7052746330a8b76b55", size = 99162049, upload-time = "2025-04-13T10:13:26.249Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bc/35f50d1c6d898eb05d3ad3001b479cc6a837f6829a0ed68e6993e31da16e/catboost-1.2.8-cp313-cp313-win_amd64.whl", hash = "sha256:9c04ab1df71501d75cad80757f33d60bab2704b2450401d2c8cf3f3bcb6bd9f8", size = 102416981, upload-time = "2025-04-13T10:13:31.721Z" }, +] + [[package]] name = "category-encoders" version = "2.6.4" @@ -761,6 +786,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/0a/a3871375c7b9727edaeeea994bfff7c63ff7804c9829c19309ba2e058807/greenlet-3.3.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b01548f6e0b9e9784a2c99c5651e5dc89ffcbe870bc5fb2e5ef864e9cc6b5dcb", size = 276379, upload-time = "2025-12-04T14:23:30.498Z" }, { url = "https://files.pythonhosted.org/packages/43/ab/7ebfe34dce8b87be0d11dae91acbf76f7b8246bf9d6b319c741f99fa59c6/greenlet-3.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349345b770dc88f81506c6861d22a6ccd422207829d2c854ae2af8025af303e3", size = 597294, upload-time = "2025-12-04T14:50:06.847Z" }, { url = "https://files.pythonhosted.org/packages/a4/39/f1c8da50024feecd0793dbd5e08f526809b8ab5609224a2da40aad3a7641/greenlet-3.3.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8e18ed6995e9e2c0b4ed264d2cf89260ab3ac7e13555b8032b25a74c6d18655", size = 607742, upload-time = "2025-12-04T14:57:42.349Z" }, + { url = "https://files.pythonhosted.org/packages/77/cb/43692bcd5f7a0da6ec0ec6d58ee7cddb606d055ce94a62ac9b1aa481e969/greenlet-3.3.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c024b1e5696626890038e34f76140ed1daf858e37496d33f2af57f06189e70d7", size = 622297, upload-time = "2025-12-04T15:07:13.552Z" }, { url = "https://files.pythonhosted.org/packages/75/b0/6bde0b1011a60782108c01de5913c588cf51a839174538d266de15e4bf4d/greenlet-3.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:047ab3df20ede6a57c35c14bf5200fcf04039d50f908270d3f9a7a82064f543b", size = 609885, upload-time = "2025-12-04T14:26:02.368Z" }, { url = "https://files.pythonhosted.org/packages/49/0e/49b46ac39f931f59f987b7cd9f34bfec8ef81d2a1e6e00682f55be5de9f4/greenlet-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d9ad37fc657b1102ec880e637cccf20191581f75c64087a549e66c57e1ceb53", size = 1567424, upload-time = "2025-12-04T15:04:23.757Z" }, { url = "https://files.pythonhosted.org/packages/05/f5/49a9ac2dff7f10091935def9165c90236d8f175afb27cbed38fb1d61ab6b/greenlet-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83cd0e36932e0e7f36a64b732a6f60c2fc2df28c351bae79fbaf4f8092fe7614", size = 1636017, upload-time = "2025-12-04T14:27:29.688Z" }, @@ -768,6 +794,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/2f/28592176381b9ab2cafa12829ba7b472d177f3acc35d8fbcf3673d966fff/greenlet-3.3.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a1e41a81c7e2825822f4e068c48cb2196002362619e2d70b148f20a831c00739", size = 275140, upload-time = "2025-12-04T14:23:01.282Z" }, { url = "https://files.pythonhosted.org/packages/2c/80/fbe937bf81e9fca98c981fe499e59a3f45df2a04da0baa5c2be0dca0d329/greenlet-3.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f515a47d02da4d30caaa85b69474cec77b7929b2e936ff7fb853d42f4bf8808", size = 599219, upload-time = "2025-12-04T14:50:08.309Z" }, { url = "https://files.pythonhosted.org/packages/c2/ff/7c985128f0514271b8268476af89aee6866df5eec04ac17dcfbc676213df/greenlet-3.3.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d2d9fd66bfadf230b385fdc90426fcd6eb64db54b40c495b72ac0feb5766c54", size = 610211, upload-time = "2025-12-04T14:57:43.968Z" }, + { url = "https://files.pythonhosted.org/packages/79/07/c47a82d881319ec18a4510bb30463ed6891f2ad2c1901ed5ec23d3de351f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30a6e28487a790417d036088b3bcb3f3ac7d8babaa7d0139edbaddebf3af9492", size = 624311, upload-time = "2025-12-04T15:07:14.697Z" }, { url = "https://files.pythonhosted.org/packages/fd/8e/424b8c6e78bd9837d14ff7df01a9829fc883ba2ab4ea787d4f848435f23f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:087ea5e004437321508a8d6f20efc4cfec5e3c30118e1417ea96ed1d93950527", size = 612833, upload-time = "2025-12-04T14:26:03.669Z" }, { url = "https://files.pythonhosted.org/packages/b5/ba/56699ff9b7c76ca12f1cdc27a886d0f81f2189c3455ff9f65246780f713d/greenlet-3.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab97cf74045343f6c60a39913fa59710e4bd26a536ce7ab2397adf8b27e67c39", size = 1567256, upload-time = "2025-12-04T15:04:25.276Z" }, { url = "https://files.pythonhosted.org/packages/1e/37/f31136132967982d698c71a281a8901daf1a8fbab935dce7c0cf15f942cc/greenlet-3.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5375d2e23184629112ca1ea89a53389dddbffcf417dad40125713d88eb5f96e8", size = 1636483, upload-time = "2025-12-04T14:27:30.804Z" }, @@ -775,6 +802,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/7c/f0a6d0ede2c7bf092d00bc83ad5bafb7e6ec9b4aab2fbdfa6f134dc73327/greenlet-3.3.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:60c2ef0f578afb3c8d92ea07ad327f9a062547137afe91f38408f08aacab667f", size = 275671, upload-time = "2025-12-04T14:23:05.267Z" }, { url = "https://files.pythonhosted.org/packages/44/06/dac639ae1a50f5969d82d2e3dd9767d30d6dbdbab0e1a54010c8fe90263c/greenlet-3.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5d554d0712ba1de0a6c94c640f7aeba3f85b3a6e1f2899c11c2c0428da9365", size = 646360, upload-time = "2025-12-04T14:50:10.026Z" }, { url = "https://files.pythonhosted.org/packages/e0/94/0fb76fe6c5369fba9bf98529ada6f4c3a1adf19e406a47332245ef0eb357/greenlet-3.3.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a898b1e9c5f7307ebbde4102908e6cbfcb9ea16284a3abe15cab996bee8b9b3", size = 658160, upload-time = "2025-12-04T14:57:45.41Z" }, + { url = "https://files.pythonhosted.org/packages/93/79/d2c70cae6e823fac36c3bbc9077962105052b7ef81db2f01ec3b9bf17e2b/greenlet-3.3.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dcd2bdbd444ff340e8d6bdf54d2f206ccddbb3ccfdcd3c25bf4afaa7b8f0cf45", size = 671388, upload-time = "2025-12-04T15:07:15.789Z" }, { url = "https://files.pythonhosted.org/packages/b8/14/bab308fc2c1b5228c3224ec2bf928ce2e4d21d8046c161e44a2012b5203e/greenlet-3.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5773edda4dc00e173820722711d043799d3adb4f01731f40619e07ea2750b955", size = 660166, upload-time = "2025-12-04T14:26:05.099Z" }, { url = "https://files.pythonhosted.org/packages/4b/d2/91465d39164eaa0085177f61983d80ffe746c5a1860f009811d498e7259c/greenlet-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac0549373982b36d5fd5d30beb8a7a33ee541ff98d2b502714a09f1169f31b55", size = 1615193, upload-time = "2025-12-04T15:04:27.041Z" }, { url = "https://files.pythonhosted.org/packages/42/1b/83d110a37044b92423084d52d5d5a3b3a73cafb51b547e6d7366ff62eff1/greenlet-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d198d2d977460358c3b3a4dc844f875d1adb33817f0613f663a656f463764ccc", size = 1683653, upload-time = "2025-12-04T14:27:32.366Z" }, @@ -782,6 +810,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/66/bd6317bc5932accf351fc19f177ffba53712a202f9df10587da8df257c7e/greenlet-3.3.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d6ed6f85fae6cdfdb9ce04c9bf7a08d666cfcfb914e7d006f44f840b46741931", size = 282638, upload-time = "2025-12-04T14:25:20.941Z" }, { url = "https://files.pythonhosted.org/packages/30/cf/cc81cb030b40e738d6e69502ccbd0dd1bced0588e958f9e757945de24404/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9125050fcf24554e69c4cacb086b87b3b55dc395a8b3ebe6487b045b2614388", size = 651145, upload-time = "2025-12-04T14:50:11.039Z" }, { url = "https://files.pythonhosted.org/packages/9c/ea/1020037b5ecfe95ca7df8d8549959baceb8186031da83d5ecceff8b08cd2/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:87e63ccfa13c0a0f6234ed0add552af24cc67dd886731f2261e46e241608bee3", size = 654236, upload-time = "2025-12-04T14:57:47.007Z" }, + { url = "https://files.pythonhosted.org/packages/69/cc/1e4bae2e45ca2fa55299f4e85854606a78ecc37fead20d69322f96000504/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2662433acbca297c9153a4023fe2161c8dcfdcc91f10433171cf7e7d94ba2221", size = 662506, upload-time = "2025-12-04T15:07:16.906Z" }, { url = "https://files.pythonhosted.org/packages/57/b9/f8025d71a6085c441a7eaff0fd928bbb275a6633773667023d19179fe815/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c6e9b9c1527a78520357de498b0e709fb9e2f49c3a513afd5a249007261911b", size = 653783, upload-time = "2025-12-04T14:26:06.225Z" }, { url = "https://files.pythonhosted.org/packages/f6/c7/876a8c7a7485d5d6b5c6821201d542ef28be645aa024cfe1145b35c120c1/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:286d093f95ec98fdd92fcb955003b8a3d054b4e2cab3e2707a5039e7b50520fd", size = 1614857, upload-time = "2025-12-04T15:04:28.484Z" }, { url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload-time = "2025-12-04T14:27:33.531Z" }, @@ -1306,6 +1335,7 @@ name = "midst-toolkit" version = "0.1.0" source = { editable = "." } dependencies = [ + { name = "catboost" }, { name = "category-encoders" }, { name = "faiss-cpu" }, { name = "filelock" }, @@ -1353,6 +1383,7 @@ docs = [ [package.metadata] requires-dist = [ + { name = "catboost", specifier = ">=1.2.8" }, { name = "category-encoders", specifier = "~=2.6.3" }, { name = "faiss-cpu", specifier = ">=1.12.0" }, { name = "filelock", specifier = ">=3.20.1" }, From 85f03de1d51e00c0c5138f80bc5185853bbd2d77 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Wed, 14 Jan 2026 22:44:13 -0500 Subject: [PATCH 16/29] Finalized classification and added tests --- catboost_info/catboost_training.json | 2002 ++++++++--------- catboost_info/learn/events.out.tfevents | Bin 54870 -> 54870 bytes catboost_info/learn_error.tsv | 2000 ++++++++-------- catboost_info/time_left.tsv | 2000 ++++++++-------- examples/ept_attack/run_ept_attack.py | 61 +- .../attacks/ept/classification.py | 204 +- .../attacks/ept_attack/test_classification.py | 229 ++ 7 files changed, 3428 insertions(+), 3068 deletions(-) create mode 100644 tests/unit/attacks/ept_attack/test_classification.py diff --git a/catboost_info/catboost_training.json b/catboost_info/catboost_training.json index d189bbb0..5138284c 100644 --- a/catboost_info/catboost_training.json +++ b/catboost_info/catboost_training.json @@ -1,1004 +1,1004 @@ { "meta":{"test_sets":[],"test_metrics":[],"learn_metrics":[{"best_value":"Min","name":"Logloss"}],"launch_mode":"Train","parameters":"","iteration_count":1000,"learn_sets":["learn"],"name":"experiment"}, "iterations":[ -{"learn":[0.6928813762],"iteration":0,"passed_time":0.05867216667,"remaining_time":58.6134945}, -{"learn":[0.6927705684],"iteration":1,"passed_time":0.05961491667,"remaining_time":29.74784342}, -{"learn":[0.6925971801],"iteration":2,"passed_time":0.06051420833,"remaining_time":20.11088857}, -{"learn":[0.6922455935],"iteration":3,"passed_time":0.06148229167,"remaining_time":15.30909062}, -{"learn":[0.6921065986],"iteration":4,"passed_time":0.06235725,"remaining_time":12.40909275}, -{"learn":[0.6919532647],"iteration":5,"passed_time":0.06322304167,"remaining_time":10.47395057}, -{"learn":[0.6917604238],"iteration":6,"passed_time":0.06411983333,"remaining_time":9.095856357}, -{"learn":[0.6914900993],"iteration":7,"passed_time":0.06500029167,"remaining_time":8.060036167}, -{"learn":[0.6913674357],"iteration":8,"passed_time":0.06589558333,"remaining_time":7.255835898}, -{"learn":[0.6912118273],"iteration":9,"passed_time":0.06677104167,"remaining_time":6.610333125}, -{"learn":[0.6909499099],"iteration":10,"passed_time":0.06776704167,"remaining_time":6.09287311}, -{"learn":[0.6908325175],"iteration":11,"passed_time":0.068630875,"remaining_time":5.650608708}, -{"learn":[0.6905856299],"iteration":12,"passed_time":0.06965054167,"remaining_time":5.288083433}, -{"learn":[0.6903327674],"iteration":13,"passed_time":0.07049879167,"remaining_time":4.965129185}, -{"learn":[0.6901495654],"iteration":14,"passed_time":0.071333875,"remaining_time":4.684257792}, -{"learn":[0.6899851009],"iteration":15,"passed_time":0.07216491667,"remaining_time":4.438142375}, -{"learn":[0.689805002],"iteration":16,"passed_time":0.07297316667,"remaining_time":4.219566049}, -{"learn":[0.6896438315],"iteration":17,"passed_time":0.073832875,"remaining_time":4.027993514}, -{"learn":[0.6894644175],"iteration":18,"passed_time":0.07467304167,"remaining_time":3.855487046}, -{"learn":[0.6893579758],"iteration":19,"passed_time":0.07553008333,"remaining_time":3.700974083}, -{"learn":[0.6892922886],"iteration":20,"passed_time":0.076332125,"remaining_time":3.55853097}, -{"learn":[0.6891095639],"iteration":21,"passed_time":0.07724825,"remaining_time":3.434035841}, -{"learn":[0.6889441399],"iteration":22,"passed_time":0.07809166667,"remaining_time":3.317198188}, -{"learn":[0.6888966863],"iteration":23,"passed_time":0.07880670833,"remaining_time":3.204806139}, -{"learn":[0.6887419932],"iteration":24,"passed_time":0.0802965,"remaining_time":3.1315635}, -{"learn":[0.6886235566],"iteration":25,"passed_time":0.081151125,"remaining_time":3.04004599}, -{"learn":[0.6884747749],"iteration":26,"passed_time":0.08196854167,"remaining_time":2.953903372}, -{"learn":[0.6883228153],"iteration":27,"passed_time":0.08279716667,"remaining_time":2.8742445}, -{"learn":[0.688067851],"iteration":28,"passed_time":0.08366016667,"remaining_time":2.801173167}, -{"learn":[0.6879232525],"iteration":29,"passed_time":0.08453154167,"remaining_time":2.733186514}, -{"learn":[0.6876759838],"iteration":30,"passed_time":0.08537220833,"remaining_time":2.668569996}, -{"learn":[0.6875918587],"iteration":31,"passed_time":0.08624770833,"remaining_time":2.608993177}, -{"learn":[0.6874656612],"iteration":32,"passed_time":0.08713533333,"remaining_time":2.553329313}, -{"learn":[0.6873087217],"iteration":33,"passed_time":0.08799758333,"remaining_time":2.500166632}, -{"learn":[0.6871237069],"iteration":34,"passed_time":0.08883720833,"remaining_time":2.449368744}, -{"learn":[0.6869757717],"iteration":35,"passed_time":0.08964579167,"remaining_time":2.400515088}, -{"learn":[0.6868291181],"iteration":36,"passed_time":0.09043833333,"remaining_time":2.353840946}, -{"learn":[0.6867156963],"iteration":37,"passed_time":0.09122379167,"remaining_time":2.309402305}, -{"learn":[0.686571403],"iteration":38,"passed_time":0.09215033333,"remaining_time":2.270678726}, -{"learn":[0.6864704558],"iteration":39,"passed_time":0.09296679167,"remaining_time":2.231203}, -{"learn":[0.6863497381],"iteration":40,"passed_time":0.093780375,"remaining_time":2.193545845}, -{"learn":[0.6862397246],"iteration":41,"passed_time":0.094648875,"remaining_time":2.158895768}, -{"learn":[0.6859510082],"iteration":42,"passed_time":0.095529125,"remaining_time":2.126078433}, -{"learn":[0.6858363546],"iteration":43,"passed_time":0.09638525,"remaining_time":2.094188614}, -{"learn":[0.6855842458],"iteration":44,"passed_time":0.09729566667,"remaining_time":2.064830259}, -{"learn":[0.6854340555],"iteration":45,"passed_time":0.0981145,"remaining_time":2.034809413}, -{"learn":[0.6852941722],"iteration":46,"passed_time":0.09972445833,"remaining_time":2.022072527}, -{"learn":[0.6851449425],"iteration":47,"passed_time":0.1005315,"remaining_time":1.99387475}, -{"learn":[0.6850428887],"iteration":48,"passed_time":0.1014757917,"remaining_time":1.969458732}, -{"learn":[0.6848561421],"iteration":49,"passed_time":0.1024744583,"remaining_time":1.947014708}, -{"learn":[0.6845848016],"iteration":50,"passed_time":0.1033057083,"remaining_time":1.922296416}, -{"learn":[0.6844226892],"iteration":51,"passed_time":0.1042358333,"remaining_time":1.900299423}, -{"learn":[0.6843131013],"iteration":52,"passed_time":0.105096875,"remaining_time":1.877863031}, -{"learn":[0.6842112438],"iteration":53,"passed_time":0.1059185,"remaining_time":1.855535204}, -{"learn":[0.6840723621],"iteration":54,"passed_time":0.10679225,"remaining_time":1.834885023}, -{"learn":[0.6839852128],"iteration":55,"passed_time":0.1076962083,"remaining_time":1.815450369}, -{"learn":[0.6837811598],"iteration":56,"passed_time":0.1085375417,"remaining_time":1.795629856}, -{"learn":[0.6836023572],"iteration":57,"passed_time":0.109430125,"remaining_time":1.777296168}, -{"learn":[0.6835238284],"iteration":58,"passed_time":0.110342,"remaining_time":1.75986139}, -{"learn":[0.6833452052],"iteration":59,"passed_time":0.1112064583,"remaining_time":1.742234514}, -{"learn":[0.6831353933],"iteration":60,"passed_time":0.1120504583,"remaining_time":1.724842301}, -{"learn":[0.6829558136],"iteration":61,"passed_time":0.1129015833,"remaining_time":1.708091696}, -{"learn":[0.6827519777],"iteration":62,"passed_time":0.1137409167,"remaining_time":1.691670459}, -{"learn":[0.6826025139],"iteration":63,"passed_time":0.114554625,"remaining_time":1.675361391}, -{"learn":[0.6824474282],"iteration":64,"passed_time":0.1153629167,"remaining_time":1.659451186}, -{"learn":[0.6822112413],"iteration":65,"passed_time":0.1161904583,"remaining_time":1.644271032}, -{"learn":[0.6820719868],"iteration":66,"passed_time":0.117047,"remaining_time":1.629923149}, -{"learn":[0.6818904516],"iteration":67,"passed_time":0.117892125,"remaining_time":1.615815596}, -{"learn":[0.6818180028],"iteration":68,"passed_time":0.118738625,"remaining_time":1.602111013}, -{"learn":[0.681679262],"iteration":69,"passed_time":0.119585875,"remaining_time":1.588783768}, -{"learn":[0.6815709723],"iteration":70,"passed_time":0.1204287917,"remaining_time":1.575751373}, -{"learn":[0.681290941],"iteration":71,"passed_time":0.1212335,"remaining_time":1.562565111}, -{"learn":[0.681085327],"iteration":72,"passed_time":0.12205925,"remaining_time":1.549985271}, -{"learn":[0.6808785482],"iteration":73,"passed_time":0.1229569583,"remaining_time":1.53862356}, -{"learn":[0.6807458838],"iteration":74,"passed_time":0.12379325,"remaining_time":1.526783417}, -{"learn":[0.6806092224],"iteration":75,"passed_time":0.1246666667,"remaining_time":1.515684211}, -{"learn":[0.6805341354],"iteration":76,"passed_time":0.125511875,"remaining_time":1.504512476}, -{"learn":[0.6802799994],"iteration":77,"passed_time":0.1263409583,"remaining_time":1.493414918}, -{"learn":[0.6801452075],"iteration":78,"passed_time":0.1272406667,"remaining_time":1.483400684}, -{"learn":[0.6799885087],"iteration":79,"passed_time":0.1280527917,"remaining_time":1.472607104}, -{"learn":[0.6798814015],"iteration":80,"passed_time":0.1289484583,"remaining_time":1.463007817}, -{"learn":[0.6797575743],"iteration":81,"passed_time":0.1297715417,"remaining_time":1.452808235}, -{"learn":[0.679654775],"iteration":82,"passed_time":0.130587625,"remaining_time":1.442757255}, -{"learn":[0.6795704853],"iteration":83,"passed_time":0.1313717083,"remaining_time":1.4325772}, -{"learn":[0.6794271274],"iteration":84,"passed_time":0.1322038333,"remaining_time":1.423135382}, -{"learn":[0.6792394004],"iteration":85,"passed_time":0.133096,"remaining_time":1.414531907}, -{"learn":[0.6791521743],"iteration":86,"passed_time":0.13399975,"remaining_time":1.406227261}, -{"learn":[0.6790378211],"iteration":87,"passed_time":0.1348456667,"remaining_time":1.397491455}, -{"learn":[0.6788650462],"iteration":88,"passed_time":0.1356789583,"remaining_time":1.38880372}, -{"learn":[0.6787676444],"iteration":89,"passed_time":0.136498375,"remaining_time":1.380150236}, -{"learn":[0.6785299664],"iteration":90,"passed_time":0.1373625833,"remaining_time":1.372116354}, -{"learn":[0.6784151028],"iteration":91,"passed_time":0.1383023333,"remaining_time":1.364983899}, -{"learn":[0.6783052451],"iteration":92,"passed_time":0.1391354583,"remaining_time":1.356944739}, -{"learn":[0.6781839108],"iteration":93,"passed_time":0.140063625,"remaining_time":1.349974939}, -{"learn":[0.6780728173],"iteration":94,"passed_time":0.1409144167,"remaining_time":1.342395232}, -{"learn":[0.6778939225],"iteration":95,"passed_time":0.1417278333,"remaining_time":1.334603764}, -{"learn":[0.6777267347],"iteration":96,"passed_time":0.14257025,"remaining_time":1.327226142}, -{"learn":[0.6776418466],"iteration":97,"passed_time":0.143430375,"remaining_time":1.32014488}, -{"learn":[0.6774645732],"iteration":98,"passed_time":0.1442831667,"remaining_time":1.313122557}, -{"learn":[0.6773457516],"iteration":99,"passed_time":0.1451127917,"remaining_time":1.306015125}, -{"learn":[0.6772239848],"iteration":100,"passed_time":0.1460104583,"remaining_time":1.299637644}, -{"learn":[0.6771305672],"iteration":101,"passed_time":0.1468199583,"remaining_time":1.292591398}, -{"learn":[0.6769795653],"iteration":102,"passed_time":0.1476614167,"remaining_time":1.28594457}, -{"learn":[0.6767967175],"iteration":103,"passed_time":0.1484924583,"remaining_time":1.279319641}, -{"learn":[0.6766538948],"iteration":104,"passed_time":0.1493474583,"remaining_time":1.273009288}, -{"learn":[0.6764472172],"iteration":105,"passed_time":0.1501957083,"remaining_time":1.266744936}, -{"learn":[0.6762686407],"iteration":106,"passed_time":0.1510007917,"remaining_time":1.26022156}, -{"learn":[0.6761461684],"iteration":107,"passed_time":0.1518664583,"remaining_time":1.254304452}, -{"learn":[0.6759860643],"iteration":108,"passed_time":0.1527155,"remaining_time":1.248344133}, -{"learn":[0.6757604502],"iteration":109,"passed_time":0.1536722083,"remaining_time":1.243347867}, -{"learn":[0.675669165],"iteration":110,"passed_time":0.15454275,"remaining_time":1.237734277}, -{"learn":[0.6755053743],"iteration":111,"passed_time":0.1553501667,"remaining_time":1.231704893}, -{"learn":[0.6753498571],"iteration":112,"passed_time":0.1562262917,"remaining_time":1.226307263}, -{"learn":[0.6752725754],"iteration":113,"passed_time":0.157053375,"remaining_time":1.220607809}, -{"learn":[0.6750365461],"iteration":114,"passed_time":0.1579120417,"remaining_time":1.215236147}, -{"learn":[0.6749116988],"iteration":115,"passed_time":0.1587330417,"remaining_time":1.209655249}, -{"learn":[0.674781043],"iteration":116,"passed_time":0.1596065833,"remaining_time":1.204552249}, -{"learn":[0.6746396213],"iteration":117,"passed_time":0.1604513333,"remaining_time":1.199305729}, -{"learn":[0.6744671803],"iteration":118,"passed_time":0.161275,"remaining_time":1.193977101}, -{"learn":[0.674325657],"iteration":119,"passed_time":0.16216275,"remaining_time":1.1891935}, -{"learn":[0.6742081932],"iteration":120,"passed_time":0.1630232083,"remaining_time":1.184276034}, -{"learn":[0.6741158781],"iteration":121,"passed_time":0.1639465,"remaining_time":1.17987727}, -{"learn":[0.6740179337],"iteration":122,"passed_time":0.1648080833,"remaining_time":1.175095033}, -{"learn":[0.6738082214],"iteration":123,"passed_time":0.165646625,"remaining_time":1.170213254}, -{"learn":[0.6737089871],"iteration":124,"passed_time":0.1664865833,"remaining_time":1.165406083}, -{"learn":[0.6735671667],"iteration":125,"passed_time":0.1672935417,"remaining_time":1.160432979}, -{"learn":[0.6734045366],"iteration":126,"passed_time":0.168125,"remaining_time":1.155693898}, -{"learn":[0.6733722294],"iteration":127,"passed_time":0.168885,"remaining_time":1.150529062}, -{"learn":[0.6733095879],"iteration":128,"passed_time":0.1697376667,"remaining_time":1.146058199}, -{"learn":[0.6732068875],"iteration":129,"passed_time":0.1705810417,"remaining_time":1.141580817}, -{"learn":[0.6730879651],"iteration":130,"passed_time":0.171404,"remaining_time":1.137023481}, -{"learn":[0.6729871979],"iteration":131,"passed_time":0.172249125,"remaining_time":1.132668489}, -{"learn":[0.6727685327],"iteration":132,"passed_time":0.1730835417,"remaining_time":1.128296471}, -{"learn":[0.6726143164],"iteration":133,"passed_time":0.1739277083,"remaining_time":1.124040264}, -{"learn":[0.6725360058],"iteration":134,"passed_time":0.1747441667,"remaining_time":1.119657068}, -{"learn":[0.6724362691],"iteration":135,"passed_time":0.1756107083,"remaining_time":1.1156445}, -{"learn":[0.6723756637],"iteration":136,"passed_time":0.17643825,"remaining_time":1.111432188}, -{"learn":[0.6722683745],"iteration":137,"passed_time":0.1773248333,"remaining_time":1.107637727}, -{"learn":[0.6721582182],"iteration":138,"passed_time":0.1781739167,"remaining_time":1.103652822}, -{"learn":[0.6719563025],"iteration":139,"passed_time":0.179007625,"remaining_time":1.099618268}, -{"learn":[0.6717853603],"iteration":140,"passed_time":0.1798435833,"remaining_time":1.095642823}, -{"learn":[0.6717031276],"iteration":141,"passed_time":0.1806888333,"remaining_time":1.091767739}, -{"learn":[0.6715383504],"iteration":142,"passed_time":0.1815092083,"remaining_time":1.087785955}, -{"learn":[0.6714334822],"iteration":143,"passed_time":0.1823629583,"remaining_time":1.084046475}, -{"learn":[0.6712567829],"iteration":144,"passed_time":0.1832514167,"remaining_time":1.080551457}, -{"learn":[0.6711694978],"iteration":145,"passed_time":0.1841272083,"remaining_time":1.077018054}, -{"learn":[0.6711064928],"iteration":146,"passed_time":0.1849270833,"remaining_time":1.073080286}, -{"learn":[0.6710450426],"iteration":147,"passed_time":0.1857626667,"remaining_time":1.069390486}, -{"learn":[0.6709995306],"iteration":148,"passed_time":0.1866347083,"remaining_time":1.065947227}, -{"learn":[0.6709483541],"iteration":149,"passed_time":0.18745275,"remaining_time":1.06223225}, -{"learn":[0.6708624641],"iteration":150,"passed_time":0.18825575,"remaining_time":1.058471071}, -{"learn":[0.6706881852],"iteration":151,"passed_time":0.1891086667,"remaining_time":1.055027298}, -{"learn":[0.6705949593],"iteration":152,"passed_time":0.1899318333,"remaining_time":1.051452698}, -{"learn":[0.6704783294],"iteration":153,"passed_time":0.1907548333,"remaining_time":1.047912916}, -{"learn":[0.6703158421],"iteration":154,"passed_time":0.1915670833,"remaining_time":1.044349583}, -{"learn":[0.670221545],"iteration":155,"passed_time":0.1924185417,"remaining_time":1.041033649}, -{"learn":[0.6700858751],"iteration":156,"passed_time":0.1932406667,"remaining_time":1.037591605}, -{"learn":[0.6699566438],"iteration":157,"passed_time":0.1940582083,"remaining_time":1.0341583}, -{"learn":[0.6698952551],"iteration":158,"passed_time":0.1949352083,"remaining_time":1.031072391}, -{"learn":[0.6698089935],"iteration":159,"passed_time":0.19575675,"remaining_time":1.027722937}, -{"learn":[0.6696558171],"iteration":160,"passed_time":0.1966063333,"remaining_time":1.024551017}, -{"learn":[0.6695847448],"iteration":161,"passed_time":0.1975026667,"remaining_time":1.021649597}, -{"learn":[0.6693364214],"iteration":162,"passed_time":0.19831625,"remaining_time":1.01834786}, -{"learn":[0.6691797984],"iteration":163,"passed_time":0.1991177083,"remaining_time":1.01501466}, -{"learn":[0.6690823532],"iteration":164,"passed_time":0.1999819167,"remaining_time":1.012029699}, -{"learn":[0.6689134698],"iteration":165,"passed_time":0.200863875,"remaining_time":1.009159468}, -{"learn":[0.6688364554],"iteration":166,"passed_time":0.2017267917,"remaining_time":1.006218069}, -{"learn":[0.6686552727],"iteration":167,"passed_time":0.20256275,"remaining_time":1.003167905}, -{"learn":[0.6685990561],"iteration":168,"passed_time":0.20336025,"remaining_time":0.9999548388}, -{"learn":[0.6685967999],"iteration":169,"passed_time":0.2039174583,"remaining_time":0.9955970025}, -{"learn":[0.6685480334],"iteration":170,"passed_time":0.2047486667,"remaining_time":0.9926119571}, -{"learn":[0.6684578575],"iteration":171,"passed_time":0.2055770833,"remaining_time":0.9896385174}, -{"learn":[0.668339763],"iteration":172,"passed_time":0.206427375,"remaining_time":0.9867944458}, -{"learn":[0.6682208795],"iteration":173,"passed_time":0.2072524583,"remaining_time":0.983853624}, -{"learn":[0.6681028404],"iteration":174,"passed_time":0.2080845833,"remaining_time":0.9809701786}, -{"learn":[0.667965681],"iteration":175,"passed_time":0.2089108333,"remaining_time":0.9780825379}, -{"learn":[0.6678856254],"iteration":176,"passed_time":0.2097556667,"remaining_time":0.975304597}, -{"learn":[0.667794658],"iteration":177,"passed_time":0.2105997917,"remaining_time":0.9725451053}, -{"learn":[0.6677252781],"iteration":178,"passed_time":0.2114235,"remaining_time":0.9697133715}, -{"learn":[0.6676019745],"iteration":179,"passed_time":0.2122879583,"remaining_time":0.967089588}, -{"learn":[0.6675230521],"iteration":180,"passed_time":0.2131032917,"remaining_time":0.9642629606}, -{"learn":[0.6674291671],"iteration":181,"passed_time":0.2139443333,"remaining_time":0.9615739817}, -{"learn":[0.6672993569],"iteration":182,"passed_time":0.2148125,"remaining_time":0.9590262978}, -{"learn":[0.6671821038],"iteration":183,"passed_time":0.2156653333,"remaining_time":0.9564288696}, -{"learn":[0.6670561823],"iteration":184,"passed_time":0.2164531667,"remaining_time":0.9535639505}, -{"learn":[0.6669913125],"iteration":185,"passed_time":0.2173006667,"remaining_time":0.9509824875}, -{"learn":[0.6669167408],"iteration":186,"passed_time":0.2181529583,"remaining_time":0.9484404017}, -{"learn":[0.6668515394],"iteration":187,"passed_time":0.219023375,"remaining_time":0.9459945771}, -{"learn":[0.6667220162],"iteration":188,"passed_time":0.219882125,"remaining_time":0.9435153618}, -{"learn":[0.6666120767],"iteration":189,"passed_time":0.2207797083,"remaining_time":0.9412187566}, -{"learn":[0.6664567035],"iteration":190,"passed_time":0.221627625,"remaining_time":0.9387264326}, -{"learn":[0.6663726434],"iteration":191,"passed_time":0.2224835417,"remaining_time":0.9362849045}, -{"learn":[0.6662914224],"iteration":192,"passed_time":0.2233881667,"remaining_time":0.9340634741}, -{"learn":[0.6661740095],"iteration":193,"passed_time":0.22421925,"remaining_time":0.9315500799}, -{"learn":[0.6660529216],"iteration":194,"passed_time":0.2250625417,"remaining_time":0.9291043387}, -{"learn":[0.6659565228],"iteration":195,"passed_time":0.2259101667,"remaining_time":0.9266927245}, -{"learn":[0.6658462719],"iteration":196,"passed_time":0.2268114167,"remaining_time":0.9245155715}, -{"learn":[0.6657833717],"iteration":197,"passed_time":0.22768125,"remaining_time":0.922224053}, -{"learn":[0.6656402926],"iteration":198,"passed_time":0.2284892917,"remaining_time":0.9196981036}, -{"learn":[0.6654518232],"iteration":199,"passed_time":0.22931575,"remaining_time":0.917263}, -{"learn":[0.6653489792],"iteration":200,"passed_time":0.230184125,"remaining_time":0.9150105267}, -{"learn":[0.6652424683],"iteration":201,"passed_time":0.2309772917,"remaining_time":0.9124746473}, -{"learn":[0.6651288387],"iteration":202,"passed_time":0.2317984583,"remaining_time":0.9100658684}, -{"learn":[0.6649545537],"iteration":203,"passed_time":0.2326806667,"remaining_time":0.9079108366}, -{"learn":[0.6648760552],"iteration":204,"passed_time":0.2335327917,"remaining_time":0.9056515579}, -{"learn":[0.664747628],"iteration":205,"passed_time":0.2343905417,"remaining_time":0.9034276218}, -{"learn":[0.6646900544],"iteration":206,"passed_time":0.235286125,"remaining_time":0.9013618219}, -{"learn":[0.6646357749],"iteration":207,"passed_time":0.2361262917,"remaining_time":0.8990962644}, -{"learn":[0.6645287935],"iteration":208,"passed_time":0.2369630417,"remaining_time":0.8968314161}, -{"learn":[0.6643522952],"iteration":209,"passed_time":0.237797875,"remaining_time":0.8945729583}, -{"learn":[0.6642867185],"iteration":210,"passed_time":0.2386956667,"remaining_time":0.8925634171}, -{"learn":[0.664195321],"iteration":211,"passed_time":0.2394984583,"remaining_time":0.8902112508}, -{"learn":[0.6640450386],"iteration":212,"passed_time":0.240321125,"remaining_time":0.8879470675}, -{"learn":[0.6639689398],"iteration":213,"passed_time":0.241142375,"remaining_time":0.885691153}, -{"learn":[0.6638775353],"iteration":214,"passed_time":0.2420187917,"remaining_time":0.8836500068}, -{"learn":[0.6638321369],"iteration":215,"passed_time":0.2428313333,"remaining_time":0.8813878025}, -{"learn":[0.6637643901],"iteration":216,"passed_time":0.2436659167,"remaining_time":0.8792184919}, -{"learn":[0.6637023278],"iteration":217,"passed_time":0.2445356667,"remaining_time":0.8771875749}, -{"learn":[0.6635913011],"iteration":218,"passed_time":0.2453980417,"remaining_time":0.8751409614}, -{"learn":[0.6634753576],"iteration":219,"passed_time":0.2462327917,"remaining_time":0.8730071705}, -{"learn":[0.6634014965],"iteration":220,"passed_time":0.24707625,"remaining_time":0.8709158314}, -{"learn":[0.6632969382],"iteration":221,"passed_time":0.2478638333,"remaining_time":0.8686399204}, -{"learn":[0.6631727915],"iteration":222,"passed_time":0.2487159167,"remaining_time":0.8666020953}, -{"learn":[0.6631256538],"iteration":223,"passed_time":0.249516375,"remaining_time":0.8643960134}, -{"learn":[0.6630035776],"iteration":224,"passed_time":0.2503286667,"remaining_time":0.8622431852}, -{"learn":[0.6629278487],"iteration":225,"passed_time":0.2512409583,"remaining_time":0.860444698}, -{"learn":[0.6628845016],"iteration":226,"passed_time":0.2520864167,"remaining_time":0.8584264321}, -{"learn":[0.6628045977],"iteration":227,"passed_time":0.2529204167,"remaining_time":0.8563796564}, -{"learn":[0.6627338264],"iteration":228,"passed_time":0.253739375,"remaining_time":0.8542928302}, -{"learn":[0.6626049676],"iteration":229,"passed_time":0.2545904167,"remaining_time":0.8523244384}, -{"learn":[0.6624874762],"iteration":230,"passed_time":0.255452625,"remaining_time":0.8504028945}, -{"learn":[0.6624023551],"iteration":231,"passed_time":0.25627425,"remaining_time":0.8483561379}, -{"learn":[0.6623000568],"iteration":232,"passed_time":0.2571020417,"remaining_time":0.8463401972}, -{"learn":[0.6621571588],"iteration":233,"passed_time":0.2580681667,"remaining_time":0.8447872464}, -{"learn":[0.6620831436],"iteration":234,"passed_time":0.2591205833,"remaining_time":0.8435201968}, -{"learn":[0.6620481338],"iteration":235,"passed_time":0.260296125,"remaining_time":0.8426535572}, -{"learn":[0.6619658571],"iteration":236,"passed_time":0.26150075,"remaining_time":0.841877942}, -{"learn":[0.6618816897],"iteration":237,"passed_time":0.2625454167,"remaining_time":0.8405865861}, -{"learn":[0.6617049279],"iteration":238,"passed_time":0.2634067917,"remaining_time":0.8387136756}, -{"learn":[0.6616285733],"iteration":239,"passed_time":0.2643239583,"remaining_time":0.8370258681}, -{"learn":[0.6614885346],"iteration":240,"passed_time":0.2651799167,"remaining_time":0.8351516878}, -{"learn":[0.6614642929],"iteration":241,"passed_time":0.2661273333,"remaining_time":0.8335723912}, -{"learn":[0.6613863502],"iteration":242,"passed_time":0.2670088333,"remaining_time":0.8317929499}, -{"learn":[0.6613087341],"iteration":243,"passed_time":0.2680896667,"remaining_time":0.8306384754}, -{"learn":[0.6612515177],"iteration":244,"passed_time":0.2689373333,"remaining_time":0.828766068}, -{"learn":[0.6611452681],"iteration":245,"passed_time":0.2697846667,"remaining_time":0.8269009702}, -{"learn":[0.6610199446],"iteration":246,"passed_time":0.2706145417,"remaining_time":0.8249908902}, -{"learn":[0.6609045425],"iteration":247,"passed_time":0.2715172083,"remaining_time":0.8233102446}, -{"learn":[0.6607958095],"iteration":248,"passed_time":0.2724729583,"remaining_time":0.8217959506}, -{"learn":[0.6607277157],"iteration":249,"passed_time":0.2733245417,"remaining_time":0.819973625}, -{"learn":[0.6606118727],"iteration":250,"passed_time":0.2741768333,"remaining_time":0.8181611481}, -{"learn":[0.6605497883],"iteration":251,"passed_time":0.2750030833,"remaining_time":0.8162789934}, -{"learn":[0.6604913238],"iteration":252,"passed_time":0.275863625,"remaining_time":0.8145064343}, -{"learn":[0.6604120247],"iteration":253,"passed_time":0.2767342083,"remaining_time":0.8127705489}, -{"learn":[0.6603301416],"iteration":254,"passed_time":0.27761175,"remaining_time":0.8110617794}, -{"learn":[0.6602117831],"iteration":255,"passed_time":0.2784780417,"remaining_time":0.8093268086}, -{"learn":[0.6600655237],"iteration":256,"passed_time":0.2793027083,"remaining_time":0.8074782579}, -{"learn":[0.659980612],"iteration":257,"passed_time":0.2801757917,"remaining_time":0.8057768892}, -{"learn":[0.6599115781],"iteration":258,"passed_time":0.2809944167,"remaining_time":0.803926111}, -{"learn":[0.6598449489],"iteration":259,"passed_time":0.2818235,"remaining_time":0.8021130385}, -{"learn":[0.6597648618],"iteration":260,"passed_time":0.2826300833,"remaining_time":0.8002437992}, -{"learn":[0.6596656338],"iteration":261,"passed_time":0.283547125,"remaining_time":0.7986938101}, -{"learn":[0.6595835164],"iteration":262,"passed_time":0.2843868333,"remaining_time":0.7969319246}, -{"learn":[0.6594721441],"iteration":263,"passed_time":0.2852294583,"remaining_time":0.7951851566}, -{"learn":[0.6593112923],"iteration":264,"passed_time":0.2860671667,"remaining_time":0.7934315755}, -{"learn":[0.659267603],"iteration":265,"passed_time":0.2869354167,"remaining_time":0.7917691573}, -{"learn":[0.6592159433],"iteration":266,"passed_time":0.2877672083,"remaining_time":0.7900125982}, -{"learn":[0.6591083452],"iteration":267,"passed_time":0.2886120417,"remaining_time":0.7882985616}, -{"learn":[0.6590749423],"iteration":268,"passed_time":0.2895200833,"remaining_time":0.7867627543}, -{"learn":[0.6589959542],"iteration":269,"passed_time":0.2903972083,"remaining_time":0.7851480077}, -{"learn":[0.6589005933],"iteration":270,"passed_time":0.2912645833,"remaining_time":0.7835124769}, -{"learn":[0.658876613],"iteration":271,"passed_time":0.2921035417,"remaining_time":0.781806538}, -{"learn":[0.6588015218],"iteration":272,"passed_time":0.2929502083,"remaining_time":0.7801274779}, -{"learn":[0.6587079641],"iteration":273,"passed_time":0.293797875,"remaining_time":0.7784571432}, -{"learn":[0.658675387],"iteration":274,"passed_time":0.2946948333,"remaining_time":0.7769227424}, -{"learn":[0.6585594005],"iteration":275,"passed_time":0.2955301667,"remaining_time":0.7752313068}, -{"learn":[0.6584995091],"iteration":276,"passed_time":0.2965508333,"remaining_time":0.7740297924}, -{"learn":[0.6584066709],"iteration":277,"passed_time":0.2973974167,"remaining_time":0.7723774634}, -{"learn":[0.6583090334],"iteration":278,"passed_time":0.29823575,"remaining_time":0.7707095905}, -{"learn":[0.6581861269],"iteration":279,"passed_time":0.299078875,"remaining_time":0.7690599643}, -{"learn":[0.6581019615],"iteration":280,"passed_time":0.2999204583,"remaining_time":0.7674121336}, -{"learn":[0.65804852],"iteration":281,"passed_time":0.3007680417,"remaining_time":0.7657852976}, -{"learn":[0.6579546998],"iteration":282,"passed_time":0.3016498333,"remaining_time":0.7642506378}, -{"learn":[0.657855023],"iteration":283,"passed_time":0.3024748333,"remaining_time":0.7625773967}, -{"learn":[0.6577164641],"iteration":284,"passed_time":0.303316375,"remaining_time":0.7609516075}, -{"learn":[0.657642921],"iteration":285,"passed_time":0.304217875,"remaining_time":0.7594809886}, -{"learn":[0.6575528485],"iteration":286,"passed_time":0.305064625,"remaining_time":0.7578783193}, -{"learn":[0.6574618776],"iteration":287,"passed_time":0.3060330833,"remaining_time":0.7565817894}, -{"learn":[0.657314761],"iteration":288,"passed_time":0.3069012083,"remaining_time":0.755040689}, -{"learn":[0.657207417],"iteration":289,"passed_time":0.307760875,"remaining_time":0.7534835216}, -{"learn":[0.6570827416],"iteration":290,"passed_time":0.308626875,"remaining_time":0.7519465786}, -{"learn":[0.6570805508],"iteration":291,"passed_time":0.3092669583,"remaining_time":0.7498664606}, -{"learn":[0.6569698428],"iteration":292,"passed_time":0.3101342083,"remaining_time":0.7483443184}, -{"learn":[0.6569242297],"iteration":293,"passed_time":0.311002875,"remaining_time":0.7468300332}, -{"learn":[0.6568222231],"iteration":294,"passed_time":0.3119032083,"remaining_time":0.745395803}, -{"learn":[0.6567737521],"iteration":295,"passed_time":0.3127275417,"remaining_time":0.7437844234}, -{"learn":[0.6566820688],"iteration":296,"passed_time":0.3135814167,"remaining_time":0.7422482691}, -{"learn":[0.6566306963],"iteration":297,"passed_time":0.3144195417,"remaining_time":0.7406795914}, -{"learn":[0.6565289163],"iteration":298,"passed_time":0.3152347083,"remaining_time":0.7390619751}, -{"learn":[0.6564283715],"iteration":299,"passed_time":0.31608125,"remaining_time":0.7375229167}, -{"learn":[0.6563825594],"iteration":300,"passed_time":0.3169622083,"remaining_time":0.7360683841}, -{"learn":[0.6562322953],"iteration":301,"passed_time":0.317881625,"remaining_time":0.7347065373}, -{"learn":[0.656110587],"iteration":302,"passed_time":0.318772,"remaining_time":0.7332808053}, -{"learn":[0.6560004418],"iteration":303,"passed_time":0.3196169583,"remaining_time":0.7317546151}, -{"learn":[0.6559111442],"iteration":304,"passed_time":0.3204956667,"remaining_time":0.7303097978}, -{"learn":[0.6559111666],"iteration":305,"passed_time":0.3209743333,"remaining_time":0.7279613965}, -{"learn":[0.6558563705],"iteration":306,"passed_time":0.3216856667,"remaining_time":0.7261503811}, -{"learn":[0.6557820481],"iteration":307,"passed_time":0.322480625,"remaining_time":0.7245343912}, -{"learn":[0.6557026149],"iteration":308,"passed_time":0.3234026667,"remaining_time":0.7232079051}, -{"learn":[0.655587157],"iteration":309,"passed_time":0.3243157083,"remaining_time":0.721863996}, -{"learn":[0.6554800571],"iteration":310,"passed_time":0.32519925,"remaining_time":0.7204575024}, -{"learn":[0.6554036732],"iteration":311,"passed_time":0.32603325,"remaining_time":0.7189451154}, -{"learn":[0.6553150878],"iteration":312,"passed_time":0.3275151667,"remaining_time":0.7188591677}, -{"learn":[0.6552289288],"iteration":313,"passed_time":0.3283622083,"remaining_time":0.7173773087}, -{"learn":[0.6551125375],"iteration":314,"passed_time":0.329184,"remaining_time":0.7158445714}, -{"learn":[0.6550528612],"iteration":315,"passed_time":0.3300330417,"remaining_time":0.714375318}, -{"learn":[0.6549986765],"iteration":316,"passed_time":0.330884,"remaining_time":0.7129141073}, -{"learn":[0.654881015],"iteration":317,"passed_time":0.331745,"remaining_time":0.7114782704}, -{"learn":[0.6548192043],"iteration":318,"passed_time":0.3326307083,"remaining_time":0.7100987849}, -{"learn":[0.6547097735],"iteration":319,"passed_time":0.3334866667,"remaining_time":0.7086591667}, -{"learn":[0.6545751383],"iteration":320,"passed_time":0.334326625,"remaining_time":0.7071893407}, -{"learn":[0.6545016783],"iteration":321,"passed_time":0.33522575,"remaining_time":0.7058480078}, -{"learn":[0.6544042973],"iteration":322,"passed_time":0.33607225,"remaining_time":0.7043991122}, -{"learn":[0.6543673179],"iteration":323,"passed_time":0.3369117917,"remaining_time":0.7029394172}, -{"learn":[0.6542927477],"iteration":324,"passed_time":0.33775175,"remaining_time":0.7014844038}, -{"learn":[0.6542482113],"iteration":325,"passed_time":0.3385705,"remaining_time":0.699989316}, -{"learn":[0.6542039034],"iteration":326,"passed_time":0.3394275833,"remaining_time":0.6985772587}, -{"learn":[0.6540639019],"iteration":327,"passed_time":0.340372125,"remaining_time":0.6973477683}, -{"learn":[0.6538708026],"iteration":328,"passed_time":0.3411945417,"remaining_time":0.6958709345}, -{"learn":[0.6537917647],"iteration":329,"passed_time":0.3420342083,"remaining_time":0.6944330896}, -{"learn":[0.6537091256],"iteration":330,"passed_time":0.342899375,"remaining_time":0.6930503984}, -{"learn":[0.6536589121],"iteration":331,"passed_time":0.3437949583,"remaining_time":0.6917320246}, -{"learn":[0.6535602797],"iteration":332,"passed_time":0.3446304167,"remaining_time":0.6902957595}, -{"learn":[0.6535005487],"iteration":333,"passed_time":0.3455119167,"remaining_time":0.6889548997}, -{"learn":[0.6534109431],"iteration":334,"passed_time":0.34634175,"remaining_time":0.6875142201}, -{"learn":[0.6533329026],"iteration":335,"passed_time":0.3472555833,"remaining_time":0.6862431766}, -{"learn":[0.6531947152],"iteration":336,"passed_time":0.3481049167,"remaining_time":0.6848473583}, -{"learn":[0.6530412041],"iteration":337,"passed_time":0.34896075,"remaining_time":0.6834675044}, -{"learn":[0.6529501117],"iteration":338,"passed_time":0.3498015417,"remaining_time":0.6820614131}, -{"learn":[0.6528444022],"iteration":339,"passed_time":0.3506322083,"remaining_time":0.6806389926}, -{"learn":[0.6527567171],"iteration":340,"passed_time":0.3514577083,"remaining_time":0.679210058}, -{"learn":[0.6526753551],"iteration":341,"passed_time":0.3522953333,"remaining_time":0.6778079805}, -{"learn":[0.6526239765],"iteration":342,"passed_time":0.353138875,"remaining_time":0.6764205273}, -{"learn":[0.652478045],"iteration":343,"passed_time":0.3539776667,"remaining_time":0.6750271783}, -{"learn":[0.6523240742],"iteration":344,"passed_time":0.35478925,"remaining_time":0.6735853877}, -{"learn":[0.6521893894],"iteration":345,"passed_time":0.3556125833,"remaining_time":0.6721694494}, -{"learn":[0.6520842527],"iteration":346,"passed_time":0.3564220417,"remaining_time":0.6707308162}, -{"learn":[0.6520330575],"iteration":347,"passed_time":0.3572406667,"remaining_time":0.6693129732}, -{"learn":[0.6519834798],"iteration":348,"passed_time":0.3580944167,"remaining_time":0.6679640838}, -{"learn":[0.6518428081],"iteration":349,"passed_time":0.3589214583,"remaining_time":0.6665684226}, -{"learn":[0.6517073039],"iteration":350,"passed_time":0.3597453333,"remaining_time":0.6651701462}, -{"learn":[0.6516040688],"iteration":351,"passed_time":0.360589625,"remaining_time":0.6638127187}, -{"learn":[0.6515031768],"iteration":352,"passed_time":0.36138675,"remaining_time":0.6623717486}, -{"learn":[0.6513973568],"iteration":353,"passed_time":0.3622503333,"remaining_time":0.661055693}, -{"learn":[0.651278663],"iteration":354,"passed_time":0.363051125,"remaining_time":0.6596281004}, -{"learn":[0.6512368762],"iteration":355,"passed_time":0.3639242917,"remaining_time":0.6583349546}, -{"learn":[0.6511093432],"iteration":356,"passed_time":0.3647824583,"remaining_time":0.6570171448}, -{"learn":[0.6510329226],"iteration":357,"passed_time":0.365662,"remaining_time":0.6557402346}, -{"learn":[0.6508837447],"iteration":358,"passed_time":0.3666140833,"remaining_time":0.6545950624}, -{"learn":[0.6507842001],"iteration":359,"passed_time":0.36744825,"remaining_time":0.6532413333}, -{"learn":[0.6507174709],"iteration":360,"passed_time":0.3682600417,"remaining_time":0.6518508771}, -{"learn":[0.650640263],"iteration":361,"passed_time":0.3691066667,"remaining_time":0.6505250092}, -{"learn":[0.6505656674],"iteration":362,"passed_time":0.3699319167,"remaining_time":0.6491642725}, -{"learn":[0.650504538],"iteration":363,"passed_time":0.3708659167,"remaining_time":0.6479964918}, -{"learn":[0.6504365248],"iteration":364,"passed_time":0.3717044167,"remaining_time":0.6466638482}, -{"learn":[0.6502783578],"iteration":365,"passed_time":0.3725345417,"remaining_time":0.6453193973}, -{"learn":[0.6501411924],"iteration":366,"passed_time":0.3733957083,"remaining_time":0.6440312899}, -{"learn":[0.6501001198],"iteration":367,"passed_time":0.3743222917,"remaining_time":0.6428578487}, -{"learn":[0.6500519265],"iteration":368,"passed_time":0.3751660833,"remaining_time":0.6415441696}, -{"learn":[0.649898024],"iteration":369,"passed_time":0.3760250833,"remaining_time":0.6402589257}, -{"learn":[0.6498355148],"iteration":370,"passed_time":0.3768451667,"remaining_time":0.6389099996}, -{"learn":[0.6497782806],"iteration":371,"passed_time":0.3776900833,"remaining_time":0.6376058396}, -{"learn":[0.6496639327],"iteration":372,"passed_time":0.3785039583,"remaining_time":0.6362519621}, -{"learn":[0.6495923372],"iteration":373,"passed_time":0.3793429167,"remaining_time":0.6349429568}, -{"learn":[0.6495199254],"iteration":374,"passed_time":0.3801982917,"remaining_time":0.6336638194}, -{"learn":[0.6494821272],"iteration":375,"passed_time":0.3810142083,"remaining_time":0.6323214521}, -{"learn":[0.649405755],"iteration":376,"passed_time":0.3818450417,"remaining_time":0.6310065277}, -{"learn":[0.6492798659],"iteration":377,"passed_time":0.3827209167,"remaining_time":0.6297682809}, -{"learn":[0.649197004],"iteration":378,"passed_time":0.3835657083,"remaining_time":0.6284810155}, -{"learn":[0.6491406129],"iteration":379,"passed_time":0.3844065417,"remaining_time":0.6271896206}, -{"learn":[0.6490583347],"iteration":380,"passed_time":0.3852387917,"remaining_time":0.6258866458}, -{"learn":[0.648981716],"iteration":381,"passed_time":0.386081,"remaining_time":0.6246022461}, -{"learn":[0.6488443636],"iteration":382,"passed_time":0.3869464583,"remaining_time":0.6233576104}, -{"learn":[0.6487312852],"iteration":383,"passed_time":0.3877959583,"remaining_time":0.6220893498}, -{"learn":[0.6485826],"iteration":384,"passed_time":0.388679625,"remaining_time":0.6208778425}, -{"learn":[0.6485108434],"iteration":385,"passed_time":0.3894870833,"remaining_time":0.6195468113}, -{"learn":[0.6484226819],"iteration":386,"passed_time":0.39048275,"remaining_time":0.618516604}, -{"learn":[0.6484031156],"iteration":387,"passed_time":0.3913134583,"remaining_time":0.6172263827}, -{"learn":[0.6483066563],"iteration":388,"passed_time":0.3921605417,"remaining_time":0.6159642441}, -{"learn":[0.6482508564],"iteration":389,"passed_time":0.393085125,"remaining_time":0.6148254519}, -{"learn":[0.6481457704],"iteration":390,"passed_time":0.3938774583,"remaining_time":0.6134817701}, -{"learn":[0.6480298032],"iteration":391,"passed_time":0.3948124583,"remaining_time":0.6123621803}, -{"learn":[0.6479658454],"iteration":392,"passed_time":0.395673875,"remaining_time":0.6111298782}, -{"learn":[0.6478794691],"iteration":393,"passed_time":0.3965270833,"remaining_time":0.6098868338}, -{"learn":[0.6477774282],"iteration":394,"passed_time":0.3973680417,"remaining_time":0.6086270005}, -{"learn":[0.647670539],"iteration":395,"passed_time":0.3982385,"remaining_time":0.6074142778}, -{"learn":[0.6475312039],"iteration":396,"passed_time":0.3991062083,"remaining_time":0.6061991023}, -{"learn":[0.6474218488],"iteration":397,"passed_time":0.3999222917,"remaining_time":0.6049075869}, -{"learn":[0.647362138],"iteration":398,"passed_time":0.400754125,"remaining_time":0.6036421783}, -{"learn":[0.6472711118],"iteration":399,"passed_time":0.4016364583,"remaining_time":0.6024546875}, -{"learn":[0.6471258649],"iteration":400,"passed_time":0.402511,"remaining_time":0.6012570798}, -{"learn":[0.6470334762],"iteration":401,"passed_time":0.4033300417,"remaining_time":0.5999785197}, -{"learn":[0.6470192304],"iteration":402,"passed_time":0.4039932917,"remaining_time":0.5984714519}, -{"learn":[0.6469025512],"iteration":403,"passed_time":0.4048337083,"remaining_time":0.5972299262}, -{"learn":[0.6468155466],"iteration":404,"passed_time":0.4056967083,"remaining_time":0.5960235592}, -{"learn":[0.6466898271],"iteration":405,"passed_time":0.406526625,"remaining_time":0.5947704809}, -{"learn":[0.6465834701],"iteration":406,"passed_time":0.407336375,"remaining_time":0.5934900992}, -{"learn":[0.6464857115],"iteration":407,"passed_time":0.408161375,"remaining_time":0.592234152}, -{"learn":[0.6463780895],"iteration":408,"passed_time":0.4090309167,"remaining_time":0.5910446742}, -{"learn":[0.6462388182],"iteration":409,"passed_time":0.4098950833,"remaining_time":0.5898490224}, -{"learn":[0.6461181037],"iteration":410,"passed_time":0.410709,"remaining_time":0.5885829708}, -{"learn":[0.6460125399],"iteration":411,"passed_time":0.41153375,"remaining_time":0.5873345752}, -{"learn":[0.6458767396],"iteration":412,"passed_time":0.4123290833,"remaining_time":0.5860464211}, -{"learn":[0.6457928059],"iteration":413,"passed_time":0.4131519167,"remaining_time":0.5847995729}, -{"learn":[0.6457080924],"iteration":414,"passed_time":0.4141215833,"remaining_time":0.58376175}, -{"learn":[0.645617138],"iteration":415,"passed_time":0.4149581667,"remaining_time":0.5825374263}, -{"learn":[0.6455334881],"iteration":416,"passed_time":0.4158413333,"remaining_time":0.5813800895}, -{"learn":[0.6454711046],"iteration":417,"passed_time":0.4166774583,"remaining_time":0.5801585664}, -{"learn":[0.6453626044],"iteration":418,"passed_time":0.4175357917,"remaining_time":0.5789696777}, -{"learn":[0.645308594],"iteration":419,"passed_time":0.4183612917,"remaining_time":0.5777370218}, -{"learn":[0.6451927692],"iteration":420,"passed_time":0.419175375,"remaining_time":0.5764905989}, -{"learn":[0.6451016287],"iteration":421,"passed_time":0.42013825,"remaining_time":0.5754500201}, -{"learn":[0.6449661868],"iteration":422,"passed_time":0.420953625,"remaining_time":0.574208609}, -{"learn":[0.644866127],"iteration":423,"passed_time":0.4219075833,"remaining_time":0.5731574717}, -{"learn":[0.6447896317],"iteration":424,"passed_time":0.4228165417,"remaining_time":0.5720459093}, -{"learn":[0.6447126428],"iteration":425,"passed_time":0.423739875,"remaining_time":0.5709546673}, -{"learn":[0.6446496806],"iteration":426,"passed_time":0.4245895,"remaining_time":0.5697653009}, -{"learn":[0.6445599823],"iteration":427,"passed_time":0.4254168333,"remaining_time":0.5685477305}, -{"learn":[0.644486129],"iteration":428,"passed_time":0.426316,"remaining_time":0.5674275897}, -{"learn":[0.6443782472],"iteration":429,"passed_time":0.4271740417,"remaining_time":0.5662539622}, -{"learn":[0.6443037051],"iteration":430,"passed_time":0.4280352083,"remaining_time":0.5650859247}, -{"learn":[0.6441554195],"iteration":431,"passed_time":0.4288723333,"remaining_time":0.5638876975}, -{"learn":[0.6440947458],"iteration":432,"passed_time":0.4297535417,"remaining_time":0.562748864}, -{"learn":[0.6439528917],"iteration":433,"passed_time":0.43064225,"remaining_time":0.5616209988}, -{"learn":[0.6438918787],"iteration":434,"passed_time":0.431491625,"remaining_time":0.5604431451}, -{"learn":[0.6438308794],"iteration":435,"passed_time":0.4323464167,"remaining_time":0.559273805}, -{"learn":[0.6437270892],"iteration":436,"passed_time":0.4331837083,"remaining_time":0.5580833588}, -{"learn":[0.6436544281],"iteration":437,"passed_time":0.4340381667,"remaining_time":0.5569165518}, -{"learn":[0.6435214201],"iteration":438,"passed_time":0.4349051667,"remaining_time":0.5557671948}, -{"learn":[0.6434448977],"iteration":439,"passed_time":0.4358224167,"remaining_time":0.5546830758}, -{"learn":[0.6433579104],"iteration":440,"passed_time":0.4366480833,"remaining_time":0.5534836249}, -{"learn":[0.6431948082],"iteration":441,"passed_time":0.4375255833,"remaining_time":0.552351302}, -{"learn":[0.6431344932],"iteration":442,"passed_time":0.4383974583,"remaining_time":0.5512130571}, -{"learn":[0.6430528126],"iteration":443,"passed_time":0.4392345,"remaining_time":0.5500323919}, -{"learn":[0.6429968012],"iteration":444,"passed_time":0.4401749167,"remaining_time":0.5489821994}, -{"learn":[0.642861806],"iteration":445,"passed_time":0.4410303333,"remaining_time":0.5478269163}, -{"learn":[0.6427939774],"iteration":446,"passed_time":0.4418816667,"remaining_time":0.5466679232}, -{"learn":[0.6427363547],"iteration":447,"passed_time":0.4426942917,"remaining_time":0.5454626094}, -{"learn":[0.6425794491],"iteration":448,"passed_time":0.4435437083,"remaining_time":0.5443041944}, -{"learn":[0.6424987426],"iteration":449,"passed_time":0.4444217917,"remaining_time":0.5431821898}, -{"learn":[0.6424080589],"iteration":450,"passed_time":0.4452880833,"remaining_time":0.542046913}, -{"learn":[0.6422963944],"iteration":451,"passed_time":0.4461859167,"remaining_time":0.5409510671}, -{"learn":[0.642175415],"iteration":452,"passed_time":0.4470997917,"remaining_time":0.5398754659}, -{"learn":[0.642050619],"iteration":453,"passed_time":0.4479469167,"remaining_time":0.5387203007}, -{"learn":[0.6418774465],"iteration":454,"passed_time":0.448787125,"remaining_time":0.5375582047}, -{"learn":[0.6417544679],"iteration":455,"passed_time":0.449668,"remaining_time":0.5364460351}, -{"learn":[0.6416362703],"iteration":456,"passed_time":0.4504775417,"remaining_time":0.5352501206}, -{"learn":[0.6415294714],"iteration":457,"passed_time":0.4513299167,"remaining_time":0.5341065826}, -{"learn":[0.6414061291],"iteration":458,"passed_time":0.4522279583,"remaining_time":0.5330181383}, -{"learn":[0.6413244024],"iteration":459,"passed_time":0.4530925833,"remaining_time":0.5318912935}, -{"learn":[0.6412004657],"iteration":460,"passed_time":0.4539735833,"remaining_time":0.5307847319}, -{"learn":[0.6410947682],"iteration":461,"passed_time":0.45480775,"remaining_time":0.5296246093}, -{"learn":[0.6409739614],"iteration":462,"passed_time":0.455681125,"remaining_time":0.5285113696}, -{"learn":[0.6408636114],"iteration":463,"passed_time":0.4565130833,"remaining_time":0.5273513204}, -{"learn":[0.6407522756],"iteration":464,"passed_time":0.4573832917,"remaining_time":0.5262366904}, -{"learn":[0.6406546622],"iteration":465,"passed_time":0.4582325,"remaining_time":0.5250990451}, -{"learn":[0.6405507114],"iteration":466,"passed_time":0.45914875,"remaining_time":0.5240391515}, -{"learn":[0.6403399735],"iteration":467,"passed_time":0.4600685,"remaining_time":0.5229838504}, -{"learn":[0.6402696947],"iteration":468,"passed_time":0.46091325,"remaining_time":0.5218442127}, -{"learn":[0.6401570267],"iteration":469,"passed_time":0.4617787917,"remaining_time":0.5207292757}, -{"learn":[0.6400653003],"iteration":470,"passed_time":0.4626703333,"remaining_time":0.5196445994}, -{"learn":[0.6399097238],"iteration":471,"passed_time":0.4635137083,"remaining_time":0.5185068602}, -{"learn":[0.639842285],"iteration":472,"passed_time":0.4644340417,"remaining_time":0.5174561098}, -{"learn":[0.639799426],"iteration":473,"passed_time":0.4653260833,"remaining_time":0.5163745144}, -{"learn":[0.6397163901],"iteration":474,"passed_time":0.466149375,"remaining_time":0.5152177303}, -{"learn":[0.6396276094],"iteration":475,"passed_time":0.4670110833,"remaining_time":0.514104638}, -{"learn":[0.6394969199],"iteration":476,"passed_time":0.4678789583,"remaining_time":0.512999361}, -{"learn":[0.6394128913],"iteration":477,"passed_time":0.4687530417,"remaining_time":0.5119018572}, -{"learn":[0.6392412702],"iteration":478,"passed_time":0.4695799167,"remaining_time":0.5107539386}, -{"learn":[0.6391334379],"iteration":479,"passed_time":0.4704555833,"remaining_time":0.5096602153}, -{"learn":[0.6390480382],"iteration":480,"passed_time":0.4713654167,"remaining_time":0.5086042646}, -{"learn":[0.6389413084],"iteration":481,"passed_time":0.4722321667,"remaining_time":0.5075026189}, -{"learn":[0.6388329704],"iteration":482,"passed_time":0.4730629167,"remaining_time":0.5063634118}, -{"learn":[0.6387424616],"iteration":483,"passed_time":0.4738849167,"remaining_time":0.5052161508}, -{"learn":[0.6386683644],"iteration":484,"passed_time":0.4747396667,"remaining_time":0.5041050069}, -{"learn":[0.6385485944],"iteration":485,"passed_time":0.4755855,"remaining_time":0.5029854877}, -{"learn":[0.6384503416],"iteration":486,"passed_time":0.4764433333,"remaining_time":0.5018797331}, -{"learn":[0.638260197],"iteration":487,"passed_time":0.4773149167,"remaining_time":0.5007894208}, -{"learn":[0.6381927172],"iteration":488,"passed_time":0.478174875,"remaining_time":0.4996878551}, -{"learn":[0.6380962012],"iteration":489,"passed_time":0.47899625,"remaining_time":0.4985471173}, -{"learn":[0.6379909251],"iteration":490,"passed_time":0.47986625,"remaining_time":0.4974580881}, -{"learn":[0.6378474539],"iteration":491,"passed_time":0.4807323333,"remaining_time":0.4963659051}, -{"learn":[0.6377359495],"iteration":492,"passed_time":0.4816680417,"remaining_time":0.4953462416}, -{"learn":[0.6376286944],"iteration":493,"passed_time":0.4825479167,"remaining_time":0.4942697284}, -{"learn":[0.6375168861],"iteration":494,"passed_time":0.4833979583,"remaining_time":0.4931635737}, -{"learn":[0.6374096027],"iteration":495,"passed_time":0.484221,"remaining_time":0.4920310161}, -{"learn":[0.6373206452],"iteration":496,"passed_time":0.4850395,"remaining_time":0.4908951076}, -{"learn":[0.6371775996],"iteration":497,"passed_time":0.4858964167,"remaining_time":0.4897991991}, -{"learn":[0.6370771129],"iteration":498,"passed_time":0.486738125,"remaining_time":0.4886889792}, -{"learn":[0.6369397389],"iteration":499,"passed_time":0.4875999583,"remaining_time":0.4875999583}, -{"learn":[0.6368328637],"iteration":500,"passed_time":0.4884541667,"remaining_time":0.4865042498}, -{"learn":[0.6367415009],"iteration":501,"passed_time":0.489289125,"remaining_time":0.4853904069}, -{"learn":[0.6366775186],"iteration":502,"passed_time":0.490754375,"remaining_time":0.4849004461}, -{"learn":[0.6365143976],"iteration":503,"passed_time":0.4916245833,"remaining_time":0.4838210185}, -{"learn":[0.6363644397],"iteration":504,"passed_time":0.4924847917,"remaining_time":0.4827326176}, -{"learn":[0.6362721351],"iteration":505,"passed_time":0.4934596667,"remaining_time":0.4817570659}, -{"learn":[0.6361524848],"iteration":506,"passed_time":0.494301875,"remaining_time":0.4806525136}, -{"learn":[0.6360488517],"iteration":507,"passed_time":0.4952812083,"remaining_time":0.4796818002}, -{"learn":[0.6358690577],"iteration":508,"passed_time":0.4961139583,"remaining_time":0.4785696533}, -{"learn":[0.6357704912],"iteration":509,"passed_time":0.496988125,"remaining_time":0.4774983946}, -{"learn":[0.6357028739],"iteration":510,"passed_time":0.4978620417,"remaining_time":0.4764276681}, -{"learn":[0.6356091559],"iteration":511,"passed_time":0.4987575,"remaining_time":0.4753782422}, -{"learn":[0.6354848954],"iteration":512,"passed_time":0.4996715833,"remaining_time":0.4743470976}, -{"learn":[0.6353332827],"iteration":513,"passed_time":0.50050175,"remaining_time":0.4732370632}, -{"learn":[0.6351958501],"iteration":514,"passed_time":0.5013453333,"remaining_time":0.4721407508}, -{"learn":[0.6350798619],"iteration":515,"passed_time":0.5022064583,"remaining_time":0.4710618718}, -{"learn":[0.6349471676],"iteration":516,"passed_time":0.503100875,"remaining_time":0.4700149374}, -{"learn":[0.6348462684],"iteration":517,"passed_time":0.50409675,"remaining_time":0.469062999}, -{"learn":[0.6347263289],"iteration":518,"passed_time":0.5049604167,"remaining_time":0.467988363}, -{"learn":[0.6345859887],"iteration":519,"passed_time":0.5058380833,"remaining_time":0.4669274615}, -{"learn":[0.6344811509],"iteration":520,"passed_time":0.5067389167,"remaining_time":0.4658885625}, -{"learn":[0.6343743761],"iteration":521,"passed_time":0.507598125,"remaining_time":0.4648120761}, -{"learn":[0.6342094082],"iteration":522,"passed_time":0.5084794583,"remaining_time":0.4637565997}, -{"learn":[0.6340919601],"iteration":523,"passed_time":0.5093290417,"remaining_time":0.4626729462}, -{"learn":[0.6339735031],"iteration":524,"passed_time":0.5102164167,"remaining_time":0.461624377}, -{"learn":[0.6337635047],"iteration":525,"passed_time":0.5110749167,"remaining_time":0.4605504002}, -{"learn":[0.6337201733],"iteration":526,"passed_time":0.5120193333,"remaining_time":0.4595543542}, -{"learn":[0.63357504],"iteration":527,"passed_time":0.5129155833,"remaining_time":0.4585154457}, -{"learn":[0.6334555542],"iteration":528,"passed_time":0.5137462917,"remaining_time":0.4574187209}, -{"learn":[0.6333003155],"iteration":529,"passed_time":0.51467775,"remaining_time":0.4564123443}, -{"learn":[0.6332287575],"iteration":530,"passed_time":0.5155197917,"remaining_time":0.4553272736}, -{"learn":[0.6331149041],"iteration":531,"passed_time":0.5163504167,"remaining_time":0.4542330733}, -{"learn":[0.6329386363],"iteration":532,"passed_time":0.5171955417,"remaining_time":0.4531525665}, -{"learn":[0.6328613311],"iteration":533,"passed_time":0.518053125,"remaining_time":0.4520838132}, -{"learn":[0.6327629963],"iteration":534,"passed_time":0.5189798333,"remaining_time":0.4510759299}, -{"learn":[0.6326155973],"iteration":535,"passed_time":0.5198146667,"remaining_time":0.4499888159}, -{"learn":[0.6325550339],"iteration":536,"passed_time":0.5206850833,"remaining_time":0.4489333214}, -{"learn":[0.6324497074],"iteration":537,"passed_time":0.5215025417,"remaining_time":0.4478330376}, -{"learn":[0.6323765804],"iteration":538,"passed_time":0.5224047917,"remaining_time":0.4468063246}, -{"learn":[0.6322556835],"iteration":539,"passed_time":0.523213125,"remaining_time":0.4457000694}, -{"learn":[0.6321161761],"iteration":540,"passed_time":0.5240855833,"remaining_time":0.4446493212}, -{"learn":[0.6319724116],"iteration":541,"passed_time":0.52491825,"remaining_time":0.4435656061}, -{"learn":[0.631890329],"iteration":542,"passed_time":0.5258379583,"remaining_time":0.4425560717}, -{"learn":[0.6318086138],"iteration":543,"passed_time":0.5267144583,"remaining_time":0.4415106489}, -{"learn":[0.6317530605],"iteration":544,"passed_time":0.527634875,"remaining_time":0.4405025103}, -{"learn":[0.6316490186],"iteration":545,"passed_time":0.528466,"remaining_time":0.4394204469}, -{"learn":[0.6315127343],"iteration":546,"passed_time":0.529310375,"remaining_time":0.438350274}, -{"learn":[0.6313655159],"iteration":547,"passed_time":0.53022375,"remaining_time":0.4373378376}, -{"learn":[0.6312192706],"iteration":548,"passed_time":0.5311270417,"remaining_time":0.4363174787}, -{"learn":[0.6310263809],"iteration":549,"passed_time":0.5319750833,"remaining_time":0.4352523409}, -{"learn":[0.6309320378],"iteration":550,"passed_time":0.5328907917,"remaining_time":0.4342431315}, -{"learn":[0.6308050567],"iteration":551,"passed_time":0.533756875,"remaining_time":0.4331939855}, -{"learn":[0.6306837863],"iteration":552,"passed_time":0.53459325,"remaining_time":0.4321214878}, -{"learn":[0.630492781],"iteration":553,"passed_time":0.5354690833,"remaining_time":0.4310816086}, -{"learn":[0.6304097708],"iteration":554,"passed_time":0.5363899167,"remaining_time":0.4300784017}, -{"learn":[0.6302761415],"iteration":555,"passed_time":0.5373109583,"remaining_time":0.4290756574}, -{"learn":[0.6302110205],"iteration":556,"passed_time":0.538201625,"remaining_time":0.4280490482}, -{"learn":[0.6301250977],"iteration":557,"passed_time":0.5390502083,"remaining_time":0.4269895915}, -{"learn":[0.6299860854],"iteration":558,"passed_time":0.5399270833,"remaining_time":0.4259532089}, -{"learn":[0.6299090389],"iteration":559,"passed_time":0.5408325833,"remaining_time":0.4249398869}, -{"learn":[0.6297831727],"iteration":560,"passed_time":0.5416884167,"remaining_time":0.4238880836}, -{"learn":[0.629679111],"iteration":561,"passed_time":0.542521875,"remaining_time":0.4228195396}, -{"learn":[0.6295834329],"iteration":562,"passed_time":0.54333975,"remaining_time":0.4217397349}, -{"learn":[0.6295367313],"iteration":563,"passed_time":0.5441609583,"remaining_time":0.4206634359}, -{"learn":[0.6294441722],"iteration":564,"passed_time":0.5450120833,"remaining_time":0.419611073}, -{"learn":[0.6292933413],"iteration":565,"passed_time":0.5458285417,"remaining_time":0.4185328394}, -{"learn":[0.6291314013],"iteration":566,"passed_time":0.5466690417,"remaining_time":0.417473889}, -{"learn":[0.6290189714],"iteration":567,"passed_time":0.5475089167,"remaining_time":0.4164152324}, -{"learn":[0.6289368531],"iteration":568,"passed_time":0.5483162083,"remaining_time":0.415332664}, -{"learn":[0.6288462229],"iteration":569,"passed_time":0.549209375,"remaining_time":0.4143158443}, -{"learn":[0.6287147421],"iteration":570,"passed_time":0.5500817917,"remaining_time":0.413283868}, -{"learn":[0.6286351228],"iteration":571,"passed_time":0.5509415,"remaining_time":0.4122429406}, -{"learn":[0.6284827572],"iteration":572,"passed_time":0.551838375,"remaining_time":0.4112303423}, -{"learn":[0.6283897609],"iteration":573,"passed_time":0.552743125,"remaining_time":0.4102239917}, -{"learn":[0.628287767],"iteration":574,"passed_time":0.5537422083,"remaining_time":0.4092877192}, -{"learn":[0.6281601836],"iteration":575,"passed_time":0.55463625,"remaining_time":0.4082739062}, -{"learn":[0.6279889828],"iteration":576,"passed_time":0.5554460833,"remaining_time":0.4071987751}, -{"learn":[0.6278752527],"iteration":577,"passed_time":0.556323125,"remaining_time":0.4061736311}, -{"learn":[0.6277687136],"iteration":578,"passed_time":0.5571374167,"remaining_time":0.405103372}, -{"learn":[0.627668386],"iteration":579,"passed_time":0.5579640417,"remaining_time":0.4040429267}, -{"learn":[0.6275302106],"iteration":580,"passed_time":0.5588252917,"remaining_time":0.4030082568}, -{"learn":[0.6274097455],"iteration":581,"passed_time":0.5597099167,"remaining_time":0.4019909711}, -{"learn":[0.6272799974],"iteration":582,"passed_time":0.5605397083,"remaining_time":0.40093492}, -{"learn":[0.6271669978],"iteration":583,"passed_time":0.561415875,"remaining_time":0.3999126781}, -{"learn":[0.6270423157],"iteration":584,"passed_time":0.5622665833,"remaining_time":0.3988728754}, -{"learn":[0.6269308866],"iteration":585,"passed_time":0.5632231667,"remaining_time":0.3979085171}, -{"learn":[0.6268392247],"iteration":586,"passed_time":0.5648543333,"remaining_time":0.3974188069}, -{"learn":[0.626715537],"iteration":587,"passed_time":0.565711625,"remaining_time":0.3963829753}, -{"learn":[0.6265772881],"iteration":588,"passed_time":0.566654,"remaining_time":0.3954071205}, -{"learn":[0.6264594577],"iteration":589,"passed_time":0.5675008333,"remaining_time":0.3943649859}, -{"learn":[0.6263123275],"iteration":590,"passed_time":0.568363625,"remaining_time":0.393334556}, -{"learn":[0.6262133604],"iteration":591,"passed_time":0.5692172917,"remaining_time":0.3922984037}, -{"learn":[0.6261036495],"iteration":592,"passed_time":0.5701004583,"remaining_time":0.3912831139}, -{"learn":[0.6259059188],"iteration":593,"passed_time":0.5709907917,"remaining_time":0.3902731674}, -{"learn":[0.6257523926],"iteration":594,"passed_time":0.5718525833,"remaining_time":0.3892441954}, -{"learn":[0.6256626475],"iteration":595,"passed_time":0.5727003333,"remaining_time":0.3882062662}, -{"learn":[0.6255739968],"iteration":596,"passed_time":0.5735434167,"remaining_time":0.387165824}, -{"learn":[0.625471779],"iteration":597,"passed_time":0.5743677083,"remaining_time":0.3861134093}, -{"learn":[0.6253633844],"iteration":598,"passed_time":0.5751884167,"remaining_time":0.3850593574}, -{"learn":[0.6252629908],"iteration":599,"passed_time":0.576037625,"remaining_time":0.3840250833}, -{"learn":[0.6252055383],"iteration":600,"passed_time":0.576902625,"remaining_time":0.3830019091}, -{"learn":[0.6250767463],"iteration":601,"passed_time":0.5777682083,"remaining_time":0.381979646}, -{"learn":[0.6249901113],"iteration":602,"passed_time":0.5787036667,"remaining_time":0.3810039066}, -{"learn":[0.6249460209],"iteration":603,"passed_time":0.5795180833,"remaining_time":0.3799489421}, -{"learn":[0.6248968142],"iteration":604,"passed_time":0.5804229583,"remaining_time":0.3789538323}, -{"learn":[0.6247970399],"iteration":605,"passed_time":0.581196375,"remaining_time":0.3778735507}, -{"learn":[0.6246682503],"iteration":606,"passed_time":0.5821137917,"remaining_time":0.3768875126}, -{"learn":[0.6245230492],"iteration":607,"passed_time":0.5829463333,"remaining_time":0.3758469781}, -{"learn":[0.6244243911],"iteration":608,"passed_time":0.5837934167,"remaining_time":0.3748164629}, -{"learn":[0.6243509135],"iteration":609,"passed_time":0.5847035,"remaining_time":0.3738268279}, -{"learn":[0.6242728069],"iteration":610,"passed_time":0.585532375,"remaining_time":0.372785751}, -{"learn":[0.6242359789],"iteration":611,"passed_time":0.5863718333,"remaining_time":0.3717520773}, -{"learn":[0.6241544412],"iteration":612,"passed_time":0.5872407083,"remaining_time":0.3707376087}, -{"learn":[0.6240728094],"iteration":613,"passed_time":0.5880809583,"remaining_time":0.3697056188}, -{"learn":[0.6239570602],"iteration":614,"passed_time":0.58900875,"remaining_time":0.3687290549}, -{"learn":[0.6238223496],"iteration":615,"passed_time":0.5898722083,"remaining_time":0.3677125455}, -{"learn":[0.6236999651],"iteration":616,"passed_time":0.590733,"remaining_time":0.3666948768}, -{"learn":[0.6236371245],"iteration":617,"passed_time":0.591610125,"remaining_time":0.3656878119}, -{"learn":[0.6235355488],"iteration":618,"passed_time":0.5924959167,"remaining_time":0.3646865012}, -{"learn":[0.6234165964],"iteration":619,"passed_time":0.5933915,"remaining_time":0.3636915645}, -{"learn":[0.6232437071],"iteration":620,"passed_time":0.5942469167,"remaining_time":0.3626724338}, -{"learn":[0.6231823926],"iteration":621,"passed_time":0.5952288333,"remaining_time":0.3617307058}, -{"learn":[0.6230291297],"iteration":622,"passed_time":0.5961462917,"remaining_time":0.3607498426}, -{"learn":[0.622997177],"iteration":623,"passed_time":0.5970388333,"remaining_time":0.3597541688}, -{"learn":[0.6229496011],"iteration":624,"passed_time":0.5979300833,"remaining_time":0.35875805}, -{"learn":[0.6228121811],"iteration":625,"passed_time":0.5988258333,"remaining_time":0.3577649547}, -{"learn":[0.6226861413],"iteration":626,"passed_time":0.599663125,"remaining_time":0.3567373933}, -{"learn":[0.6226244729],"iteration":627,"passed_time":0.6005455417,"remaining_time":0.355737168}, -{"learn":[0.6225595178],"iteration":628,"passed_time":0.6013856667,"remaining_time":0.3547123725}, -{"learn":[0.6224827756],"iteration":629,"passed_time":0.602256,"remaining_time":0.3537059048}, -{"learn":[0.6223680111],"iteration":630,"passed_time":0.6030630417,"remaining_time":0.3526628564}, -{"learn":[0.6222540007],"iteration":631,"passed_time":0.6039235417,"remaining_time":0.3516516825}, -{"learn":[0.6221538415],"iteration":632,"passed_time":0.604796875,"remaining_time":0.3506484252}, -{"learn":[0.6220762578],"iteration":633,"passed_time":0.6056305,"remaining_time":0.3496226546}, -{"learn":[0.6219660335],"iteration":634,"passed_time":0.6065775,"remaining_time":0.3486626575}, -{"learn":[0.62188634],"iteration":635,"passed_time":0.607441125,"remaining_time":0.3476549835}, -{"learn":[0.6218020551],"iteration":636,"passed_time":0.60833175,"remaining_time":0.346663148}, -{"learn":[0.6216555363],"iteration":637,"passed_time":0.60914125,"remaining_time":0.3456255995}, -{"learn":[0.6215575745],"iteration":638,"passed_time":0.6100025833,"remaining_time":0.3446180479}, -{"learn":[0.6214663845],"iteration":639,"passed_time":0.6108417917,"remaining_time":0.3435985078}, -{"learn":[0.6213875579],"iteration":640,"passed_time":0.6117429583,"remaining_time":0.342614231}, -{"learn":[0.6213345572],"iteration":641,"passed_time":0.6126240417,"remaining_time":0.3416190139}, -{"learn":[0.6212789289],"iteration":642,"passed_time":0.613561125,"remaining_time":0.3406552436}, -{"learn":[0.6211349209],"iteration":643,"passed_time":0.614421375,"remaining_time":0.3396490831}, -{"learn":[0.6210476278],"iteration":644,"passed_time":0.6152490833,"remaining_time":0.3386254645}, -{"learn":[0.6208814405],"iteration":645,"passed_time":0.616136125,"remaining_time":0.3376349663}, -{"learn":[0.6207879568],"iteration":646,"passed_time":0.6170049167,"remaining_time":0.3366348309}, -{"learn":[0.6206961904],"iteration":647,"passed_time":0.6178855,"remaining_time":0.3356415062}, -{"learn":[0.6205756362],"iteration":648,"passed_time":0.6186845833,"remaining_time":0.3346044511}, -{"learn":[0.620489714],"iteration":649,"passed_time":0.619567,"remaining_time":0.333613}, -{"learn":[0.6203560498],"iteration":650,"passed_time":0.6204354167,"remaining_time":0.3326143785}, -{"learn":[0.6201900917],"iteration":651,"passed_time":0.62127425,"remaining_time":0.3316003666}, -{"learn":[0.6200948954],"iteration":652,"passed_time":0.6221871667,"remaining_time":0.3306262586}, -{"learn":[0.6199593443],"iteration":653,"passed_time":0.6230258333,"remaining_time":0.3296130556}, -{"learn":[0.6198125256],"iteration":654,"passed_time":0.623864375,"remaining_time":0.3286003197}, -{"learn":[0.6196710602],"iteration":655,"passed_time":0.6247112917,"remaining_time":0.3275925066}, -{"learn":[0.6196207402],"iteration":656,"passed_time":0.6255725417,"remaining_time":0.3265926663}, -{"learn":[0.6195696658],"iteration":657,"passed_time":0.6264435,"remaining_time":0.3255982933}, -{"learn":[0.6194968475],"iteration":658,"passed_time":0.627324625,"remaining_time":0.3246095556}, -{"learn":[0.6194141635],"iteration":659,"passed_time":0.628151625,"remaining_time":0.3235932614}, -{"learn":[0.61935944],"iteration":660,"passed_time":0.6290048333,"remaining_time":0.3225909811}, -{"learn":[0.6192651336],"iteration":661,"passed_time":0.6300189167,"remaining_time":0.3216712898}, -{"learn":[0.619161837],"iteration":662,"passed_time":0.6309228333,"remaining_time":0.3206953165}, -{"learn":[0.619100053],"iteration":663,"passed_time":0.6318079167,"remaining_time":0.3197100301}, -{"learn":[0.6189102509],"iteration":664,"passed_time":0.632651,"remaining_time":0.3187038872}, -{"learn":[0.6187836399],"iteration":665,"passed_time":0.63348625,"remaining_time":0.3176943056}, -{"learn":[0.6186752696],"iteration":666,"passed_time":0.634283125,"remaining_time":0.3166660879}, -{"learn":[0.6185793207],"iteration":667,"passed_time":0.6351313333,"remaining_time":0.3156640758}, -{"learn":[0.6184556644],"iteration":668,"passed_time":0.636007125,"remaining_time":0.314676171}, -{"learn":[0.6183547598],"iteration":669,"passed_time":0.6368517083,"remaining_time":0.3136732295}, -{"learn":[0.6182543311],"iteration":670,"passed_time":0.6376957917,"remaining_time":0.3126705148}, -{"learn":[0.6181447023],"iteration":671,"passed_time":0.638646,"remaining_time":0.3117200714}, -{"learn":[0.6180756722],"iteration":672,"passed_time":0.6395057917,"remaining_time":0.3107256967}, -{"learn":[0.6179628263],"iteration":673,"passed_time":0.640407875,"remaining_time":0.3097521769}, -{"learn":[0.6178767191],"iteration":674,"passed_time":0.6412378333,"remaining_time":0.308744142}, -{"learn":[0.6177457197],"iteration":675,"passed_time":0.6420738333,"remaining_time":0.3077395296}, -{"learn":[0.6175885438],"iteration":676,"passed_time":0.6429148333,"remaining_time":0.3067378008}, -{"learn":[0.6175131774],"iteration":677,"passed_time":0.6437360833,"remaining_time":0.3057271664}, -{"learn":[0.6173813339],"iteration":678,"passed_time":0.644591875,"remaining_time":0.3047334196}, -{"learn":[0.6172965125],"iteration":679,"passed_time":0.6454354167,"remaining_time":0.3037343137}, -{"learn":[0.6172250901],"iteration":680,"passed_time":0.6463154583,"remaining_time":0.3027527624}, -{"learn":[0.6170926518],"iteration":681,"passed_time":0.6471819167,"remaining_time":0.3017651752}, -{"learn":[0.616973324],"iteration":682,"passed_time":0.6480337917,"remaining_time":0.3007711742}, -{"learn":[0.6169183634],"iteration":683,"passed_time":0.6489113333,"remaining_time":0.2997894464}, -{"learn":[0.6167861017],"iteration":684,"passed_time":0.649859625,"remaining_time":0.2988405575}, -{"learn":[0.6167087958],"iteration":685,"passed_time":0.6507582083,"remaining_time":0.2978689175}, -{"learn":[0.6166320669],"iteration":686,"passed_time":0.6515955833,"remaining_time":0.2968696035}, -{"learn":[0.616536298],"iteration":687,"passed_time":0.6524415833,"remaining_time":0.2958746715}, -{"learn":[0.6164080717],"iteration":688,"passed_time":0.6533106667,"remaining_time":0.2948905912}, -{"learn":[0.616287606],"iteration":689,"passed_time":0.6541902917,"remaining_time":0.2939115803}, -{"learn":[0.6162332563],"iteration":690,"passed_time":0.655123375,"remaining_time":0.2929567625}, -{"learn":[0.6161250832],"iteration":691,"passed_time":0.6560125417,"remaining_time":0.2919824607}, -{"learn":[0.6160210474],"iteration":692,"passed_time":0.6568712917,"remaining_time":0.2909949301}, -{"learn":[0.6159276634],"iteration":693,"passed_time":0.6577257917,"remaining_time":0.2900058966}, -{"learn":[0.615874583],"iteration":694,"passed_time":0.658538375,"remaining_time":0.2889988552}, -{"learn":[0.615746811],"iteration":695,"passed_time":0.6595298333,"remaining_time":0.2880705019}, -{"learn":[0.6156979757],"iteration":696,"passed_time":0.6604519583,"remaining_time":0.2871118269}, -{"learn":[0.6156281876],"iteration":697,"passed_time":0.6613020417,"remaining_time":0.2861220868}, -{"learn":[0.6155299974],"iteration":698,"passed_time":0.6622415833,"remaining_time":0.2851712684}, -{"learn":[0.61541052],"iteration":699,"passed_time":0.6631658333,"remaining_time":0.2842139286}, -{"learn":[0.6153276474],"iteration":700,"passed_time":0.6640329583,"remaining_time":0.2832323175}, -{"learn":[0.6152041366],"iteration":701,"passed_time":0.6648829583,"remaining_time":0.2822437629}, -{"learn":[0.6151300774],"iteration":702,"passed_time":0.66578225,"remaining_time":0.2812764271}, -{"learn":[0.6149737492],"iteration":703,"passed_time":0.666714375,"remaining_time":0.2803230895}, -{"learn":[0.6148346042],"iteration":704,"passed_time":0.6675789583,"remaining_time":0.2793415499}, -{"learn":[0.6147754102],"iteration":705,"passed_time":0.6684313333,"remaining_time":0.2783552578}, -{"learn":[0.6146369332],"iteration":706,"passed_time":0.6692458333,"remaining_time":0.277353648}, -{"learn":[0.6144883355],"iteration":707,"passed_time":0.6701590417,"remaining_time":0.2763932771}, -{"learn":[0.6143737231],"iteration":708,"passed_time":0.6709925,"remaining_time":0.2754003068}, -{"learn":[0.6142649151],"iteration":709,"passed_time":0.6717869583,"remaining_time":0.2743918562}, -{"learn":[0.6141459941],"iteration":710,"passed_time":0.6726079583,"remaining_time":0.273394796}, -{"learn":[0.6139975423],"iteration":711,"passed_time":0.6734695833,"remaining_time":0.2724146629}, -{"learn":[0.613855914],"iteration":712,"passed_time":0.6742677083,"remaining_time":0.271409302}, -{"learn":[0.613678782],"iteration":713,"passed_time":0.675126,"remaining_time":0.2704286218}, -{"learn":[0.6135928058],"iteration":714,"passed_time":0.67596825,"remaining_time":0.2694418899}, -{"learn":[0.6135311722],"iteration":715,"passed_time":0.6768229583,"remaining_time":0.268460503}, -{"learn":[0.6134451919],"iteration":716,"passed_time":0.6776765833,"remaining_time":0.267479042}, -{"learn":[0.6133056337],"iteration":717,"passed_time":0.6785389167,"remaining_time":0.2665013572}, -{"learn":[0.6132658941],"iteration":718,"passed_time":0.6793984167,"remaining_time":0.2655228861}, -{"learn":[0.6131619598],"iteration":719,"passed_time":0.680295375,"remaining_time":0.2645593125}, -{"learn":[0.6131005904],"iteration":720,"passed_time":0.6811607083,"remaining_time":0.263583686}, -{"learn":[0.6129929298],"iteration":721,"passed_time":0.6820442083,"remaining_time":0.26261536}, -{"learn":[0.6128732939],"iteration":722,"passed_time":0.6829186667,"remaining_time":0.2616438045}, -{"learn":[0.6127641474],"iteration":723,"passed_time":0.6837775417,"remaining_time":0.2606665767}, -{"learn":[0.6126318318],"iteration":724,"passed_time":0.684616625,"remaining_time":0.2596821681}, -{"learn":[0.6125384369],"iteration":725,"passed_time":0.68549325,"remaining_time":0.2587123285}, -{"learn":[0.6124106601],"iteration":726,"passed_time":0.6863904167,"remaining_time":0.2577504591}, -{"learn":[0.6123654172],"iteration":727,"passed_time":0.6872264167,"remaining_time":0.2567659139}, -{"learn":[0.6122788128],"iteration":728,"passed_time":0.6881484167,"remaining_time":0.2558137461}, -{"learn":[0.6122126108],"iteration":729,"passed_time":0.6890134583,"remaining_time":0.2548405942}, -{"learn":[0.6121104225],"iteration":730,"passed_time":0.6899081667,"remaining_time":0.253878655}, -{"learn":[0.6120130881],"iteration":731,"passed_time":0.6908475417,"remaining_time":0.252933253}, -{"learn":[0.6119112927],"iteration":732,"passed_time":0.691678875,"remaining_time":0.2519485124}, -{"learn":[0.6118246638],"iteration":733,"passed_time":0.69263075,"remaining_time":0.251007874}, -{"learn":[0.6117177565],"iteration":734,"passed_time":0.6935211667,"remaining_time":0.2500450465}, -{"learn":[0.6116389763],"iteration":735,"passed_time":0.6943914583,"remaining_time":0.249075197}, -{"learn":[0.6114579229],"iteration":736,"passed_time":0.6952369167,"remaining_time":0.2480967559}, -{"learn":[0.6113895881],"iteration":737,"passed_time":0.69625775,"remaining_time":0.2471809356}, -{"learn":[0.6113396696],"iteration":738,"passed_time":0.697195625,"remaining_time":0.246235532}, -{"learn":[0.6112891405],"iteration":739,"passed_time":0.698084625,"remaining_time":0.2452729764}, -{"learn":[0.6112067316],"iteration":740,"passed_time":0.6989770417,"remaining_time":0.2443118135}, -{"learn":[0.6111778767],"iteration":741,"passed_time":0.6998454583,"remaining_time":0.2433424909}, -{"learn":[0.6110938966],"iteration":742,"passed_time":0.7006858333,"remaining_time":0.2423637405}, -{"learn":[0.6110588958],"iteration":743,"passed_time":0.701543125,"remaining_time":0.2413911828}, -{"learn":[0.6110345082],"iteration":744,"passed_time":0.7024291667,"remaining_time":0.2404287752}, -{"learn":[0.6109203042],"iteration":745,"passed_time":0.7033755,"remaining_time":0.2394871005}, -{"learn":[0.6108124605],"iteration":746,"passed_time":0.7042810417,"remaining_time":0.2385315978}, -{"learn":[0.6106891767],"iteration":747,"passed_time":0.7051778333,"remaining_time":0.2375732807}, -{"learn":[0.6105830088],"iteration":748,"passed_time":0.7060598333,"remaining_time":0.2366101711}, -{"learn":[0.6104668042],"iteration":749,"passed_time":0.70701675,"remaining_time":0.23567225}, -{"learn":[0.6103335407],"iteration":750,"passed_time":0.7078719167,"remaining_time":0.2347005423}, -{"learn":[0.6102476438],"iteration":751,"passed_time":0.7086905833,"remaining_time":0.2337171073}, -{"learn":[0.6101576684],"iteration":752,"passed_time":0.7096325417,"remaining_time":0.2327745522}, -{"learn":[0.6100299836],"iteration":753,"passed_time":0.7104922083,"remaining_time":0.2318051502}, -{"learn":[0.6099106607],"iteration":754,"passed_time":0.7113880417,"remaining_time":0.2308477751}, -{"learn":[0.6097946837],"iteration":755,"passed_time":0.7122717083,"remaining_time":0.229886636}, -{"learn":[0.6096914954],"iteration":756,"passed_time":0.7131004583,"remaining_time":0.2289080732}, -{"learn":[0.6095701024],"iteration":757,"passed_time":0.71394325,"remaining_time":0.2279343885}, -{"learn":[0.6094605049],"iteration":758,"passed_time":0.7147775833,"remaining_time":0.2269583631}, -{"learn":[0.6093697682],"iteration":759,"passed_time":0.7156485417,"remaining_time":0.2259942763}, -{"learn":[0.6092899688],"iteration":760,"passed_time":0.7165489167,"remaining_time":0.2250396729}, -{"learn":[0.6092042421],"iteration":761,"passed_time":0.717489625,"remaining_time":0.2240978094}, -{"learn":[0.6091257097],"iteration":762,"passed_time":0.7183723333,"remaining_time":0.2231379332}, -{"learn":[0.6090299559],"iteration":763,"passed_time":0.719213125,"remaining_time":0.2221653109}, -{"learn":[0.6089423349],"iteration":764,"passed_time":0.7200561667,"remaining_time":0.2211937244}, -{"learn":[0.6088834909],"iteration":765,"passed_time":0.7209439583,"remaining_time":0.2202361439}, -{"learn":[0.6087828286],"iteration":766,"passed_time":0.7217654167,"remaining_time":0.2192585946}, -{"learn":[0.608689057],"iteration":767,"passed_time":0.722579625,"remaining_time":0.2182792617}, -{"learn":[0.6085700604],"iteration":768,"passed_time":0.7234702083,"remaining_time":0.2173233006}, -{"learn":[0.608439473],"iteration":769,"passed_time":0.7243243333,"remaining_time":0.216356619}, -{"learn":[0.608359382],"iteration":770,"passed_time":0.7252335417,"remaining_time":0.2154065902}, -{"learn":[0.6082689384],"iteration":771,"passed_time":0.7261444167,"remaining_time":0.2144571593}, -{"learn":[0.6081907179],"iteration":772,"passed_time":0.72702075,"remaining_time":0.2134976847}, -{"learn":[0.6080718779],"iteration":773,"passed_time":0.7279461667,"remaining_time":0.2125527567}, -{"learn":[0.6079545844],"iteration":774,"passed_time":0.728792125,"remaining_time":0.2115848105}, -{"learn":[0.6078928627],"iteration":775,"passed_time":0.729671125,"remaining_time":0.2106267165}, -{"learn":[0.6078142075],"iteration":776,"passed_time":0.7304837917,"remaining_time":0.2096497883}, -{"learn":[0.6076877936],"iteration":777,"passed_time":0.731356875,"remaining_time":0.2086905222}, -{"learn":[0.6075586835],"iteration":778,"passed_time":0.732248625,"remaining_time":0.2077367729}, -{"learn":[0.6074776794],"iteration":779,"passed_time":0.7331587083,"remaining_time":0.2067883536}, -{"learn":[0.6073698886],"iteration":780,"passed_time":0.7340482083,"remaining_time":0.2058342607}, -{"learn":[0.6072989674],"iteration":781,"passed_time":0.7349200833,"remaining_time":0.2048754197}, -{"learn":[0.6072177464],"iteration":782,"passed_time":0.7359413333,"remaining_time":0.2039581984}, -{"learn":[0.6070946205],"iteration":783,"passed_time":0.736829625,"remaining_time":0.2030040804}, -{"learn":[0.6070088132],"iteration":784,"passed_time":0.737699875,"remaining_time":0.2020451887}, -{"learn":[0.6068112623],"iteration":785,"passed_time":0.738555625,"remaining_time":0.2010825747}, -{"learn":[0.6066953812],"iteration":786,"passed_time":0.739432875,"remaining_time":0.2001260513}, -{"learn":[0.6065614126],"iteration":787,"passed_time":0.7403120417,"remaining_time":0.1991702447}, -{"learn":[0.6064676059],"iteration":788,"passed_time":0.74115825,"remaining_time":0.1982058184}, -{"learn":[0.6063495792],"iteration":789,"passed_time":0.7420425833,"remaining_time":0.1972518259}, -{"learn":[0.6062228485],"iteration":790,"passed_time":0.742968875,"remaining_time":0.1963090959}, -{"learn":[0.6060937846],"iteration":791,"passed_time":0.7438357083,"remaining_time":0.1953507921}, -{"learn":[0.6060014667],"iteration":792,"passed_time":0.7446884583,"remaining_time":0.1943890427}, -{"learn":[0.6058886423],"iteration":793,"passed_time":0.7454995417,"remaining_time":0.1934167577}, -{"learn":[0.6057141355],"iteration":794,"passed_time":0.746333125,"remaining_time":0.19245068}, -{"learn":[0.605632333],"iteration":795,"passed_time":0.7471766667,"remaining_time":0.1914874874}, -{"learn":[0.6055230529],"iteration":796,"passed_time":0.7480674167,"remaining_time":0.1905366193}, -{"learn":[0.6053841295],"iteration":797,"passed_time":0.7489005,"remaining_time":0.1895713045}, -{"learn":[0.6053323372],"iteration":798,"passed_time":0.7497743333,"remaining_time":0.188616572}, -{"learn":[0.6052619534],"iteration":799,"passed_time":0.750594125,"remaining_time":0.1876485313}, -{"learn":[0.6051896956],"iteration":800,"passed_time":0.7514947083,"remaining_time":0.1867009325}, -{"learn":[0.6051446857],"iteration":801,"passed_time":0.7523584583,"remaining_time":0.1857443575}, -{"learn":[0.6050448247],"iteration":802,"passed_time":0.7533304583,"remaining_time":0.1848145707}, -{"learn":[0.6049600147],"iteration":803,"passed_time":0.7541478333,"remaining_time":0.1838469842}, -{"learn":[0.6048282451],"iteration":804,"passed_time":0.7550132083,"remaining_time":0.1828913983}, -{"learn":[0.6047487123],"iteration":805,"passed_time":0.755943125,"remaining_time":0.181951571}, -{"learn":[0.604604094],"iteration":806,"passed_time":0.756818625,"remaining_time":0.1809987542}, -{"learn":[0.6044734619],"iteration":807,"passed_time":0.757691375,"remaining_time":0.1800454752}, -{"learn":[0.6043585512],"iteration":808,"passed_time":0.7585872917,"remaining_time":0.1790978649}, -{"learn":[0.6042819435],"iteration":809,"passed_time":0.7594910833,"remaining_time":0.1781522294}, -{"learn":[0.6041891818],"iteration":810,"passed_time":0.7603317917,"remaining_time":0.1771919958}, -{"learn":[0.6040979288],"iteration":811,"passed_time":0.7612197917,"remaining_time":0.176243006}, -{"learn":[0.6039702464],"iteration":812,"passed_time":0.7620856667,"remaining_time":0.1752890771}, -{"learn":[0.6038717824],"iteration":813,"passed_time":0.7629103333,"remaining_time":0.1743259484}, -{"learn":[0.6037687691],"iteration":814,"passed_time":0.7638888333,"remaining_time":0.1733980787}, -{"learn":[0.6036619193],"iteration":815,"passed_time":0.7647368333,"remaining_time":0.1724406585}, -{"learn":[0.6035915912],"iteration":816,"passed_time":0.7656070417,"remaining_time":0.1714884806}, -{"learn":[0.6034922993],"iteration":817,"passed_time":0.7665289167,"remaining_time":0.1705479986}, -{"learn":[0.6034118605],"iteration":818,"passed_time":0.7674675417,"remaining_time":0.1696112638}, -{"learn":[0.6033064571],"iteration":819,"passed_time":0.7683005,"remaining_time":0.1686513293}, -{"learn":[0.603251048],"iteration":820,"passed_time":0.7691102917,"remaining_time":0.1676866531}, -{"learn":[0.6031280312],"iteration":821,"passed_time":0.7700459583,"remaining_time":0.1667496114}, -{"learn":[0.6030161761],"iteration":822,"passed_time":0.77094075,"remaining_time":0.1658037822}, -{"learn":[0.6028591274],"iteration":823,"passed_time":0.771777375,"remaining_time":0.1648456529}, -{"learn":[0.6027928212],"iteration":824,"passed_time":0.7726381667,"remaining_time":0.1638929444}, -{"learn":[0.6026817944],"iteration":825,"passed_time":0.77348875,"remaining_time":0.1629383081}, -{"learn":[0.6025456726],"iteration":826,"passed_time":0.77432975,"remaining_time":0.1619819187}, -{"learn":[0.6024532742],"iteration":827,"passed_time":0.775288875,"remaining_time":0.161050346}, -{"learn":[0.6023474292],"iteration":828,"passed_time":0.776172375,"remaining_time":0.1601031075}, -{"learn":[0.6022556889],"iteration":829,"passed_time":0.777052625,"remaining_time":0.1591553569}, -{"learn":[0.6021177215],"iteration":830,"passed_time":0.7778994583,"remaining_time":0.1582009729}, -{"learn":[0.6020755036],"iteration":831,"passed_time":0.7788144583,"remaining_time":0.1572606118}, -{"learn":[0.6020117073],"iteration":832,"passed_time":0.7797717083,"remaining_time":0.1563287819}, -{"learn":[0.6019502868],"iteration":833,"passed_time":0.7806800417,"remaining_time":0.1553871546}, -{"learn":[0.6018480088],"iteration":834,"passed_time":0.7815754583,"remaining_time":0.1544430546}, -{"learn":[0.6017694455],"iteration":835,"passed_time":0.7824990417,"remaining_time":0.1535045967}, -{"learn":[0.60170259],"iteration":836,"passed_time":0.7833045417,"remaining_time":0.1525431784}, -{"learn":[0.6015910268],"iteration":837,"passed_time":0.7841851667,"remaining_time":0.1515966551}, -{"learn":[0.6015245886],"iteration":838,"passed_time":0.7851024583,"remaining_time":0.1506573251}, -{"learn":[0.6014938932],"iteration":839,"passed_time":0.786048125,"remaining_time":0.1497234524}, -{"learn":[0.6014357534],"iteration":840,"passed_time":0.786916,"remaining_time":0.1487748442}, -{"learn":[0.6013370417],"iteration":841,"passed_time":0.7878287917,"remaining_time":0.1478348564}, -{"learn":[0.6013015619],"iteration":842,"passed_time":0.7887409167,"remaining_time":0.1468948089}, -{"learn":[0.6012103707],"iteration":843,"passed_time":0.7897045417,"remaining_time":0.1459643466}, -{"learn":[0.6011104296],"iteration":844,"passed_time":0.790604375,"remaining_time":0.1450221043}, -{"learn":[0.6009857425],"iteration":845,"passed_time":0.7914500833,"remaining_time":0.1440701097}, -{"learn":[0.6009384028],"iteration":846,"passed_time":0.7923135833,"remaining_time":0.14312158}, -{"learn":[0.6008769001],"iteration":847,"passed_time":0.7931865417,"remaining_time":0.1421749461}, -{"learn":[0.600723994],"iteration":848,"passed_time":0.79404125,"remaining_time":0.14122524}, -{"learn":[0.6005725792],"iteration":849,"passed_time":0.7949336667,"remaining_time":0.1402824118}, -{"learn":[0.6004173276],"iteration":850,"passed_time":0.795782125,"remaining_time":0.1393320054}, -{"learn":[0.6003554873],"iteration":851,"passed_time":0.7966835,"remaining_time":0.1383910305}, -{"learn":[0.6002822832],"iteration":852,"passed_time":0.7975607083,"remaining_time":0.1374459837}, -{"learn":[0.6002519847],"iteration":853,"passed_time":0.7984800417,"remaining_time":0.1365082975}, -{"learn":[0.6001101203],"iteration":854,"passed_time":0.7993060417,"remaining_time":0.1355548258}, -{"learn":[0.600026324],"iteration":855,"passed_time":0.800225625,"remaining_time":0.1346173949}, -{"learn":[0.5999059997],"iteration":856,"passed_time":0.801103625,"remaining_time":0.1336730669}, -{"learn":[0.5997826751],"iteration":857,"passed_time":0.8019577917,"remaining_time":0.1327249492}, -{"learn":[0.5996946214],"iteration":858,"passed_time":0.8028097083,"remaining_time":0.1317766809}, -{"learn":[0.5996372571],"iteration":859,"passed_time":0.8037239583,"remaining_time":0.1308387839}, -{"learn":[0.5995671529],"iteration":860,"passed_time":0.8045672083,"remaining_time":0.1298894796}, -{"learn":[0.5994830837],"iteration":861,"passed_time":0.8054008333,"remaining_time":0.1289388805}, -{"learn":[0.5994070327],"iteration":862,"passed_time":0.8063535833,"remaining_time":0.1280074634}, -{"learn":[0.599291588],"iteration":863,"passed_time":0.807240875,"remaining_time":0.1270656933}, -{"learn":[0.5991555529],"iteration":864,"passed_time":0.808073625,"remaining_time":0.1261155368}, -{"learn":[0.5990512189],"iteration":865,"passed_time":0.8089779583,"remaining_time":0.125176728}, -{"learn":[0.5989449257],"iteration":866,"passed_time":0.80982675,"remaining_time":0.1242294784}, -{"learn":[0.5987995471],"iteration":867,"passed_time":0.8106805833,"remaining_time":0.1232832224}, -{"learn":[0.5986596191],"iteration":868,"passed_time":0.8115848333,"remaining_time":0.1223447792}, -{"learn":[0.5984596],"iteration":869,"passed_time":0.8124724167,"remaining_time":0.1214039243}, -{"learn":[0.5983708614],"iteration":870,"passed_time":0.8133187083,"remaining_time":0.1204570762}, -{"learn":[0.5982659758],"iteration":871,"passed_time":0.8141499167,"remaining_time":0.1195082446}, -{"learn":[0.5981914491],"iteration":872,"passed_time":0.8150022083,"remaining_time":0.1185627497}, -{"learn":[0.5980372406],"iteration":873,"passed_time":0.8158679583,"remaining_time":0.1176194082}, -{"learn":[0.5979616497],"iteration":874,"passed_time":0.8167729583,"remaining_time":0.1166818512}, -{"learn":[0.5978349599],"iteration":875,"passed_time":0.8176350833,"remaining_time":0.1157382995}, -{"learn":[0.5977471907],"iteration":876,"passed_time":0.818550625,"remaining_time":0.1148024252}, -{"learn":[0.5976357923],"iteration":877,"passed_time":0.8194545417,"remaining_time":0.1138649819}, -{"learn":[0.597539397],"iteration":878,"passed_time":0.8203150833,"remaining_time":0.112921644}, -{"learn":[0.5974475337],"iteration":879,"passed_time":0.8211387083,"remaining_time":0.1119734602}, -{"learn":[0.5973648148],"iteration":880,"passed_time":0.822098625,"remaining_time":0.1110439686}, -{"learn":[0.5972881113],"iteration":881,"passed_time":0.8229774167,"remaining_time":0.1101035546}, -{"learn":[0.5972097551],"iteration":882,"passed_time":0.8238649583,"remaining_time":0.1091644396}, -{"learn":[0.5971028695],"iteration":883,"passed_time":0.8247139167,"remaining_time":0.1082203782}, -{"learn":[0.5970075276],"iteration":884,"passed_time":0.8256132083,"remaining_time":0.1072830723}, -{"learn":[0.5969448085],"iteration":885,"passed_time":0.8264575417,"remaining_time":0.1063387808}, -{"learn":[0.5968829332],"iteration":886,"passed_time":0.8273245833,"remaining_time":0.1053976076}, -{"learn":[0.5968335648],"iteration":887,"passed_time":0.8282341667,"remaining_time":0.104461967}, -{"learn":[0.5967692857],"iteration":888,"passed_time":0.8291255833,"remaining_time":0.1035241167}, -{"learn":[0.5966935535],"iteration":889,"passed_time":0.82995775,"remaining_time":0.1025790478}, -{"learn":[0.5966234683],"iteration":890,"passed_time":0.8308470417,"remaining_time":0.1016412206}, -{"learn":[0.5965520128],"iteration":891,"passed_time":0.831935375,"remaining_time":0.1007276015}, -{"learn":[0.5964774556],"iteration":892,"passed_time":0.832822125,"remaining_time":0.09978943715}, -{"learn":[0.5964001453],"iteration":893,"passed_time":0.8336955,"remaining_time":0.09884980201}, -{"learn":[0.5963597499],"iteration":894,"passed_time":0.8346064583,"remaining_time":0.09791472416}, -{"learn":[0.5962594803],"iteration":895,"passed_time":0.8354746667,"remaining_time":0.0969747381}, -{"learn":[0.5961441503],"iteration":896,"passed_time":0.836385375,"remaining_time":0.09603979222}, -{"learn":[0.5960515286],"iteration":897,"passed_time":0.8372344583,"remaining_time":0.09509790061}, -{"learn":[0.5959631666],"iteration":898,"passed_time":0.8381841667,"remaining_time":0.09416752039}, -{"learn":[0.5958549249],"iteration":899,"passed_time":0.8391097083,"remaining_time":0.09323441204}, -{"learn":[0.5958251023],"iteration":900,"passed_time":0.8399942083,"remaining_time":0.0922968109}, -{"learn":[0.5957247475],"iteration":901,"passed_time":0.840837375,"remaining_time":0.09135483675}, -{"learn":[0.5956181786],"iteration":902,"passed_time":0.8416924583,"remaining_time":0.09041436153}, -{"learn":[0.5955217787],"iteration":903,"passed_time":0.8425678333,"remaining_time":0.08947623009}, -{"learn":[0.5953823552],"iteration":904,"passed_time":0.8434293333,"remaining_time":0.08853678085}, -{"learn":[0.5952485511],"iteration":905,"passed_time":0.8442760833,"remaining_time":0.08759597333}, -{"learn":[0.5951395035],"iteration":906,"passed_time":0.8451188333,"remaining_time":0.08665496307}, -{"learn":[0.5950566675],"iteration":907,"passed_time":0.845961875,"remaining_time":0.08571419879}, -{"learn":[0.5949382392],"iteration":908,"passed_time":0.846875625,"remaining_time":0.08478072814}, -{"learn":[0.5948631696],"iteration":909,"passed_time":0.8478230417,"remaining_time":0.08385063049}, -{"learn":[0.5947775742],"iteration":910,"passed_time":0.8487059167,"remaining_time":0.08291418944}, -{"learn":[0.5946450491],"iteration":911,"passed_time":0.849536625,"remaining_time":0.08197283224}, -{"learn":[0.5945927187],"iteration":912,"passed_time":0.8504662917,"remaining_time":0.08104114718}, -{"learn":[0.5944767771],"iteration":913,"passed_time":0.8512885833,"remaining_time":0.08009936342}, -{"learn":[0.594375845],"iteration":914,"passed_time":0.8521580417,"remaining_time":0.07916222245}, -{"learn":[0.5942287995],"iteration":915,"passed_time":0.8530177083,"remaining_time":0.07822433133}, -{"learn":[0.594189855],"iteration":916,"passed_time":0.8538657917,"remaining_time":0.07728556239}, -{"learn":[0.5940514923],"iteration":917,"passed_time":0.8546859583,"remaining_time":0.07634449737}, -{"learn":[0.5939805504],"iteration":918,"passed_time":0.8555402083,"remaining_time":0.07540669954}, -{"learn":[0.5938739906],"iteration":919,"passed_time":0.8563802083,"remaining_time":0.0744678442}, -{"learn":[0.5938174928],"iteration":920,"passed_time":0.8573428333,"remaining_time":0.07353972186}, -{"learn":[0.5937350345],"iteration":921,"passed_time":0.8581869583,"remaining_time":0.07260149973}, -{"learn":[0.5936636322],"iteration":922,"passed_time":0.859066,"remaining_time":0.07166639437}, -{"learn":[0.5935815184],"iteration":923,"passed_time":0.85989725,"remaining_time":0.07072747944}, -{"learn":[0.5934893421],"iteration":924,"passed_time":0.8607494167,"remaining_time":0.06979049324}, -{"learn":[0.593449219],"iteration":925,"passed_time":0.8617271667,"remaining_time":0.06886372606}, -{"learn":[0.5933491024],"iteration":926,"passed_time":0.8625928333,"remaining_time":0.06792802247}, -{"learn":[0.5932453746],"iteration":927,"passed_time":0.8634812917,"remaining_time":0.06699423815}, -{"learn":[0.593154078],"iteration":928,"passed_time":0.8643215,"remaining_time":0.06605686383}, -{"learn":[0.5930957201],"iteration":929,"passed_time":0.865213,"remaining_time":0.06512355914}, -{"learn":[0.593017525],"iteration":930,"passed_time":0.8660666667,"remaining_time":0.06418754028}, -{"learn":[0.5929123713],"iteration":931,"passed_time":0.866877125,"remaining_time":0.0632485456}, -{"learn":[0.5928582934],"iteration":932,"passed_time":0.8678081667,"remaining_time":0.06231848571}, -{"learn":[0.5927365436],"iteration":933,"passed_time":0.868666875,"remaining_time":0.06138331237}, -{"learn":[0.592679295],"iteration":934,"passed_time":0.8695045833,"remaining_time":0.06044684269}, -{"learn":[0.5925512165],"iteration":935,"passed_time":0.8703714167,"remaining_time":0.0595125755}, -{"learn":[0.5924919592],"iteration":936,"passed_time":0.8712627083,"remaining_time":0.05858009672}, -{"learn":[0.5924054122],"iteration":937,"passed_time":0.8721310833,"remaining_time":0.05764619101}, -{"learn":[0.5923346481],"iteration":938,"passed_time":0.8729755833,"remaining_time":0.05671087389}, -{"learn":[0.5922318225],"iteration":939,"passed_time":0.87398475,"remaining_time":0.05578626064}, -{"learn":[0.5921497125],"iteration":940,"passed_time":0.8748503333,"remaining_time":0.05485246511}, -{"learn":[0.5920512215],"iteration":941,"passed_time":0.87572475,"remaining_time":0.05391935828}, -{"learn":[0.591994926],"iteration":942,"passed_time":0.8766001667,"remaining_time":0.05298643637}, -{"learn":[0.5918975164],"iteration":943,"passed_time":0.87747425,"remaining_time":0.0520535572}, -{"learn":[0.5917693795],"iteration":944,"passed_time":0.8783917917,"remaining_time":0.05112333179}, -{"learn":[0.5917194456],"iteration":945,"passed_time":0.8793845833,"remaining_time":0.05019742865}, -{"learn":[0.5916583656],"iteration":946,"passed_time":0.8802786667,"remaining_time":0.04926585991}, -{"learn":[0.591580854],"iteration":947,"passed_time":0.8811242083,"remaining_time":0.04833170763}, -{"learn":[0.5915253687],"iteration":948,"passed_time":0.8820177917,"remaining_time":0.04740032389}, -{"learn":[0.5914398758],"iteration":949,"passed_time":0.8828759167,"remaining_time":0.04646715351}, -{"learn":[0.5913587762],"iteration":950,"passed_time":0.88371475,"remaining_time":0.04553314695}, -{"learn":[0.5913216292],"iteration":951,"passed_time":0.8847088333,"remaining_time":0.04460716807}, -{"learn":[0.5912173708],"iteration":952,"passed_time":0.8855774583,"remaining_time":0.04367485891}, -{"learn":[0.5911216593],"iteration":953,"passed_time":0.886479,"remaining_time":0.04274427044}, -{"learn":[0.5910419119],"iteration":954,"passed_time":0.887397625,"remaining_time":0.04181454777}, -{"learn":[0.5909652365],"iteration":955,"passed_time":0.8882579583,"remaining_time":0.04088216545}, -{"learn":[0.5908915942],"iteration":956,"passed_time":0.889102,"remaining_time":0.03994920167}, -{"learn":[0.5908010204],"iteration":957,"passed_time":0.889981125,"remaining_time":0.03901796164}, -{"learn":[0.5906865771],"iteration":958,"passed_time":0.890816,"remaining_time":0.03808493848}, -{"learn":[0.5905654737],"iteration":959,"passed_time":0.8916815,"remaining_time":0.03715339583}, -{"learn":[0.5904341965],"iteration":960,"passed_time":0.8925140833,"remaining_time":0.03622065479}, -{"learn":[0.5903113144],"iteration":961,"passed_time":0.8933801667,"remaining_time":0.03528944525}, -{"learn":[0.5902120949],"iteration":962,"passed_time":0.8942666667,"remaining_time":0.03435915542}, -{"learn":[0.5901522946],"iteration":963,"passed_time":0.8951554167,"remaining_time":0.03342904046}, -{"learn":[0.5900856096],"iteration":964,"passed_time":0.8960375,"remaining_time":0.03249876943}, -{"learn":[0.5899826952],"iteration":965,"passed_time":0.8969290833,"remaining_time":0.03156893254}, -{"learn":[0.5898385582],"iteration":966,"passed_time":0.897803125,"remaining_time":0.03063857614}, -{"learn":[0.5897849396],"iteration":967,"passed_time":0.8987314583,"remaining_time":0.02971013085}, -{"learn":[0.5896595068],"iteration":968,"passed_time":0.899615125,"remaining_time":0.02878025684}, -{"learn":[0.5895739305],"iteration":969,"passed_time":0.90053225,"remaining_time":0.02785151289}, -{"learn":[0.5895022224],"iteration":970,"passed_time":0.901440375,"remaining_time":0.02692252407}, -{"learn":[0.5893844171],"iteration":971,"passed_time":0.9023563333,"remaining_time":0.02599380384}, -{"learn":[0.589284196],"iteration":972,"passed_time":0.9032532083,"remaining_time":0.02506458029}, -{"learn":[0.5891785801],"iteration":973,"passed_time":0.904184125,"remaining_time":0.02413633188}, -{"learn":[0.5891223598],"iteration":974,"passed_time":0.9050166667,"remaining_time":0.02320555556}, -{"learn":[0.5890188244],"iteration":975,"passed_time":0.9058810417,"remaining_time":0.02227576332}, -{"learn":[0.5889523527],"iteration":976,"passed_time":0.9067448333,"remaining_time":0.02134609127}, -{"learn":[0.5888453469],"iteration":977,"passed_time":0.9076269167,"remaining_time":0.02041696541}, -{"learn":[0.5887064685],"iteration":978,"passed_time":0.9084969167,"remaining_time":0.01948767646}, -{"learn":[0.5886411903],"iteration":979,"passed_time":0.90936575,"remaining_time":0.01855848469}, -{"learn":[0.588510144],"iteration":980,"passed_time":0.9102329167,"remaining_time":0.01762938371}, -{"learn":[0.5883941504],"iteration":981,"passed_time":0.91110375,"remaining_time":0.01670047607}, -{"learn":[0.5883016216],"iteration":982,"passed_time":0.9120130833,"remaining_time":0.01577235241}, -{"learn":[0.5882688712],"iteration":983,"passed_time":0.9129241667,"remaining_time":0.01484429539}, -{"learn":[0.5881616955],"iteration":984,"passed_time":0.9137523333,"remaining_time":0.01391501015}, -{"learn":[0.5880908841],"iteration":985,"passed_time":0.9145471667,"remaining_time":0.01298545673}, -{"learn":[0.5879911494],"iteration":986,"passed_time":0.9154051667,"remaining_time":0.01205700827}, -{"learn":[0.5878546188],"iteration":987,"passed_time":0.9162403333,"remaining_time":0.0111284251}, -{"learn":[0.5878286823],"iteration":988,"passed_time":0.917131,"remaining_time":0.01020064813}, -{"learn":[0.5877494643],"iteration":989,"passed_time":0.9180367917,"remaining_time":0.009273098906}, -{"learn":[0.5876096324],"iteration":990,"passed_time":0.9189062083,"remaining_time":0.008345263244}, -{"learn":[0.5874841349],"iteration":991,"passed_time":0.919794875,"remaining_time":0.007417700605}, -{"learn":[0.5873866008],"iteration":992,"passed_time":0.9206342083,"remaining_time":0.006489868538}, -{"learn":[0.587266743],"iteration":993,"passed_time":0.9215325833,"remaining_time":0.005562570926}, -{"learn":[0.5871444457],"iteration":994,"passed_time":0.9224122917,"remaining_time":0.004635237647}, -{"learn":[0.5870732271],"iteration":995,"passed_time":0.9232960833,"remaining_time":0.003708016399}, -{"learn":[0.5869590978],"iteration":996,"passed_time":0.9241671667,"remaining_time":0.002780844032}, -{"learn":[0.58691796],"iteration":997,"passed_time":0.925030875,"remaining_time":0.001853769289}, -{"learn":[0.5868353451],"iteration":998,"passed_time":0.9259231667,"remaining_time":0.0009268500167}, -{"learn":[0.5867894654],"iteration":999,"passed_time":0.9268122083,"remaining_time":0} -]} \ No newline at end of file +{"learn":[0.6928287833],"iteration":0,"passed_time":0.001349767948,"remaining_time":1.34841818}, +{"learn":[0.6926164346],"iteration":1,"passed_time":0.002560825718,"remaining_time":1.277852033}, +{"learn":[0.6924060032],"iteration":2,"passed_time":0.004350307847,"remaining_time":1.445752308}, +{"learn":[0.6922061951],"iteration":3,"passed_time":0.005762993298,"remaining_time":1.434985331}, +{"learn":[0.6919050072],"iteration":4,"passed_time":0.006852549453,"remaining_time":1.363657341}, +{"learn":[0.691670916],"iteration":5,"passed_time":0.007894729978,"remaining_time":1.3078936}, +{"learn":[0.6914286307],"iteration":6,"passed_time":0.009197080628,"remaining_time":1.304671581}, +{"learn":[0.6910840058],"iteration":7,"passed_time":0.01041630517,"remaining_time":1.291621842}, +{"learn":[0.6907501367],"iteration":8,"passed_time":0.01160357096,"remaining_time":1.277682091}, +{"learn":[0.6905266754],"iteration":9,"passed_time":0.01286879612,"remaining_time":1.274010816}, +{"learn":[0.6902108601],"iteration":10,"passed_time":0.01400556123,"remaining_time":1.259227278}, +{"learn":[0.6899110402],"iteration":11,"passed_time":0.01506011692,"remaining_time":1.239949627}, +{"learn":[0.6897678923],"iteration":12,"passed_time":0.01631325859,"remaining_time":1.238552787}, +{"learn":[0.6895523065],"iteration":13,"passed_time":0.01766402655,"remaining_time":1.244052155}, +{"learn":[0.6893331015],"iteration":14,"passed_time":0.0187404992,"remaining_time":1.230626114}, +{"learn":[0.6889941588],"iteration":15,"passed_time":0.01989013948,"remaining_time":1.223243578}, +{"learn":[0.6887095933],"iteration":16,"passed_time":0.02102948797,"remaining_time":1.215999216}, +{"learn":[0.6885156519],"iteration":17,"passed_time":0.02213346098,"remaining_time":1.20750326}, +{"learn":[0.6882187429],"iteration":18,"passed_time":0.0231981418,"remaining_time":1.19775669}, +{"learn":[0.6879135541],"iteration":19,"passed_time":0.02426365597,"remaining_time":1.188919143}, +{"learn":[0.687697466],"iteration":20,"passed_time":0.02549350566,"remaining_time":1.188482954}, +{"learn":[0.6874472905],"iteration":21,"passed_time":0.02666806294,"remaining_time":1.185516616}, +{"learn":[0.687284936],"iteration":22,"passed_time":0.0278533287,"remaining_time":1.183160963}, +{"learn":[0.6870264131],"iteration":23,"passed_time":0.02901988588,"remaining_time":1.180142026}, +{"learn":[0.6866763484],"iteration":24,"passed_time":0.03019502651,"remaining_time":1.177606034}, +{"learn":[0.6864787251],"iteration":25,"passed_time":0.03126587408,"remaining_time":1.171267744}, +{"learn":[0.6862068171],"iteration":26,"passed_time":0.03230126285,"remaining_time":1.164041806}, +{"learn":[0.686048033],"iteration":27,"passed_time":0.03350032046,"remaining_time":1.162939696}, +{"learn":[0.6857677154],"iteration":28,"passed_time":0.03464325232,"remaining_time":1.159951655}, +{"learn":[0.6854892539],"iteration":29,"passed_time":0.03578122579,"remaining_time":1.156926301}, +{"learn":[0.6852026013],"iteration":30,"passed_time":0.03768141772,"remaining_time":1.177848186}, +{"learn":[0.6849279945],"iteration":31,"passed_time":0.03878959913,"remaining_time":1.173385374}, +{"learn":[0.6847059523],"iteration":32,"passed_time":0.03989636384,"remaining_time":1.169084359}, +{"learn":[0.6845645139],"iteration":33,"passed_time":0.04104054572,"remaining_time":1.166034328}, +{"learn":[0.6843277955],"iteration":34,"passed_time":0.04222293645,"remaining_time":1.164146676}, +{"learn":[0.6841055761],"iteration":35,"passed_time":0.04331486763,"remaining_time":1.1598759}, +{"learn":[0.6838078629],"iteration":36,"passed_time":0.04436408992,"remaining_time":1.154665367}, +{"learn":[0.683537295],"iteration":37,"passed_time":0.04548947988,"remaining_time":1.151602096}, +{"learn":[0.6832856679],"iteration":38,"passed_time":0.04658986951,"remaining_time":1.148022169}, +{"learn":[0.683036311],"iteration":39,"passed_time":0.04773775978,"remaining_time":1.145706235}, +{"learn":[0.6826603834],"iteration":40,"passed_time":0.04882173252,"remaining_time":1.141952231}, +{"learn":[0.6825702211],"iteration":41,"passed_time":0.04982874591,"remaining_time":1.136569966}, +{"learn":[0.6823844966],"iteration":42,"passed_time":0.05151814338,"remaining_time":1.146578214}, +{"learn":[0.6821721103],"iteration":43,"passed_time":0.05270507583,"remaining_time":1.145137557}, +{"learn":[0.6819953415],"iteration":44,"passed_time":0.05382013232,"remaining_time":1.142182808}, +{"learn":[0.6816754017],"iteration":45,"passed_time":0.05490939681,"remaining_time":1.138773142}, +{"learn":[0.6815330468],"iteration":46,"passed_time":0.05596199414,"remaining_time":1.134718732}, +{"learn":[0.6812347701],"iteration":47,"passed_time":0.05702888332,"remaining_time":1.131072853}, +{"learn":[0.6810628101],"iteration":48,"passed_time":0.05808160565,"remaining_time":1.127257285}, +{"learn":[0.6808755478],"iteration":49,"passed_time":0.05924466279,"remaining_time":1.125648593}, +{"learn":[0.6807493585],"iteration":50,"passed_time":0.0603813029,"remaining_time":1.123565813}, +{"learn":[0.6804509029],"iteration":51,"passed_time":0.06146744234,"remaining_time":1.120598757}, +{"learn":[0.6803251196],"iteration":52,"passed_time":0.06256674863,"remaining_time":1.117937942}, +{"learn":[0.680213535],"iteration":53,"passed_time":0.06379980669,"remaining_time":1.117678095}, +{"learn":[0.6798640298],"iteration":54,"passed_time":0.06488923784,"remaining_time":1.114915087}, +{"learn":[0.6797186547],"iteration":55,"passed_time":0.06605183664,"remaining_time":1.113445246}, +{"learn":[0.679505348],"iteration":56,"passed_time":0.06728072798,"remaining_time":1.113082921}, +{"learn":[0.6791986169],"iteration":57,"passed_time":0.06834695049,"remaining_time":1.110048748}, +{"learn":[0.6790541683],"iteration":58,"passed_time":0.06939933948,"remaining_time":1.106860652}, +{"learn":[0.6787328061],"iteration":59,"passed_time":0.07057239675,"remaining_time":1.105634216}, +{"learn":[0.6785615931],"iteration":60,"passed_time":0.07175091242,"remaining_time":1.104493553}, +{"learn":[0.6783498609],"iteration":61,"passed_time":0.07283988523,"remaining_time":1.101996973}, +{"learn":[0.6780073876],"iteration":62,"passed_time":0.07389564927,"remaining_time":1.099051165}, +{"learn":[0.6777334812],"iteration":63,"passed_time":0.07492778799,"remaining_time":1.095818899}, +{"learn":[0.6773925562],"iteration":64,"passed_time":0.07599538552,"remaining_time":1.093164392}, +{"learn":[0.6772580202],"iteration":65,"passed_time":0.07706181637,"remaining_time":1.090541462}, +{"learn":[0.6770390765],"iteration":66,"passed_time":0.07817108112,"remaining_time":1.088561473}, +{"learn":[0.6768627712],"iteration":67,"passed_time":0.07924651209,"remaining_time":1.086143372}, +{"learn":[0.6767381944],"iteration":68,"passed_time":0.08040065243,"remaining_time":1.084826194}, +{"learn":[0.6764800491],"iteration":69,"passed_time":0.0814512914,"remaining_time":1.082138586}, +{"learn":[0.6763113114],"iteration":70,"passed_time":0.08266597422,"remaining_time":1.081643522}, +{"learn":[0.6760785307],"iteration":71,"passed_time":0.08393136605,"remaining_time":1.081782051}, +{"learn":[0.6759073986],"iteration":72,"passed_time":0.08510433998,"remaining_time":1.080708536}, +{"learn":[0.6756884286],"iteration":73,"passed_time":0.08618443768,"remaining_time":1.078470126}, +{"learn":[0.6754932357],"iteration":74,"passed_time":0.08727370216,"remaining_time":1.07637566}, +{"learn":[0.6752823846],"iteration":75,"passed_time":0.08847113475,"remaining_time":1.075622744}, +{"learn":[0.6750764536],"iteration":76,"passed_time":0.08953102384,"remaining_time":1.073209546}, +{"learn":[0.6748006547],"iteration":77,"passed_time":0.09070687281,"remaining_time":1.072201753}, +{"learn":[0.6746149098],"iteration":78,"passed_time":0.09197313965,"remaining_time":1.072243818}, +{"learn":[0.6743795255],"iteration":79,"passed_time":0.09304111218,"remaining_time":1.06997279}, +{"learn":[0.6741601159],"iteration":80,"passed_time":0.09413746009,"remaining_time":1.068053405}, +{"learn":[0.6739583715],"iteration":81,"passed_time":0.09525576663,"remaining_time":1.066399924}, +{"learn":[0.6736956411],"iteration":82,"passed_time":0.09635303122,"remaining_time":1.064526863}, +{"learn":[0.6735222682],"iteration":83,"passed_time":0.09741025361,"remaining_time":1.062235623}, +{"learn":[0.6732040071],"iteration":84,"passed_time":0.09866543697,"remaining_time":1.06210441}, +{"learn":[0.6730653342],"iteration":85,"passed_time":0.09975586814,"remaining_time":1.060196087}, +{"learn":[0.6727821352],"iteration":86,"passed_time":0.1008670496,"remaining_time":1.058524325}, +{"learn":[0.6726847729],"iteration":87,"passed_time":0.101979606,"remaining_time":1.056879554}, +{"learn":[0.6724062595],"iteration":88,"passed_time":0.10302737,"remaining_time":1.054583529}, +{"learn":[0.6722732874],"iteration":89,"passed_time":0.1040742589,"remaining_time":1.052306395}, +{"learn":[0.6720428269],"iteration":90,"passed_time":0.1051568983,"remaining_time":1.050413413}, +{"learn":[0.6718851637],"iteration":91,"passed_time":0.1062229125,"remaining_time":1.048373962}, +{"learn":[0.6717745622],"iteration":92,"passed_time":0.1075355133,"remaining_time":1.048760328}, +{"learn":[0.6716173719],"iteration":93,"passed_time":0.1086103192,"remaining_time":1.046818609}, +{"learn":[0.6714800803],"iteration":94,"passed_time":0.1096842085,"remaining_time":1.044886407}, +{"learn":[0.6713188357],"iteration":95,"passed_time":0.1107214723,"remaining_time":1.042627197}, +{"learn":[0.6711623649],"iteration":96,"passed_time":0.1118271537,"remaining_time":1.0410301}, +{"learn":[0.6709778679],"iteration":97,"passed_time":0.1130235029,"remaining_time":1.040277547}, +{"learn":[0.6706995134],"iteration":98,"passed_time":0.1140733085,"remaining_time":1.038182333}, +{"learn":[0.6706233192],"iteration":99,"passed_time":0.1151698231,"remaining_time":1.036528408}, +{"learn":[0.6703872418],"iteration":100,"passed_time":0.1162681294,"remaining_time":1.034901468}, +{"learn":[0.6702086988],"iteration":101,"passed_time":0.1173555188,"remaining_time":1.033188783}, +{"learn":[0.6699334796],"iteration":102,"passed_time":0.1183866575,"remaining_time":1.030998367}, +{"learn":[0.6697245445],"iteration":103,"passed_time":0.1195568814,"remaining_time":1.030028517}, +{"learn":[0.6694821826],"iteration":104,"passed_time":0.1206638545,"remaining_time":1.028515712}, +{"learn":[0.6693429681],"iteration":105,"passed_time":0.1217432855,"remaining_time":1.026778276}, +{"learn":[0.6692443922],"iteration":106,"passed_time":0.1229298013,"remaining_time":1.025946846}, +{"learn":[0.6690957163],"iteration":107,"passed_time":0.1239689401,"remaining_time":1.023891616}, +{"learn":[0.6689903048],"iteration":108,"passed_time":0.1252231651,"remaining_time":1.023613212}, +{"learn":[0.668850182],"iteration":109,"passed_time":0.1263484717,"remaining_time":1.022273999}, +{"learn":[0.6686834278],"iteration":110,"passed_time":0.1274699867,"remaining_time":1.020908272}, +{"learn":[0.6685945587],"iteration":111,"passed_time":0.1287063364,"remaining_time":1.020457382}, +{"learn":[0.6683676461],"iteration":112,"passed_time":0.1298528933,"remaining_time":1.019287756}, +{"learn":[0.6682199765],"iteration":113,"passed_time":0.1309045323,"remaining_time":1.017380839}, +{"learn":[0.6680477742],"iteration":114,"passed_time":0.1319432128,"remaining_time":1.015389072}, +{"learn":[0.6679219029],"iteration":115,"passed_time":0.1331426871,"remaining_time":1.014639098}, +{"learn":[0.6678083834],"iteration":116,"passed_time":0.1343114943,"remaining_time":1.013649995}, +{"learn":[0.6675823422],"iteration":117,"passed_time":0.1354848432,"remaining_time":1.012691794}, +{"learn":[0.6673951098],"iteration":118,"passed_time":0.1366879842,"remaining_time":1.011950539}, +{"learn":[0.6672506656],"iteration":119,"passed_time":0.1378468746,"remaining_time":1.010877081}, +{"learn":[0.6670696664],"iteration":120,"passed_time":0.1389095971,"remaining_time":1.009103602}, +{"learn":[0.6667165763],"iteration":121,"passed_time":0.1400346537,"remaining_time":1.007790377}, +{"learn":[0.6665780153],"iteration":122,"passed_time":0.1412987955,"remaining_time":1.0074719}, +{"learn":[0.6663949212],"iteration":123,"passed_time":0.1424543526,"remaining_time":1.006371071}, +{"learn":[0.6660985541],"iteration":124,"passed_time":0.143514075,"remaining_time":1.004598525}, +{"learn":[0.6658269877],"iteration":125,"passed_time":0.1445820892,"remaining_time":1.002894809}, +{"learn":[0.6656440187],"iteration":126,"passed_time":0.145648645,"remaining_time":1.00119108}, +{"learn":[0.6655221413],"iteration":127,"passed_time":0.1467157426,"remaining_time":0.9995009963}, +{"learn":[0.6653756244],"iteration":128,"passed_time":0.1477927152,"remaining_time":0.9978872478}, +{"learn":[0.6652414277],"iteration":129,"passed_time":0.1489074384,"remaining_time":0.9965343953}, +{"learn":[0.66510967],"iteration":130,"passed_time":0.1500114531,"remaining_time":0.9951141428}, +{"learn":[0.6649534115],"iteration":131,"passed_time":0.1511188845,"remaining_time":0.9937211493}, +{"learn":[0.664709159],"iteration":132,"passed_time":0.1521702734,"remaining_time":0.9919671208}, +{"learn":[0.6644466829],"iteration":133,"passed_time":0.1533278305,"remaining_time":0.9909097105}, +{"learn":[0.6642076197],"iteration":134,"passed_time":0.1543873862,"remaining_time":0.9892228823}, +{"learn":[0.6640760489],"iteration":135,"passed_time":0.1554274417,"remaining_time":0.9874213946}, +{"learn":[0.6638759781],"iteration":136,"passed_time":0.1564820808,"remaining_time":0.9857228883}, +{"learn":[0.6636627943],"iteration":137,"passed_time":0.157702222,"remaining_time":0.9850675026}, +{"learn":[0.6634215245],"iteration":138,"passed_time":0.1595053293,"remaining_time":0.9880150254}, +{"learn":[0.6633030921],"iteration":139,"passed_time":0.1605879687,"remaining_time":0.9864689506}, +{"learn":[0.6631113541],"iteration":140,"passed_time":0.1618267768,"remaining_time":0.9858808603}, +{"learn":[0.662986964],"iteration":141,"passed_time":0.163016376,"remaining_time":0.9849862718}, +{"learn":[0.662829127],"iteration":142,"passed_time":0.1641420576,"remaining_time":0.9837044992}, +{"learn":[0.6627006591],"iteration":143,"passed_time":0.1652210303,"remaining_time":0.9821472357}, +{"learn":[0.6624516614],"iteration":144,"passed_time":0.1672039317,"remaining_time":0.9859266316}, +{"learn":[0.6623631013],"iteration":145,"passed_time":0.1682725292,"remaining_time":0.9842790407}, +{"learn":[0.6621185781],"iteration":146,"passed_time":0.1693410018,"remaining_time":0.982638602}, +{"learn":[0.6619535145],"iteration":147,"passed_time":0.1704785169,"remaining_time":0.9814033539}, +{"learn":[0.6617618135],"iteration":148,"passed_time":0.171663741,"remaining_time":0.9804419031}, +{"learn":[0.6615291483],"iteration":149,"passed_time":0.1727857976,"remaining_time":0.9791195195}, +{"learn":[0.6612972842],"iteration":150,"passed_time":0.1738350198,"remaining_time":0.9773902771}, +{"learn":[0.6610713393],"iteration":151,"passed_time":0.1752367885,"remaining_time":0.97763682}, +{"learn":[0.6608558469],"iteration":152,"passed_time":0.1763264696,"remaining_time":0.9761341163}, +{"learn":[0.6605726319],"iteration":153,"passed_time":0.1774250259,"remaining_time":0.974685532}, +{"learn":[0.6603816831],"iteration":154,"passed_time":0.1785195821,"remaining_time":0.9732196575}, +{"learn":[0.6601677036],"iteration":155,"passed_time":0.1795729711,"remaining_time":0.9715358182}, +{"learn":[0.6600519771],"iteration":156,"passed_time":0.180689486,"remaining_time":0.9701989598}, +{"learn":[0.6599233624],"iteration":157,"passed_time":0.1817801255,"remaining_time":0.9687269979}, +{"learn":[0.6596793023],"iteration":158,"passed_time":0.182992975,"remaining_time":0.9679062386}, +{"learn":[0.659501313],"iteration":159,"passed_time":0.1843294511,"remaining_time":0.9677296181}, +{"learn":[0.6592179566],"iteration":160,"passed_time":0.1857544283,"remaining_time":0.967999785}, +{"learn":[0.6590524625],"iteration":161,"passed_time":0.1868881517,"remaining_time":0.9667424146}, +{"learn":[0.6589222389],"iteration":162,"passed_time":0.1880170001,"remaining_time":0.9654615281}, +{"learn":[0.6587672488],"iteration":163,"passed_time":0.1890880977,"remaining_time":0.9638881076}, +{"learn":[0.6585432905],"iteration":164,"passed_time":0.190241863,"remaining_time":0.9627391249}, +{"learn":[0.6583341285],"iteration":165,"passed_time":0.1913395026,"remaining_time":0.9613081035}, +{"learn":[0.6581287575],"iteration":166,"passed_time":0.1924001,"remaining_time":0.9596963074}, +{"learn":[0.658040769],"iteration":167,"passed_time":0.193550532,"remaining_time":0.958535968}, +{"learn":[0.657824124],"iteration":168,"passed_time":0.1946158795,"remaining_time":0.956957372}, +{"learn":[0.6576711522],"iteration":169,"passed_time":0.1957274776,"remaining_time":0.955610626}, +{"learn":[0.6574105284],"iteration":170,"passed_time":0.196885868,"remaining_time":0.9544934771}, +{"learn":[0.6573513967],"iteration":171,"passed_time":0.1979627573,"remaining_time":0.9529835063}, +{"learn":[0.6572393594],"iteration":172,"passed_time":0.1989998545,"remaining_time":0.9512883216}, +{"learn":[0.6571337901],"iteration":173,"passed_time":0.2001093276,"remaining_time":0.9499442791}, +{"learn":[0.656967115],"iteration":174,"passed_time":0.2011853835,"remaining_time":0.9484453795}, +{"learn":[0.6567832979],"iteration":175,"passed_time":0.202250981,"remaining_time":0.9469023203}, +{"learn":[0.6565641804],"iteration":176,"passed_time":0.2032937449,"remaining_time":0.9452584862}, +{"learn":[0.6563728518],"iteration":177,"passed_time":0.2044038847,"remaining_time":0.943932546}, +{"learn":[0.6561657601],"iteration":178,"passed_time":0.2054987742,"remaining_time":0.9425390706}, +{"learn":[0.655904797],"iteration":179,"passed_time":0.2065484548,"remaining_time":0.9409429609}, +{"learn":[0.6556907144],"iteration":180,"passed_time":0.2083866043,"remaining_time":0.9429206017}, +{"learn":[0.6554749836],"iteration":181,"passed_time":0.2094665353,"remaining_time":0.9414484939}, +{"learn":[0.6552384278],"iteration":182,"passed_time":0.2105146742,"remaining_time":0.9398387369}, +{"learn":[0.6550593705],"iteration":183,"passed_time":0.2116563144,"remaining_time":0.9386497423}, +{"learn":[0.6549176946],"iteration":184,"passed_time":0.2128372468,"remaining_time":0.9376343575}, +{"learn":[0.6547667344],"iteration":185,"passed_time":0.2139100944,"remaining_time":0.9361441766}, +{"learn":[0.6546407621],"iteration":186,"passed_time":0.2150146508,"remaining_time":0.9347963158}, +{"learn":[0.654531388],"iteration":187,"passed_time":0.2161881664,"remaining_time":0.9337488887}, +{"learn":[0.6543715973],"iteration":188,"passed_time":0.2172865143,"remaining_time":0.9323775825}, +{"learn":[0.6542344294],"iteration":189,"passed_time":0.2183387783,"remaining_time":0.9308126864}, +{"learn":[0.653980908],"iteration":190,"passed_time":0.2194532514,"remaining_time":0.9295166514}, +{"learn":[0.6537231655],"iteration":191,"passed_time":0.220620267,"remaining_time":0.9284436234}, +{"learn":[0.6535846343],"iteration":192,"passed_time":0.2216737393,"remaining_time":0.9268948581}, +{"learn":[0.6532570799],"iteration":193,"passed_time":0.2227745873,"remaining_time":0.9255480275}, +{"learn":[0.6531244226],"iteration":194,"passed_time":0.2239336443,"remaining_time":0.924444019}, +{"learn":[0.6530105959],"iteration":195,"passed_time":0.2250331173,"remaining_time":0.9230950322}, +{"learn":[0.6528758555],"iteration":196,"passed_time":0.2261424654,"remaining_time":0.921788831}, +{"learn":[0.6527330184],"iteration":197,"passed_time":0.2273905653,"remaining_time":0.9210466333}, +{"learn":[0.652579639],"iteration":198,"passed_time":0.228572081,"remaining_time":0.9200313412}, +{"learn":[0.6524510676],"iteration":199,"passed_time":0.2296255117,"remaining_time":0.9185020468}, +{"learn":[0.6523011961],"iteration":200,"passed_time":0.2306674839,"remaining_time":0.9169319384}, +{"learn":[0.6520717755],"iteration":201,"passed_time":0.2318333327,"remaining_time":0.9158564332}, +{"learn":[0.65195605],"iteration":202,"passed_time":0.2330250152,"remaining_time":0.9148814638}, +{"learn":[0.6517967451],"iteration":203,"passed_time":0.2341788639,"remaining_time":0.9137567435}, +{"learn":[0.6516507776],"iteration":204,"passed_time":0.2352555866,"remaining_time":0.9123326406}, +{"learn":[0.6515417944],"iteration":205,"passed_time":0.2363364759,"remaining_time":0.9109279704}, +{"learn":[0.6512425091],"iteration":206,"passed_time":0.2374091152,"remaining_time":0.909494823}, +{"learn":[0.6511639815],"iteration":207,"passed_time":0.238473171,"remaining_time":0.9080324589}, +{"learn":[0.6510348185],"iteration":208,"passed_time":0.2395241433,"remaining_time":0.9065243893}, +{"learn":[0.6508672783],"iteration":209,"passed_time":0.2407667432,"remaining_time":0.9057415577}, +{"learn":[0.6507311498],"iteration":210,"passed_time":0.2418413408,"remaining_time":0.9043261512}, +{"learn":[0.6505463552],"iteration":211,"passed_time":0.2430395651,"remaining_time":0.9033734777}, +{"learn":[0.650325255],"iteration":212,"passed_time":0.2441398297,"remaining_time":0.9020565539}, +{"learn":[0.6501750068],"iteration":213,"passed_time":0.2453214704,"remaining_time":0.9010405409}, +{"learn":[0.6499916934],"iteration":214,"passed_time":0.2463792345,"remaining_time":0.8995706933}, +{"learn":[0.6499259299],"iteration":215,"passed_time":0.2474604989,"remaining_time":0.8981899588}, +{"learn":[0.6497298657],"iteration":216,"passed_time":0.2485992223,"remaining_time":0.8970193138}, +{"learn":[0.6496321568],"iteration":217,"passed_time":0.2498546557,"remaining_time":0.8962676181}, +{"learn":[0.6495153521],"iteration":218,"passed_time":0.2509115447,"remaining_time":0.8948032714}, +{"learn":[0.6493507922],"iteration":219,"passed_time":0.2520214762,"remaining_time":0.8935306882}, +{"learn":[0.6491371804],"iteration":220,"passed_time":0.2531780749,"remaining_time":0.8924240739}, +{"learn":[0.6489323062],"iteration":221,"passed_time":0.2542473391,"remaining_time":0.8910109451}, +{"learn":[0.6487269873],"iteration":222,"passed_time":0.2553171033,"remaining_time":0.8896026425}, +{"learn":[0.6485897273],"iteration":223,"passed_time":0.2563774091,"remaining_time":0.8881645958}, +{"learn":[0.6485224681],"iteration":224,"passed_time":0.2577755944,"remaining_time":0.8878937139}, +{"learn":[0.6482982815],"iteration":225,"passed_time":0.2588426085,"remaining_time":0.8864786682}, +{"learn":[0.6481669177],"iteration":226,"passed_time":0.2599112894,"remaining_time":0.8850723644}, +{"learn":[0.6479954591],"iteration":227,"passed_time":0.2611523893,"remaining_time":0.8842528268}, +{"learn":[0.6478675495],"iteration":228,"passed_time":0.2622018615,"remaining_time":0.8827844334}, +{"learn":[0.6477284999],"iteration":229,"passed_time":0.2633770022,"remaining_time":0.8817403986}, +{"learn":[0.6474944265],"iteration":230,"passed_time":0.2644065992,"remaining_time":0.8802107133}, +{"learn":[0.6473038441],"iteration":231,"passed_time":0.2657402419,"remaining_time":0.8796918353}, +{"learn":[0.6470612389],"iteration":232,"passed_time":0.2667694639,"remaining_time":0.8781638577}, +{"learn":[0.6469377301],"iteration":233,"passed_time":0.2678319781,"remaining_time":0.8767491248}, +{"learn":[0.6467344211],"iteration":234,"passed_time":0.2690289107,"remaining_time":0.8757749645}, +{"learn":[0.6465578608],"iteration":235,"passed_time":0.2701266753,"remaining_time":0.8744778809}, +{"learn":[0.6462007877],"iteration":236,"passed_time":0.2711652307,"remaining_time":0.872991861}, +{"learn":[0.6460313848],"iteration":237,"passed_time":0.2722257865,"remaining_time":0.8715800391}, +{"learn":[0.6458084912],"iteration":238,"passed_time":0.273341718,"remaining_time":0.8703474787}, +{"learn":[0.645565545],"iteration":239,"passed_time":0.2744719414,"remaining_time":0.8691611477}, +{"learn":[0.6454666549],"iteration":240,"passed_time":0.2755539974,"remaining_time":0.8678235852}, +{"learn":[0.6452336406],"iteration":241,"passed_time":0.2768167642,"remaining_time":0.8670541623}, +{"learn":[0.6450761694],"iteration":242,"passed_time":0.2779331957,"remaining_time":0.8658248114}, +{"learn":[0.6449271099],"iteration":243,"passed_time":0.2790430438,"remaining_time":0.8645759882}, +{"learn":[0.6446656228],"iteration":244,"passed_time":0.2801298499,"remaining_time":0.8632572927}, +{"learn":[0.6444511293],"iteration":245,"passed_time":0.2815204101,"remaining_time":0.8628715008}, +{"learn":[0.6442758803],"iteration":246,"passed_time":0.2826750504,"remaining_time":0.8617583522}, +{"learn":[0.6441133995],"iteration":247,"passed_time":0.2837780234,"remaining_time":0.8604882001}, +{"learn":[0.6439721373],"iteration":248,"passed_time":0.2848268707,"remaining_time":0.8590561442}, +{"learn":[0.6438202551],"iteration":249,"passed_time":0.2859702193,"remaining_time":0.8579106578}, +{"learn":[0.6436297006],"iteration":250,"passed_time":0.2870582337,"remaining_time":0.856600068}, +{"learn":[0.6435316476],"iteration":251,"passed_time":0.2881409565,"remaining_time":0.8552755374}, +{"learn":[0.6433556983],"iteration":252,"passed_time":0.2891833453,"remaining_time":0.8538338299}, +{"learn":[0.6432501392],"iteration":253,"passed_time":0.2903248188,"remaining_time":0.8526862789}, +{"learn":[0.6430529146],"iteration":254,"passed_time":0.2914407503,"remaining_time":0.8514641529}, +{"learn":[0.6429007964],"iteration":255,"passed_time":0.2925264731,"remaining_time":0.8501550625}, +{"learn":[0.6427050358],"iteration":256,"passed_time":0.2936102375,"remaining_time":0.8488420485}, +{"learn":[0.6425969601],"iteration":257,"passed_time":0.2946924186,"remaining_time":0.8475262581}, +{"learn":[0.64239199],"iteration":258,"passed_time":0.2957566827,"remaining_time":0.8461610112}, +{"learn":[0.6422389106],"iteration":259,"passed_time":0.2967911131,"remaining_time":0.8447131682}, +{"learn":[0.6421388836],"iteration":260,"passed_time":0.2979902541,"remaining_time":0.8437348574}, +{"learn":[0.6418177949],"iteration":261,"passed_time":0.2991298526,"remaining_time":0.842587142}, +{"learn":[0.6416277654],"iteration":262,"passed_time":0.3001601163,"remaining_time":0.8411331015}, +{"learn":[0.6414999049],"iteration":263,"passed_time":0.301216797,"remaining_time":0.8397559189}, +{"learn":[0.641403861],"iteration":264,"passed_time":0.302393396,"remaining_time":0.8387137586}, +{"learn":[0.6412156053],"iteration":265,"passed_time":0.3034568684,"remaining_time":0.8373584265}, +{"learn":[0.6410922328],"iteration":266,"passed_time":0.3045229243,"remaining_time":0.8360123727}, +{"learn":[0.6409248609],"iteration":267,"passed_time":0.3055805634,"remaining_time":0.8346454193}, +{"learn":[0.6408260454],"iteration":268,"passed_time":0.3067785793,"remaining_time":0.8336622359}, +{"learn":[0.6407395757],"iteration":269,"passed_time":0.3079475115,"remaining_time":0.8325988274}, +{"learn":[0.6406765192],"iteration":270,"passed_time":0.3089815669,"remaining_time":0.8311718165}, +{"learn":[0.6405300314],"iteration":271,"passed_time":0.3100044138,"remaining_time":0.8297176959}, +{"learn":[0.6402917271],"iteration":272,"passed_time":0.3111284705,"remaining_time":0.8285362565}, +{"learn":[0.6401005668],"iteration":273,"passed_time":0.3122106932,"remaining_time":0.8272443914}, +{"learn":[0.6399810568],"iteration":274,"passed_time":0.3132824574,"remaining_time":0.8259264787}, +{"learn":[0.6398442654],"iteration":275,"passed_time":0.3143675969,"remaining_time":0.8246454353}, +{"learn":[0.6396609865],"iteration":276,"passed_time":0.3154865701,"remaining_time":0.8234541161}, +{"learn":[0.6395399797],"iteration":277,"passed_time":0.3165686261,"remaining_time":0.8221674391}, +{"learn":[0.6393915779],"iteration":278,"passed_time":0.3176852243,"remaining_time":0.8209714937}, +{"learn":[0.6392510533],"iteration":279,"passed_time":0.3188816152,"remaining_time":0.8199812963}, +{"learn":[0.6390640876],"iteration":280,"passed_time":0.3199256708,"remaining_time":0.818599848}, +{"learn":[0.6388813133],"iteration":281,"passed_time":0.3209716847,"remaining_time":0.8172257787}, +{"learn":[0.6386231752],"iteration":282,"passed_time":0.3221467003,"remaining_time":0.8161808626}, +{"learn":[0.6384054253],"iteration":283,"passed_time":0.3233256743,"remaining_time":0.8151450099}, +{"learn":[0.6382830578],"iteration":284,"passed_time":0.3243837301,"remaining_time":0.8138047964}, +{"learn":[0.6381060976],"iteration":285,"passed_time":0.3255427455,"remaining_time":0.8127186023}, +{"learn":[0.6379678556],"iteration":286,"passed_time":0.3267669284,"remaining_time":0.8117937978}, +{"learn":[0.637898437],"iteration":287,"passed_time":0.3278806099,"remaining_time":0.81059373}, +{"learn":[0.6377864434],"iteration":288,"passed_time":0.3289595826,"remaining_time":0.8093088692}, +{"learn":[0.6376816795],"iteration":289,"passed_time":0.3300553888,"remaining_time":0.8080666415}, +{"learn":[0.6374682544],"iteration":290,"passed_time":0.3313742813,"remaining_time":0.8073689535}, +{"learn":[0.6372822114],"iteration":291,"passed_time":0.3324396705,"remaining_time":0.8060523518}, +{"learn":[0.6370751767],"iteration":292,"passed_time":0.3335002679,"remaining_time":0.8047259025}, +{"learn":[0.6369206376],"iteration":293,"passed_time":0.3346934088,"remaining_time":0.8037195463}, +{"learn":[0.6367744339],"iteration":294,"passed_time":0.3358453408,"remaining_time":0.8026134416}, +{"learn":[0.6366542495],"iteration":295,"passed_time":0.3368965214,"remaining_time":0.8012674023}, +{"learn":[0.6364635964],"iteration":296,"passed_time":0.3379392853,"remaining_time":0.7999034262}, +{"learn":[0.6363697405],"iteration":297,"passed_time":0.3391458847,"remaining_time":0.7989275538}, +{"learn":[0.6360921908],"iteration":298,"passed_time":0.3402873582,"remaining_time":0.7977974518}, +{"learn":[0.6359513904],"iteration":299,"passed_time":0.3415023743,"remaining_time":0.7968388735}, +{"learn":[0.6357112166],"iteration":300,"passed_time":0.3425930972,"remaining_time":0.7955899499}, +{"learn":[0.6355495896],"iteration":301,"passed_time":0.3437939882,"remaining_time":0.7945967011}, +{"learn":[0.6354084417],"iteration":302,"passed_time":0.3448746275,"remaining_time":0.7933254633}, +{"learn":[0.6353168145],"iteration":303,"passed_time":0.3459515168,"remaining_time":0.7920468938}, +{"learn":[0.6351611326],"iteration":304,"passed_time":0.3470453647,"remaining_time":0.7908082901}, +{"learn":[0.6350570747],"iteration":305,"passed_time":0.348220672,"remaining_time":0.7897553803}, +{"learn":[0.6349289594],"iteration":306,"passed_time":0.3493400619,"remaining_time":0.7885754492}, +{"learn":[0.6347149332],"iteration":307,"passed_time":0.3504339514,"remaining_time":0.7873386182}, +{"learn":[0.6345938333],"iteration":308,"passed_time":0.3515073824,"remaining_time":0.7860569619}, +{"learn":[0.6344716645],"iteration":309,"passed_time":0.3526260223,"remaining_time":0.7848772754}, +{"learn":[0.6343805546],"iteration":310,"passed_time":0.3537114117,"remaining_time":0.7836243172}, +{"learn":[0.6342541118],"iteration":311,"passed_time":0.3548035512,"remaining_time":0.7823873181}, +{"learn":[0.6341957596],"iteration":312,"passed_time":0.355889274,"remaining_time":0.7811371605}, +{"learn":[0.6339729768],"iteration":313,"passed_time":0.3570996651,"remaining_time":0.7801604148}, +{"learn":[0.6337278764],"iteration":314,"passed_time":0.3581793878,"remaining_time":0.7788980337}, +{"learn":[0.6335920365],"iteration":315,"passed_time":0.3598829104,"remaining_time":0.7789870593}, +{"learn":[0.6333865776],"iteration":316,"passed_time":0.3610124254,"remaining_time":0.7778280334}, +{"learn":[0.6331644196],"iteration":317,"passed_time":0.3620696478,"remaining_time":0.7765141504}, +{"learn":[0.6330564327],"iteration":318,"passed_time":0.3631576623,"remaining_time":0.7752676114}, +{"learn":[0.6328799647],"iteration":319,"passed_time":0.3642519269,"remaining_time":0.7740353446}, +{"learn":[0.6326293133],"iteration":320,"passed_time":0.365340733,"remaining_time":0.7727923916}, +{"learn":[0.6324649571],"iteration":321,"passed_time":0.3663882053,"remaining_time":0.7714633639}, +{"learn":[0.6322994461],"iteration":322,"passed_time":0.3674671363,"remaining_time":0.7702020163}, +{"learn":[0.6321805908],"iteration":323,"passed_time":0.3685476923,"remaining_time":0.7689451852}, +{"learn":[0.6319767135],"iteration":324,"passed_time":0.3696204566,"remaining_time":0.767673256}, +{"learn":[0.6317227783],"iteration":325,"passed_time":0.3707236796,"remaining_time":0.7664655216}, +{"learn":[0.6315527576],"iteration":326,"passed_time":0.3717844437,"remaining_time":0.7651710416}, +{"learn":[0.6313431718],"iteration":327,"passed_time":0.3729920847,"remaining_time":0.7641789053}, +{"learn":[0.6312776656],"iteration":328,"passed_time":0.3740895993,"remaining_time":0.7629608546}, +{"learn":[0.6310615527],"iteration":329,"passed_time":0.3751332382,"remaining_time":0.7616341503}, +{"learn":[0.6309051025],"iteration":330,"passed_time":0.376223586,"remaining_time":0.7604035621}, +{"learn":[0.6306737106],"iteration":331,"passed_time":0.3773175173,"remaining_time":0.7591810287}, +{"learn":[0.6304642575],"iteration":332,"passed_time":0.3783668645,"remaining_time":0.7578699659}, +{"learn":[0.6303361181],"iteration":333,"passed_time":0.3794206286,"remaining_time":0.7565692773}, +{"learn":[0.6302354293],"iteration":334,"passed_time":0.380505643,"remaining_time":0.7553320973}, +{"learn":[0.6301192269],"iteration":335,"passed_time":0.3816963671,"remaining_time":0.7543047256}, +{"learn":[0.629981865],"iteration":336,"passed_time":0.3827430894,"remaining_time":0.7529930809}, +{"learn":[0.6297073564],"iteration":337,"passed_time":0.3838348539,"remaining_time":0.7517712228}, +{"learn":[0.6296129758],"iteration":338,"passed_time":0.3850124529,"remaining_time":0.7507174967}, +{"learn":[0.6294242323],"iteration":339,"passed_time":0.3860656336,"remaining_time":0.749421524}, +{"learn":[0.6292916404],"iteration":340,"passed_time":0.3871060224,"remaining_time":0.7481022545}, +{"learn":[0.6291595625],"iteration":341,"passed_time":0.38818162,"remaining_time":0.7468523567}, +{"learn":[0.6290588264],"iteration":342,"passed_time":0.3894252616,"remaining_time":0.7459253553}, +{"learn":[0.6288420988],"iteration":343,"passed_time":0.3905095677,"remaining_time":0.7446926639}, +{"learn":[0.6286427013],"iteration":344,"passed_time":0.3916757915,"remaining_time":0.7436163578}, +{"learn":[0.6284962895],"iteration":345,"passed_time":0.3928692657,"remaining_time":0.7425910398}, +{"learn":[0.6283360565],"iteration":346,"passed_time":0.3939487801,"remaining_time":0.7413502979}, +{"learn":[0.6281451808],"iteration":347,"passed_time":0.394994544,"remaining_time":0.7400472491}, +{"learn":[0.6280083719],"iteration":348,"passed_time":0.3961072671,"remaining_time":0.7388705756}, +{"learn":[0.6277919523],"iteration":349,"passed_time":0.3972873245,"remaining_time":0.7378193169}, +{"learn":[0.6276657808],"iteration":350,"passed_time":0.3983747556,"remaining_time":0.7365960581}, +{"learn":[0.6275668792],"iteration":351,"passed_time":0.3993988525,"remaining_time":0.7352569785}, +{"learn":[0.6273892886],"iteration":352,"passed_time":0.4006463691,"remaining_time":0.7343291808}, +{"learn":[0.6272167352],"iteration":353,"passed_time":0.4017485921,"remaining_time":0.7331344365}, +{"learn":[0.6270626375],"iteration":354,"passed_time":0.4027859809,"remaining_time":0.731822416}, +{"learn":[0.6268568126],"iteration":355,"passed_time":0.4038576202,"remaining_time":0.7305738971}, +{"learn":[0.6267554228],"iteration":356,"passed_time":0.4048889255,"remaining_time":0.729253723}, +{"learn":[0.6266514279],"iteration":357,"passed_time":0.4062120265,"remaining_time":0.7284584385}, +{"learn":[0.6266002689],"iteration":358,"passed_time":0.4073972089,"remaining_time":0.7274139579}, +{"learn":[0.6264469905],"iteration":359,"passed_time":0.4085609744,"remaining_time":0.7263306211}, +{"learn":[0.6262237731],"iteration":360,"passed_time":0.4096416554,"remaining_time":0.7250997723}, +{"learn":[0.6260506135],"iteration":361,"passed_time":0.410787379,"remaining_time":0.7239843861}, +{"learn":[0.6258476306],"iteration":362,"passed_time":0.4118561849,"remaining_time":0.7227338561}, +{"learn":[0.6256479288],"iteration":363,"passed_time":0.4129146573,"remaining_time":0.7214662693}, +{"learn":[0.6254577162],"iteration":364,"passed_time":0.4140883812,"remaining_time":0.7204003344}, +{"learn":[0.6252714788],"iteration":365,"passed_time":0.4151596871,"remaining_time":0.7191563979}, +{"learn":[0.6250642782],"iteration":366,"passed_time":0.416201076,"remaining_time":0.7178618013}, +{"learn":[0.6249302091],"iteration":367,"passed_time":0.4172530483,"remaining_time":0.7165867568}, +{"learn":[0.6248063466],"iteration":368,"passed_time":0.4184274806,"remaining_time":0.7155223313}, +{"learn":[0.624690983],"iteration":369,"passed_time":0.4195313702,"remaining_time":0.714337198}, +{"learn":[0.6244881791],"iteration":370,"passed_time":0.4205774258,"remaining_time":0.7130544497}, +{"learn":[0.6243543796],"iteration":371,"passed_time":0.4216208147,"remaining_time":0.7117684721}, +{"learn":[0.6241406811],"iteration":372,"passed_time":0.4229017484,"remaining_time":0.7108830998}, +{"learn":[0.6240586132],"iteration":373,"passed_time":0.4239734293,"remaining_time":0.7096453656}, +{"learn":[0.6239186862],"iteration":374,"passed_time":0.4250293184,"remaining_time":0.7083821973}, +{"learn":[0.6237425797],"iteration":375,"passed_time":0.4261020409,"remaining_time":0.707148068}, +{"learn":[0.6235103706],"iteration":376,"passed_time":0.4272038056,"remaining_time":0.7059627875}, +{"learn":[0.6232618576],"iteration":377,"passed_time":0.4283129453,"remaining_time":0.7047900847}, +{"learn":[0.6230423742],"iteration":378,"passed_time":0.4295181697,"remaining_time":0.7037751541}, +{"learn":[0.6228993874],"iteration":379,"passed_time":0.430817562,"remaining_time":0.7029128643}, +{"learn":[0.6227141417],"iteration":380,"passed_time":0.4319339102,"remaining_time":0.7017508934}, +{"learn":[0.6225744734],"iteration":381,"passed_time":0.4330207163,"remaining_time":0.7005413682}, +{"learn":[0.6224494116],"iteration":382,"passed_time":0.4342232739,"remaining_time":0.6995189557}, +{"learn":[0.6222950807],"iteration":383,"passed_time":0.4354002896,"remaining_time":0.6984546312}, +{"learn":[0.6221331603],"iteration":384,"passed_time":0.4364511369,"remaining_time":0.6971881797}, +{"learn":[0.6219647921],"iteration":385,"passed_time":0.4375464015,"remaining_time":0.6959934987}, +{"learn":[0.6217540633],"iteration":386,"passed_time":0.4387216254,"remaining_time":0.6949259855}, +{"learn":[0.621576683],"iteration":387,"passed_time":0.4399396416,"remaining_time":0.6939254141}, +{"learn":[0.6214684761],"iteration":388,"passed_time":0.4410983237,"remaining_time":0.692830529}, +{"learn":[0.6213231941],"iteration":389,"passed_time":0.4423255483,"remaining_time":0.6918425243}, +{"learn":[0.6210937545],"iteration":390,"passed_time":0.4434009376,"remaining_time":0.6906168057}, +{"learn":[0.6209777285],"iteration":391,"passed_time":0.4445369944,"remaining_time":0.6894859505}, +{"learn":[0.6208072926],"iteration":392,"passed_time":0.4455752582,"remaining_time":0.6882040248}, +{"learn":[0.6206963867],"iteration":393,"passed_time":0.4467956078,"remaining_time":0.6872033967}, +{"learn":[0.6204372677],"iteration":394,"passed_time":0.4478937891,"remaining_time":0.6860145377}, +{"learn":[0.6202551767],"iteration":395,"passed_time":0.4489314695,"remaining_time":0.6847338575}, +{"learn":[0.6200011736],"iteration":396,"passed_time":0.4501455273,"remaining_time":0.6837222997}, +{"learn":[0.6198859016],"iteration":397,"passed_time":0.4512079998,"remaining_time":0.6824804419}, +{"learn":[0.6197676271],"iteration":398,"passed_time":0.4522883058,"remaining_time":0.6812663454}, +{"learn":[0.6196238705],"iteration":399,"passed_time":0.4533593617,"remaining_time":0.6800390426}, +{"learn":[0.6194628335],"iteration":400,"passed_time":0.4544378761,"remaining_time":0.6788236603}, +{"learn":[0.6192820561],"iteration":401,"passed_time":0.4554927651,"remaining_time":0.6775738147}, +{"learn":[0.6191287958],"iteration":402,"passed_time":0.4565325289,"remaining_time":0.6763025304}, +{"learn":[0.6190112194],"iteration":403,"passed_time":0.4577197947,"remaining_time":0.6752499942}, +{"learn":[0.6188244898],"iteration":404,"passed_time":0.4587649336,"remaining_time":0.6739879889}, +{"learn":[0.6186323589],"iteration":405,"passed_time":0.4605394155,"remaining_time":0.6737941203}, +{"learn":[0.618501291],"iteration":406,"passed_time":0.4616827641,"remaining_time":0.6726729216}, +{"learn":[0.618335109],"iteration":407,"passed_time":0.4628101957,"remaining_time":0.6715285193}, +{"learn":[0.6182382013],"iteration":408,"passed_time":0.4639444191,"remaining_time":0.670394014}, +{"learn":[0.6180877322],"iteration":409,"passed_time":0.4650213918,"remaining_time":0.6691771248}, +{"learn":[0.6178987142],"iteration":410,"passed_time":0.466041947,"remaining_time":0.6678800652}, +{"learn":[0.6177274632],"iteration":411,"passed_time":0.4671073779,"remaining_time":0.6666483937}, +{"learn":[0.6175628143],"iteration":412,"passed_time":0.4682569348,"remaining_time":0.6655370962}, +{"learn":[0.6173870936],"iteration":413,"passed_time":0.4693644495,"remaining_time":0.6643661049}, +{"learn":[0.617243719],"iteration":414,"passed_time":0.4704847144,"remaining_time":0.6632133927}, +{"learn":[0.617076468],"iteration":415,"passed_time":0.471602021,"remaining_time":0.6620566833}, +{"learn":[0.6169526231],"iteration":416,"passed_time":0.4727616197,"remaining_time":0.6609592909}, +{"learn":[0.6167942897],"iteration":417,"passed_time":0.4738452175,"remaining_time":0.6597557813}, +{"learn":[0.6164803784],"iteration":418,"passed_time":0.4750050246,"remaining_time":0.6586585185}, +{"learn":[0.6163095595],"iteration":419,"passed_time":0.476191582,"remaining_time":0.6575978989}, +{"learn":[0.6161848351],"iteration":420,"passed_time":0.4772309292,"remaining_time":0.6563342232}, +{"learn":[0.6160444539],"iteration":421,"passed_time":0.4783139019,"remaining_time":0.6551313632}, +{"learn":[0.6158717535],"iteration":422,"passed_time":0.4794190416,"remaining_time":0.6539593073}, +{"learn":[0.6156687018],"iteration":423,"passed_time":0.4807027253,"remaining_time":0.6530301174}, +{"learn":[0.6155442288],"iteration":424,"passed_time":0.4818643658,"remaining_time":0.6519341419}, +{"learn":[0.6153987844],"iteration":425,"passed_time":0.4829743805,"remaining_time":0.6507682968}, +{"learn":[0.6150702755],"iteration":426,"passed_time":0.4840431031,"remaining_time":0.6495473022}, +{"learn":[0.6148315705],"iteration":427,"passed_time":0.4851781182,"remaining_time":0.6484156159}, +{"learn":[0.6146912117],"iteration":428,"passed_time":0.4862211737,"remaining_time":0.6471615156}, +{"learn":[0.6145858122],"iteration":429,"passed_time":0.487273896,"remaining_time":0.645921211}, +{"learn":[0.6144470683],"iteration":430,"passed_time":0.4884807871,"remaining_time":0.6448853082}, +{"learn":[0.6143511808],"iteration":431,"passed_time":0.4895615931,"remaining_time":0.6436828354}, +{"learn":[0.614153372],"iteration":432,"passed_time":0.4906651911,"remaining_time":0.6425107699}, +{"learn":[0.6140563648],"iteration":433,"passed_time":0.4919235412,"remaining_time":0.6415408394}, +{"learn":[0.6138333404],"iteration":434,"passed_time":0.4931969331,"remaining_time":0.64058912}, +{"learn":[0.613673912],"iteration":435,"passed_time":0.4942461971,"remaining_time":0.639345998}, +{"learn":[0.613576502],"iteration":436,"passed_time":0.4953100862,"remaining_time":0.6381226054}, +{"learn":[0.6133663253],"iteration":437,"passed_time":0.4964855185,"remaining_time":0.6370430626}, +{"learn":[0.6132683391],"iteration":438,"passed_time":0.4976453673,"remaining_time":0.6359431687}, +{"learn":[0.6131613093],"iteration":439,"passed_time":0.4988706752,"remaining_time":0.6349263139}, +{"learn":[0.6129250814],"iteration":440,"passed_time":0.4999505646,"remaining_time":0.633724185}, +{"learn":[0.6128435837],"iteration":441,"passed_time":0.5010243289,"remaining_time":0.6325148767}, +{"learn":[0.612668239],"iteration":442,"passed_time":0.5020730928,"remaining_time":0.6312747465}, +{"learn":[0.6125632313],"iteration":443,"passed_time":0.5031766492,"remaining_time":0.6301040922}, +{"learn":[0.6122853605],"iteration":444,"passed_time":0.5043036641,"remaining_time":0.6289629969}, +{"learn":[0.612130259],"iteration":445,"passed_time":0.5055273887,"remaining_time":0.6279420927}, +{"learn":[0.6119902833],"iteration":446,"passed_time":0.5067885305,"remaining_time":0.6269665713}, +{"learn":[0.6118376246],"iteration":447,"passed_time":0.5078628365,"remaining_time":0.6257595664}, +{"learn":[0.6117137681],"iteration":448,"passed_time":0.5089429758,"remaining_time":0.6245603111}, +{"learn":[0.6115924957],"iteration":449,"passed_time":0.5100330737,"remaining_time":0.6233737567}, +{"learn":[0.6113412557],"iteration":450,"passed_time":0.5110676708,"remaining_time":0.6221200693}, +{"learn":[0.6111673834],"iteration":451,"passed_time":0.5122064776,"remaining_time":0.620993694}, +{"learn":[0.6109274262],"iteration":452,"passed_time":0.5133092422,"remaining_time":0.6198237428}, +{"learn":[0.6108157003],"iteration":453,"passed_time":0.5143908816,"remaining_time":0.6186286814}, +{"learn":[0.6106415561],"iteration":454,"passed_time":0.5154665626,"remaining_time":0.6174269815}, +{"learn":[0.6104567948],"iteration":455,"passed_time":0.5166470366,"remaining_time":0.6163508507}, +{"learn":[0.6103790373],"iteration":456,"passed_time":0.5178355107,"remaining_time":0.6152837688}, +{"learn":[0.6102637745],"iteration":457,"passed_time":0.5189484422,"remaining_time":0.6141267591}, +{"learn":[0.6100885733],"iteration":458,"passed_time":0.5200332483,"remaining_time":0.6129367916}, +{"learn":[0.6098868869],"iteration":459,"passed_time":0.5211603883,"remaining_time":0.6117969776}, +{"learn":[0.6095725763],"iteration":460,"passed_time":0.5222210691,"remaining_time":0.6105795146}, +{"learn":[0.6093974847],"iteration":461,"passed_time":0.5232751247,"remaining_time":0.6093550154}, +{"learn":[0.6092903271],"iteration":462,"passed_time":0.5243660142,"remaining_time":0.6081739733}, +{"learn":[0.6091473356],"iteration":463,"passed_time":0.5255819054,"remaining_time":0.6071377183}, +{"learn":[0.6089835447],"iteration":464,"passed_time":0.5266340861,"remaining_time":0.6059123356}, +{"learn":[0.6087066913],"iteration":465,"passed_time":0.5276986002,"remaining_time":0.6047018294}, +{"learn":[0.6084564614],"iteration":466,"passed_time":0.5287645311,"remaining_time":0.6034935654}, +{"learn":[0.6082511926],"iteration":467,"passed_time":0.5298958378,"remaining_time":0.6023602259}, +{"learn":[0.6081150344],"iteration":468,"passed_time":0.5309839356,"remaining_time":0.601177974}, +{"learn":[0.6079835426],"iteration":469,"passed_time":0.5320890336,"remaining_time":0.6000152932}, +{"learn":[0.607821293],"iteration":470,"passed_time":0.533393926,"remaining_time":0.5990772544}, +{"learn":[0.6076626389],"iteration":471,"passed_time":0.534503024,"remaining_time":0.5979186371}, +{"learn":[0.6074862958],"iteration":472,"passed_time":0.5356422892,"remaining_time":0.5967938402}, +{"learn":[0.6072599715],"iteration":473,"passed_time":0.5367805543,"remaining_time":0.5956678725}, +{"learn":[0.607132385],"iteration":474,"passed_time":0.5379502365,"remaining_time":0.5945765772}, +{"learn":[0.6069274992],"iteration":475,"passed_time":0.5391748362,"remaining_time":0.5935454079}, +{"learn":[0.6067469422],"iteration":476,"passed_time":0.5403149347,"remaining_time":0.5924207774}, +{"learn":[0.6066197488],"iteration":477,"passed_time":0.5414478247,"remaining_time":0.5912882103}, +{"learn":[0.6064370432],"iteration":478,"passed_time":0.5427276334,"remaining_time":0.5903154426}, +{"learn":[0.6062565573],"iteration":479,"passed_time":0.543801356,"remaining_time":0.5891181357}, +{"learn":[0.6060803436],"iteration":480,"passed_time":0.5448677869,"remaining_time":0.5879134748}, +{"learn":[0.6058863889],"iteration":481,"passed_time":0.546156679,"remaining_time":0.5869484642}, +{"learn":[0.6057108685],"iteration":482,"passed_time":0.5473190695,"remaining_time":0.5858467058}, +{"learn":[0.6055753117],"iteration":483,"passed_time":0.5483946254,"remaining_time":0.5846521213}, +{"learn":[0.6054485469],"iteration":484,"passed_time":0.5496002248,"remaining_time":0.583596115}, +{"learn":[0.6052253509],"iteration":485,"passed_time":0.5507531151,"remaining_time":0.5824837473}, +{"learn":[0.6051180262],"iteration":486,"passed_time":0.5517939206,"remaining_time":0.5812531443}, +{"learn":[0.6049694509],"iteration":487,"passed_time":0.5529391442,"remaining_time":0.5801328726}, +{"learn":[0.6047492718],"iteration":488,"passed_time":0.5540558674,"remaining_time":0.5789827162}, +{"learn":[0.6046068876],"iteration":489,"passed_time":0.5553521346,"remaining_time":0.5780195687}, +{"learn":[0.6044819774],"iteration":490,"passed_time":0.5564630244,"remaining_time":0.5768628909}, +{"learn":[0.6042493579],"iteration":491,"passed_time":0.5576461234,"remaining_time":0.5757809567}, +{"learn":[0.6039649679],"iteration":492,"passed_time":0.558813639,"remaining_time":0.5746825861}, +{"learn":[0.6037830331],"iteration":493,"passed_time":0.559969071,"remaining_time":0.5735715586}, +{"learn":[0.6034944903],"iteration":494,"passed_time":0.5610122515,"remaining_time":0.5723458324}, +{"learn":[0.6031894111],"iteration":495,"passed_time":0.5620896409,"remaining_time":0.5711556028}, +{"learn":[0.6030692694],"iteration":496,"passed_time":0.5633239489,"remaining_time":0.5701246405}, +{"learn":[0.602857329],"iteration":497,"passed_time":0.5643786296,"remaining_time":0.5689117913}, +{"learn":[0.6027120707],"iteration":498,"passed_time":0.5654449771,"remaining_time":0.5677112897}, +{"learn":[0.6025975162],"iteration":499,"passed_time":0.5665324083,"remaining_time":0.5665324083}, +{"learn":[0.6023946798],"iteration":500,"passed_time":0.5676216311,"remaining_time":0.5653556765}, +{"learn":[0.6022233018],"iteration":501,"passed_time":0.5686959787,"remaining_time":0.5641645366}, +{"learn":[0.6020096537],"iteration":502,"passed_time":0.5698914113,"remaining_time":0.5630935018}, +{"learn":[0.6017527374],"iteration":503,"passed_time":0.5710562601,"remaining_time":0.561991875}, +{"learn":[0.6016262717],"iteration":504,"passed_time":0.5721456079,"remaining_time":0.5608159919}, +{"learn":[0.6014828534],"iteration":505,"passed_time":0.5731947885,"remaining_time":0.5596012362}, +{"learn":[0.6013815306],"iteration":506,"passed_time":0.5742290106,"remaining_time":0.5583725882}, +{"learn":[0.6010625342],"iteration":507,"passed_time":0.5754243182,"remaining_time":0.5573007176}, +{"learn":[0.6009207315],"iteration":508,"passed_time":0.5765574166,"remaining_time":0.5561683527}, +{"learn":[0.6007574298],"iteration":509,"passed_time":0.5776565145,"remaining_time":0.5550033179}, +{"learn":[0.6005437978],"iteration":510,"passed_time":0.578820155,"remaining_time":0.5539003049}, +{"learn":[0.6003599775],"iteration":511,"passed_time":0.5799769204,"remaining_time":0.5527905022}, +{"learn":[0.600228366],"iteration":512,"passed_time":0.5811001853,"remaining_time":0.5516487139}, +{"learn":[0.6000519316],"iteration":513,"passed_time":0.5821366574,"remaining_time":0.5504249329}, +{"learn":[0.5998173338],"iteration":514,"passed_time":0.5832167135,"remaining_time":0.5492429243}, +{"learn":[0.5996808159],"iteration":515,"passed_time":0.5843307699,"remaining_time":0.5480932028}, +{"learn":[0.5994794911],"iteration":516,"passed_time":0.5853784505,"remaining_time":0.5468816085}, +{"learn":[0.5993400552],"iteration":517,"passed_time":0.5866331339,"remaining_time":0.5458632636}, +{"learn":[0.5991918493],"iteration":518,"passed_time":0.5880633196,"remaining_time":0.5450066603}, +{"learn":[0.5990687744],"iteration":519,"passed_time":0.5892443769,"remaining_time":0.5439178864}, +{"learn":[0.5989251275],"iteration":520,"passed_time":0.5903219329,"remaining_time":0.5427336005}, +{"learn":[0.5987484682],"iteration":521,"passed_time":0.5914120724,"remaining_time":0.5415612464}, +{"learn":[0.598539905],"iteration":522,"passed_time":0.5925127121,"remaining_time":0.5403987833}, +{"learn":[0.5983243863],"iteration":523,"passed_time":0.5935621844,"remaining_time":0.5391900759}, +{"learn":[0.598140471],"iteration":524,"passed_time":0.5948969521,"remaining_time":0.5382400995}, +{"learn":[0.5979920466],"iteration":525,"passed_time":0.595963508,"remaining_time":0.5370469634}, +{"learn":[0.5978144014],"iteration":526,"passed_time":0.5970531891,"remaining_time":0.5358750635}, +{"learn":[0.5976198173],"iteration":527,"passed_time":0.5981086198,"remaining_time":0.5346728571}, +{"learn":[0.5973817659],"iteration":528,"passed_time":0.5992751353,"remaining_time":0.533570111}, +{"learn":[0.5970926086],"iteration":529,"passed_time":0.600405442,"remaining_time":0.5324350146}, +{"learn":[0.5968562337],"iteration":530,"passed_time":0.6014649978,"remaining_time":0.5312374462}, +{"learn":[0.5965884118],"iteration":531,"passed_time":0.6024990115,"remaining_time":0.5300179274}, +{"learn":[0.5963067416],"iteration":532,"passed_time":0.6035912761,"remaining_time":0.5288501424}, +{"learn":[0.596152156],"iteration":533,"passed_time":0.6048910433,"remaining_time":0.5278637195}, +{"learn":[0.5959415132],"iteration":534,"passed_time":0.6060035998,"remaining_time":0.5267134092}, +{"learn":[0.5957594547],"iteration":535,"passed_time":0.6072098242,"remaining_time":0.5256443254}, +{"learn":[0.5955065894],"iteration":536,"passed_time":0.6083468393,"remaining_time":0.5245150588}, +{"learn":[0.5953756532],"iteration":537,"passed_time":0.6094491873,"remaining_time":0.5233559935}, +{"learn":[0.595092336],"iteration":538,"passed_time":0.610506743,"remaining_time":0.5221588284}, +{"learn":[0.5949285408],"iteration":539,"passed_time":0.6117377594,"remaining_time":0.5211099432}, +{"learn":[0.5947331968],"iteration":540,"passed_time":0.6129541089,"remaining_time":0.5200479408}, +{"learn":[0.5945482366],"iteration":541,"passed_time":0.614016248,"remaining_time":0.5188550583}, +{"learn":[0.5944289428],"iteration":542,"passed_time":0.6151561382,"remaining_time":0.5177280942}, +{"learn":[0.594254527],"iteration":543,"passed_time":0.6162239857,"remaining_time":0.5165406939}, +{"learn":[0.5941060575],"iteration":544,"passed_time":0.6173444173,"remaining_time":0.5153976328}, +{"learn":[0.5939215336],"iteration":545,"passed_time":0.6183727226,"remaining_time":0.5141780514}, +{"learn":[0.5937015993],"iteration":546,"passed_time":0.619431695,"remaining_time":0.5129845664}, +{"learn":[0.593632453],"iteration":547,"passed_time":0.6206522946,"remaining_time":0.5119248853}, +{"learn":[0.5934795942],"iteration":548,"passed_time":0.6217907681,"remaining_time":0.5107971519}, +{"learn":[0.5932974668],"iteration":549,"passed_time":0.622890616,"remaining_time":0.5096377767}, +{"learn":[0.5931481645],"iteration":550,"passed_time":0.6241764248,"remaining_time":0.5086301538}, +{"learn":[0.5930201136],"iteration":551,"passed_time":0.6253461487,"remaining_time":0.5075273091}, +{"learn":[0.5927748207],"iteration":552,"passed_time":0.6264082461,"remaining_time":0.5063372261}, +{"learn":[0.5925972796],"iteration":553,"passed_time":0.6274371348,"remaining_time":0.5051208703}, +{"learn":[0.5923743694],"iteration":554,"passed_time":0.6285548163,"remaining_time":0.5039763843}, +{"learn":[0.5921400612],"iteration":555,"passed_time":0.6296755396,"remaining_time":0.5028344237}, +{"learn":[0.5919419924],"iteration":556,"passed_time":0.6307534706,"remaining_time":0.5016585053}, +{"learn":[0.591639888],"iteration":557,"passed_time":0.6318308182,"remaining_time":0.5004824761}, +{"learn":[0.5914261055],"iteration":558,"passed_time":0.6329840419,"remaining_time":0.4993666592}, +{"learn":[0.5913167288],"iteration":559,"passed_time":0.6346851478,"remaining_time":0.4986811876}, +{"learn":[0.5910459835],"iteration":560,"passed_time":0.6357063281,"remaining_time":0.4974600321}, +{"learn":[0.590899325],"iteration":561,"passed_time":0.6369542614,"remaining_time":0.4964163104}, +{"learn":[0.5906364836],"iteration":562,"passed_time":0.6380519843,"remaining_time":0.4952552702}, +{"learn":[0.5904312804],"iteration":563,"passed_time":0.6390950815,"remaining_time":0.4940522261}, +{"learn":[0.5902427931],"iteration":564,"passed_time":0.6403329729,"remaining_time":0.4929997225}, +{"learn":[0.5899763873],"iteration":565,"passed_time":0.6414739048,"remaining_time":0.4918722167}, +{"learn":[0.5896645423],"iteration":566,"passed_time":0.6425587525,"remaining_time":0.490701834}, +{"learn":[0.5893953601],"iteration":567,"passed_time":0.64362285,"remaining_time":0.4895159704}, +{"learn":[0.5892079017],"iteration":568,"passed_time":0.6446666972,"remaining_time":0.488315196}, +{"learn":[0.5890369001],"iteration":569,"passed_time":0.6458378378,"remaining_time":0.4872110005}, +{"learn":[0.5888700644],"iteration":570,"passed_time":0.6468992269,"remaining_time":0.4860241127}, +{"learn":[0.5886944212],"iteration":571,"passed_time":0.6479705745,"remaining_time":0.4848451152}, +{"learn":[0.5885472318],"iteration":572,"passed_time":0.6491011729,"remaining_time":0.4837106471}, +{"learn":[0.5882955796],"iteration":573,"passed_time":0.6503288559,"remaining_time":0.4826482449}, +{"learn":[0.588177907],"iteration":574,"passed_time":0.6514378289,"remaining_time":0.4814975257}, +{"learn":[0.5880087151],"iteration":575,"passed_time":0.6525914693,"remaining_time":0.4803798316}, +{"learn":[0.5878877522],"iteration":576,"passed_time":0.6537895269,"remaining_time":0.4792945752}, +{"learn":[0.5877394438],"iteration":577,"passed_time":0.6548682496,"remaining_time":0.4781218016}, +{"learn":[0.5875354276],"iteration":578,"passed_time":0.6559645141,"remaining_time":0.4769621079}, +{"learn":[0.5873781879],"iteration":579,"passed_time":0.6570876957,"remaining_time":0.4758221245}, +{"learn":[0.5871570215],"iteration":580,"passed_time":0.6587660931,"remaining_time":0.4750826041}, +{"learn":[0.5869408178],"iteration":581,"passed_time":0.659811357,"remaining_time":0.4738851327}, +{"learn":[0.5867958342],"iteration":582,"passed_time":0.6609653306,"remaining_time":0.4727659397}, +{"learn":[0.5866464684],"iteration":583,"passed_time":0.6622057638,"remaining_time":0.4717082153}, +{"learn":[0.5864211198],"iteration":584,"passed_time":0.6632387359,"remaining_time":0.470502693}, +{"learn":[0.5861778077],"iteration":585,"passed_time":0.6644023763,"remaining_time":0.4693900747}, +{"learn":[0.5860218984],"iteration":586,"passed_time":0.6654665155,"remaining_time":0.4682072758}, +{"learn":[0.5858051579],"iteration":587,"passed_time":0.6666558646,"remaining_time":0.4671126126}, +{"learn":[0.5856502809],"iteration":588,"passed_time":0.6677981715,"remaining_time":0.4659848022}, +{"learn":[0.5855076758],"iteration":589,"passed_time":0.6688702691,"remaining_time":0.4648081531}, +{"learn":[0.5853526765],"iteration":590,"passed_time":0.6701624529,"remaining_time":0.4637841679}, +{"learn":[0.5852234908],"iteration":591,"passed_time":0.6712103419,"remaining_time":0.4625909113}, +{"learn":[0.5849590421],"iteration":592,"passed_time":0.6722512307,"remaining_time":0.4613933405}, +{"learn":[0.5847811281],"iteration":593,"passed_time":0.673328995,"remaining_time":0.4602215017}, +{"learn":[0.5846573345],"iteration":594,"passed_time":0.6743824674,"remaining_time":0.4590334442}, +{"learn":[0.5844178553],"iteration":595,"passed_time":0.6755394828,"remaining_time":0.4579160252}, +{"learn":[0.5842622801],"iteration":596,"passed_time":0.6765653714,"remaining_time":0.4567099576}, +{"learn":[0.5841617009],"iteration":597,"passed_time":0.6776817612,"remaining_time":0.4555653311}, +{"learn":[0.5839732073],"iteration":598,"passed_time":0.6788619853,"remaining_time":0.4544635327}, +{"learn":[0.5838466201],"iteration":599,"passed_time":0.6799833752,"remaining_time":0.4533222501}, +{"learn":[0.5836809592],"iteration":600,"passed_time":0.6810322225,"remaining_time":0.4521328732}, +{"learn":[0.5834816861],"iteration":601,"passed_time":0.6821450289,"remaining_time":0.4509862484}, +{"learn":[0.5832933774],"iteration":602,"passed_time":0.6833710036,"remaining_time":0.4499142428}, +{"learn":[0.5830915643],"iteration":603,"passed_time":0.6844310177,"remaining_time":0.4487329189}, +{"learn":[0.5828762469],"iteration":604,"passed_time":0.6854983235,"remaining_time":0.4475567567}, +{"learn":[0.5827102786],"iteration":605,"passed_time":0.6866743808,"remaining_time":0.4464516601}, +{"learn":[0.5825584191],"iteration":606,"passed_time":0.687741645,"remaining_time":0.4452758921}, +{"learn":[0.5823849377],"iteration":607,"passed_time":0.6887979091,"remaining_time":0.4440933887}, +{"learn":[0.5822421333],"iteration":608,"passed_time":0.690043759,"remaining_time":0.4430330209}, +{"learn":[0.5820446465],"iteration":609,"passed_time":0.6910978146,"remaining_time":0.4418494225}, +{"learn":[0.5819186008],"iteration":610,"passed_time":0.692178204,"remaining_time":0.4406830137}, +{"learn":[0.581712043],"iteration":611,"passed_time":0.6932407181,"remaining_time":0.4395055533}, +{"learn":[0.581418597],"iteration":612,"passed_time":0.6943498579,"remaining_time":0.4383579038}, +{"learn":[0.5812617905],"iteration":613,"passed_time":0.6954395807,"remaining_time":0.4371981729}, +{"learn":[0.5811345824],"iteration":614,"passed_time":0.6965800125,"remaining_time":0.4360704144}, +{"learn":[0.5809945797],"iteration":615,"passed_time":0.6976381933,"remaining_time":0.4348913413}, +{"learn":[0.5807703215],"iteration":616,"passed_time":0.6987466663,"remaining_time":0.4337438788}, +{"learn":[0.5806810234],"iteration":617,"passed_time":0.6999198069,"remaining_time":0.432636515}, +{"learn":[0.5804906681],"iteration":618,"passed_time":0.7010630305,"remaining_time":0.4315105244}, +{"learn":[0.5802844937],"iteration":619,"passed_time":0.7021482116,"remaining_time":0.4303489039}, +{"learn":[0.5801082221],"iteration":620,"passed_time":0.7034296453,"remaining_time":0.4293073036}, +{"learn":[0.5798591849],"iteration":621,"passed_time":0.704482826,"remaining_time":0.428126219}, +{"learn":[0.5796337432],"iteration":622,"passed_time":0.7055546319,"remaining_time":0.4269568158}, +{"learn":[0.5794423033],"iteration":623,"passed_time":0.7066436047,"remaining_time":0.4257980695}, +{"learn":[0.5792417402],"iteration":624,"passed_time":0.7078405373,"remaining_time":0.4247043224}, +{"learn":[0.5790863885],"iteration":625,"passed_time":0.7089428853,"remaining_time":0.4235537366}, +{"learn":[0.5789031467],"iteration":626,"passed_time":0.710103359,"remaining_time":0.4224378834}, +{"learn":[0.5788019539],"iteration":627,"passed_time":0.7112906665,"remaining_time":0.4213377833}, +{"learn":[0.5785530882],"iteration":628,"passed_time":0.7124135564,"remaining_time":0.4201994109}, +{"learn":[0.5783661907],"iteration":629,"passed_time":0.7135047793,"remaining_time":0.4190424894}, +{"learn":[0.5780794351],"iteration":630,"passed_time":0.7147117536,"remaining_time":0.4179534661}, +{"learn":[0.5777616782],"iteration":631,"passed_time":0.7159083529,"remaining_time":0.4168580283}, +{"learn":[0.57746221],"iteration":632,"passed_time":0.7169644503,"remaining_time":0.4156808108}, +{"learn":[0.5772864292],"iteration":633,"passed_time":0.7180339645,"remaining_time":0.4145117208}, +{"learn":[0.5771663299],"iteration":634,"passed_time":0.7192291054,"remaining_time":0.4134151551}, +{"learn":[0.5769549527],"iteration":635,"passed_time":0.720354912,"remaining_time":0.4122785974}, +{"learn":[0.5766596787],"iteration":636,"passed_time":0.7214282596,"remaining_time":0.4111121793}, +{"learn":[0.5765605303],"iteration":637,"passed_time":0.7224764402,"remaining_time":0.4099317733}, +{"learn":[0.576398549],"iteration":638,"passed_time":0.7235958301,"remaining_time":0.4087920104}, +{"learn":[0.5762556725],"iteration":639,"passed_time":0.7246975948,"remaining_time":0.4076423971}, +{"learn":[0.5761487527],"iteration":640,"passed_time":0.7257884843,"remaining_time":0.4064868422}, +{"learn":[0.5758335528],"iteration":641,"passed_time":0.7268527484,"remaining_time":0.4053166416}, +{"learn":[0.5756773535],"iteration":642,"passed_time":0.7280441809,"remaining_time":0.4042173757}, +{"learn":[0.5754980346],"iteration":643,"passed_time":0.7290890282,"remaining_time":0.403036792}, +{"learn":[0.5753363568],"iteration":644,"passed_time":0.7301502089,"remaining_time":0.4018656189}, +{"learn":[0.5751553704],"iteration":645,"passed_time":0.7312020146,"remaining_time":0.4006896489}, +{"learn":[0.574994782],"iteration":646,"passed_time":0.7323464881,"remaining_time":0.3995646218}, +{"learn":[0.5746520685],"iteration":647,"passed_time":0.7334104189,"remaining_time":0.3983957831}, +{"learn":[0.5744786518],"iteration":648,"passed_time":0.7344540162,"remaining_time":0.3972162707}, +{"learn":[0.5743093647],"iteration":649,"passed_time":0.7356278651,"remaining_time":0.396107312}, +{"learn":[0.5740378195],"iteration":650,"passed_time":0.7367850472,"remaining_time":0.3949892188}, +{"learn":[0.5738607313],"iteration":651,"passed_time":0.7378511863,"remaining_time":0.3938224123}, +{"learn":[0.5736602143],"iteration":652,"passed_time":0.7389247423,"remaining_time":0.3926598554}, +{"learn":[0.5735057779],"iteration":653,"passed_time":0.740055549,"remaining_time":0.3915278592}, +{"learn":[0.5733589489],"iteration":654,"passed_time":0.7411317716,"remaining_time":0.3903671163}, +{"learn":[0.5732260899],"iteration":655,"passed_time":0.7421862856,"remaining_time":0.3891952473}, +{"learn":[0.5730274171],"iteration":656,"passed_time":0.7433458844,"remaining_time":0.3880785972}, +{"learn":[0.5728035078],"iteration":657,"passed_time":0.7446276931,"remaining_time":0.3870253359}, +{"learn":[0.5726621361],"iteration":658,"passed_time":0.7458181673,"remaining_time":0.3859241199}, +{"learn":[0.5724996493],"iteration":659,"passed_time":0.746877223,"remaining_time":0.3847549331}, +{"learn":[0.572275212],"iteration":660,"passed_time":0.7479529873,"remaining_time":0.3835946486}, +{"learn":[0.5721652811],"iteration":661,"passed_time":0.7490609187,"remaining_time":0.3824510431}, +{"learn":[0.5719889143],"iteration":662,"passed_time":0.7501363497,"remaining_time":0.3812910254}, +{"learn":[0.5717793936],"iteration":663,"passed_time":0.7512037389,"remaining_time":0.3801271932}, +{"learn":[0.5715225666],"iteration":664,"passed_time":0.7522635863,"remaining_time":0.3789598517}, +{"learn":[0.5713071394],"iteration":665,"passed_time":0.7533256838,"remaining_time":0.3777939615}, +{"learn":[0.5711611734],"iteration":666,"passed_time":0.7543965313,"remaining_time":0.376632751}, +{"learn":[0.5709508581],"iteration":667,"passed_time":0.755449712,"remaining_time":0.3754630305}, +{"learn":[0.5708466585],"iteration":668,"passed_time":0.7566116858,"remaining_time":0.3743474858}, +{"learn":[0.5706789963],"iteration":669,"passed_time":0.7577440342,"remaining_time":0.3732172109}, +{"learn":[0.5705145294],"iteration":670,"passed_time":0.7588354237,"remaining_time":0.3720668471}, +{"learn":[0.5703594655],"iteration":671,"passed_time":0.760090482,"remaining_time":0.3709965448}, +{"learn":[0.570233263],"iteration":672,"passed_time":0.7614281248,"remaining_time":0.3699658199}, +{"learn":[0.5700568003],"iteration":673,"passed_time":0.7624864306,"remaining_time":0.3687990747}, +{"learn":[0.5698230012],"iteration":674,"passed_time":0.7635332778,"remaining_time":0.3676271338}, +{"learn":[0.5696445855],"iteration":675,"passed_time":0.7645738333,"remaining_time":0.3664525473}, +{"learn":[0.5694219371],"iteration":676,"passed_time":0.7657392655,"remaining_time":0.3653379361}, +{"learn":[0.5691902986],"iteration":677,"passed_time":0.7668205715,"remaining_time":0.3641832213}, +{"learn":[0.568975701],"iteration":678,"passed_time":0.7679993372,"remaining_time":0.3630747971}, +{"learn":[0.5687357631],"iteration":679,"passed_time":0.7691370607,"remaining_time":0.3619468521}, +{"learn":[0.5686058667],"iteration":680,"passed_time":0.7702342003,"remaining_time":0.3607998677}, +{"learn":[0.5684074399],"iteration":681,"passed_time":0.7713038395,"remaining_time":0.3596402067}, +{"learn":[0.5683267239],"iteration":682,"passed_time":0.7724631049,"remaining_time":0.3585224074}, +{"learn":[0.5681378304],"iteration":683,"passed_time":0.773627162,"remaining_time":0.3574067006}, +{"learn":[0.5679212045],"iteration":684,"passed_time":0.7746735926,"remaining_time":0.3562367616}, +{"learn":[0.5677783883],"iteration":685,"passed_time":0.77573119,"remaining_time":0.355072294}, +{"learn":[0.5675905176],"iteration":686,"passed_time":0.7768494966,"remaining_time":0.3539357968}, +{"learn":[0.5674470133],"iteration":687,"passed_time":0.7781517639,"remaining_time":0.3528827766}, +{"learn":[0.5672686787],"iteration":688,"passed_time":0.7792316949,"remaining_time":0.3517286751}, +{"learn":[0.5671459155],"iteration":689,"passed_time":0.7803041675,"remaining_time":0.3505714376}, +{"learn":[0.5669955805],"iteration":690,"passed_time":0.7815277671,"remaining_time":0.3494820261}, +{"learn":[0.5666697152],"iteration":691,"passed_time":0.7826763657,"remaining_time":0.3483588449}, +{"learn":[0.566539699],"iteration":692,"passed_time":0.7837397549,"remaining_time":0.3471978423}, +{"learn":[0.5663154141],"iteration":693,"passed_time":0.7848836867,"remaining_time":0.3460726342}, +{"learn":[0.5661290985],"iteration":694,"passed_time":0.7862049543,"remaining_time":0.3450251958}, +{"learn":[0.5660170629],"iteration":695,"passed_time":0.7873039272,"remaining_time":0.3438798763}, +{"learn":[0.5658454568],"iteration":696,"passed_time":0.7884658594,"remaining_time":0.3427620594}, +{"learn":[0.5657412965],"iteration":697,"passed_time":0.7895270818,"remaining_time":0.3416005426}, +{"learn":[0.565656909],"iteration":698,"passed_time":0.7905984711,"remaining_time":0.3404436907}, +{"learn":[0.5654805971],"iteration":699,"passed_time":0.7917784451,"remaining_time":0.3393336193}, +{"learn":[0.565362411],"iteration":700,"passed_time":0.7928059171,"remaining_time":0.3381583013}, +{"learn":[0.5652005669],"iteration":701,"passed_time":0.7939410988,"remaining_time":0.3370291274}, +{"learn":[0.5650263732],"iteration":702,"passed_time":0.7950689472,"remaining_time":0.3358968383}, +{"learn":[0.5648323631],"iteration":703,"passed_time":0.7961495032,"remaining_time":0.3347446775}, +{"learn":[0.5645947556],"iteration":704,"passed_time":0.797213434,"remaining_time":0.3335857632}, +{"learn":[0.5644599485],"iteration":705,"passed_time":0.7990616253,"remaining_time":0.332753708}, +{"learn":[0.564204921],"iteration":706,"passed_time":0.8001342229,"remaining_time":0.3315973512}, +{"learn":[0.5640519764],"iteration":707,"passed_time":0.8011656949,"remaining_time":0.3304242696}, +{"learn":[0.5639119189],"iteration":708,"passed_time":0.8024847124,"remaining_time":0.3293696069}, +{"learn":[0.5637137979],"iteration":709,"passed_time":0.80355681,"remaining_time":0.3282133449}, +{"learn":[0.5635321559],"iteration":710,"passed_time":0.8045959488,"remaining_time":0.3270439229}, +{"learn":[0.5633965376],"iteration":711,"passed_time":0.8058216735,"remaining_time":0.3259503398}, +{"learn":[0.5631966568],"iteration":712,"passed_time":0.8070241895,"remaining_time":0.324847044}, +{"learn":[0.5629439664],"iteration":713,"passed_time":0.8080998704,"remaining_time":0.3236926652}, +{"learn":[0.5627552647],"iteration":714,"passed_time":0.8091498011,"remaining_time":0.3225282424}, +{"learn":[0.5626807493],"iteration":715,"passed_time":0.8102886495,"remaining_time":0.3213994085}, +{"learn":[0.5624805497],"iteration":716,"passed_time":0.8115894585,"remaining_time":0.3203344725}, +{"learn":[0.5623499406],"iteration":717,"passed_time":0.8127545573,"remaining_time":0.3192155782}, +{"learn":[0.5621985714],"iteration":718,"passed_time":0.8139339063,"remaining_time":0.3181021247}, +{"learn":[0.5620233085],"iteration":719,"passed_time":0.8150923801,"remaining_time":0.31698037}, +{"learn":[0.5619094409],"iteration":720,"passed_time":0.8162041865,"remaining_time":0.315840455}, +{"learn":[0.5617663317],"iteration":721,"passed_time":0.8173027011,"remaining_time":0.3146954999}, +{"learn":[0.5615274657],"iteration":722,"passed_time":0.8184172576,"remaining_time":0.3135568193}, +{"learn":[0.5614016072],"iteration":723,"passed_time":0.8198394849,"remaining_time":0.3125354942}, +{"learn":[0.5612694287],"iteration":724,"passed_time":0.8233901571,"remaining_time":0.3123204044}, +{"learn":[0.5610634381],"iteration":725,"passed_time":0.8272548335,"remaining_time":0.3122146341}, +{"learn":[0.5608926924],"iteration":726,"passed_time":0.8286105182,"remaining_time":0.3111563569}, +{"learn":[0.5607440575],"iteration":727,"passed_time":0.8311309267,"remaining_time":0.3105324341}, +{"learn":[0.5606459699],"iteration":728,"passed_time":0.8332265796,"remaining_time":0.3097454089}, +{"learn":[0.5604593988],"iteration":729,"passed_time":0.8344734295,"remaining_time":0.3086408575}, +{"learn":[0.5602402607],"iteration":730,"passed_time":0.8355403603,"remaining_time":0.3074697085}, +{"learn":[0.5600333014],"iteration":731,"passed_time":0.8366292915,"remaining_time":0.3063068991}, +{"learn":[0.5598194436],"iteration":732,"passed_time":0.8378276407,"remaining_time":0.3051841474}, +{"learn":[0.5597098828],"iteration":733,"passed_time":0.8388986133,"remaining_time":0.3040150288}, +{"learn":[0.5595499759],"iteration":734,"passed_time":0.8405878024,"remaining_time":0.3030690716}, +{"learn":[0.559324633],"iteration":735,"passed_time":0.8420361967,"remaining_time":0.3020347227}, +{"learn":[0.5591558322],"iteration":736,"passed_time":0.8431526282,"remaining_time":0.3008807886}, +{"learn":[0.558980647],"iteration":737,"passed_time":0.8442287675,"remaining_time":0.2997126519}, +{"learn":[0.5588159007],"iteration":738,"passed_time":0.8453028235,"remaining_time":0.2985440283}, +{"learn":[0.5586143253],"iteration":739,"passed_time":0.8464188383,"remaining_time":0.2973904026}, +{"learn":[0.5584324854],"iteration":740,"passed_time":0.8474663939,"remaining_time":0.2962129501}, +{"learn":[0.5582234063],"iteration":741,"passed_time":0.8485166162,"remaining_time":0.2950367749}, +{"learn":[0.5580350105],"iteration":742,"passed_time":0.849881176,"remaining_time":0.2939696665}, +{"learn":[0.5578868641],"iteration":743,"passed_time":0.8509730655,"remaining_time":0.2928079365}, +{"learn":[0.5577588577],"iteration":744,"passed_time":0.8520688718,"remaining_time":0.2916477346}, +{"learn":[0.5576122867],"iteration":745,"passed_time":0.853164178,"remaining_time":0.2904875351}, +{"learn":[0.5575166974],"iteration":746,"passed_time":0.8542426923,"remaining_time":0.2893218222}, +{"learn":[0.5574477164],"iteration":747,"passed_time":0.8554884172,"remaining_time":0.2882126753}, +{"learn":[0.5573025254],"iteration":748,"passed_time":0.8565343061,"remaining_time":0.2870361961}, +{"learn":[0.5571818754],"iteration":749,"passed_time":0.8580838684,"remaining_time":0.2860279561}, +{"learn":[0.5570053351],"iteration":750,"passed_time":0.859257509,"remaining_time":0.2848936348}, +{"learn":[0.5567012378],"iteration":751,"passed_time":0.8603013562,"remaining_time":0.2837164047}, +{"learn":[0.5565143939],"iteration":752,"passed_time":0.861437788,"remaining_time":0.2825698986}, +{"learn":[0.5563202494],"iteration":753,"passed_time":0.8626311789,"remaining_time":0.2814420027}, +{"learn":[0.5561048874],"iteration":754,"passed_time":0.8637610689,"remaining_time":0.280293327}, +{"learn":[0.5560310721],"iteration":755,"passed_time":0.8651440456,"remaining_time":0.2792263851}, +{"learn":[0.5559032035],"iteration":756,"passed_time":0.8663630202,"remaining_time":0.2781059629}, +{"learn":[0.5556773884],"iteration":757,"passed_time":0.8674392011,"remaining_time":0.2769396922}, +{"learn":[0.5554237404],"iteration":758,"passed_time":0.8685478826,"remaining_time":0.2757839785}, +{"learn":[0.5552554185],"iteration":759,"passed_time":0.8696663141,"remaining_time":0.2746314676}, +{"learn":[0.5551290079],"iteration":760,"passed_time":0.8708414964,"remaining_time":0.2734968694}, +{"learn":[0.5549633835],"iteration":761,"passed_time":0.8719198857,"remaining_time":0.2723319328}, +{"learn":[0.5548311341],"iteration":762,"passed_time":0.8732058195,"remaining_time":0.2712316897}, +{"learn":[0.5546711171],"iteration":763,"passed_time":0.874595463,"remaining_time":0.2701629964}, +{"learn":[0.5545365493],"iteration":764,"passed_time":0.875704186,"remaining_time":0.2690071683}, +{"learn":[0.5544011318],"iteration":765,"passed_time":0.8767388248,"remaining_time":0.2678288316}, +{"learn":[0.5542163136],"iteration":766,"passed_time":0.877832631,"remaining_time":0.2666688436}, +{"learn":[0.5540799772],"iteration":767,"passed_time":0.8789572293,"remaining_time":0.2655183297}, +{"learn":[0.5539516357],"iteration":768,"passed_time":0.8800237435,"remaining_time":0.2643504353}, +{"learn":[0.553717142],"iteration":769,"passed_time":0.8810882576,"remaining_time":0.2631822068}, +{"learn":[0.5535495657],"iteration":770,"passed_time":0.8825873192,"remaining_time":0.2621433153}, +{"learn":[0.553403792],"iteration":771,"passed_time":0.8836479583,"remaining_time":0.2609737494}, +{"learn":[0.5532358044],"iteration":772,"passed_time":0.8847620565,"remaining_time":0.2598201641}, +{"learn":[0.5530988019],"iteration":773,"passed_time":0.8859578224,"remaining_time":0.258690527}, +{"learn":[0.5529529706],"iteration":774,"passed_time":0.887133338,"remaining_time":0.2575548401}, +{"learn":[0.5527736306],"iteration":775,"passed_time":0.8882693948,"remaining_time":0.2564076604}, +{"learn":[0.5525740784],"iteration":776,"passed_time":0.8894519105,"remaining_time":0.255273843}, +{"learn":[0.5523988589],"iteration":777,"passed_time":0.8905701337,"remaining_time":0.2541215549}, +{"learn":[0.5522617496],"iteration":778,"passed_time":0.8918547758,"remaining_time":0.2530165667}, +{"learn":[0.5520769314],"iteration":779,"passed_time":0.8929509987,"remaining_time":0.251857974}, +{"learn":[0.5519216436],"iteration":780,"passed_time":0.8940819721,"remaining_time":0.2507092854}, +{"learn":[0.5517846698],"iteration":781,"passed_time":0.8951764033,"remaining_time":0.2495504551}, +{"learn":[0.5516019696],"iteration":782,"passed_time":0.8963341687,"remaining_time":0.2484093418}, +{"learn":[0.5515248823],"iteration":783,"passed_time":0.8975916021,"remaining_time":0.2472956455}, +{"learn":[0.551412334],"iteration":784,"passed_time":0.8987460758,"remaining_time":0.2461533838}, +{"learn":[0.551316933],"iteration":785,"passed_time":0.8999968424,"remaining_time":0.2450373082}, +{"learn":[0.5512066025],"iteration":786,"passed_time":0.9010818152,"remaining_time":0.2438760186}, +{"learn":[0.5510420861],"iteration":787,"passed_time":0.9021746214,"remaining_time":0.2427170301}, +{"learn":[0.5508210285],"iteration":788,"passed_time":0.9032420939,"remaining_time":0.2415514345}, +{"learn":[0.5506904058],"iteration":789,"passed_time":0.9043761923,"remaining_time":0.240403798}, +{"learn":[0.5504929906],"iteration":790,"passed_time":0.9056341257,"remaining_time":0.2392889156}, +{"learn":[0.5502393339],"iteration":791,"passed_time":0.9068214332,"remaining_time":0.2381551239}, +{"learn":[0.5500673218],"iteration":792,"passed_time":0.9080711581,"remaining_time":0.2370374902}, +{"learn":[0.5498658881],"iteration":793,"passed_time":0.9091629226,"remaining_time":0.2358785416}, +{"learn":[0.5497903262],"iteration":794,"passed_time":0.9102544788,"remaining_time":0.2347197084}, +{"learn":[0.5496638458],"iteration":795,"passed_time":0.9115397459,"remaining_time":0.2336106886}, +{"learn":[0.5494455014],"iteration":796,"passed_time":0.9126618441,"remaining_time":0.2324596667}, +{"learn":[0.5492022359],"iteration":797,"passed_time":0.9138558184,"remaining_time":0.2313269114}, +{"learn":[0.5490872019],"iteration":798,"passed_time":0.9149518746,"remaining_time":0.2301693702}, +{"learn":[0.5489065226],"iteration":799,"passed_time":0.9160629727,"remaining_time":0.2290157432}, +{"learn":[0.5487057435],"iteration":800,"passed_time":0.9172344883,"remaining_time":0.2278772324}, +{"learn":[0.5485074883],"iteration":801,"passed_time":0.9182998775,"remaining_time":0.2267124386}, +{"learn":[0.5483695235],"iteration":802,"passed_time":0.9194598095,"remaining_time":0.2255710865}, +{"learn":[0.5481713053],"iteration":803,"passed_time":0.9206471587,"remaining_time":0.224436372}, +{"learn":[0.5480101384],"iteration":804,"passed_time":0.9219915932,"remaining_time":0.2233395785}, +{"learn":[0.5478715915],"iteration":805,"passed_time":0.9230665242,"remaining_time":0.2221773023}, +{"learn":[0.5475953509],"iteration":806,"passed_time":0.9242684568,"remaining_time":0.2210456161}, +{"learn":[0.547408714],"iteration":807,"passed_time":0.9255065983,"remaining_time":0.21992236}, +{"learn":[0.5472241436],"iteration":808,"passed_time":0.9265874877,"remaining_time":0.2187616936}, +{"learn":[0.547046197],"iteration":809,"passed_time":0.9276947107,"remaining_time":0.2176074013}, +{"learn":[0.5468800084],"iteration":810,"passed_time":0.9287983504,"remaining_time":0.2164523899}, +{"learn":[0.5466156398],"iteration":811,"passed_time":0.930097701,"remaining_time":0.2153428175}, +{"learn":[0.5465582902],"iteration":812,"passed_time":0.9311890905,"remaining_time":0.2141849446}, +{"learn":[0.5463975279],"iteration":813,"passed_time":0.9324492739,"remaining_time":0.2130658046}, +{"learn":[0.546287305],"iteration":814,"passed_time":0.9337234159,"remaining_time":0.211949487}, +{"learn":[0.5461004895],"iteration":815,"passed_time":0.934811972,"remaining_time":0.2107909349}, +{"learn":[0.5458764408],"iteration":816,"passed_time":0.9358718611,"remaining_time":0.2096261329}, +{"learn":[0.5457505651],"iteration":817,"passed_time":0.9370783355,"remaining_time":0.2084942018}, +{"learn":[0.5455673223],"iteration":818,"passed_time":0.938272518,"remaining_time":0.2073593721}, +{"learn":[0.5453657635],"iteration":819,"passed_time":0.9393419906,"remaining_time":0.2061970223}, +{"learn":[0.5451750098],"iteration":820,"passed_time":0.9407089254,"remaining_time":0.2050997535}, +{"learn":[0.5450580229],"iteration":821,"passed_time":0.9418477322,"remaining_time":0.2039524286}, +{"learn":[0.5448891122],"iteration":822,"passed_time":0.9430239562,"remaining_time":0.2028131716}, +{"learn":[0.5447159953],"iteration":823,"passed_time":0.9441911801,"remaining_time":0.2016719025}, +{"learn":[0.5445744778],"iteration":824,"passed_time":0.9454946557,"remaining_time":0.2005594724}, +{"learn":[0.5443809225],"iteration":825,"passed_time":0.9468624239,"remaining_time":0.1994601232}, +{"learn":[0.5442042196],"iteration":826,"passed_time":0.9480271477,"remaining_time":0.19831765}, +{"learn":[0.5439359693],"iteration":827,"passed_time":0.9495146675,"remaining_time":0.1972421773}, +{"learn":[0.5436948438],"iteration":828,"passed_time":0.950806643,"remaining_time":0.1961253751}, +{"learn":[0.5435238046],"iteration":829,"passed_time":0.9519422831,"remaining_time":0.1949761303}, +{"learn":[0.5433885592],"iteration":830,"passed_time":0.9530060056,"remaining_time":0.1938122924}, +{"learn":[0.5432087084],"iteration":831,"passed_time":0.9545835683,"remaining_time":0.1927524513}, +{"learn":[0.5429354732],"iteration":832,"passed_time":0.9557564172,"remaining_time":0.1916102301}, +{"learn":[0.5427264428],"iteration":833,"passed_time":0.9572851875,"remaining_time":0.1905387783}, +{"learn":[0.5424446678],"iteration":834,"passed_time":0.9584514114,"remaining_time":0.1893945903}, +{"learn":[0.5423728941],"iteration":835,"passed_time":0.9595989683,"remaining_time":0.1882466876}, +{"learn":[0.5422192589],"iteration":836,"passed_time":0.9607939842,"remaining_time":0.187108028}, +{"learn":[0.5420059953],"iteration":837,"passed_time":0.9621563773,"remaining_time":0.1860015908}, +{"learn":[0.5419305179],"iteration":838,"passed_time":0.963314851,"remaining_time":0.1848554124}, +{"learn":[0.5416955576],"iteration":839,"passed_time":0.964439741,"remaining_time":0.1837028078}, +{"learn":[0.5415667697],"iteration":840,"passed_time":0.9659413859,"remaining_time":0.1826214987}, +{"learn":[0.5414730371],"iteration":841,"passed_time":0.9670932763,"remaining_time":0.1814735602}, +{"learn":[0.5413254033],"iteration":842,"passed_time":0.9683060841,"remaining_time":0.1803369575}, +{"learn":[0.541134908],"iteration":843,"passed_time":0.969452891,"remaining_time":0.1791879751}, +{"learn":[0.541011651],"iteration":844,"passed_time":0.9708942018,"remaining_time":0.1780930193}, +{"learn":[0.5408742065],"iteration":845,"passed_time":0.9720472588,"remaining_time":0.1769447729}, +{"learn":[0.5407677399],"iteration":846,"passed_time":0.97351282,"remaining_time":0.1758529651}, +{"learn":[0.5405882682],"iteration":847,"passed_time":0.9748717964,"remaining_time":0.174741171}, +{"learn":[0.5404063591],"iteration":848,"passed_time":0.9759860195,"remaining_time":0.1735852638}, +{"learn":[0.5402199597],"iteration":849,"passed_time":0.9771223263,"remaining_time":0.1724333517}, +{"learn":[0.5400828497],"iteration":850,"passed_time":0.9783578011,"remaining_time":0.1712988394}, +{"learn":[0.5399611765],"iteration":851,"passed_time":0.979505858,"remaining_time":0.1701489049}, +{"learn":[0.5396695028],"iteration":852,"passed_time":0.9806189978,"remaining_time":0.1689929574}, +{"learn":[0.5394488059],"iteration":853,"passed_time":0.9821755602,"remaining_time":0.1679129178}, +{"learn":[0.5391908301],"iteration":854,"passed_time":0.9833997431,"remaining_time":0.166775395}, +{"learn":[0.5390772765],"iteration":855,"passed_time":0.9846534264,"remaining_time":0.1656426325}, +{"learn":[0.5388830726],"iteration":856,"passed_time":0.9858470256,"remaining_time":0.164499562}, +{"learn":[0.5387260102],"iteration":857,"passed_time":0.9874740056,"remaining_time":0.1634280988}, +{"learn":[0.5385718663],"iteration":858,"passed_time":0.9887822313,"remaining_time":0.1623030205}, +{"learn":[0.5384163577],"iteration":859,"passed_time":0.9903007932,"remaining_time":0.161211757}, +{"learn":[0.5382201659],"iteration":860,"passed_time":0.9915760185,"remaining_time":0.1600802167}, +{"learn":[0.5379996906],"iteration":861,"passed_time":0.9927680343,"remaining_time":0.1589350217}, +{"learn":[0.5378266584],"iteration":862,"passed_time":0.9939941756,"remaining_time":0.1577951356}, +{"learn":[0.5376524191],"iteration":863,"passed_time":0.9955644049,"remaining_time":0.1567092119}, +{"learn":[0.5375314462],"iteration":864,"passed_time":0.996932423,"remaining_time":0.1555906094}, +{"learn":[0.5374158523],"iteration":865,"passed_time":0.9985464445,"remaining_time":0.154509496}, +{"learn":[0.5373387291],"iteration":866,"passed_time":0.9996967098,"remaining_time":0.153356012}, +{"learn":[0.5371031689],"iteration":867,"passed_time":1.000813516,"remaining_time":0.1521974472}, +{"learn":[0.5369876964],"iteration":868,"passed_time":1.002058075,"remaining_time":0.1510582368}, +{"learn":[0.5368424466],"iteration":869,"passed_time":1.003375425,"remaining_time":0.1499296613}, +{"learn":[0.5366527847],"iteration":870,"passed_time":1.004651734,"remaining_time":0.1487945737}, +{"learn":[0.5364835345],"iteration":871,"passed_time":1.005933751,"remaining_time":0.1476600002}, +{"learn":[0.5363997115],"iteration":872,"passed_time":1.007516855,"remaining_time":0.1465688896}, +{"learn":[0.5362290419],"iteration":873,"passed_time":1.008723205,"remaining_time":0.1454223385}, +{"learn":[0.5361499667],"iteration":874,"passed_time":1.010380019,"remaining_time":0.1443400026}, +{"learn":[0.5359272704],"iteration":875,"passed_time":1.011926539,"remaining_time":0.143240743}, +{"learn":[0.5357993232],"iteration":876,"passed_time":1.013088471,"remaining_time":0.1420865245}, +{"learn":[0.5356482822],"iteration":877,"passed_time":1.014843078,"remaining_time":0.1410146418}, +{"learn":[0.5355361733],"iteration":878,"passed_time":1.016382015,"remaining_time":0.1399115174}, +{"learn":[0.5354460196],"iteration":879,"passed_time":1.017927619,"remaining_time":0.1388083117}, +{"learn":[0.5352588228],"iteration":880,"passed_time":1.019176552,"remaining_time":0.1376640292}, +{"learn":[0.53512148],"iteration":881,"passed_time":1.020487653,"remaining_time":0.1365278266}, +{"learn":[0.5350096075],"iteration":882,"passed_time":1.021694044,"remaining_time":0.1353773535}, +{"learn":[0.5348475038],"iteration":883,"passed_time":1.023954116,"remaining_time":0.1343650197}, +{"learn":[0.534620608],"iteration":884,"passed_time":1.025320301,"remaining_time":0.1332337114}, +{"learn":[0.5345059191],"iteration":885,"passed_time":1.026687652,"remaining_time":0.1321020229}, +{"learn":[0.5343386233],"iteration":886,"passed_time":1.027889626,"remaining_time":0.1309487348}, +{"learn":[0.5341194767],"iteration":887,"passed_time":1.029000266,"remaining_time":0.1297838173}, +{"learn":[0.533889748],"iteration":888,"passed_time":1.030475786,"remaining_time":0.1286645807}, +{"learn":[0.5337391311],"iteration":889,"passed_time":1.03169926,"remaining_time":0.1275133917}, +{"learn":[0.5335737931],"iteration":890,"passed_time":1.033147655,"remaining_time":0.126389556}, +{"learn":[0.5334144509],"iteration":891,"passed_time":1.034404421,"remaining_time":0.1252417909}, +{"learn":[0.5332543181],"iteration":892,"passed_time":1.035710105,"remaining_time":0.1240996431}, +{"learn":[0.5330324114],"iteration":893,"passed_time":1.03693808,"remaining_time":0.1229479155}, +{"learn":[0.532823744],"iteration":894,"passed_time":1.038020761,"remaining_time":0.121778972}, +{"learn":[0.5326132813],"iteration":895,"passed_time":1.039392988,"remaining_time":0.1206438289}, +{"learn":[0.532559536],"iteration":896,"passed_time":1.040504877,"remaining_time":0.1194782635}, +{"learn":[0.5323901087],"iteration":897,"passed_time":1.041834853,"remaining_time":0.1183375891}, +{"learn":[0.532317485],"iteration":898,"passed_time":1.043248247,"remaining_time":0.1172058654}, +{"learn":[0.5321770734],"iteration":899,"passed_time":1.044346262,"remaining_time":0.1160384735}, +{"learn":[0.5319322789],"iteration":900,"passed_time":1.045449068,"remaining_time":0.1148717622}, +{"learn":[0.5316690346],"iteration":901,"passed_time":1.046637001,"remaining_time":0.1137144413}, +{"learn":[0.5315424691],"iteration":902,"passed_time":1.048160604,"remaining_time":0.1125931103}, +{"learn":[0.5313859248],"iteration":903,"passed_time":1.049427079,"remaining_time":0.1114435837}, +{"learn":[0.531195805],"iteration":904,"passed_time":1.050513969,"remaining_time":0.110274947}, +{"learn":[0.5310412898],"iteration":905,"passed_time":1.051734527,"remaining_time":0.1091203593}, +{"learn":[0.5309069909],"iteration":906,"passed_time":1.0528255,"remaining_time":0.107952339}, +{"learn":[0.5308202803],"iteration":907,"passed_time":1.054048308,"remaining_time":0.1067978461}, +{"learn":[0.5306762481],"iteration":908,"passed_time":1.055409576,"remaining_time":0.1056570642}, +{"learn":[0.5305210105],"iteration":909,"passed_time":1.05676726,"remaining_time":0.1045154433}, +{"learn":[0.5303613837],"iteration":910,"passed_time":1.057928734,"remaining_time":0.1033541793}, +{"learn":[0.5301894383],"iteration":911,"passed_time":1.059413587,"remaining_time":0.1022241181}, +{"learn":[0.5300110846],"iteration":912,"passed_time":1.060551852,"remaining_time":0.1010602532}, +{"learn":[0.5298896467],"iteration":913,"passed_time":1.06171916,"remaining_time":0.09989917694}, +{"learn":[0.5297722075],"iteration":914,"passed_time":1.062816382,"remaining_time":0.09873157651}, +{"learn":[0.5295404489],"iteration":915,"passed_time":1.064131692,"remaining_time":0.09758412892}, +{"learn":[0.5294298694],"iteration":916,"passed_time":1.065476001,"remaining_time":0.09643894013}, +{"learn":[0.5292101992],"iteration":917,"passed_time":1.066543182,"remaining_time":0.0952685631}, +{"learn":[0.5289950717],"iteration":918,"passed_time":1.06778824,"remaining_time":0.09411408864}, +{"learn":[0.5288228305],"iteration":919,"passed_time":1.069120091,"remaining_time":0.09296696446}, +{"learn":[0.5286330477],"iteration":920,"passed_time":1.070387441,"remaining_time":0.09181390649}, +{"learn":[0.5284490903],"iteration":921,"passed_time":1.071462414,"remaining_time":0.0906443257}, +{"learn":[0.5283180803],"iteration":922,"passed_time":1.072724306,"remaining_time":0.08949054339}, +{"learn":[0.5281316824],"iteration":923,"passed_time":1.073802779,"remaining_time":0.08832144066}, +{"learn":[0.5279960696],"iteration":924,"passed_time":1.074910668,"remaining_time":0.08715491905}, +{"learn":[0.5277708018],"iteration":925,"passed_time":1.076039225,"remaining_time":0.08599017564}, +{"learn":[0.5275788182],"iteration":926,"passed_time":1.077167282,"remaining_time":0.08482547094}, +{"learn":[0.5274954053],"iteration":927,"passed_time":1.078315589,"remaining_time":0.08366241635}, +{"learn":[0.5273939801],"iteration":928,"passed_time":1.079599106,"remaining_time":0.08250972712}, +{"learn":[0.5271941343],"iteration":929,"passed_time":1.080878998,"remaining_time":0.08135648369}, +{"learn":[0.5270978216],"iteration":930,"passed_time":1.08203968,"remaining_time":0.08019413308}, +{"learn":[0.5269792396],"iteration":931,"passed_time":1.083161403,"remaining_time":0.07902894356}, +{"learn":[0.5268377973],"iteration":932,"passed_time":1.08430196,"remaining_time":0.07786519969}, +{"learn":[0.5267032069],"iteration":933,"passed_time":1.085477225,"remaining_time":0.07670395811}, +{"learn":[0.5265548995],"iteration":934,"passed_time":1.08655849,"remaining_time":0.0755361517}, +{"learn":[0.5264515743],"iteration":935,"passed_time":1.08769538,"remaining_time":0.07437233367}, +{"learn":[0.5262363111],"iteration":936,"passed_time":1.088955063,"remaining_time":0.07321682923}, +{"learn":[0.5262123118],"iteration":937,"passed_time":1.090084787,"remaining_time":0.07205251255}, +{"learn":[0.5261404386],"iteration":938,"passed_time":1.091339928,"remaining_time":0.07089641707}, +{"learn":[0.5260256059],"iteration":939,"passed_time":1.092537986,"remaining_time":0.06973646719}, +{"learn":[0.5259196314],"iteration":940,"passed_time":1.093713835,"remaining_time":0.06857504385}, +{"learn":[0.5257448753],"iteration":941,"passed_time":1.094825808,"remaining_time":0.06740965697}, +{"learn":[0.5255640861],"iteration":942,"passed_time":1.09598199,"remaining_time":0.06624705561}, +{"learn":[0.5254048598],"iteration":943,"passed_time":1.097287049,"remaining_time":0.06509329953}, +{"learn":[0.5252093179],"iteration":944,"passed_time":1.098435939,"remaining_time":0.06393013404}, +{"learn":[0.5250705737],"iteration":945,"passed_time":1.099588246,"remaining_time":0.06276719377}, +{"learn":[0.5249127042],"iteration":946,"passed_time":1.100744178,"remaining_time":0.06160447884}, +{"learn":[0.5248016433],"iteration":947,"passed_time":1.101941403,"remaining_time":0.06044404319}, +{"learn":[0.5245889009],"iteration":948,"passed_time":1.103026792,"remaining_time":0.05927751991}, +{"learn":[0.5244611525],"iteration":949,"passed_time":1.104130098,"remaining_time":0.05811211045}, +{"learn":[0.52435538],"iteration":950,"passed_time":1.10523203,"remaining_time":0.05694676074}, +{"learn":[0.5242868134],"iteration":951,"passed_time":1.106400087,"remaining_time":0.05578487834}, +{"learn":[0.5241478183],"iteration":952,"passed_time":1.107504393,"remaining_time":0.05461983892}, +{"learn":[0.523947669],"iteration":953,"passed_time":1.108621033,"remaining_time":0.05345552152}, +{"learn":[0.5237888331],"iteration":954,"passed_time":1.109708881,"remaining_time":0.05228994727}, +{"learn":[0.5236090071],"iteration":955,"passed_time":1.110803479,"remaining_time":0.05112484631}, +{"learn":[0.5234509657],"iteration":956,"passed_time":1.111964036,"remaining_time":0.04996285637}, +{"learn":[0.5232790155],"iteration":957,"passed_time":1.113029467,"remaining_time":0.04879669896}, +{"learn":[0.5230899075],"iteration":958,"passed_time":1.114440902,"remaining_time":0.04764554431}, +{"learn":[0.5229585604],"iteration":959,"passed_time":1.115597376,"remaining_time":0.046483224}, +{"learn":[0.5228564751],"iteration":960,"passed_time":1.116897685,"remaining_time":0.04532675308}, +{"learn":[0.5226973984],"iteration":961,"passed_time":1.118131035,"remaining_time":0.04416733817}, +{"learn":[0.522581195],"iteration":962,"passed_time":1.119245049,"remaining_time":0.04300318466}, +{"learn":[0.5224049925],"iteration":963,"passed_time":1.120307939,"remaining_time":0.04183722592}, +{"learn":[0.5221831982],"iteration":964,"passed_time":1.12141937,"remaining_time":0.0406732414}, +{"learn":[0.5220633205],"iteration":965,"passed_time":1.122702429,"remaining_time":0.0395154064}, +{"learn":[0.5218727774],"iteration":966,"passed_time":1.123848444,"remaining_time":0.03835263563}, +{"learn":[0.5217142792],"iteration":967,"passed_time":1.124948292,"remaining_time":0.03718837329}, +{"learn":[0.5216137175],"iteration":968,"passed_time":1.126049265,"remaining_time":0.03602427989}, +{"learn":[0.521431127],"iteration":969,"passed_time":1.127147405,"remaining_time":0.03486022901}, +{"learn":[0.5212491425],"iteration":970,"passed_time":1.128320503,"remaining_time":0.03369855263}, +{"learn":[0.5210412582],"iteration":971,"passed_time":1.129375601,"remaining_time":0.03253345352}, +{"learn":[0.5209096834],"iteration":972,"passed_time":1.130485574,"remaining_time":0.03137010328}, +{"learn":[0.5206924059],"iteration":973,"passed_time":1.131710799,"remaining_time":0.03020993918}, +{"learn":[0.5204450378],"iteration":974,"passed_time":1.13279648,"remaining_time":0.02904606358}, +{"learn":[0.5203452705],"iteration":975,"passed_time":1.133940328,"remaining_time":0.02788377856}, +{"learn":[0.5201276544],"iteration":976,"passed_time":1.135022676,"remaining_time":0.02672008347}, +{"learn":[0.5200265373],"iteration":977,"passed_time":1.136771116,"remaining_time":0.02557153839}, +{"learn":[0.5199170844],"iteration":978,"passed_time":1.137911089,"remaining_time":0.02440871591}, +{"learn":[0.5197050537],"iteration":979,"passed_time":1.139124272,"remaining_time":0.02324743412}, +{"learn":[0.5195470424],"iteration":980,"passed_time":1.14019212,"remaining_time":0.02208323168}, +{"learn":[0.5194250506],"iteration":981,"passed_time":1.141367885,"remaining_time":0.0209212036}, +{"learn":[0.5193402584],"iteration":982,"passed_time":1.142640277,"remaining_time":0.01976081863}, +{"learn":[0.5191450323],"iteration":983,"passed_time":1.143999295,"remaining_time":0.01860161456}, +{"learn":[0.5190161094],"iteration":984,"passed_time":1.145095185,"remaining_time":0.01743799774}, +{"learn":[0.5188890325],"iteration":985,"passed_time":1.14614549,"remaining_time":0.01627387106}, +{"learn":[0.518662949],"iteration":986,"passed_time":1.147782637,"remaining_time":0.01511770444}, +{"learn":[0.5185427602],"iteration":987,"passed_time":1.148910319,"remaining_time":0.01395437634}, +{"learn":[0.518436865],"iteration":988,"passed_time":1.150014584,"remaining_time":0.01279085988}, +{"learn":[0.5183853031],"iteration":989,"passed_time":1.151108765,"remaining_time":0.01162736126}, +{"learn":[0.5182570586],"iteration":990,"passed_time":1.152181737,"remaining_time":0.01046380993}, +{"learn":[0.5181277957],"iteration":991,"passed_time":1.15323071,"remaining_time":0.009300247659}, +{"learn":[0.5179707171],"iteration":992,"passed_time":1.15427339,"remaining_time":0.008136871834}, +{"learn":[0.5178342938],"iteration":993,"passed_time":1.155688492,"remaining_time":0.006975986876}, +{"learn":[0.5176966263],"iteration":994,"passed_time":1.156769257,"remaining_time":0.005812910838}, +{"learn":[0.5175970443],"iteration":995,"passed_time":1.157896355,"remaining_time":0.004650186165}, +{"learn":[0.5174165617],"iteration":996,"passed_time":1.159128663,"remaining_time":0.003487849538}, +{"learn":[0.5172515223],"iteration":997,"passed_time":1.160268345,"remaining_time":0.002325187064}, +{"learn":[0.5170768331],"iteration":998,"passed_time":1.161338359,"remaining_time":0.00116250086}, +{"learn":[0.5169045154],"iteration":999,"passed_time":1.16242329,"remaining_time":0} +]} diff --git a/catboost_info/learn/events.out.tfevents b/catboost_info/learn/events.out.tfevents index 18f91a65b8a8eef308a7444f32074200b8dbb731..64bb1c50794d710ebfba4c25c6b08b9076cac8e4 100644 GIT binary patch literal 54870 zcmZ|YcUX^o_&4xSM3J3jX0Pm#Ju;(VMAC+ywtzJ80!?s{D0H7iB#$8fQl;JF^*SFrOI*!sH%B+ z+PrEeRlCN3+B9)=e_qK-m47c#R|*WHc_k-RE82nD?&$TKSIwpBP!mv&D^+^)s)bbL ze;d(w=hthr*X5PGRLP`)+F2zxjaMzDYULA9y|r#y^Qx6p-3b8oC8zIMUMWabGgnXx zTI7}TN>QrZFN3ly+_8XHt)=S3X;5)(`wE^{8>vz|49Y+~#E;KXlB)0PK`AP(I>xKE zQZ+{hRHZ`MOkTBHG z<&~OLsg3~U9zWwUulh*Ux!#~Yf4cjCSAC^Qz743bB2x`s^^>Yab?S}3ukPn|U*%PQ zsd`Zis@lZSl~)6#>TotFgMI59c{Na~(&9k%jkZwZ)gY<*9tmox+M*G>8Z1?@{-8|L ziw5&*h*YKB1eNL0UT_bGO4T$cP`Pa*SMgcHq-w4?s6S2`$9bhLRTYOpwJhzG!>i#^ zWwaSoi*7FjzpoKerDh1~m|p%JK5L{@y9=GduSQFi{3uY@ z;;%jC)flNt8U)JpabGiDjg_h+YM^Gf2ol_laZ+Wk0Lo)XnLv$~Dut$?Tsx(l;wzjW zRc(I_YwQ4R)-Qd+D-Eft$^}(+C_s@{6Q$~SI;g6W-(I|$BvpGJf$A~n-4b3+ma1_f zpz3?%$@6N8ROx$zQY!23!KW~dr~!-SJS1+c^jyk>K6oa zA~I`xx(-z8kMS{l)=X*Ep2eUP#@QS4YL--eoC9jNpSfU^qA69OQ$bZdIVk8+v!yC! z7^p*Dh41+a=SWqQ8mJC~`|an|T&Xhc0BYvXTXwvfCsmsApz=qSj^@>TsVc4++W4!q zoVR)>uNFvEuM$uNSGMftm6lX#=YqPY5;crh3#IDCD^Q9Vxrw}5Bvp|ypvJsze~nk# zQg!hGs8#(v+<2uURed}`*%b`);gzmb#W{e=9$_cAEYQmIl|4(j!^_;0*gCRI(fL79Brmdq=CsWP4f%3#2ebY3l& zs`g_+O!oUJ0w}%S?*(gL8>H%YAgF$q$^{*Jqf}Mj0~Hi{dk}wJo22T5 zE2!0P4+uKIW~oZC2c=~5ryZZQMXDa30JY-Usb;(~lB#ybpmMJVx$tVMR1Mz*nw zDqaIrO2&r2yxJ{Q>FS`ovO8|z)gGy8HVBl-BxOOz-YZpoyMlT;s^}@7wNI)JwFPxl zZ~rJ>?UyQbIZ#QZol|*bELEj-gBv?rQV-{DygDFN$0|VuHG5LcD-)@@R|sm_D@(yj z;6bU{`VN$VO823B)*-3-@eabLGOaL`|@C5~49g(W?d!Xhl%@&NK{*$U~ zPf*7I$X z3}FQ_zS;K%0%~T)5GiSmU zr~*s)&+8A*t`hd74X_(YmAiO$jj&i5U`^ZIiR0OI!iLlgZ0sdz+Bc1P=0aFhIk31L zYe(?Rm9XeMV8c4Ay7J78u#RcKqIN$Kyd^gXGmit-V|Sm|e40C9cSC_0{7G8JvzvtV z_5(KmXyH+wc@S3Z3GC3JX?J+$Ntl)+u#{Gs%XxN-Fh?t3HuH@IziuzWdL0F(d3}fm zpLUzDRVKh*oK5+~GjGBM838jH=b*>4JB0OF4Qy^!#5A7WC9KUtVEvX{?#(kF!qn#h zlPNaHZmKv`LqDSTFV2Qq~AuCXMuzrtsT(Vxtgo1d-3c6Ve7sE^E-VphG#*98Ds;~ z|MKk;&w>dXn+j}f;XJ|bErhV(C}6t{qWkh`p@h{00K0gkLmkh;2=n&_)@+$-7|+59 zOLhhJwsWf+Jc}UgtRpb@xaEO7dq~(CTVUI^Z|TOfNWuzF0aMoMZq2hO!itUpi+I1j z3D2Sl)7k-S-r_++c@{&Mks+{X)nBW47E9O?Jz%Z+8NK1zBf_#L0gF7j<{QuA2pc>a zSm&Iw^*nn_SkMq)6Gwg+#j|+Aa@Bxk{&5hDf)WU`PysgXaP@3H?FnHAm4Mx>`JuwI zM8f1-02}C(BS?En*toy_8#|ZVgNm1YS`uNyN`ZC$vqJE=pAqI%2&_+#vS3`2OxS?; zz&@J#x$s4%5a#$A*sfBYt~^U6Y+o`kr}Gu%JbO;q+fZQYqfdwM>;++dfxre87zpNX zFA1A)7udi(7S4RyE5fF@0qfJl>mJWu6Q<_~>|v^d63^ZcHr5(gyM7)KJbO!6=uu!= zgPa84?li)3_W=u#TeE~uOD8OQGq7DPzi03)gRt}Kf%P1cs>ZWS!UC59Gg_$ln`c>s zX=wx7tmtONvv-7f%mMaKDdQv0vI)zc1kBn^&zNWLDH{gt_oVI%dG>*@UA=$>_F5j# zvmC-|+5@ZayzV&9atW(#3C!!whz~r=Bg|e7SdZ^51<&mxVR=>k8r$opOdY|}Up`@) zrNEA>dpzWeEFet20N5Bsz_O|>+wkl&VP{_f+q`y;U_f6;*r+&QPeuex z=hMCr78DFDd_}YY&x#0pehb*m1z!?)_LZ;@7hub>T6y#A8(|wS0?U1U=rhlX343)4 z*uN3sg5k_}!nW@M=J!2hBcE16nC=E(UUl{@cvebS@DgBpiJO-3tc zhA^X7z%)m;5H#~z!iwX8^=`W2J744~;rW3oBl)$+RKNyali;$_0WA&J7qbW&>NlyjX!xb0%=I(96p8Qd3?313lKezJN=1th#GGH!qPO9?k4q?5&0?Tp8)8yG*!phTu zg?NmZ&odvwLQ;X*@4geuGhf20qkzdJ9T1#(x<}ah2f#|Z8w!?L?i1GgF0co4vjn%q zkFcJez^pDs3zq);3H$C0tT0%n2Y*Wf2LD(FcHC+NL&#zqVk)B6kA2Ya}n&MhGD+ehaX0lc~CVS}0-vtpV0!rtU^QI*$gnZbOk^I1@>jTR&h0 z_x}jy0a1jtRR*T(SiXWUGMcczO2BM3ZxsA+VhGzQ3#@#DvS7t9mazJY-i__`lW{vA zzQ{*}X?z9tIwf;A&*BJMmji5e{5-)>?J;4F>A;qauUyKf#S=C$3E0_Xr?>DdfiTA~ zVC8=GmOOhx*uHzfyp)!Q@+^_CU^igjK8CvU>?vW}uK{~&=h%v8NrX+e0p|F{Nzf;s z5ms*wY-pCUV0|)~ury;}H|*aDP7b6Hrn&`~`G4|)IZi5J!K;Dgepn$m74e*~Zp(q` zjB77w<}V04t^@4#JXygU=OtxxfX!I6q&NTEUJ-U;46yb$tpq#JuL;vr2PV@oTd-jD zhOnQ#fwf#ZPKPh@EnzcNfSuntPSBOp2)o)ASi8Po1uIYKgvqo5wyL?F;M{8lVJUxl zH8wok7FQGbYs(}oq7<0%s1U(hl0}%>XJ9j0Kl;t5y(8@AJ76m{x?kp5Heo%V1FQ4x znaQ*Fgbhppwk-UzU`qReu$mBHWi!f3`LrCug6;!*;kE7^&vFUV@CJ4vcw#-z@(6Rh z4(yW7bHS|RBVlvxfW@eOZNaDI6E^G&FmpRQd7c#z=6?iO{oUDukMJkL6pVqbX(hjy zPy0;R#GSw%oGK~cSs`J0TY+WW`2Y9>90P>bnD5Ue)pdpH@OxaywuXzFiay zXG#ehCkw3E(=+|}v@*hW{ps1*C)efvoy)Uw!gMNt#p~%m;@J;(Di6?6@oFC$;DA!A3_?6bh$ zwD1yqyX^^^Xa+1`ns$4>$V-G-9s<_<&J8D?T_$Ya4q$7>I*j9)17QJcfc2e!UeHS% z3G1p4>|C;SFrVf`*f=dGxPXuNaF-4Gem9XpTz@`+I z3Qn_JBWzP;F&97e$9ZXYMm6!^4$mv zukPO1C)<^j2o`m25O%E`n4-72V9e!C*rY;W=l|`?<*)4~VcxHRjSQ@q#xoDX4m|;; z-9JmvCp`&U5Dn~I&`80y-7UhDgMoe0D)#1!^dcHerXZ0}Jt*`;lkf zglS&}rX+t&aBX)8dtwdj-o*^TO!zKg(@cQry&hZ17wJRT)y=?GCtC;xy}pDQtpc{| zxX)ug?H*xf%YfY}SuQyDdY>?(g}~;os}r;!Kf-#<0XC@ju|a&1{)7$G0Jh&ea5&Eb z2um3S?1t7oBc25kHoPw|i*pwQkNW{(kt)EFH_Z~v@`DI7>;No(R*GQdDVVTJa==>d z3EjzGTL@tT>bo^IyeS1oi+C1FSl?=3J5T9E^DK-o?;>EqVM>CTa5!Ol1;FM$%@+)@ zBM5tw0ZcZ?Pp~}pkg%UGfw?bkwwS-RNWvncff>x!7i=~~5oR9*Os&o2nS5F_VViw` zS;>zVEPlrjw#gmXk+IH#!@049&2a`c_(P>XU*sdgme>L7kUVn(&*BJse*)N2i=Y^u zJtpjs39w6*3dKB&CoF0+u)pIwEAuRYupMiF*|ps)*lc=2Sd%5ddi2}BfKN*#tZ)vn z`kFw&TF_I%QfB~jn;Roo{7xcl+C*Uf8;t$f3@7`^kiz?+vV#>si5v zDuu8LMPRN6{Xg+VrV@6f39t&Csuw(aPMC46YGa=~^(lTN&t4GL@dvO;R`>ey>?L6< z3W24~meJzbE5gRS1@^+lVF=G&6PEfISX{J;4A0&WW*7qOgl1`5p1mb(*F9kWEuN*z zvoyk9cmh+eP!r5L(g_=O6BT=VH&4^{jGS`pHIsoY?BGF z!gW6qc=nF47Q29Lja?`BzGV}3buF;f+gE?#)7}%7umsqQ2}`H&>;qwYw1C}Tn<&_j z$sx>S8nERS!`ky{xrDio29`SJ%p0EN5!PuSu#bP-B6;?au(hhdrbP7@j3@I6%TWS0 zyI3=cPb(m-t~s#S`JDuB$tS|@{p;G;xit4@De`Hb2~#Ww7NVCTm_Qd2Ci@lGz@~*) z`Lr*D&CLZ?sQEOVXGMf%y#!YI;Gp0w`AXQSL|_F0zasdwZ-gz20jAXL;Q*c$6V}-u z*rjRz2}XF|2{U#9cK51G8J|`{*l9aphyOW+^Q@FGm*c<;_ZC(2tc)8OZ0NXUwL-0=iAng58U|WjMoA7Br30tlO%-6}@mS+`&rOg6%=*nqxp8X=sdK|FC zZFSFhR!Nxl5MXaUU9I9-6=mIl^+>RY=h<(<4l4qS>l7szs#O!FE(=WKR`>)yt%k6t zwJMD*=+@s2f}NFG!utLK=9n~V44?Lgu*tc=_GgW0#`$t(6u%gTN1-lRRgpCXUwq}ZIGM{#W{6l4S-oUJqQs49JBwd4_+2R?(>{kKns$Ddjzcwqv1}*`1VDph5JUdI+<+;EPnMVmu{aF+CRRfsiF=fGr z>KtK7LxA1g7dDkI@;qUYJ%NR(^%QJ2*$~#WGq8b48wE3}3xut11#E=T>^^*vwuHI- z?b6t}dfk{6$g_)tH7f=7LdH+fg6s%un+>cYIaDyfuqVtu8Q6Te*0p?*mk5)K0OruV z(^j5cCd~FWFoo-#mh;Skuw5>|&Zv3Jy&~8yGHJWO;rHa z)~NdtzQ~(|y{%JjYzlIfH7-2!AZ%eZFslWV1g9cA37cCAEMNYVU}66jVJq^1jT=_- zlP}VXFxyOEt%~NW@$5EXLtX-Vd*h$r_vTHQaxAb539{Yzv^#{E1OeOkF*1&4cL~e7 z1#FJO)|Nc;A?&y#u#xQp1;1`z!Ys}LGuvk4#;4sQEW`v@hgXWeJiAX=kP)z$w+ou` z%#Sdub-*IdP4CJxf5M(=1Kaf5b`#G62veU8ETr(gSy+XUCJbOUc$^O8; z^gXD~vmn9-bOn|ymtx1WV8R0AfvKaR zN?nd%VEBZv=@WphKfSvZpO#42A$4HQ+C}N`>?vV^J%Kq_g$qu6BoP*?1kCJbj$jr0 z8DUm(z@iIxMDj%@6Snksr^Xg^rOH?^3{4?ySP8ImzwbNqX{m&z6#%UI2y3$z*pCe}W%;ysgoQ2!mXMb4fM?l+9h(g-Apevp z&)yTZemt<@E~2IO4}_f<3T)ERwSsRz4q@ljfUVxN@;F~)E@A4*z`Wu{AL3aaVXs>Q z+n)3JFwZ^`_E82{@euR(Jj*A{wYpEzkXA<6GJRlr5A4SAY2}2Cm=COG!{XjN`$1Tf zX~52PsmB>_BJ0U0iXX8wd1KW|@lunHr*h#|PZUa`(aoQFB z+RO=aS_>?~b?-HvSrC@71laNDwRF9tp~zE&O`Q*H!}E#sJXZs=By7VJV5$4s2p+&` z!rqSpb}3J@4}WcE2;0&P*q$iUY@S&WCf^R&OZ)$I#<1bq&JtEG2kdUl5_3Myny|jV z+Bf!+l|NG_@$4L7XN!Q{HuVvF-_8@ZIUCsUxj*UPso~me2%GZ?*kHfR6?~Bw2)msK zOfPWbRG!%q_A?q-lImbpo?RrYBmme--NXJovmz3IW9c;-TwTo+(H!|n=(*sg?4X$|bD;?`Y!nj2vqn*qC#U#G;g8-%^6 zZP(bje#jZqvuX_wz@4zEWx$M9I0=T>HwpWm3(Pm;kKmSg5H|5Gu**?}g15wzFpmUa zm&UD1=Wod^!c0Pdo%*OR_yu?ow#ggVtKhqWZ@_KBe69dX-MH&0U!*r-11dp0Ng_<8J1||-iS(R81A9i;!?wU|&U?Y61Ff4*eQ=;FZi@qgcZL4HmJL<56@l`rWp%tS37OG-P%y(8^UD6fJIGF z6s%ypCCtzd*zf)RtN0?*2z%!aY*^Vr!S5}du)B`HoM&D>&ZlJ%_WeAt9yO+dk8mbo zW~YHYKXF3vDrXU<`5&-e8Wr?FUBd%-M_ADgU``gp*YVeuP1uSxz_#ZY&<)UrwD*K9 z)dhCVW8Hi{?E_)`=L1_A9JYyPIfVI41txoJieU7bOIYD>U}Iy&=1&g<=AjOt(vg1Zom>BYfj@?4Pl+y0}I+cLa<&^OW5|7z-o*83Vt|$2rK#5 zy0PKK+V~FSi>xC|wF=nFq1y_1_Ls29CBTAe$AP6V_rqF!Mi|Q}`m!5%z5atTqJDOAYdh{wFEy?JHk}^0GqOD zaaX=bd&2TmfxY}Mj2=2`_y$}etV=s!pHIIK4CpTtcC9I}fu$;A`63+%Q>;~N?8?`D zW+?E?k+5zhz=~5(U*MS&VW#ha4Oh+*e5kGvHtrR$)ab#2x5SySX7Ru}RL1w^i@Zvh zQVg(svrNG#=o(=OA;7}lbc*BCt`m098`xB1O~Kh27s4#B09$a)tvR3OO4y%^z{UsU zci@>DVSOxt-F%|=mS;Bz`*R3b+>AJ1p1BkDcRR4<{r4{9*-gTJt_N0bku{oU9)$f` z3M}!^eOI1&61HgpF#loy>o4tV_;ueROm_yb*_N_H`7|%W#tsJ-a3#i%XaDD)FjZ-# z+^WUGJw`kC7#nx0RRgyEcDEd!c@vi38Cd;|HV=4qhp-6>z?9dPKjPV4!j{Sa8>rPY zg=ap5H7QeQ>|7>SZVUFPdm-x_JE|&jJY32?4f#dpAMn3M6dNU0?yNtHb!T2ZSlR04veg z5ls7n2y?m!Y)Lm=!L9Ya}DZw7C~6GF0iFKA%c!jfz3_( zkI5}&EYP5kxvQh=?Tm+=ciz@l0;ao3$P_0Z3NT4 zXM`=f4D65NpIE-gWWrvZ0d{|3w?RBhAuP%a*k_|ND|nVl*u#Usx?lb!SZI7s*rPqb zdjHDZ$)~*_?B7OUDwDY}PkTjJwid8nI$Hz-`qzZz&IFcWUoDs| zz9H=ML}1U$WCc5!ZwY%k0GQ0ph1>aSOCwBA1z61Q7SDN>PS`eiU?KYR3wV}6ShWnW z;o%NeJj*0(>aUiKeX`i3EShIogjIY6HbVbjcb>f?EGrjS{*Gstd6rF>cN(xeeziY% z_MWhmr@&$>as@-|4}=*+0PD5lm*8ufLs(NkU@z26JM%^666WLqOv74UFfPd>?9Me{ zLD}Ex__U9Nb-oPDpmztsvSvPE^0vT~edGV~X$6E`F$4CrzKLLD{)w;_hk+@&-4ryu z&xD!p1{VB&BmL`Y8m4`Pgmv5itVm_TWB%H{5LTxT?A#zZYn~Mmc3clwO>b?%w%u34 zwC4b;47s?NPy0q#uNlDRAF^r1vtq)mMgiNR)zge;-wEqC7+BvbE5V_&62hkS0yg>U z;(vTvDPe_OfF%Tu5DY`h2>aI_*yi`fzxlLs!or&atM0k0C(nLR_E)~Ky;=|JCs;!I zN!X?;V2gj>5=_@C2#YTUR?)2DBVXh%!alzTmVZ)DooAJVtxp5C^EU;B7te_*uR%&)r8611NLlqsUWR}u-+cPTAC#a8eT17T33K+9sfLoFY*sz zSvJ5Drs@ce@6{2u(gIlGGE>3!&tJk`9sqW(TU)`@=pSKyjDYQEsV&D}TRmYb41gJ^ zM?B%#i5Al3vDeFhrD}dm4RIg0)v`!Ysc6TiGsL@C`UeSVjS`*su)2ojgz2mUqCKwmT_! zCv6Cu_!8KpBme7f;cgh0Tp;Xm0x-KyV+D%?wuG5Q0JDzVd4_-77YTcQAK0=rdjzMD z>=CPze3}Dci~j@G zL%+3PL&lLXjh(>GobkEEr#TT;whq|rBMxhLc7-srrNDZ-Hc#f6GhzGY0lR)nu9#<6 z3Co@aOf9%ZFbcXxn8#>fYwel{mdCCW7CRVNKmUG<_##~h`>P6UP+p`7&s+)Hsst?B z{=XeOb0e(0C9unCM+Mh*gD|aTz_jHH1q=J`gpI0d-q>E#CVcMA7kQJg{4!v3WikcR zJ`cjW7Xcd(_dbSC^CT=Y2bi5jYe6%=MVMSVu!xIm1?D|ZR&8vty?SueqJ^C8UT4zRx^iyAguWgV4ful?fJAo!tSpF_Qo?xFz9_in2`anysisB@o7PXnP>s)ciK+C zf(h$93z$;U9%Vi)gs=gVfhj8XaphSkVRyy@Yx%Q_U^o*-n2kEHbxl_5@@e6O?dc6{ zbJs0`A$9~|&6R;|+}>?GpZ1WjDGI<;P9N~$StMckGQhOmb_*6hq6l-TlxzG3bjTkQ z%BMvWHsLEWS7*U&F@`XgJYd!Zr`qsov4nlk0_J~qUOvwr5oY!Rn5)Gp!E`;2u>3?| z+m}A9<Da>?HPHGPfI0CWg#%tKU#r2drnxvBw(Yr^|#^K3&IS>0`nedD41lv zB&_oQV7ITwsqtyA2s_vdSR1`~!TjwtVe?gh70q4!j8A(**d_&FM=puZbG;?3WfNeX z<(u~6)6xiQRU_NjCnp;&6igq|2{Ww#wkW}L0H2mYn13O#@uL<9Hm)-Xo00>}yK>VP zJ}rx|uW7)Z=9how**n6zBm!HqX~PwsWfL|b23Vr3q888I6E-&tnBy7UYMy-{tS|_e zhlhh;){#S)nJ=)hMYm`1X}N?o_XK9Y-Po|M3|&xAQ|2NpJRLO-4r64rk$u(wa@ S1tYvKgk>)QwrJtt8UF*D?l08< literal 54870 zcmaLgcU+Hc_&0DXvS(IC$e!7o5OE_bq5GEX8IcsBk~C-tO=+r-Q5xEcrWR#|6p=Jk zltg}iJUvgJ>-Zh#<3E4AU!U{3zSs9WkMlUMFN)3n&z}XOjaRg7*34MFa^q{|QGMF= zYS(7@!Cm_g9yuZxxJ7B+%>Vm0Px+%&!y3&IwGYkypXt(Es`hLIRb4c9 z8*De&@T#R$wU`E~Y|LU6UbT{{Ph&x4g&5@UN=B+)4FPo~zxpn(T1(Z`UZCdXcpLGm zjZ~eM0oAL^YGYo>O4ZRn6PiA++cE`jdDT{`7F2^;-|=f#UbT~|-i4rsZB)C;tM*d0 z^EIeT{U#0KRR^h>o(d|`GSY`v9i{5}15hnZ<~H!ElT`Txf~uBVKaf|QrRuF0C@;C5 ziM;9}Rb3oGd7Sd@!Kf9R2$-uewXsBSTP;C+5cTs)tnR z9|bjO)be~@$w`&b9#Fxp7svCer&RfF26gDwxn{iTB~_N1pyDE~&gE5asoJp`)G+Oy z?|Icns=Sth8u+`go>zUPs&F1ClXl%l@Je2)%BFyNXXRPLtA0{7Z73*v?{0;>>MvE% z@}Qd4M!N87fK*ww2PL;i#^buJ2&>$TNKc{M_+-0y>GRjVo(;Yg|49SEv;xzl|38JS7^ym93hGY$X+2(zl`2;QP_}A2M)PW%R2@19N_qIN0A7uk zs(>A!vT_bM@M?lo)olh98|$%`S4vV9xdxP4QvZ{@nkZG(^Fh6R(^;_UO_Hj$Q$Z!G zl)d4zCQH@O@t|7o*KW?MDNc=(Bz0FM{t@x~2QWaVOD#O+~mshi;s-^(c znm(QNc{N9>l%9ifkkw1z)m*8{O$K$f)%A(InkQB5VnH3t(7(*9`BL@%KBzG>Yy|T> z*|qKP1-0$ialr@|NV8PjKpAX$BBRi+J1GhC$E-BmE0asgC82D@=8^z+%!RbjI$R!hfAfZ(@IdE{A7CZ zS<9sAKNV22yWg(o)jv|Tdp0O1h1(^(S}s*a(?B(Z8>#bZg;eDX1GVtUo8G)yDOG>_ zgWA1v#Xr1Kld6dBpe`OgsmZHVQWeqxl%86DLDp)ia%u%CJStO*&srl@d4I+>&4-UJ z*8btuTB%b12`YP=ilBS2PO83@gOYEXWWr~uOO;n4sNDJ_XI`zBs;_TAU2~i%SSvN8 zYJV;$cb%(y`K%36)i)KCRl^buUTu`Bumn((-zT2t)h4M@ybo&PU*C7U(v+&Jw?H{` z%oKbp|COq}zMvw_{dV$M|4EhpRZy23HWlz{vs8_{0&4%(Lw>x{lB%Otpc;Bk9mT6H zQe}J^R7zar172xM)i*;>O5rj;d9_ulR_lP;KI!JayxJyJ7CS)&E&M6yZ)}&U3!6dB zRqz?kXYG(GoeiMWy=yk{YNu3LtOT`lQsvz+ zrfJ45NFVf-S2|MV{}WW|gVL$IIw)18WuUG{7>4lbkW@u{0JW$3!4Y2RO4W^bpgeLW zjpfy0shXGxYW2*~+jwa(lp3$OH~>PQTzb2Aq#;?+^98Xp2mw@;7RywaDd z!T?b9I))LvIwn=F9-tgTj|*lS1F0%@0+pFRQgEJPC{=GRf|AR6n$C~#xKtfF59;NY z2T{B_Ayq-AKn*tACU_2wq)N#ERD+J*6+Y{vRDIF`wZkjm60c54)tv31f;xH#=BU$B zHE=5^v!@g4hBuyMMHbv!+;oyN~JDYM&SL%!aUUUx2+UF<#0uTf(}20JiDBdPknw5oYuP z*u2&jA9-d^*rRMRywib&_wcyLGY7)lQh>><>bH((mk9Gn1ol{|eiqLz z6Q+^??BD?>51w5i%qJSyZu!2(JaZ&$Mi8)jiYLbM%!#mmw}35PRk)02&V(8G08_45 zevoG_ggtczc1BHhFV9>F^Kk%HRIw-WFJ6{sR|#8U3e3&6?Ps336Q+C$ z*wWD>*YNBbVJ-&1G}I5j;+Y3wb~?Zc0}|Tt%#*OLof({2*hNdZ`1XS3%#yG7XQ z-oOroY!?(yfrOcN0jA!+yAz*wo3K<_U|nzM2=3$^!qWeaYFdPk?wk?Fr`;v&!Y^RC zp$dXW`5s}8-+@i?*bu;{1rgT%8?f-JNgH?;Ojzw_U>a$`K|H%pSZX1#${mq{v=G9) z-vCp|*eEDxLJ1p`18mQr30C|d!w5V41en*u3f+uq^Fv1vX-^3Y>I7_g_#;6<|BSHvvcN|7Fzn2y4>8(09$y?b}T_92h3v#)@e?OiM=vELAOI|o?S^(%sXz+1v{(t*iGqzS%n?+Cm1 z7})sMAF}vcl24dRJg`@rbh`5FJ!KKVj$1hiHkk#4`Gf##@!jPSpH@iNlOSNnY86lL z>;qwTfxzPSp6|}HkA#)^1MBqJEuUvagq`pJ=CXUvex7|IEXfJjVXvU0Jo`-8BnMzI zO5+#tteCLV=YbXcuvpErFN6&~15CT;quo3!Ax!lYu#t-0)Oq%mus7pU05)m3Ycii!LDKg>pMafv*<&c5c9yVL`M}2eydTLkbHa|j2G+6JlpLO& zBW(0DU=w7T8}ZD7Fpp$lJEAT`@ywF2gvY=R?>?WzGb_Tj!~;utUl+|YYr@t>0_!(d zzL;m{2^;bN*mGH<(LB3A*pFafE5^v|;h7C#p@G1jTZQE;x|6LRh6aFb#9#Tt3Z_un(tzDO$G?On6R&X&D0Bnf4@sPje>h-BDnt zgZszw%!RPB&4;kD<00+em`{Sr+?TKkV}NDuDp<~^T_?(vV03r#qz6Y%9>FICyK}HeQ5C}|Jb?QGnizZCvOKHpwnAKSnnIaZZ4WNpHKTl*lG`8 zo$f5%&9l#hr8xt0d}Cn7vtq*bUj}y4!6BSyUkLlx4p@;*uwalSgc(``yItIN9iR4< zuw&<^aB3w;az6P+#(-O||gZxg| zmQ}#q((c6b><3|Y{sFerKvZJa5cX{`uugkBR`O}Jgy}B=me`^5AfEjs?C3mT6Er6Z zI=yv-O_>I4uenz@KJ6D_iAun>ZyF@nztt1gV;nH!jW#}f+Hb<{jsO;4Rxa4T{UPke z5MXtuRgL(x2Fm&ZOVf1_?5O?{rraG^xXC4XKFyf?^NOZzfhiwvZo)GY!ZKO`Gx|AA zaBgZ!Sew5?o2sDq9&x+)v@?Xo{sFe(`~txXK4yd+s0DWTXD`74=vl%ZR|8uyXKfZg zNOQspOM%TFS0mU_og+-O2-rNiA&dAl3&MI80Lz*(Q!oWt5~h;}tktpt!IE!9SWFHu zqn-AJ{2;9fi%ti&b%*jLo}DMm^${@rSkadD0%3=ufpuP-DfpV&5N7@WSg?Wa9e$9u zgxLlIYnx;`m}ho`wYvfALe<-Bp4k)j+Z)(`yv~AV+(p7VB2&`S{Ets_AZ)iQqg->%Ntfw)sNIQ4IQL+9Rqv%XcQM_#m)5Z(Z8)gLEP6?=E0{3Zq1KkXEl#fVr!oH5VmPFu+Dk21cyz&glP{2rkwHM z51)3OFq3}3TE{J$%rig2s^oy_<}ZH9Gk?M=x&SNd6)E^3TL57n+5=k?+W9V@c7w2l zHo#QYYYWb(ZW3159N5B(mj%0yTZFa$qu5jh=>``FK7c^N>V5$G_IRP73c5{L&q`qb zX(;sNZ^<3Pv_1p#+qd>R&+Zbo;{&jchwiQC**(JgyatvW*~X1$L6kiQ=CJEOLGct! zSl_3>7W-xg@M-r6Tb>3ia^R@}JPRSrG7;Fz)Zc>lf&NhE4+z`q5A4TgS#6$05T@?~tVDHLFP=pb*6$jySc5)-=0Fr- zhg^Y;s2O9*r$rOycoA50^ZP$}7DL!j8(?dSOLp=smM|?VVBKc8p5j>?VLgq36~qP& z<=I2Ro*W0}S79rdOX3O3(*ssKqi8ChmOz;00bn2H+m7JbBf{Kv0Gl&ERL~85OqkAp zz>0q@6>NCxnF!1$KMKbiu1q>4c>W0H)U?L$HC)AS}Np zF!SjX-T6Ug66W0*n9r^!20Y6mOhXn}_O<()d6rFBRdZmfB?0ew_LQ)}^+TE}1=Z)q zg8kbw!q$`lt5_#`dn|{ruwq~;39kgFM!AHk7XYhszW0{Dw&#Sc$pdCO>P`^PUJ#~` z4eV&b<99rJN!a}-z)ZG>3wHUh2rEhf*5~UA!CC%m!t@>iD>3cxmmg#vVcs#ow1%#b z!6UtsQSw|MX@pRoDvz!G=rFXP#J!u*_o z?OSMX#Ipjz{Oy7L`~0lnP8JeoYXz)A)B7Bs_JJ@DGhi9%W-WO3k+8?7fsGrPtj@C{ z!b*<;`)em}!Lv_uYeN?6@eV5vK&2>M*5gxy#GEHvwEHJ?^SnAa>|pI&qlOy=c; zsZ9pft)tm!KCObVC1Zi*>E>_e**C%t4+oa^c8Oq1TS-{A0l=1Z_%WYPt0K&(7qGnp zHVKyeYRWnR8*w5kk5Btf*oij4F3mL&6!bp`JJlSRS~Hg+d|C}*%l`~+TDx85y4>Vh zEn#j|z;bPZJMru%Vadh7Oslfq@T`uo$UvtNXLd=2bdsD&!e>Iv(U18khT zr{Hw`H({%jfn79G*~X{+AuR79u!s2`f?iMqVf&+j%}w~L#HalwOf?Kx&C2_NNx_)> zM`c6q04u9Z7Mur|5H{HtSXzU&pwnwg*hDvASrcZC=dbMyVNRETl}K3M}( zJNQ)adz`a`EjH)Lroid5PHVeWu4*=VITTigd zw!2Beqhve6hK>TZ#U)%&E87$Hb0Dx?{cPs) zgS<$XsywjQKDG`#b093cJ22H&<$^uVCBhcT0;^5<6;{I@XU>{%};?1K4)srv#W$vB?C+7;!?mfcf#xwfW7|XBUn1F5jHgj zSmtqcL08R#u!|AEDx=3}@PqUuEG`(>IIHq7o_P`W^aim0y|)Rj&6}_>p1`)YN)ntc z`Ve--5t!`iMW*~9eF>|w0#=aN)0b!02}>{oHaaEi1<(8l(=`G%G{IW1Tl6RFlpe6p z@}ifj0|@)I3s{@a5rQr44Z zgcYa(b3J(aD4%wlu*ZvmHJkcH@VVU~EL<5_+nuXN@o9GnGnfIa-3k8@JiABO^@+d? z9l8igwIIT@#{l#CQf9)Z1rxSrB(R;c90j|@`-CYE0hWDDOK@lrLfGa$z=~fF{K^k9 zl(2`LfXUw6@Q7z&gl%gB%*|!`C7y*7*1QF`T2>zws^vhgaA|Ruu(86BoOxg zHZb>S2LXFT*i&C%ri#r4U!2E;m0bmP_u5gxYMMyc{>#8TZf_dL-;yN4TG;@*;Z-0g z=#vS1c@~(X)^1NeErl@aQ^3v}=?Y4|UzqU-m&Z+_1ctTEamY+q~I#pmH?iQ!{ zv~0q(W&w-5srQ>_PYF{~0_NBG>wca+BkaIvU~;dONAfI(F!!OrM%u0S;aM(WUk3pD zID6p@o;@clyBDy81a(1U{{>;Qy8;{LKfWEG_L4Azj=c5>s{E5c-DfVsN{2_EIw zgl+meuxVKgzpXrlPs<}r|2MGyRVsod{|#Yt>VV0H?h>4vz9lTU3RuUN>dp8;z9Vcw z39w7PiGriJRR84LWk~r+DF2!Bm-M{YNry!WY8sTnDzLOzR?_Rzg@C4`3BjMQYehOHUd8yz9)(XO6jDT&hNxsex@*80uhQP+m zFcB2=m4vw;0(QV;ieM*PMcBW)fo)oMT#!~x*y`=TEb_W)^VjyBur6DG9WdA3!m}TQ z$!Y?NFq?giXElVKSqrRB&$)srsFtvH%Yj9mcrVzl|0K*%1z5D6wqW~EN7(lHz{1uJ z6;wgL2pcs6*u5Mh!P;F`CYJoQT_DUq1eku+w{<+TA*}5!U^9D}De}ygummq)^}F^8 zmJU0@j$H#bq2ucBe40IB1KfbAwn`JcJ9Ck+4UWK)@5ssVX%2*y*#qn1v*bCa_;ij5B%WNm$lIV96SCwmkD9 zZ1h-Q)1xf}=ce9-T~-9KpRi*sfQ>z1B`9YC2urE!-?ZdsCwe^R({2z}TM2BDM~Yy{ zze(7C<-k^3AI;&@ZV?t#1gyuQBEd5mNSNn)V86RMMDl6333JW^W>*|*!?Qbtt<43N z?fBnhp4}zv>l0wk=Z4qu>>gpQ9|QXk>{`pSAj0$?0vo4h8~ic`0iR&q4|N5ddt^^N)gNTo_@OJ%NSQY6<4aaKg5_1Jm@a z7{d?p0b!ZWz|`%^1aIm@5Vpku*sX>@r1qF04#X)j>~*n0%85sfGO`S7Szg*2y^`n0CPKJlQ^+XX%7FHwR{5A=jE`8H6=7 z^lMu3_a1uMjc1vJjsFR(jk=Ev&$0*``5oB%4|nL&(fDy^6DD5-P>={7Gk8nKuqHhcMk-U^)|gkMe1`gssU0=JfiZJBR&H5up`;(0yKptTq zZvmTOvqHe$5H|ffFr{g_f{*(xVb&hN6tvC=(%unf=?v_K?V~IFEy*WL>k_cESa!8}<&SQ|57r*==HMQ>wTAz|^xz;2Zy&2Dn35(wk zEWY2W3Z8u-Z1E0YM_OE?8?nY~Dg2Cy~5-qU)rk$ofVpGm;ZYq`;S zvXNC1RyGRQCYQQ6{@SVtlOF=i{n*A>o>dcOA`i?gQC9FZ{Z3d+4`3TqqSN@aAB3fJ z09NjpLw`2ccuQ&sbCm&>sIco5pH@ql|6lp0a^~m1A@o(L#dFTM>zfr}wHCmlVs;3Y z4r{{v&j34qeNtO~kmm_=G6L47nKkWVH+};y5LR^zSnCs^i}*Af!mb?#rtCGAp5rv8 z*%D^67nsZM5_vw&j(nI;iG<(8+YXGYW8%$g6jqD;}+g1Tni8vzI2|Ezx zwggzs$p6;!*LI08ePv+o)uKCjnXrf%z|Mvz`tfO32-~j&Y}~$XCwb;bSj`AvtD=qw zYAz?jN(KY#waDC+Pje>htURzT4&NX0%!M$yF2FXoo8`bWSHi;E0n-fX|D9)UgxR(P z_T%S9dP>{)a9t%#?^oZZN+D{P!vj9eov_Ze!1j#G*~GJJgdM2@mJqL>&NC0fLd$?< zZVm0lGf%=2N`RG(zA4yIc@Z}KBe0GxMo;-PZ^8oJ0o!HP?iSB{2y6Wu*tl{f`dUik z=jKaTRu(Xw;2B@|wCjYaCjo0YtU&O^@gpoT2AH*V=azh$KVfsjfZgh)-j`GduEw zyiJ&+9k4T#Wayg%jZeuP!md~X^F2B;kWafySiKprr=cN&LEa?JJ z83IcV_S(m@V8Z@64D8^M2YYySpRfQOV9|5*F7PabFz21fuB@NWvrxiRw18b~5weD7 zVTAo!2TWNdNl^5L6Xv-J*gU^Kf~DgDVVX;Uo&9)eG(X4)!Vb;{HecSZhG&t4Y0m`K z|8YNAo<$L+I|NESfN#vB0{W@QvnK3}M?8f!!FmY6{O{3A;83*gc~{eV)Y; zcBntF6Y45Yc=nL6y?ub?hmBdyvv|Tny8&C6zJtD0-8h#d5N6jA*c_$P^h~&sJtAye zTVU$FPU`Z5d`wt=b6~~iqMdn`NSN85K27D!tK!M~d6q<&Nj)$x?>s>ZDVeaKT3|IZ zeFalc3Sl!Ufo)bZP~r!fO4z4zV8OFe1zXxQ!b*#Q=?pCU#-}|YY)c`qE_c^D@+_UO z$*+Oge;5(Ovkb!eya1+|xJ=Mf$Rw=WGhk<1Z=YgjR78lU!>uq$VQ zoej+I$Fn@ba!i2D-hH*0XKx6beG*uJs@GPYy(R3yFfTCc=my?vSq-E zE3^eY^N)nZD+AN}{=a@H-#7&o5q5ntFzqrk`bJ|T`$SmoIAG6L92e|_KND6n99Wp@ zH!uE{6cg5c2(aYadj+%d7s7t_2IfCH^D>`SLRhOFzy{9@?7_3IgoU;TwpC@E5zk5q ztC0a#aKu+oy_OLc(9pZ7z}OZT?8~Q>6SmU1 z`t-kEm1=yrDhYf48JL;=)ye#|RS_0l2u#=h{7#-#6Bd;RY{J(MS9tcFFr!>xrsInN1 z2TUPXZy3*h5whih>>JoFp4ju=#vdDEV zpLUM00eZmd2aFlQGYi6g?FE+I{-B_ou_SEjR$$F`7#8tqR)lrY1g6nmPEdwg6XvB3 z?6ca-6h7@dVfib7wdnA10M9NE_FWa2!|}jQJhLHe!$M#`-1OV<%$6|!nZR~fl?!f( z9bq%40n<90!t5Rcli8tgjAy=tU5*Ck|HiM9XV(eKeE=+G zQ7gf&!;i2-_keBJG!(QV{0XxO1om;cXzdOltk4fw=bK@I?fMPE=6VC`kUC#*-hGoW z6E|Q-XL<{oI=2W@a0J%3-$+5t6-d}kJ78VcToNoDw+X9156t%IaY6I@4q;B_zzSDy zFz26=yM#?T1#F(Pp8<2rJbGwtT&{;F%02?4>TSt(_M|@M-r6 zo1z13;?AP0JPRSrbvLjxwr_j#ER?Wi+kh3Ud*sctFv9Y-0Gpw;@e>3!Sln7*J==+1@QEPId?hfWfGok=W08cNUJ7iA;%ULRJBqMdi+~MEh*ROOEt;^X zxxnUc^*O_{7{X>x1JC%r3^U=`Bf?&H2DX2Z=nbpKgvqxBmhVy`sJRje3;5f! zsZ?`rTU*T!GKsLEzkv;U8ZOvTB@&m`8dP3A-2rtgu0~fM-t$GYA3Zt2M`yXU_;YY-zy{@-<6%y7*4cLl}qXbL-2f}og0sE%9Z#19wk+AOzfNkzEra#Y$2veR9%qg{DD$hO< Y_F^Wm=aC9#Jo`-8^J&2PU-4Y None: # Step 4: Attack classifier training def run_attack_classifier_training(config: DictConfig) -> None: """ - Train the attack classifier for EPT-MIA attack. + Trains multiple attack classifiers to distinguish between training and synthetic data, + and selects the best performing configuration based on evaluation metrics. + + This function orchestrates the training of various attack classifiers (XGBoost, + CatBoost, MLP) to perform a membership inference attack. It iterates through + different diffusion models used to generate synthetic data and all combinations + of feature types derived from the attribute prediction task. + + The process involves: + 1. Reading pre-computed feature files generated by the feature extraction step. + 2. Splitting the feature files into training and testing sets. + 3. For each diffusion model, iterating through all possible combinations of + feature columns ('actual', 'error', 'error_ratio', 'accuracy', 'prediction'). + 4. Training each classifier type on these feature combinations. + 5. Evaluating the classifier's performance and saving the scores (e.g., AUC, TPR at + specific FPR) and prediction results for each configuration. + 6. Aggregating all results into a summary CSV file, which includes a final + metric ('final_tpr_fpr_10') representing the best TPR at 10% FPR across + all diffusion models for a given classifier and feature set. + 7. Logging the best-performing attack configuration based on this final metric. Args: config: Configuration object set in config.yaml. @@ -121,6 +141,7 @@ def run_attack_classifier_training(config: DictConfig) -> None: features_data_path = Path(config.data_paths.attribute_features_path) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + summary_results: list[dict[str, Any]] = [] for diffusion_model_name in diffusion_models: train_features_path = features_data_path / f"{diffusion_model_name}_black_box" / "train" @@ -155,7 +176,20 @@ def run_attack_classifier_training(config: DictConfig) -> None: for classifier in classifier_types: # XGBoost, CatBoost, MLP for r in range(1, len(column_types) + 1): for selected_columns_tuple in itertools.combinations(column_types, r): + # Find if a result for this combination already exists + columns_str = " ".join(sorted(selected_columns_tuple)) + row = next( + ( + item + for item in summary_results + if item["classifier"] == classifier and item["columns_lst"] == columns_str + ), + None, + ) + if not row: + row = {"classifier": classifier, "columns_lst": columns_str} + summary_results.append(row) results = train_attack_classifier( classifier_type=classifier, @@ -166,6 +200,13 @@ def run_attack_classifier_training(config: DictConfig) -> None: y_test=test_labels, ) + # Update row with scores for the current diffusion model + for score_name, score_value in results["scores"].items(): + # Sanitize score_name for column header + col_name = score_name.lower().replace(" ", "_").replace("-", "_") + col_name = col_name.replace("_at_", "_").replace(".0", "") + row[f"{diffusion_model_name}_{col_name}"] = score_value + trianing_directory_name = f"{classifier}_" + "_".join(selected_columns_tuple) trianing_output_path = output_summary_path / trianing_directory_name trianing_output_path.mkdir(parents=True, exist_ok=True) @@ -185,14 +226,21 @@ def run_attack_classifier_training(config: DictConfig) -> None: for score_name, score_value in results["scores"].items(): f.write(f"{score_name}: {score_value}\n") - # _________________________________________________________________________________ + summary_file_name = "attack_classifier_summary.csv" + summary_df = pd.DataFrame(summary_results) + + # Add final_tpr_fpr_10 column which is the max TPR at FPR=10% across diffusion models + tpr_10_cols = [col for col in summary_df.columns if col.endswith("_tpr_fpr_10")] + if tpr_10_cols: + summary_df["final_tpr_fpr_10"] = summary_df[tpr_10_cols].max(axis=1) - summary_file_name = "attack_classifier_summary.txt" + summary_df.to_csv(output_summary_path / summary_file_name, index=False) - with open(output_summary_path / summary_file_name, "w") as f: - json.dump(results, f, indent=4) + log(INFO, f"Saved attack classifier summary to {output_summary_path / summary_file_name}") - log(INFO, f"Saved attack classifier summary to {output_summary_path / summary_file_name}") + summary_df.sort_values(by=["final_tpr_fpr_10"], ascending=False, inplace=True) + best_result = summary_df.head(1) + log(INFO, f"Best performing attack configuration:\n{best_result}") @hydra.main(config_path=".", config_name="config", version_base=None) @@ -213,7 +261,6 @@ def main(config: DictConfig) -> None: log(INFO, "Data: Multi-table.") # TODO: Implement potential data preprocessing step. - # TODO: Implement shadow model training step. if config.pipeline.run_feature_extraction: run_attribute_prediction(config) diff --git a/src/midst_toolkit/attacks/ept/classification.py b/src/midst_toolkit/attacks/ept/classification.py index 3574ec17..3738e945 100644 --- a/src/midst_toolkit/attacks/ept/classification.py +++ b/src/midst_toolkit/attacks/ept/classification.py @@ -1,13 +1,13 @@ from logging import INFO +from typing import Any import numpy as np import pandas as pd import torch from catboost import CatBoostClassifier +from sklearn.metrics import accuracy_score, auc, roc_curve from torch import nn, optim from xgboost import XGBClassifier -from sklearn.metrics import accuracy_score, roc_curve, auc - from midst_toolkit.common.logger import log @@ -23,11 +23,11 @@ def filter_data(features_df: pd.DataFrame, columns_list: list[str]) -> np.ndarra Args: features_df: The pandas DataFrame to process. - columns_lst: A list of strings specifying the types of columns + columns_list: A list of strings specifying the types of columns to select. Returns: - np.ndarray: A NumPy array containing the data from the selected columns. + A NumPy array containing the data from the selected columns. """ suffix_mapping = { "actual": lambda x: not ( @@ -48,82 +48,137 @@ def filter_data(features_df: pd.DataFrame, columns_list: list[str]) -> np.ndarra class MLPClassifier(nn.Module): - """ - Multi-Layer Perceptron (MLP) classifier. - """ - - def __init__(self, input_size=100, hidden_size=64, output_size=1): + def __init__(self, input_size: int = 100, hidden_size: int = 64, output_size: int = 1): + """ + Creates the Multi-layer perceptron classifier. Defines a simple feedforward neural network with + customizable input, hidden, and output sizes. + + Args: + input_size: The number of features in the input data. Defaults to 100. + hidden_size: The number of neurons in the hidden layer. Defaults to 64. + output_size: The number of output neurons, typically 1 for binary classification. Defaults to 1. + """ super(MLPClassifier, self).__init__() self.layers = nn.Sequential( nn.Linear(input_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, output_size), nn.Sigmoid() ) - def forward(self, x): + def forward(self, x: torch.Tensor) -> torch.Tensor: + """ + Performs the forward pass of the MLP. + + Args: + x: The input tensor. + + Returns: + The output tensor after passing through the network. + """ return self.layers(x) -def train_mlp(x_train, y_train, x_test, y_test, device, eval): +def train_mlp( + x_train: np.ndarray, + y_train: np.ndarray, + x_test: np.ndarray, + device: torch.device, + eval: bool, + epochs: int = 10, +) -> tuple[np.ndarray | None, np.ndarray | None]: """ - Train an MLP classifier and evaluate it on the test set. + Trains a simple MLP classifier and optionally evaluates it on a test set. + + Args: + x_train: Training data features. + y_train: Training data labels. + x_test: Test data features. + device: The device to train the model on (e.g., 'cpu' or 'cuda'). + eval: If True, evaluates the model on the test set. + epochs: Number of training epochs. Default is 10. + + Returns: + A tuple containing: + - The predicted labels for the test set (or None if eval is False). + - The prediction probabilities for the test set (or None if eval is False). """ - epochs = 10 input_size = x_train.shape[1] model = MLPClassifier(input_size=input_size).to(device) criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) - x_train, y_train = ( + x_train_tensor, y_train_tensor = ( torch.tensor(x_train, dtype=torch.float32).to(device), torch.tensor(y_train, dtype=torch.float32).to(device), ) + if eval: - x_test, y_test = ( - torch.tensor(x_test, dtype=torch.float32).to(device), - torch.tensor(y_test, dtype=torch.float32).to(device), - ) + x_test_tensor = torch.tensor(x_test, dtype=torch.float32).to(device) # Train the model for _ in range(epochs): model.train() optimizer.zero_grad() - outputs = model(x_train).squeeze() - loss = criterion(outputs, y_train) + outputs = model(x_train_tensor).squeeze() + loss = criterion(outputs, y_train_tensor) loss.backward() optimizer.step() y_pred, y_proba = None, None + if eval: model.eval() + with torch.no_grad(): # Get probabilities - y_proba = model(x_test).squeeze().cpu().numpy() + y_proba = model(x_test_tensor).squeeze().cpu().numpy() # Convert probabilities to binary predictions y_pred = (y_proba > 0.5).astype(float) - return model, y_pred, y_proba + return y_pred, y_proba -def get_scores(y_true, y_proba, y_pred, fpr_thresholds=[0.1, 0.01, 0.001]) -> dict[str, float]: + +def get_scores( + y_true: np.ndarray, + y_proba: np.ndarray, + y_pred: np.ndarray, + fpr_thresholds: list[float] | None = None, +) -> dict[str, float]: """ - Calculate evaluation scores for the classifier. + Calculates and returns a dictionary of evaluation scores for a binary classifier. + + This function computes the accuracy, the Area Under the Receiver Operating Characteristic + Curve (AUC-ROC), and the True Positive Rate (TPR) at specified False Positive Rate (FPR) + thresholds. + + Args: + y_true: Ground truth binary labels. + y_proba: Predicted probabilities for the positive class. + y_pred: Predicted binary labels. + fpr_thresholds: A list of FPR values at which to calculate the TPR. + Defaults to [0.1, 0.01, 0.001]. + + Returns: + A dictionary containing the calculated scores: 'accuracy', 'AUC-ROC', and + 'TPR at FPR {threshold}' for each specified threshold. """ + if fpr_thresholds is None: + fpr_thresholds = [0.1, 0.01, 0.001] + accuracy = accuracy_score(y_true, y_pred) fpr, tpr, _ = roc_curve(y_true, y_proba) auc_roc = auc(fpr, tpr) + scores = {"accuracy": accuracy, "AUC-ROC": auc_roc} + # Compute TPR at specific FPR thresholds - tpr_at_fpr = {} for threshold in fpr_thresholds: - tpr_at_fpr[threshold] = max(tpr[fpr < threshold]) - - scores = { - "accuracy": accuracy, - "AUC-ROC": auc_roc, - } - for threshold, tpr_value in tpr_at_fpr.items(): - scores[f"TPR at FPR {threshold}"] = tpr_value + # Find the highest TPR for FPRs less than the threshold + valid_tpr = tpr[fpr < threshold] + tpr_at_fpr = valid_tpr.max() if valid_tpr.size > 0 else 0.0 + scores[f"TPR at FPR {threshold * 100}"] = tpr_at_fpr return scores + def train_attack_classifier( classifier_type: str, columns_list: list[str], @@ -131,57 +186,86 @@ def train_attack_classifier( y_train: pd.Series, x_test: pd.DataFrame, y_test: pd.Series, -) -> dict[dict]: +) -> dict[str, dict]: """ - Train an attack classifier for EPT-MIA attack using specified classifier and specific selection of columns. + Trains a specified classifier for a membership inference attack. + This function takes training and testing data, selects the subset of features given in + the provided column list, and trains a classifier (XGBoost, CatBoost, or MLP) to + distinguish between member and non-member data points. It then evaluates the + classifier on the test set and returns the prediction results and performance scores. + + Args: + classifier_type: The type of classifier to train. + Supported values are "XGBoost", "CatBoost", and "MLP". + columns_list: A list of column names to be used as features for training the classifier. + x_train: The feature data for the training set. + y_train: The labels for the training set (membership status). + x_test: The feature data for the test set. + y_test: The labels for the test set (membership status). + + Returns: + A dictionary containing the results. It has two keys: + - "prediction_results": A dictionary with the true labels ('y_true'), + predicted probabilities ('y_proba'), and predicted labels ('y_pred'). + - "scores": A dictionary of performance metrics, including accuracy, + AUC, and TPR at various FPR thresholds. """ log(INFO, f"Training {classifier_type} classifier using features from columns: {columns_list}") - all_results = { - prediction_results := {}, - scores := {} - } + all_results: dict[str, Any] = {} + + x_train_processed = filter_data(x_train, columns_list) + y_train_processed = y_train.to_numpy() - x_train = filter_data(x_train, columns_list) - y_train = np.hstack(y_train) + x_test_processed = filter_data(x_test, columns_list) + y_test_processed = y_test.to_numpy() - x_test = filter_data(x_test, columns_list) - y_test = np.hstack(y_test) + assert x_train_processed.shape[0] == y_train_processed.shape[0], ( + "Mismatch in number of training samples and labels" + ) + assert x_test_processed.shape[0] == y_test_processed.shape[0], "Mismatch in number of test samples and labels" + assert x_train_processed.shape[1] == x_test_processed.shape[1], ( + "Mismatch in number of features between train and test sets" + ) - assert x_train.shape[0] == y_train.shape[0], "Mismatch in number of training samples and labels" - assert x_test.shape[0] == y_test.shape[0], "Mismatch in number of test samples and labels" - assert x_train.shape[1] == x_test.shape[1], "Mismatch in number of features between train and test sets" - assert classifier_type in ["XGBoost", "CatBoost", "MLP"], f"Unsupported classifier type: {classifier_type}" + y_pred, y_proba = None, None + if classifier_type == "XGBoost": model = XGBClassifier() - model.fit(x_train, y_train) - y_pred = model.predict(x_test) - y_proba = model.predict_proba(x_test)[:, 1] + model.fit(x_train_processed, y_train_processed) + y_pred = model.predict(x_test_processed) + y_proba = model.predict_proba(x_test_processed)[:, 1] + elif classifier_type == "CatBoost": model = CatBoostClassifier(verbose=0) - model.fit(x_train, y_train) - y_pred = model.predict(x_test) - y_proba = model.predict_proba(x_test)[:, 1] - import pdb; pdb.set_trace() + model.fit(x_train_processed, y_train_processed) + y_pred = model.predict(x_test_processed) + y_proba = model.predict_proba(x_test_processed)[:, 1] elif classifier_type == "MLP": - model, y_pred, y_proba = train_mlp( - x_train, y_train, x_test, y_test, torch.device("cuda" if torch.cuda.is_available() else "cpu"), eval=True + y_pred, y_proba = train_mlp( + x_train_processed, + y_train_processed, + x_test_processed, + torch.device("cuda" if torch.cuda.is_available() else "cpu"), + eval=True, ) prediction_results = { - "y_true": y_test, + "y_true": y_test_processed, "y_proba": y_proba, "y_pred": y_pred, } + assert y_pred is not None and y_proba is not None, ( + "Predictions and probabilities should not be None to get scores." + ) fpr_thresholds = [0.1, 0.01, 0.001] - all_results.prediction_results = prediction_results - all_results.scores = get_scores(y_test, y_proba, y_pred, fpr_thresholds) - + all_results["prediction_results"] = prediction_results + all_results["scores"] = get_scores(y_test_processed, y_proba, y_pred, fpr_thresholds) return all_results diff --git a/tests/unit/attacks/ept_attack/test_classification.py b/tests/unit/attacks/ept_attack/test_classification.py new file mode 100644 index 00000000..d646db4e --- /dev/null +++ b/tests/unit/attacks/ept_attack/test_classification.py @@ -0,0 +1,229 @@ +import numpy as np +import pandas as pd +import pytest +import torch +from unittest.mock import patch, MagicMock + +from midst_toolkit.attacks.ept.classification import ( + filter_data, + MLPClassifier, + train_mlp, + get_scores, + train_attack_classifier, +) + + +@pytest.fixture +def sample_features_df(): + # Sample DataFrame for testing filter_data. + data = { + "feature1_actual": [1, 2, 3], + "feature1_error": [0.1, 0.2, 0.3], + "feature2_error_ratio": [0.01, 0.02, 0.03], + "feature3_accuracy": [0.9, 0.8, 0.7], + "feature4_prediction": [1, 0, 1], + "another_feature": [4, 5, 6], + } + return pd.DataFrame(data) + + +@pytest.mark.parametrize( + "columns_list, expected_cols", + [ + (["actual"], ["feature1_actual", "another_feature"]), + (["error"], ["feature1_error"]), + (["error_ratio"], ["feature2_error_ratio"]), + (["accuracy"], ["feature3_accuracy"]), + (["prediction"], ["feature4_prediction"]), + (["error", "accuracy"], ["feature1_error", "feature3_accuracy"]), + ( + ["actual", "prediction"], + ["feature1_actual", "another_feature", "feature4_prediction"], + ), + ([], []), + ], +) +def test_filter_data(sample_features_df, columns_list, expected_cols): + # Tests that filter_data correctly selects columns based on suffixes. + result = filter_data(sample_features_df, columns_list) + expected = sample_features_df[expected_cols].values + np.testing.assert_array_equal(result, expected) + assert result.shape == (3, len(expected_cols)) + + +def test_mlp_classifier(): + # Tests the MLPClassifier initialization and forward pass. + input_size, hidden_size, output_size = 10, 5, 1 + + model = MLPClassifier(input_size, hidden_size, output_size) + + # Check layer types and sizes + assert isinstance(model.layers[0], torch.nn.Linear) + assert model.layers[0].in_features == input_size + assert model.layers[0].out_features == hidden_size + assert isinstance(model.layers[2], torch.nn.Linear) + assert model.layers[2].in_features == hidden_size + assert model.layers[2].out_features == output_size + + # Test forward pass + input_tensor = torch.randn(4, input_size) + output = model(input_tensor) + assert output.shape == (4, output_size) + assert torch.all(output >= 0) and torch.all(output <= 1) + + +@patch("midst_toolkit.attacks.ept.classification.MLPClassifier") +def test_train_mlp(mock_mlp_class): + # Tests the train_mlp function's logic and outputs. + mock_model = MagicMock() + mock_model.parameters.return_value = [torch.nn.Parameter(torch.randn(2, 2))] + + mock_model.return_value = torch.rand(10, 1, requires_grad=True) + + eval_output_mock = MagicMock() + eval_output_mock.squeeze.return_value.cpu.return_value.numpy.return_value = np.array( + [0.6, 0.4, 0.7] + ) + + mock_model.side_effect = [ + torch.rand(10, 1, requires_grad=True), # 1st call (training) + eval_output_mock, # 2nd call (evaluation) + ] + + mock_mlp_class.return_value.to.return_value = mock_model + + x_train = np.random.rand(10, 5) + y_train = np.random.randint(0, 2, 10) + x_test = np.random.rand(3, 5) + device = torch.device("cpu") + + # Test with eval=True + y_pred, y_proba = train_mlp(x_train, y_train, x_test, device, eval=True, epochs=1) + assert y_pred is not None + assert y_proba is not None + assert y_pred.shape == (3,) + assert y_proba.shape == (3,) + np.testing.assert_array_equal(y_pred, np.array([1, 0, 1])) + + mock_model.side_effect = [ + torch.rand(10, 1, requires_grad=True), + eval_output_mock, + ] + + # Test with eval=False + y_pred_no_eval, y_proba_no_eval = train_mlp( + x_train, y_train, x_test, device, eval=False, epochs=1 + ) + assert y_pred_no_eval is None + assert y_proba_no_eval is None + + +def test_get_scores(): + # Tests the get_scores function with known values. + y_true = np.array([1, 0, 1, 0, 1, 0]) + y_pred = np.array([1, 1, 1, 0, 0, 0]) + y_proba = np.array([0.9, 0.8, 0.7, 0.3, 0.2, 0.1]) + fpr_thresholds = [0.5, 0.1] + + scores = get_scores(y_true, y_proba, y_pred, fpr_thresholds) + + # Accuracy = (2 TP + 2 TN) / 6 = 4/6 + assert scores["accuracy"] == pytest.approx(4 / 6) + + # AUC-ROC = 2/3 for this specific arrangement + assert scores["AUC-ROC"] == pytest.approx(2 / 3) + + # At a threshold of 0.5, FPR is 1/3 and TPR is 2/3. This is the highest TPR for FPR <= 0.5. + assert scores["TPR at FPR 50.0"] == pytest.approx(2 / 3) + + # For FPR <= 0.1, max TPR is 1/3 (achieved at actual FPR of 0). + assert scores["TPR at FPR 10.0"] == pytest.approx(1 / 3) + + +@pytest.fixture +def attack_data(): + # Sample data for training an attack classifier + x_train = pd.DataFrame({"feature_error": np.random.rand(20)}) + y_train = pd.Series(np.random.randint(0, 2, 20)) + x_test = pd.DataFrame({"feature_error": np.random.rand(10)}) + y_test = pd.Series(np.random.randint(0, 2, 10)) + return x_train, y_train, x_test, y_test + + +@pytest.mark.parametrize("classifier_type", ["XGBoost", "CatBoost"]) +@patch("midst_toolkit.attacks.ept.classification.XGBClassifier") +@patch("midst_toolkit.attacks.ept.classification.CatBoostClassifier") +def test_train_attack_classifier_tree_models( + mock_catboost, mock_xgboost, classifier_type, attack_data +): + # Tests train_attack_classifier for XGBoost and CatBoost + x_train, y_train, x_test, y_test = attack_data + columns_list = ["error"] + + mock_model = MagicMock() + mock_model.predict.return_value = np.zeros(10) + mock_model.predict_proba.return_value = np.zeros((10, 2)) + if classifier_type == "XGBoost": + mock_xgboost.return_value = mock_model + else: + mock_catboost.return_value = mock_model + + results = train_attack_classifier( + classifier_type, columns_list, x_train, y_train, x_test, y_test + ) + + assert "prediction_results" in results + assert "scores" in results + assert "y_true" in results["prediction_results"] + mock_model.fit.assert_called_once() + mock_model.predict.assert_called_once() + mock_model.predict_proba.assert_called_once() + + +def test_train_attack_classifier_mismatched_data(attack_data): + # Tests that train_attack_classifier raises errors for mismatched data shapes + x_train, y_train, x_test, y_test = attack_data + columns_list = ["error"] + + # Test mismatches + with pytest.raises(AssertionError, match="Mismatch in number of training samples and labels"): + train_attack_classifier( + "XGBoost", columns_list, x_train.head(10), y_train, x_test, y_test + ) + + with pytest.raises(AssertionError, match="Mismatch in number of test samples and labels"): + train_attack_classifier( + "XGBoost", columns_list, x_train, y_train, x_test.head(5), y_test + ) + + x_test_wrong_features = x_test.rename(columns={"feature_error": "another_feature"}) + with pytest.raises(AssertionError, match="Mismatch in number of features between train and test sets"): + train_attack_classifier( + "XGBoost", columns_list, x_train, y_train, x_test_wrong_features, y_test + ) + + +@patch("midst_toolkit.attacks.ept.classification.train_mlp") +def test_train_attack_classifier_mlp(mock_train_mlp, attack_data): + # Tests train_attack_classifier for the MLP model + x_train, y_train, x_test, y_test = attack_data + columns_list = ["error"] + mock_train_mlp.return_value = (np.zeros(10), np.zeros(10)) + + results = train_attack_classifier( + "MLP", columns_list, x_train, y_train, x_test, y_test + ) + + assert "prediction_results" in results + assert "scores" in results + mock_train_mlp.assert_called_once() + + assert mock_train_mlp.call_args[1]["eval"] is True + +def test_train_attack_classifier_unsupported(attack_data): + # Tests that an unsupported classifier type raises an assertion error + x_train, y_train, x_test, y_test = attack_data + with pytest.raises(AssertionError, match="Unsupported classifier type: SVM"): + train_attack_classifier( + "SVM", ["error"], x_train, y_train, x_test, y_test + ) \ No newline at end of file From cbbd129acb3b881a1f09c5b7a628e76a12e9b759 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Wed, 14 Jan 2026 23:06:45 -0500 Subject: [PATCH 17/29] Remove catbooost_info --- .gitignore | 3 + catboost_info/catboost_training.json | 1004 ----------------------- catboost_info/learn/events.out.tfevents | Bin 54870 -> 0 bytes catboost_info/learn_error.tsv | 1001 ---------------------- catboost_info/time_left.tsv | 1001 ---------------------- 5 files changed, 3 insertions(+), 3006 deletions(-) delete mode 100644 catboost_info/catboost_training.json delete mode 100644 catboost_info/learn/events.out.tfevents delete mode 100644 catboost_info/learn_error.tsv delete mode 100644 catboost_info/time_left.tsv diff --git a/.gitignore b/.gitignore index 6ce2773f..a62ff834 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,6 @@ tests/integration/attacks/tartan_federer/assets/tartan_federer_attack_results # Training Logs *.err *.out + ++# CatBoost training artifacts ++catboost_info/ \ No newline at end of file diff --git a/catboost_info/catboost_training.json b/catboost_info/catboost_training.json deleted file mode 100644 index 5138284c..00000000 --- a/catboost_info/catboost_training.json +++ /dev/null @@ -1,1004 +0,0 @@ -{ -"meta":{"test_sets":[],"test_metrics":[],"learn_metrics":[{"best_value":"Min","name":"Logloss"}],"launch_mode":"Train","parameters":"","iteration_count":1000,"learn_sets":["learn"],"name":"experiment"}, -"iterations":[ -{"learn":[0.6928287833],"iteration":0,"passed_time":0.001349767948,"remaining_time":1.34841818}, -{"learn":[0.6926164346],"iteration":1,"passed_time":0.002560825718,"remaining_time":1.277852033}, -{"learn":[0.6924060032],"iteration":2,"passed_time":0.004350307847,"remaining_time":1.445752308}, -{"learn":[0.6922061951],"iteration":3,"passed_time":0.005762993298,"remaining_time":1.434985331}, -{"learn":[0.6919050072],"iteration":4,"passed_time":0.006852549453,"remaining_time":1.363657341}, -{"learn":[0.691670916],"iteration":5,"passed_time":0.007894729978,"remaining_time":1.3078936}, -{"learn":[0.6914286307],"iteration":6,"passed_time":0.009197080628,"remaining_time":1.304671581}, -{"learn":[0.6910840058],"iteration":7,"passed_time":0.01041630517,"remaining_time":1.291621842}, -{"learn":[0.6907501367],"iteration":8,"passed_time":0.01160357096,"remaining_time":1.277682091}, -{"learn":[0.6905266754],"iteration":9,"passed_time":0.01286879612,"remaining_time":1.274010816}, -{"learn":[0.6902108601],"iteration":10,"passed_time":0.01400556123,"remaining_time":1.259227278}, -{"learn":[0.6899110402],"iteration":11,"passed_time":0.01506011692,"remaining_time":1.239949627}, -{"learn":[0.6897678923],"iteration":12,"passed_time":0.01631325859,"remaining_time":1.238552787}, -{"learn":[0.6895523065],"iteration":13,"passed_time":0.01766402655,"remaining_time":1.244052155}, -{"learn":[0.6893331015],"iteration":14,"passed_time":0.0187404992,"remaining_time":1.230626114}, -{"learn":[0.6889941588],"iteration":15,"passed_time":0.01989013948,"remaining_time":1.223243578}, -{"learn":[0.6887095933],"iteration":16,"passed_time":0.02102948797,"remaining_time":1.215999216}, -{"learn":[0.6885156519],"iteration":17,"passed_time":0.02213346098,"remaining_time":1.20750326}, -{"learn":[0.6882187429],"iteration":18,"passed_time":0.0231981418,"remaining_time":1.19775669}, -{"learn":[0.6879135541],"iteration":19,"passed_time":0.02426365597,"remaining_time":1.188919143}, -{"learn":[0.687697466],"iteration":20,"passed_time":0.02549350566,"remaining_time":1.188482954}, -{"learn":[0.6874472905],"iteration":21,"passed_time":0.02666806294,"remaining_time":1.185516616}, -{"learn":[0.687284936],"iteration":22,"passed_time":0.0278533287,"remaining_time":1.183160963}, -{"learn":[0.6870264131],"iteration":23,"passed_time":0.02901988588,"remaining_time":1.180142026}, -{"learn":[0.6866763484],"iteration":24,"passed_time":0.03019502651,"remaining_time":1.177606034}, -{"learn":[0.6864787251],"iteration":25,"passed_time":0.03126587408,"remaining_time":1.171267744}, -{"learn":[0.6862068171],"iteration":26,"passed_time":0.03230126285,"remaining_time":1.164041806}, -{"learn":[0.686048033],"iteration":27,"passed_time":0.03350032046,"remaining_time":1.162939696}, -{"learn":[0.6857677154],"iteration":28,"passed_time":0.03464325232,"remaining_time":1.159951655}, -{"learn":[0.6854892539],"iteration":29,"passed_time":0.03578122579,"remaining_time":1.156926301}, -{"learn":[0.6852026013],"iteration":30,"passed_time":0.03768141772,"remaining_time":1.177848186}, -{"learn":[0.6849279945],"iteration":31,"passed_time":0.03878959913,"remaining_time":1.173385374}, -{"learn":[0.6847059523],"iteration":32,"passed_time":0.03989636384,"remaining_time":1.169084359}, -{"learn":[0.6845645139],"iteration":33,"passed_time":0.04104054572,"remaining_time":1.166034328}, -{"learn":[0.6843277955],"iteration":34,"passed_time":0.04222293645,"remaining_time":1.164146676}, -{"learn":[0.6841055761],"iteration":35,"passed_time":0.04331486763,"remaining_time":1.1598759}, -{"learn":[0.6838078629],"iteration":36,"passed_time":0.04436408992,"remaining_time":1.154665367}, -{"learn":[0.683537295],"iteration":37,"passed_time":0.04548947988,"remaining_time":1.151602096}, -{"learn":[0.6832856679],"iteration":38,"passed_time":0.04658986951,"remaining_time":1.148022169}, -{"learn":[0.683036311],"iteration":39,"passed_time":0.04773775978,"remaining_time":1.145706235}, -{"learn":[0.6826603834],"iteration":40,"passed_time":0.04882173252,"remaining_time":1.141952231}, -{"learn":[0.6825702211],"iteration":41,"passed_time":0.04982874591,"remaining_time":1.136569966}, -{"learn":[0.6823844966],"iteration":42,"passed_time":0.05151814338,"remaining_time":1.146578214}, -{"learn":[0.6821721103],"iteration":43,"passed_time":0.05270507583,"remaining_time":1.145137557}, -{"learn":[0.6819953415],"iteration":44,"passed_time":0.05382013232,"remaining_time":1.142182808}, -{"learn":[0.6816754017],"iteration":45,"passed_time":0.05490939681,"remaining_time":1.138773142}, -{"learn":[0.6815330468],"iteration":46,"passed_time":0.05596199414,"remaining_time":1.134718732}, -{"learn":[0.6812347701],"iteration":47,"passed_time":0.05702888332,"remaining_time":1.131072853}, -{"learn":[0.6810628101],"iteration":48,"passed_time":0.05808160565,"remaining_time":1.127257285}, -{"learn":[0.6808755478],"iteration":49,"passed_time":0.05924466279,"remaining_time":1.125648593}, -{"learn":[0.6807493585],"iteration":50,"passed_time":0.0603813029,"remaining_time":1.123565813}, -{"learn":[0.6804509029],"iteration":51,"passed_time":0.06146744234,"remaining_time":1.120598757}, -{"learn":[0.6803251196],"iteration":52,"passed_time":0.06256674863,"remaining_time":1.117937942}, -{"learn":[0.680213535],"iteration":53,"passed_time":0.06379980669,"remaining_time":1.117678095}, -{"learn":[0.6798640298],"iteration":54,"passed_time":0.06488923784,"remaining_time":1.114915087}, -{"learn":[0.6797186547],"iteration":55,"passed_time":0.06605183664,"remaining_time":1.113445246}, -{"learn":[0.679505348],"iteration":56,"passed_time":0.06728072798,"remaining_time":1.113082921}, -{"learn":[0.6791986169],"iteration":57,"passed_time":0.06834695049,"remaining_time":1.110048748}, -{"learn":[0.6790541683],"iteration":58,"passed_time":0.06939933948,"remaining_time":1.106860652}, -{"learn":[0.6787328061],"iteration":59,"passed_time":0.07057239675,"remaining_time":1.105634216}, -{"learn":[0.6785615931],"iteration":60,"passed_time":0.07175091242,"remaining_time":1.104493553}, -{"learn":[0.6783498609],"iteration":61,"passed_time":0.07283988523,"remaining_time":1.101996973}, -{"learn":[0.6780073876],"iteration":62,"passed_time":0.07389564927,"remaining_time":1.099051165}, -{"learn":[0.6777334812],"iteration":63,"passed_time":0.07492778799,"remaining_time":1.095818899}, -{"learn":[0.6773925562],"iteration":64,"passed_time":0.07599538552,"remaining_time":1.093164392}, -{"learn":[0.6772580202],"iteration":65,"passed_time":0.07706181637,"remaining_time":1.090541462}, -{"learn":[0.6770390765],"iteration":66,"passed_time":0.07817108112,"remaining_time":1.088561473}, -{"learn":[0.6768627712],"iteration":67,"passed_time":0.07924651209,"remaining_time":1.086143372}, -{"learn":[0.6767381944],"iteration":68,"passed_time":0.08040065243,"remaining_time":1.084826194}, -{"learn":[0.6764800491],"iteration":69,"passed_time":0.0814512914,"remaining_time":1.082138586}, -{"learn":[0.6763113114],"iteration":70,"passed_time":0.08266597422,"remaining_time":1.081643522}, -{"learn":[0.6760785307],"iteration":71,"passed_time":0.08393136605,"remaining_time":1.081782051}, -{"learn":[0.6759073986],"iteration":72,"passed_time":0.08510433998,"remaining_time":1.080708536}, -{"learn":[0.6756884286],"iteration":73,"passed_time":0.08618443768,"remaining_time":1.078470126}, -{"learn":[0.6754932357],"iteration":74,"passed_time":0.08727370216,"remaining_time":1.07637566}, -{"learn":[0.6752823846],"iteration":75,"passed_time":0.08847113475,"remaining_time":1.075622744}, -{"learn":[0.6750764536],"iteration":76,"passed_time":0.08953102384,"remaining_time":1.073209546}, -{"learn":[0.6748006547],"iteration":77,"passed_time":0.09070687281,"remaining_time":1.072201753}, -{"learn":[0.6746149098],"iteration":78,"passed_time":0.09197313965,"remaining_time":1.072243818}, -{"learn":[0.6743795255],"iteration":79,"passed_time":0.09304111218,"remaining_time":1.06997279}, -{"learn":[0.6741601159],"iteration":80,"passed_time":0.09413746009,"remaining_time":1.068053405}, -{"learn":[0.6739583715],"iteration":81,"passed_time":0.09525576663,"remaining_time":1.066399924}, -{"learn":[0.6736956411],"iteration":82,"passed_time":0.09635303122,"remaining_time":1.064526863}, -{"learn":[0.6735222682],"iteration":83,"passed_time":0.09741025361,"remaining_time":1.062235623}, -{"learn":[0.6732040071],"iteration":84,"passed_time":0.09866543697,"remaining_time":1.06210441}, -{"learn":[0.6730653342],"iteration":85,"passed_time":0.09975586814,"remaining_time":1.060196087}, -{"learn":[0.6727821352],"iteration":86,"passed_time":0.1008670496,"remaining_time":1.058524325}, -{"learn":[0.6726847729],"iteration":87,"passed_time":0.101979606,"remaining_time":1.056879554}, -{"learn":[0.6724062595],"iteration":88,"passed_time":0.10302737,"remaining_time":1.054583529}, -{"learn":[0.6722732874],"iteration":89,"passed_time":0.1040742589,"remaining_time":1.052306395}, -{"learn":[0.6720428269],"iteration":90,"passed_time":0.1051568983,"remaining_time":1.050413413}, -{"learn":[0.6718851637],"iteration":91,"passed_time":0.1062229125,"remaining_time":1.048373962}, -{"learn":[0.6717745622],"iteration":92,"passed_time":0.1075355133,"remaining_time":1.048760328}, -{"learn":[0.6716173719],"iteration":93,"passed_time":0.1086103192,"remaining_time":1.046818609}, -{"learn":[0.6714800803],"iteration":94,"passed_time":0.1096842085,"remaining_time":1.044886407}, -{"learn":[0.6713188357],"iteration":95,"passed_time":0.1107214723,"remaining_time":1.042627197}, -{"learn":[0.6711623649],"iteration":96,"passed_time":0.1118271537,"remaining_time":1.0410301}, -{"learn":[0.6709778679],"iteration":97,"passed_time":0.1130235029,"remaining_time":1.040277547}, -{"learn":[0.6706995134],"iteration":98,"passed_time":0.1140733085,"remaining_time":1.038182333}, -{"learn":[0.6706233192],"iteration":99,"passed_time":0.1151698231,"remaining_time":1.036528408}, -{"learn":[0.6703872418],"iteration":100,"passed_time":0.1162681294,"remaining_time":1.034901468}, -{"learn":[0.6702086988],"iteration":101,"passed_time":0.1173555188,"remaining_time":1.033188783}, -{"learn":[0.6699334796],"iteration":102,"passed_time":0.1183866575,"remaining_time":1.030998367}, -{"learn":[0.6697245445],"iteration":103,"passed_time":0.1195568814,"remaining_time":1.030028517}, -{"learn":[0.6694821826],"iteration":104,"passed_time":0.1206638545,"remaining_time":1.028515712}, -{"learn":[0.6693429681],"iteration":105,"passed_time":0.1217432855,"remaining_time":1.026778276}, -{"learn":[0.6692443922],"iteration":106,"passed_time":0.1229298013,"remaining_time":1.025946846}, -{"learn":[0.6690957163],"iteration":107,"passed_time":0.1239689401,"remaining_time":1.023891616}, -{"learn":[0.6689903048],"iteration":108,"passed_time":0.1252231651,"remaining_time":1.023613212}, -{"learn":[0.668850182],"iteration":109,"passed_time":0.1263484717,"remaining_time":1.022273999}, -{"learn":[0.6686834278],"iteration":110,"passed_time":0.1274699867,"remaining_time":1.020908272}, -{"learn":[0.6685945587],"iteration":111,"passed_time":0.1287063364,"remaining_time":1.020457382}, -{"learn":[0.6683676461],"iteration":112,"passed_time":0.1298528933,"remaining_time":1.019287756}, -{"learn":[0.6682199765],"iteration":113,"passed_time":0.1309045323,"remaining_time":1.017380839}, -{"learn":[0.6680477742],"iteration":114,"passed_time":0.1319432128,"remaining_time":1.015389072}, -{"learn":[0.6679219029],"iteration":115,"passed_time":0.1331426871,"remaining_time":1.014639098}, -{"learn":[0.6678083834],"iteration":116,"passed_time":0.1343114943,"remaining_time":1.013649995}, -{"learn":[0.6675823422],"iteration":117,"passed_time":0.1354848432,"remaining_time":1.012691794}, -{"learn":[0.6673951098],"iteration":118,"passed_time":0.1366879842,"remaining_time":1.011950539}, -{"learn":[0.6672506656],"iteration":119,"passed_time":0.1378468746,"remaining_time":1.010877081}, -{"learn":[0.6670696664],"iteration":120,"passed_time":0.1389095971,"remaining_time":1.009103602}, -{"learn":[0.6667165763],"iteration":121,"passed_time":0.1400346537,"remaining_time":1.007790377}, -{"learn":[0.6665780153],"iteration":122,"passed_time":0.1412987955,"remaining_time":1.0074719}, -{"learn":[0.6663949212],"iteration":123,"passed_time":0.1424543526,"remaining_time":1.006371071}, -{"learn":[0.6660985541],"iteration":124,"passed_time":0.143514075,"remaining_time":1.004598525}, -{"learn":[0.6658269877],"iteration":125,"passed_time":0.1445820892,"remaining_time":1.002894809}, -{"learn":[0.6656440187],"iteration":126,"passed_time":0.145648645,"remaining_time":1.00119108}, -{"learn":[0.6655221413],"iteration":127,"passed_time":0.1467157426,"remaining_time":0.9995009963}, -{"learn":[0.6653756244],"iteration":128,"passed_time":0.1477927152,"remaining_time":0.9978872478}, -{"learn":[0.6652414277],"iteration":129,"passed_time":0.1489074384,"remaining_time":0.9965343953}, -{"learn":[0.66510967],"iteration":130,"passed_time":0.1500114531,"remaining_time":0.9951141428}, -{"learn":[0.6649534115],"iteration":131,"passed_time":0.1511188845,"remaining_time":0.9937211493}, -{"learn":[0.664709159],"iteration":132,"passed_time":0.1521702734,"remaining_time":0.9919671208}, -{"learn":[0.6644466829],"iteration":133,"passed_time":0.1533278305,"remaining_time":0.9909097105}, -{"learn":[0.6642076197],"iteration":134,"passed_time":0.1543873862,"remaining_time":0.9892228823}, -{"learn":[0.6640760489],"iteration":135,"passed_time":0.1554274417,"remaining_time":0.9874213946}, -{"learn":[0.6638759781],"iteration":136,"passed_time":0.1564820808,"remaining_time":0.9857228883}, -{"learn":[0.6636627943],"iteration":137,"passed_time":0.157702222,"remaining_time":0.9850675026}, -{"learn":[0.6634215245],"iteration":138,"passed_time":0.1595053293,"remaining_time":0.9880150254}, -{"learn":[0.6633030921],"iteration":139,"passed_time":0.1605879687,"remaining_time":0.9864689506}, -{"learn":[0.6631113541],"iteration":140,"passed_time":0.1618267768,"remaining_time":0.9858808603}, -{"learn":[0.662986964],"iteration":141,"passed_time":0.163016376,"remaining_time":0.9849862718}, -{"learn":[0.662829127],"iteration":142,"passed_time":0.1641420576,"remaining_time":0.9837044992}, -{"learn":[0.6627006591],"iteration":143,"passed_time":0.1652210303,"remaining_time":0.9821472357}, -{"learn":[0.6624516614],"iteration":144,"passed_time":0.1672039317,"remaining_time":0.9859266316}, -{"learn":[0.6623631013],"iteration":145,"passed_time":0.1682725292,"remaining_time":0.9842790407}, -{"learn":[0.6621185781],"iteration":146,"passed_time":0.1693410018,"remaining_time":0.982638602}, -{"learn":[0.6619535145],"iteration":147,"passed_time":0.1704785169,"remaining_time":0.9814033539}, -{"learn":[0.6617618135],"iteration":148,"passed_time":0.171663741,"remaining_time":0.9804419031}, -{"learn":[0.6615291483],"iteration":149,"passed_time":0.1727857976,"remaining_time":0.9791195195}, -{"learn":[0.6612972842],"iteration":150,"passed_time":0.1738350198,"remaining_time":0.9773902771}, -{"learn":[0.6610713393],"iteration":151,"passed_time":0.1752367885,"remaining_time":0.97763682}, -{"learn":[0.6608558469],"iteration":152,"passed_time":0.1763264696,"remaining_time":0.9761341163}, -{"learn":[0.6605726319],"iteration":153,"passed_time":0.1774250259,"remaining_time":0.974685532}, -{"learn":[0.6603816831],"iteration":154,"passed_time":0.1785195821,"remaining_time":0.9732196575}, -{"learn":[0.6601677036],"iteration":155,"passed_time":0.1795729711,"remaining_time":0.9715358182}, -{"learn":[0.6600519771],"iteration":156,"passed_time":0.180689486,"remaining_time":0.9701989598}, -{"learn":[0.6599233624],"iteration":157,"passed_time":0.1817801255,"remaining_time":0.9687269979}, -{"learn":[0.6596793023],"iteration":158,"passed_time":0.182992975,"remaining_time":0.9679062386}, -{"learn":[0.659501313],"iteration":159,"passed_time":0.1843294511,"remaining_time":0.9677296181}, -{"learn":[0.6592179566],"iteration":160,"passed_time":0.1857544283,"remaining_time":0.967999785}, -{"learn":[0.6590524625],"iteration":161,"passed_time":0.1868881517,"remaining_time":0.9667424146}, -{"learn":[0.6589222389],"iteration":162,"passed_time":0.1880170001,"remaining_time":0.9654615281}, -{"learn":[0.6587672488],"iteration":163,"passed_time":0.1890880977,"remaining_time":0.9638881076}, -{"learn":[0.6585432905],"iteration":164,"passed_time":0.190241863,"remaining_time":0.9627391249}, -{"learn":[0.6583341285],"iteration":165,"passed_time":0.1913395026,"remaining_time":0.9613081035}, -{"learn":[0.6581287575],"iteration":166,"passed_time":0.1924001,"remaining_time":0.9596963074}, -{"learn":[0.658040769],"iteration":167,"passed_time":0.193550532,"remaining_time":0.958535968}, -{"learn":[0.657824124],"iteration":168,"passed_time":0.1946158795,"remaining_time":0.956957372}, -{"learn":[0.6576711522],"iteration":169,"passed_time":0.1957274776,"remaining_time":0.955610626}, -{"learn":[0.6574105284],"iteration":170,"passed_time":0.196885868,"remaining_time":0.9544934771}, -{"learn":[0.6573513967],"iteration":171,"passed_time":0.1979627573,"remaining_time":0.9529835063}, -{"learn":[0.6572393594],"iteration":172,"passed_time":0.1989998545,"remaining_time":0.9512883216}, -{"learn":[0.6571337901],"iteration":173,"passed_time":0.2001093276,"remaining_time":0.9499442791}, -{"learn":[0.656967115],"iteration":174,"passed_time":0.2011853835,"remaining_time":0.9484453795}, -{"learn":[0.6567832979],"iteration":175,"passed_time":0.202250981,"remaining_time":0.9469023203}, -{"learn":[0.6565641804],"iteration":176,"passed_time":0.2032937449,"remaining_time":0.9452584862}, -{"learn":[0.6563728518],"iteration":177,"passed_time":0.2044038847,"remaining_time":0.943932546}, -{"learn":[0.6561657601],"iteration":178,"passed_time":0.2054987742,"remaining_time":0.9425390706}, -{"learn":[0.655904797],"iteration":179,"passed_time":0.2065484548,"remaining_time":0.9409429609}, -{"learn":[0.6556907144],"iteration":180,"passed_time":0.2083866043,"remaining_time":0.9429206017}, -{"learn":[0.6554749836],"iteration":181,"passed_time":0.2094665353,"remaining_time":0.9414484939}, -{"learn":[0.6552384278],"iteration":182,"passed_time":0.2105146742,"remaining_time":0.9398387369}, -{"learn":[0.6550593705],"iteration":183,"passed_time":0.2116563144,"remaining_time":0.9386497423}, -{"learn":[0.6549176946],"iteration":184,"passed_time":0.2128372468,"remaining_time":0.9376343575}, -{"learn":[0.6547667344],"iteration":185,"passed_time":0.2139100944,"remaining_time":0.9361441766}, -{"learn":[0.6546407621],"iteration":186,"passed_time":0.2150146508,"remaining_time":0.9347963158}, -{"learn":[0.654531388],"iteration":187,"passed_time":0.2161881664,"remaining_time":0.9337488887}, -{"learn":[0.6543715973],"iteration":188,"passed_time":0.2172865143,"remaining_time":0.9323775825}, -{"learn":[0.6542344294],"iteration":189,"passed_time":0.2183387783,"remaining_time":0.9308126864}, -{"learn":[0.653980908],"iteration":190,"passed_time":0.2194532514,"remaining_time":0.9295166514}, -{"learn":[0.6537231655],"iteration":191,"passed_time":0.220620267,"remaining_time":0.9284436234}, -{"learn":[0.6535846343],"iteration":192,"passed_time":0.2216737393,"remaining_time":0.9268948581}, -{"learn":[0.6532570799],"iteration":193,"passed_time":0.2227745873,"remaining_time":0.9255480275}, -{"learn":[0.6531244226],"iteration":194,"passed_time":0.2239336443,"remaining_time":0.924444019}, -{"learn":[0.6530105959],"iteration":195,"passed_time":0.2250331173,"remaining_time":0.9230950322}, -{"learn":[0.6528758555],"iteration":196,"passed_time":0.2261424654,"remaining_time":0.921788831}, -{"learn":[0.6527330184],"iteration":197,"passed_time":0.2273905653,"remaining_time":0.9210466333}, -{"learn":[0.652579639],"iteration":198,"passed_time":0.228572081,"remaining_time":0.9200313412}, -{"learn":[0.6524510676],"iteration":199,"passed_time":0.2296255117,"remaining_time":0.9185020468}, -{"learn":[0.6523011961],"iteration":200,"passed_time":0.2306674839,"remaining_time":0.9169319384}, -{"learn":[0.6520717755],"iteration":201,"passed_time":0.2318333327,"remaining_time":0.9158564332}, -{"learn":[0.65195605],"iteration":202,"passed_time":0.2330250152,"remaining_time":0.9148814638}, -{"learn":[0.6517967451],"iteration":203,"passed_time":0.2341788639,"remaining_time":0.9137567435}, -{"learn":[0.6516507776],"iteration":204,"passed_time":0.2352555866,"remaining_time":0.9123326406}, -{"learn":[0.6515417944],"iteration":205,"passed_time":0.2363364759,"remaining_time":0.9109279704}, -{"learn":[0.6512425091],"iteration":206,"passed_time":0.2374091152,"remaining_time":0.909494823}, -{"learn":[0.6511639815],"iteration":207,"passed_time":0.238473171,"remaining_time":0.9080324589}, -{"learn":[0.6510348185],"iteration":208,"passed_time":0.2395241433,"remaining_time":0.9065243893}, -{"learn":[0.6508672783],"iteration":209,"passed_time":0.2407667432,"remaining_time":0.9057415577}, -{"learn":[0.6507311498],"iteration":210,"passed_time":0.2418413408,"remaining_time":0.9043261512}, -{"learn":[0.6505463552],"iteration":211,"passed_time":0.2430395651,"remaining_time":0.9033734777}, -{"learn":[0.650325255],"iteration":212,"passed_time":0.2441398297,"remaining_time":0.9020565539}, -{"learn":[0.6501750068],"iteration":213,"passed_time":0.2453214704,"remaining_time":0.9010405409}, -{"learn":[0.6499916934],"iteration":214,"passed_time":0.2463792345,"remaining_time":0.8995706933}, -{"learn":[0.6499259299],"iteration":215,"passed_time":0.2474604989,"remaining_time":0.8981899588}, -{"learn":[0.6497298657],"iteration":216,"passed_time":0.2485992223,"remaining_time":0.8970193138}, -{"learn":[0.6496321568],"iteration":217,"passed_time":0.2498546557,"remaining_time":0.8962676181}, -{"learn":[0.6495153521],"iteration":218,"passed_time":0.2509115447,"remaining_time":0.8948032714}, -{"learn":[0.6493507922],"iteration":219,"passed_time":0.2520214762,"remaining_time":0.8935306882}, -{"learn":[0.6491371804],"iteration":220,"passed_time":0.2531780749,"remaining_time":0.8924240739}, -{"learn":[0.6489323062],"iteration":221,"passed_time":0.2542473391,"remaining_time":0.8910109451}, -{"learn":[0.6487269873],"iteration":222,"passed_time":0.2553171033,"remaining_time":0.8896026425}, -{"learn":[0.6485897273],"iteration":223,"passed_time":0.2563774091,"remaining_time":0.8881645958}, -{"learn":[0.6485224681],"iteration":224,"passed_time":0.2577755944,"remaining_time":0.8878937139}, -{"learn":[0.6482982815],"iteration":225,"passed_time":0.2588426085,"remaining_time":0.8864786682}, -{"learn":[0.6481669177],"iteration":226,"passed_time":0.2599112894,"remaining_time":0.8850723644}, -{"learn":[0.6479954591],"iteration":227,"passed_time":0.2611523893,"remaining_time":0.8842528268}, -{"learn":[0.6478675495],"iteration":228,"passed_time":0.2622018615,"remaining_time":0.8827844334}, -{"learn":[0.6477284999],"iteration":229,"passed_time":0.2633770022,"remaining_time":0.8817403986}, -{"learn":[0.6474944265],"iteration":230,"passed_time":0.2644065992,"remaining_time":0.8802107133}, -{"learn":[0.6473038441],"iteration":231,"passed_time":0.2657402419,"remaining_time":0.8796918353}, -{"learn":[0.6470612389],"iteration":232,"passed_time":0.2667694639,"remaining_time":0.8781638577}, -{"learn":[0.6469377301],"iteration":233,"passed_time":0.2678319781,"remaining_time":0.8767491248}, -{"learn":[0.6467344211],"iteration":234,"passed_time":0.2690289107,"remaining_time":0.8757749645}, -{"learn":[0.6465578608],"iteration":235,"passed_time":0.2701266753,"remaining_time":0.8744778809}, -{"learn":[0.6462007877],"iteration":236,"passed_time":0.2711652307,"remaining_time":0.872991861}, -{"learn":[0.6460313848],"iteration":237,"passed_time":0.2722257865,"remaining_time":0.8715800391}, -{"learn":[0.6458084912],"iteration":238,"passed_time":0.273341718,"remaining_time":0.8703474787}, -{"learn":[0.645565545],"iteration":239,"passed_time":0.2744719414,"remaining_time":0.8691611477}, -{"learn":[0.6454666549],"iteration":240,"passed_time":0.2755539974,"remaining_time":0.8678235852}, -{"learn":[0.6452336406],"iteration":241,"passed_time":0.2768167642,"remaining_time":0.8670541623}, -{"learn":[0.6450761694],"iteration":242,"passed_time":0.2779331957,"remaining_time":0.8658248114}, -{"learn":[0.6449271099],"iteration":243,"passed_time":0.2790430438,"remaining_time":0.8645759882}, -{"learn":[0.6446656228],"iteration":244,"passed_time":0.2801298499,"remaining_time":0.8632572927}, -{"learn":[0.6444511293],"iteration":245,"passed_time":0.2815204101,"remaining_time":0.8628715008}, -{"learn":[0.6442758803],"iteration":246,"passed_time":0.2826750504,"remaining_time":0.8617583522}, -{"learn":[0.6441133995],"iteration":247,"passed_time":0.2837780234,"remaining_time":0.8604882001}, -{"learn":[0.6439721373],"iteration":248,"passed_time":0.2848268707,"remaining_time":0.8590561442}, -{"learn":[0.6438202551],"iteration":249,"passed_time":0.2859702193,"remaining_time":0.8579106578}, -{"learn":[0.6436297006],"iteration":250,"passed_time":0.2870582337,"remaining_time":0.856600068}, -{"learn":[0.6435316476],"iteration":251,"passed_time":0.2881409565,"remaining_time":0.8552755374}, -{"learn":[0.6433556983],"iteration":252,"passed_time":0.2891833453,"remaining_time":0.8538338299}, -{"learn":[0.6432501392],"iteration":253,"passed_time":0.2903248188,"remaining_time":0.8526862789}, -{"learn":[0.6430529146],"iteration":254,"passed_time":0.2914407503,"remaining_time":0.8514641529}, -{"learn":[0.6429007964],"iteration":255,"passed_time":0.2925264731,"remaining_time":0.8501550625}, -{"learn":[0.6427050358],"iteration":256,"passed_time":0.2936102375,"remaining_time":0.8488420485}, -{"learn":[0.6425969601],"iteration":257,"passed_time":0.2946924186,"remaining_time":0.8475262581}, -{"learn":[0.64239199],"iteration":258,"passed_time":0.2957566827,"remaining_time":0.8461610112}, -{"learn":[0.6422389106],"iteration":259,"passed_time":0.2967911131,"remaining_time":0.8447131682}, -{"learn":[0.6421388836],"iteration":260,"passed_time":0.2979902541,"remaining_time":0.8437348574}, -{"learn":[0.6418177949],"iteration":261,"passed_time":0.2991298526,"remaining_time":0.842587142}, -{"learn":[0.6416277654],"iteration":262,"passed_time":0.3001601163,"remaining_time":0.8411331015}, -{"learn":[0.6414999049],"iteration":263,"passed_time":0.301216797,"remaining_time":0.8397559189}, -{"learn":[0.641403861],"iteration":264,"passed_time":0.302393396,"remaining_time":0.8387137586}, -{"learn":[0.6412156053],"iteration":265,"passed_time":0.3034568684,"remaining_time":0.8373584265}, -{"learn":[0.6410922328],"iteration":266,"passed_time":0.3045229243,"remaining_time":0.8360123727}, -{"learn":[0.6409248609],"iteration":267,"passed_time":0.3055805634,"remaining_time":0.8346454193}, -{"learn":[0.6408260454],"iteration":268,"passed_time":0.3067785793,"remaining_time":0.8336622359}, -{"learn":[0.6407395757],"iteration":269,"passed_time":0.3079475115,"remaining_time":0.8325988274}, -{"learn":[0.6406765192],"iteration":270,"passed_time":0.3089815669,"remaining_time":0.8311718165}, -{"learn":[0.6405300314],"iteration":271,"passed_time":0.3100044138,"remaining_time":0.8297176959}, -{"learn":[0.6402917271],"iteration":272,"passed_time":0.3111284705,"remaining_time":0.8285362565}, -{"learn":[0.6401005668],"iteration":273,"passed_time":0.3122106932,"remaining_time":0.8272443914}, -{"learn":[0.6399810568],"iteration":274,"passed_time":0.3132824574,"remaining_time":0.8259264787}, -{"learn":[0.6398442654],"iteration":275,"passed_time":0.3143675969,"remaining_time":0.8246454353}, -{"learn":[0.6396609865],"iteration":276,"passed_time":0.3154865701,"remaining_time":0.8234541161}, -{"learn":[0.6395399797],"iteration":277,"passed_time":0.3165686261,"remaining_time":0.8221674391}, -{"learn":[0.6393915779],"iteration":278,"passed_time":0.3176852243,"remaining_time":0.8209714937}, -{"learn":[0.6392510533],"iteration":279,"passed_time":0.3188816152,"remaining_time":0.8199812963}, -{"learn":[0.6390640876],"iteration":280,"passed_time":0.3199256708,"remaining_time":0.818599848}, -{"learn":[0.6388813133],"iteration":281,"passed_time":0.3209716847,"remaining_time":0.8172257787}, -{"learn":[0.6386231752],"iteration":282,"passed_time":0.3221467003,"remaining_time":0.8161808626}, -{"learn":[0.6384054253],"iteration":283,"passed_time":0.3233256743,"remaining_time":0.8151450099}, -{"learn":[0.6382830578],"iteration":284,"passed_time":0.3243837301,"remaining_time":0.8138047964}, -{"learn":[0.6381060976],"iteration":285,"passed_time":0.3255427455,"remaining_time":0.8127186023}, -{"learn":[0.6379678556],"iteration":286,"passed_time":0.3267669284,"remaining_time":0.8117937978}, -{"learn":[0.637898437],"iteration":287,"passed_time":0.3278806099,"remaining_time":0.81059373}, -{"learn":[0.6377864434],"iteration":288,"passed_time":0.3289595826,"remaining_time":0.8093088692}, -{"learn":[0.6376816795],"iteration":289,"passed_time":0.3300553888,"remaining_time":0.8080666415}, -{"learn":[0.6374682544],"iteration":290,"passed_time":0.3313742813,"remaining_time":0.8073689535}, -{"learn":[0.6372822114],"iteration":291,"passed_time":0.3324396705,"remaining_time":0.8060523518}, -{"learn":[0.6370751767],"iteration":292,"passed_time":0.3335002679,"remaining_time":0.8047259025}, -{"learn":[0.6369206376],"iteration":293,"passed_time":0.3346934088,"remaining_time":0.8037195463}, -{"learn":[0.6367744339],"iteration":294,"passed_time":0.3358453408,"remaining_time":0.8026134416}, -{"learn":[0.6366542495],"iteration":295,"passed_time":0.3368965214,"remaining_time":0.8012674023}, -{"learn":[0.6364635964],"iteration":296,"passed_time":0.3379392853,"remaining_time":0.7999034262}, -{"learn":[0.6363697405],"iteration":297,"passed_time":0.3391458847,"remaining_time":0.7989275538}, -{"learn":[0.6360921908],"iteration":298,"passed_time":0.3402873582,"remaining_time":0.7977974518}, -{"learn":[0.6359513904],"iteration":299,"passed_time":0.3415023743,"remaining_time":0.7968388735}, -{"learn":[0.6357112166],"iteration":300,"passed_time":0.3425930972,"remaining_time":0.7955899499}, -{"learn":[0.6355495896],"iteration":301,"passed_time":0.3437939882,"remaining_time":0.7945967011}, -{"learn":[0.6354084417],"iteration":302,"passed_time":0.3448746275,"remaining_time":0.7933254633}, -{"learn":[0.6353168145],"iteration":303,"passed_time":0.3459515168,"remaining_time":0.7920468938}, -{"learn":[0.6351611326],"iteration":304,"passed_time":0.3470453647,"remaining_time":0.7908082901}, -{"learn":[0.6350570747],"iteration":305,"passed_time":0.348220672,"remaining_time":0.7897553803}, -{"learn":[0.6349289594],"iteration":306,"passed_time":0.3493400619,"remaining_time":0.7885754492}, -{"learn":[0.6347149332],"iteration":307,"passed_time":0.3504339514,"remaining_time":0.7873386182}, -{"learn":[0.6345938333],"iteration":308,"passed_time":0.3515073824,"remaining_time":0.7860569619}, -{"learn":[0.6344716645],"iteration":309,"passed_time":0.3526260223,"remaining_time":0.7848772754}, -{"learn":[0.6343805546],"iteration":310,"passed_time":0.3537114117,"remaining_time":0.7836243172}, -{"learn":[0.6342541118],"iteration":311,"passed_time":0.3548035512,"remaining_time":0.7823873181}, -{"learn":[0.6341957596],"iteration":312,"passed_time":0.355889274,"remaining_time":0.7811371605}, -{"learn":[0.6339729768],"iteration":313,"passed_time":0.3570996651,"remaining_time":0.7801604148}, -{"learn":[0.6337278764],"iteration":314,"passed_time":0.3581793878,"remaining_time":0.7788980337}, -{"learn":[0.6335920365],"iteration":315,"passed_time":0.3598829104,"remaining_time":0.7789870593}, -{"learn":[0.6333865776],"iteration":316,"passed_time":0.3610124254,"remaining_time":0.7778280334}, -{"learn":[0.6331644196],"iteration":317,"passed_time":0.3620696478,"remaining_time":0.7765141504}, -{"learn":[0.6330564327],"iteration":318,"passed_time":0.3631576623,"remaining_time":0.7752676114}, -{"learn":[0.6328799647],"iteration":319,"passed_time":0.3642519269,"remaining_time":0.7740353446}, -{"learn":[0.6326293133],"iteration":320,"passed_time":0.365340733,"remaining_time":0.7727923916}, -{"learn":[0.6324649571],"iteration":321,"passed_time":0.3663882053,"remaining_time":0.7714633639}, -{"learn":[0.6322994461],"iteration":322,"passed_time":0.3674671363,"remaining_time":0.7702020163}, -{"learn":[0.6321805908],"iteration":323,"passed_time":0.3685476923,"remaining_time":0.7689451852}, -{"learn":[0.6319767135],"iteration":324,"passed_time":0.3696204566,"remaining_time":0.767673256}, -{"learn":[0.6317227783],"iteration":325,"passed_time":0.3707236796,"remaining_time":0.7664655216}, -{"learn":[0.6315527576],"iteration":326,"passed_time":0.3717844437,"remaining_time":0.7651710416}, -{"learn":[0.6313431718],"iteration":327,"passed_time":0.3729920847,"remaining_time":0.7641789053}, -{"learn":[0.6312776656],"iteration":328,"passed_time":0.3740895993,"remaining_time":0.7629608546}, -{"learn":[0.6310615527],"iteration":329,"passed_time":0.3751332382,"remaining_time":0.7616341503}, -{"learn":[0.6309051025],"iteration":330,"passed_time":0.376223586,"remaining_time":0.7604035621}, -{"learn":[0.6306737106],"iteration":331,"passed_time":0.3773175173,"remaining_time":0.7591810287}, -{"learn":[0.6304642575],"iteration":332,"passed_time":0.3783668645,"remaining_time":0.7578699659}, -{"learn":[0.6303361181],"iteration":333,"passed_time":0.3794206286,"remaining_time":0.7565692773}, -{"learn":[0.6302354293],"iteration":334,"passed_time":0.380505643,"remaining_time":0.7553320973}, -{"learn":[0.6301192269],"iteration":335,"passed_time":0.3816963671,"remaining_time":0.7543047256}, -{"learn":[0.629981865],"iteration":336,"passed_time":0.3827430894,"remaining_time":0.7529930809}, -{"learn":[0.6297073564],"iteration":337,"passed_time":0.3838348539,"remaining_time":0.7517712228}, -{"learn":[0.6296129758],"iteration":338,"passed_time":0.3850124529,"remaining_time":0.7507174967}, -{"learn":[0.6294242323],"iteration":339,"passed_time":0.3860656336,"remaining_time":0.749421524}, -{"learn":[0.6292916404],"iteration":340,"passed_time":0.3871060224,"remaining_time":0.7481022545}, -{"learn":[0.6291595625],"iteration":341,"passed_time":0.38818162,"remaining_time":0.7468523567}, -{"learn":[0.6290588264],"iteration":342,"passed_time":0.3894252616,"remaining_time":0.7459253553}, -{"learn":[0.6288420988],"iteration":343,"passed_time":0.3905095677,"remaining_time":0.7446926639}, -{"learn":[0.6286427013],"iteration":344,"passed_time":0.3916757915,"remaining_time":0.7436163578}, -{"learn":[0.6284962895],"iteration":345,"passed_time":0.3928692657,"remaining_time":0.7425910398}, -{"learn":[0.6283360565],"iteration":346,"passed_time":0.3939487801,"remaining_time":0.7413502979}, -{"learn":[0.6281451808],"iteration":347,"passed_time":0.394994544,"remaining_time":0.7400472491}, -{"learn":[0.6280083719],"iteration":348,"passed_time":0.3961072671,"remaining_time":0.7388705756}, -{"learn":[0.6277919523],"iteration":349,"passed_time":0.3972873245,"remaining_time":0.7378193169}, -{"learn":[0.6276657808],"iteration":350,"passed_time":0.3983747556,"remaining_time":0.7365960581}, -{"learn":[0.6275668792],"iteration":351,"passed_time":0.3993988525,"remaining_time":0.7352569785}, -{"learn":[0.6273892886],"iteration":352,"passed_time":0.4006463691,"remaining_time":0.7343291808}, -{"learn":[0.6272167352],"iteration":353,"passed_time":0.4017485921,"remaining_time":0.7331344365}, -{"learn":[0.6270626375],"iteration":354,"passed_time":0.4027859809,"remaining_time":0.731822416}, -{"learn":[0.6268568126],"iteration":355,"passed_time":0.4038576202,"remaining_time":0.7305738971}, -{"learn":[0.6267554228],"iteration":356,"passed_time":0.4048889255,"remaining_time":0.729253723}, -{"learn":[0.6266514279],"iteration":357,"passed_time":0.4062120265,"remaining_time":0.7284584385}, -{"learn":[0.6266002689],"iteration":358,"passed_time":0.4073972089,"remaining_time":0.7274139579}, -{"learn":[0.6264469905],"iteration":359,"passed_time":0.4085609744,"remaining_time":0.7263306211}, -{"learn":[0.6262237731],"iteration":360,"passed_time":0.4096416554,"remaining_time":0.7250997723}, -{"learn":[0.6260506135],"iteration":361,"passed_time":0.410787379,"remaining_time":0.7239843861}, -{"learn":[0.6258476306],"iteration":362,"passed_time":0.4118561849,"remaining_time":0.7227338561}, -{"learn":[0.6256479288],"iteration":363,"passed_time":0.4129146573,"remaining_time":0.7214662693}, -{"learn":[0.6254577162],"iteration":364,"passed_time":0.4140883812,"remaining_time":0.7204003344}, -{"learn":[0.6252714788],"iteration":365,"passed_time":0.4151596871,"remaining_time":0.7191563979}, -{"learn":[0.6250642782],"iteration":366,"passed_time":0.416201076,"remaining_time":0.7178618013}, -{"learn":[0.6249302091],"iteration":367,"passed_time":0.4172530483,"remaining_time":0.7165867568}, -{"learn":[0.6248063466],"iteration":368,"passed_time":0.4184274806,"remaining_time":0.7155223313}, -{"learn":[0.624690983],"iteration":369,"passed_time":0.4195313702,"remaining_time":0.714337198}, -{"learn":[0.6244881791],"iteration":370,"passed_time":0.4205774258,"remaining_time":0.7130544497}, -{"learn":[0.6243543796],"iteration":371,"passed_time":0.4216208147,"remaining_time":0.7117684721}, -{"learn":[0.6241406811],"iteration":372,"passed_time":0.4229017484,"remaining_time":0.7108830998}, -{"learn":[0.6240586132],"iteration":373,"passed_time":0.4239734293,"remaining_time":0.7096453656}, -{"learn":[0.6239186862],"iteration":374,"passed_time":0.4250293184,"remaining_time":0.7083821973}, -{"learn":[0.6237425797],"iteration":375,"passed_time":0.4261020409,"remaining_time":0.707148068}, -{"learn":[0.6235103706],"iteration":376,"passed_time":0.4272038056,"remaining_time":0.7059627875}, -{"learn":[0.6232618576],"iteration":377,"passed_time":0.4283129453,"remaining_time":0.7047900847}, -{"learn":[0.6230423742],"iteration":378,"passed_time":0.4295181697,"remaining_time":0.7037751541}, -{"learn":[0.6228993874],"iteration":379,"passed_time":0.430817562,"remaining_time":0.7029128643}, -{"learn":[0.6227141417],"iteration":380,"passed_time":0.4319339102,"remaining_time":0.7017508934}, -{"learn":[0.6225744734],"iteration":381,"passed_time":0.4330207163,"remaining_time":0.7005413682}, -{"learn":[0.6224494116],"iteration":382,"passed_time":0.4342232739,"remaining_time":0.6995189557}, -{"learn":[0.6222950807],"iteration":383,"passed_time":0.4354002896,"remaining_time":0.6984546312}, -{"learn":[0.6221331603],"iteration":384,"passed_time":0.4364511369,"remaining_time":0.6971881797}, -{"learn":[0.6219647921],"iteration":385,"passed_time":0.4375464015,"remaining_time":0.6959934987}, -{"learn":[0.6217540633],"iteration":386,"passed_time":0.4387216254,"remaining_time":0.6949259855}, -{"learn":[0.621576683],"iteration":387,"passed_time":0.4399396416,"remaining_time":0.6939254141}, -{"learn":[0.6214684761],"iteration":388,"passed_time":0.4410983237,"remaining_time":0.692830529}, -{"learn":[0.6213231941],"iteration":389,"passed_time":0.4423255483,"remaining_time":0.6918425243}, -{"learn":[0.6210937545],"iteration":390,"passed_time":0.4434009376,"remaining_time":0.6906168057}, -{"learn":[0.6209777285],"iteration":391,"passed_time":0.4445369944,"remaining_time":0.6894859505}, -{"learn":[0.6208072926],"iteration":392,"passed_time":0.4455752582,"remaining_time":0.6882040248}, -{"learn":[0.6206963867],"iteration":393,"passed_time":0.4467956078,"remaining_time":0.6872033967}, -{"learn":[0.6204372677],"iteration":394,"passed_time":0.4478937891,"remaining_time":0.6860145377}, -{"learn":[0.6202551767],"iteration":395,"passed_time":0.4489314695,"remaining_time":0.6847338575}, -{"learn":[0.6200011736],"iteration":396,"passed_time":0.4501455273,"remaining_time":0.6837222997}, -{"learn":[0.6198859016],"iteration":397,"passed_time":0.4512079998,"remaining_time":0.6824804419}, -{"learn":[0.6197676271],"iteration":398,"passed_time":0.4522883058,"remaining_time":0.6812663454}, -{"learn":[0.6196238705],"iteration":399,"passed_time":0.4533593617,"remaining_time":0.6800390426}, -{"learn":[0.6194628335],"iteration":400,"passed_time":0.4544378761,"remaining_time":0.6788236603}, -{"learn":[0.6192820561],"iteration":401,"passed_time":0.4554927651,"remaining_time":0.6775738147}, -{"learn":[0.6191287958],"iteration":402,"passed_time":0.4565325289,"remaining_time":0.6763025304}, -{"learn":[0.6190112194],"iteration":403,"passed_time":0.4577197947,"remaining_time":0.6752499942}, -{"learn":[0.6188244898],"iteration":404,"passed_time":0.4587649336,"remaining_time":0.6739879889}, -{"learn":[0.6186323589],"iteration":405,"passed_time":0.4605394155,"remaining_time":0.6737941203}, -{"learn":[0.618501291],"iteration":406,"passed_time":0.4616827641,"remaining_time":0.6726729216}, -{"learn":[0.618335109],"iteration":407,"passed_time":0.4628101957,"remaining_time":0.6715285193}, -{"learn":[0.6182382013],"iteration":408,"passed_time":0.4639444191,"remaining_time":0.670394014}, -{"learn":[0.6180877322],"iteration":409,"passed_time":0.4650213918,"remaining_time":0.6691771248}, -{"learn":[0.6178987142],"iteration":410,"passed_time":0.466041947,"remaining_time":0.6678800652}, -{"learn":[0.6177274632],"iteration":411,"passed_time":0.4671073779,"remaining_time":0.6666483937}, -{"learn":[0.6175628143],"iteration":412,"passed_time":0.4682569348,"remaining_time":0.6655370962}, -{"learn":[0.6173870936],"iteration":413,"passed_time":0.4693644495,"remaining_time":0.6643661049}, -{"learn":[0.617243719],"iteration":414,"passed_time":0.4704847144,"remaining_time":0.6632133927}, -{"learn":[0.617076468],"iteration":415,"passed_time":0.471602021,"remaining_time":0.6620566833}, -{"learn":[0.6169526231],"iteration":416,"passed_time":0.4727616197,"remaining_time":0.6609592909}, -{"learn":[0.6167942897],"iteration":417,"passed_time":0.4738452175,"remaining_time":0.6597557813}, -{"learn":[0.6164803784],"iteration":418,"passed_time":0.4750050246,"remaining_time":0.6586585185}, -{"learn":[0.6163095595],"iteration":419,"passed_time":0.476191582,"remaining_time":0.6575978989}, -{"learn":[0.6161848351],"iteration":420,"passed_time":0.4772309292,"remaining_time":0.6563342232}, -{"learn":[0.6160444539],"iteration":421,"passed_time":0.4783139019,"remaining_time":0.6551313632}, -{"learn":[0.6158717535],"iteration":422,"passed_time":0.4794190416,"remaining_time":0.6539593073}, -{"learn":[0.6156687018],"iteration":423,"passed_time":0.4807027253,"remaining_time":0.6530301174}, -{"learn":[0.6155442288],"iteration":424,"passed_time":0.4818643658,"remaining_time":0.6519341419}, -{"learn":[0.6153987844],"iteration":425,"passed_time":0.4829743805,"remaining_time":0.6507682968}, -{"learn":[0.6150702755],"iteration":426,"passed_time":0.4840431031,"remaining_time":0.6495473022}, -{"learn":[0.6148315705],"iteration":427,"passed_time":0.4851781182,"remaining_time":0.6484156159}, -{"learn":[0.6146912117],"iteration":428,"passed_time":0.4862211737,"remaining_time":0.6471615156}, -{"learn":[0.6145858122],"iteration":429,"passed_time":0.487273896,"remaining_time":0.645921211}, -{"learn":[0.6144470683],"iteration":430,"passed_time":0.4884807871,"remaining_time":0.6448853082}, -{"learn":[0.6143511808],"iteration":431,"passed_time":0.4895615931,"remaining_time":0.6436828354}, -{"learn":[0.614153372],"iteration":432,"passed_time":0.4906651911,"remaining_time":0.6425107699}, -{"learn":[0.6140563648],"iteration":433,"passed_time":0.4919235412,"remaining_time":0.6415408394}, -{"learn":[0.6138333404],"iteration":434,"passed_time":0.4931969331,"remaining_time":0.64058912}, -{"learn":[0.613673912],"iteration":435,"passed_time":0.4942461971,"remaining_time":0.639345998}, -{"learn":[0.613576502],"iteration":436,"passed_time":0.4953100862,"remaining_time":0.6381226054}, -{"learn":[0.6133663253],"iteration":437,"passed_time":0.4964855185,"remaining_time":0.6370430626}, -{"learn":[0.6132683391],"iteration":438,"passed_time":0.4976453673,"remaining_time":0.6359431687}, -{"learn":[0.6131613093],"iteration":439,"passed_time":0.4988706752,"remaining_time":0.6349263139}, -{"learn":[0.6129250814],"iteration":440,"passed_time":0.4999505646,"remaining_time":0.633724185}, -{"learn":[0.6128435837],"iteration":441,"passed_time":0.5010243289,"remaining_time":0.6325148767}, -{"learn":[0.612668239],"iteration":442,"passed_time":0.5020730928,"remaining_time":0.6312747465}, -{"learn":[0.6125632313],"iteration":443,"passed_time":0.5031766492,"remaining_time":0.6301040922}, -{"learn":[0.6122853605],"iteration":444,"passed_time":0.5043036641,"remaining_time":0.6289629969}, -{"learn":[0.612130259],"iteration":445,"passed_time":0.5055273887,"remaining_time":0.6279420927}, -{"learn":[0.6119902833],"iteration":446,"passed_time":0.5067885305,"remaining_time":0.6269665713}, -{"learn":[0.6118376246],"iteration":447,"passed_time":0.5078628365,"remaining_time":0.6257595664}, -{"learn":[0.6117137681],"iteration":448,"passed_time":0.5089429758,"remaining_time":0.6245603111}, -{"learn":[0.6115924957],"iteration":449,"passed_time":0.5100330737,"remaining_time":0.6233737567}, -{"learn":[0.6113412557],"iteration":450,"passed_time":0.5110676708,"remaining_time":0.6221200693}, -{"learn":[0.6111673834],"iteration":451,"passed_time":0.5122064776,"remaining_time":0.620993694}, -{"learn":[0.6109274262],"iteration":452,"passed_time":0.5133092422,"remaining_time":0.6198237428}, -{"learn":[0.6108157003],"iteration":453,"passed_time":0.5143908816,"remaining_time":0.6186286814}, -{"learn":[0.6106415561],"iteration":454,"passed_time":0.5154665626,"remaining_time":0.6174269815}, -{"learn":[0.6104567948],"iteration":455,"passed_time":0.5166470366,"remaining_time":0.6163508507}, -{"learn":[0.6103790373],"iteration":456,"passed_time":0.5178355107,"remaining_time":0.6152837688}, -{"learn":[0.6102637745],"iteration":457,"passed_time":0.5189484422,"remaining_time":0.6141267591}, -{"learn":[0.6100885733],"iteration":458,"passed_time":0.5200332483,"remaining_time":0.6129367916}, -{"learn":[0.6098868869],"iteration":459,"passed_time":0.5211603883,"remaining_time":0.6117969776}, -{"learn":[0.6095725763],"iteration":460,"passed_time":0.5222210691,"remaining_time":0.6105795146}, -{"learn":[0.6093974847],"iteration":461,"passed_time":0.5232751247,"remaining_time":0.6093550154}, -{"learn":[0.6092903271],"iteration":462,"passed_time":0.5243660142,"remaining_time":0.6081739733}, -{"learn":[0.6091473356],"iteration":463,"passed_time":0.5255819054,"remaining_time":0.6071377183}, -{"learn":[0.6089835447],"iteration":464,"passed_time":0.5266340861,"remaining_time":0.6059123356}, -{"learn":[0.6087066913],"iteration":465,"passed_time":0.5276986002,"remaining_time":0.6047018294}, -{"learn":[0.6084564614],"iteration":466,"passed_time":0.5287645311,"remaining_time":0.6034935654}, -{"learn":[0.6082511926],"iteration":467,"passed_time":0.5298958378,"remaining_time":0.6023602259}, -{"learn":[0.6081150344],"iteration":468,"passed_time":0.5309839356,"remaining_time":0.601177974}, -{"learn":[0.6079835426],"iteration":469,"passed_time":0.5320890336,"remaining_time":0.6000152932}, -{"learn":[0.607821293],"iteration":470,"passed_time":0.533393926,"remaining_time":0.5990772544}, -{"learn":[0.6076626389],"iteration":471,"passed_time":0.534503024,"remaining_time":0.5979186371}, -{"learn":[0.6074862958],"iteration":472,"passed_time":0.5356422892,"remaining_time":0.5967938402}, -{"learn":[0.6072599715],"iteration":473,"passed_time":0.5367805543,"remaining_time":0.5956678725}, -{"learn":[0.607132385],"iteration":474,"passed_time":0.5379502365,"remaining_time":0.5945765772}, -{"learn":[0.6069274992],"iteration":475,"passed_time":0.5391748362,"remaining_time":0.5935454079}, -{"learn":[0.6067469422],"iteration":476,"passed_time":0.5403149347,"remaining_time":0.5924207774}, -{"learn":[0.6066197488],"iteration":477,"passed_time":0.5414478247,"remaining_time":0.5912882103}, -{"learn":[0.6064370432],"iteration":478,"passed_time":0.5427276334,"remaining_time":0.5903154426}, -{"learn":[0.6062565573],"iteration":479,"passed_time":0.543801356,"remaining_time":0.5891181357}, -{"learn":[0.6060803436],"iteration":480,"passed_time":0.5448677869,"remaining_time":0.5879134748}, -{"learn":[0.6058863889],"iteration":481,"passed_time":0.546156679,"remaining_time":0.5869484642}, -{"learn":[0.6057108685],"iteration":482,"passed_time":0.5473190695,"remaining_time":0.5858467058}, -{"learn":[0.6055753117],"iteration":483,"passed_time":0.5483946254,"remaining_time":0.5846521213}, -{"learn":[0.6054485469],"iteration":484,"passed_time":0.5496002248,"remaining_time":0.583596115}, -{"learn":[0.6052253509],"iteration":485,"passed_time":0.5507531151,"remaining_time":0.5824837473}, -{"learn":[0.6051180262],"iteration":486,"passed_time":0.5517939206,"remaining_time":0.5812531443}, -{"learn":[0.6049694509],"iteration":487,"passed_time":0.5529391442,"remaining_time":0.5801328726}, -{"learn":[0.6047492718],"iteration":488,"passed_time":0.5540558674,"remaining_time":0.5789827162}, -{"learn":[0.6046068876],"iteration":489,"passed_time":0.5553521346,"remaining_time":0.5780195687}, -{"learn":[0.6044819774],"iteration":490,"passed_time":0.5564630244,"remaining_time":0.5768628909}, -{"learn":[0.6042493579],"iteration":491,"passed_time":0.5576461234,"remaining_time":0.5757809567}, -{"learn":[0.6039649679],"iteration":492,"passed_time":0.558813639,"remaining_time":0.5746825861}, -{"learn":[0.6037830331],"iteration":493,"passed_time":0.559969071,"remaining_time":0.5735715586}, -{"learn":[0.6034944903],"iteration":494,"passed_time":0.5610122515,"remaining_time":0.5723458324}, -{"learn":[0.6031894111],"iteration":495,"passed_time":0.5620896409,"remaining_time":0.5711556028}, -{"learn":[0.6030692694],"iteration":496,"passed_time":0.5633239489,"remaining_time":0.5701246405}, -{"learn":[0.602857329],"iteration":497,"passed_time":0.5643786296,"remaining_time":0.5689117913}, -{"learn":[0.6027120707],"iteration":498,"passed_time":0.5654449771,"remaining_time":0.5677112897}, -{"learn":[0.6025975162],"iteration":499,"passed_time":0.5665324083,"remaining_time":0.5665324083}, -{"learn":[0.6023946798],"iteration":500,"passed_time":0.5676216311,"remaining_time":0.5653556765}, -{"learn":[0.6022233018],"iteration":501,"passed_time":0.5686959787,"remaining_time":0.5641645366}, -{"learn":[0.6020096537],"iteration":502,"passed_time":0.5698914113,"remaining_time":0.5630935018}, -{"learn":[0.6017527374],"iteration":503,"passed_time":0.5710562601,"remaining_time":0.561991875}, -{"learn":[0.6016262717],"iteration":504,"passed_time":0.5721456079,"remaining_time":0.5608159919}, -{"learn":[0.6014828534],"iteration":505,"passed_time":0.5731947885,"remaining_time":0.5596012362}, -{"learn":[0.6013815306],"iteration":506,"passed_time":0.5742290106,"remaining_time":0.5583725882}, -{"learn":[0.6010625342],"iteration":507,"passed_time":0.5754243182,"remaining_time":0.5573007176}, -{"learn":[0.6009207315],"iteration":508,"passed_time":0.5765574166,"remaining_time":0.5561683527}, -{"learn":[0.6007574298],"iteration":509,"passed_time":0.5776565145,"remaining_time":0.5550033179}, -{"learn":[0.6005437978],"iteration":510,"passed_time":0.578820155,"remaining_time":0.5539003049}, -{"learn":[0.6003599775],"iteration":511,"passed_time":0.5799769204,"remaining_time":0.5527905022}, -{"learn":[0.600228366],"iteration":512,"passed_time":0.5811001853,"remaining_time":0.5516487139}, -{"learn":[0.6000519316],"iteration":513,"passed_time":0.5821366574,"remaining_time":0.5504249329}, -{"learn":[0.5998173338],"iteration":514,"passed_time":0.5832167135,"remaining_time":0.5492429243}, -{"learn":[0.5996808159],"iteration":515,"passed_time":0.5843307699,"remaining_time":0.5480932028}, -{"learn":[0.5994794911],"iteration":516,"passed_time":0.5853784505,"remaining_time":0.5468816085}, -{"learn":[0.5993400552],"iteration":517,"passed_time":0.5866331339,"remaining_time":0.5458632636}, -{"learn":[0.5991918493],"iteration":518,"passed_time":0.5880633196,"remaining_time":0.5450066603}, -{"learn":[0.5990687744],"iteration":519,"passed_time":0.5892443769,"remaining_time":0.5439178864}, -{"learn":[0.5989251275],"iteration":520,"passed_time":0.5903219329,"remaining_time":0.5427336005}, -{"learn":[0.5987484682],"iteration":521,"passed_time":0.5914120724,"remaining_time":0.5415612464}, -{"learn":[0.598539905],"iteration":522,"passed_time":0.5925127121,"remaining_time":0.5403987833}, -{"learn":[0.5983243863],"iteration":523,"passed_time":0.5935621844,"remaining_time":0.5391900759}, -{"learn":[0.598140471],"iteration":524,"passed_time":0.5948969521,"remaining_time":0.5382400995}, -{"learn":[0.5979920466],"iteration":525,"passed_time":0.595963508,"remaining_time":0.5370469634}, -{"learn":[0.5978144014],"iteration":526,"passed_time":0.5970531891,"remaining_time":0.5358750635}, -{"learn":[0.5976198173],"iteration":527,"passed_time":0.5981086198,"remaining_time":0.5346728571}, -{"learn":[0.5973817659],"iteration":528,"passed_time":0.5992751353,"remaining_time":0.533570111}, -{"learn":[0.5970926086],"iteration":529,"passed_time":0.600405442,"remaining_time":0.5324350146}, -{"learn":[0.5968562337],"iteration":530,"passed_time":0.6014649978,"remaining_time":0.5312374462}, -{"learn":[0.5965884118],"iteration":531,"passed_time":0.6024990115,"remaining_time":0.5300179274}, -{"learn":[0.5963067416],"iteration":532,"passed_time":0.6035912761,"remaining_time":0.5288501424}, -{"learn":[0.596152156],"iteration":533,"passed_time":0.6048910433,"remaining_time":0.5278637195}, -{"learn":[0.5959415132],"iteration":534,"passed_time":0.6060035998,"remaining_time":0.5267134092}, -{"learn":[0.5957594547],"iteration":535,"passed_time":0.6072098242,"remaining_time":0.5256443254}, -{"learn":[0.5955065894],"iteration":536,"passed_time":0.6083468393,"remaining_time":0.5245150588}, -{"learn":[0.5953756532],"iteration":537,"passed_time":0.6094491873,"remaining_time":0.5233559935}, -{"learn":[0.595092336],"iteration":538,"passed_time":0.610506743,"remaining_time":0.5221588284}, -{"learn":[0.5949285408],"iteration":539,"passed_time":0.6117377594,"remaining_time":0.5211099432}, -{"learn":[0.5947331968],"iteration":540,"passed_time":0.6129541089,"remaining_time":0.5200479408}, -{"learn":[0.5945482366],"iteration":541,"passed_time":0.614016248,"remaining_time":0.5188550583}, -{"learn":[0.5944289428],"iteration":542,"passed_time":0.6151561382,"remaining_time":0.5177280942}, -{"learn":[0.594254527],"iteration":543,"passed_time":0.6162239857,"remaining_time":0.5165406939}, -{"learn":[0.5941060575],"iteration":544,"passed_time":0.6173444173,"remaining_time":0.5153976328}, -{"learn":[0.5939215336],"iteration":545,"passed_time":0.6183727226,"remaining_time":0.5141780514}, -{"learn":[0.5937015993],"iteration":546,"passed_time":0.619431695,"remaining_time":0.5129845664}, -{"learn":[0.593632453],"iteration":547,"passed_time":0.6206522946,"remaining_time":0.5119248853}, -{"learn":[0.5934795942],"iteration":548,"passed_time":0.6217907681,"remaining_time":0.5107971519}, -{"learn":[0.5932974668],"iteration":549,"passed_time":0.622890616,"remaining_time":0.5096377767}, -{"learn":[0.5931481645],"iteration":550,"passed_time":0.6241764248,"remaining_time":0.5086301538}, -{"learn":[0.5930201136],"iteration":551,"passed_time":0.6253461487,"remaining_time":0.5075273091}, -{"learn":[0.5927748207],"iteration":552,"passed_time":0.6264082461,"remaining_time":0.5063372261}, -{"learn":[0.5925972796],"iteration":553,"passed_time":0.6274371348,"remaining_time":0.5051208703}, -{"learn":[0.5923743694],"iteration":554,"passed_time":0.6285548163,"remaining_time":0.5039763843}, -{"learn":[0.5921400612],"iteration":555,"passed_time":0.6296755396,"remaining_time":0.5028344237}, -{"learn":[0.5919419924],"iteration":556,"passed_time":0.6307534706,"remaining_time":0.5016585053}, -{"learn":[0.591639888],"iteration":557,"passed_time":0.6318308182,"remaining_time":0.5004824761}, -{"learn":[0.5914261055],"iteration":558,"passed_time":0.6329840419,"remaining_time":0.4993666592}, -{"learn":[0.5913167288],"iteration":559,"passed_time":0.6346851478,"remaining_time":0.4986811876}, -{"learn":[0.5910459835],"iteration":560,"passed_time":0.6357063281,"remaining_time":0.4974600321}, -{"learn":[0.590899325],"iteration":561,"passed_time":0.6369542614,"remaining_time":0.4964163104}, -{"learn":[0.5906364836],"iteration":562,"passed_time":0.6380519843,"remaining_time":0.4952552702}, -{"learn":[0.5904312804],"iteration":563,"passed_time":0.6390950815,"remaining_time":0.4940522261}, -{"learn":[0.5902427931],"iteration":564,"passed_time":0.6403329729,"remaining_time":0.4929997225}, -{"learn":[0.5899763873],"iteration":565,"passed_time":0.6414739048,"remaining_time":0.4918722167}, -{"learn":[0.5896645423],"iteration":566,"passed_time":0.6425587525,"remaining_time":0.490701834}, -{"learn":[0.5893953601],"iteration":567,"passed_time":0.64362285,"remaining_time":0.4895159704}, -{"learn":[0.5892079017],"iteration":568,"passed_time":0.6446666972,"remaining_time":0.488315196}, -{"learn":[0.5890369001],"iteration":569,"passed_time":0.6458378378,"remaining_time":0.4872110005}, -{"learn":[0.5888700644],"iteration":570,"passed_time":0.6468992269,"remaining_time":0.4860241127}, -{"learn":[0.5886944212],"iteration":571,"passed_time":0.6479705745,"remaining_time":0.4848451152}, -{"learn":[0.5885472318],"iteration":572,"passed_time":0.6491011729,"remaining_time":0.4837106471}, -{"learn":[0.5882955796],"iteration":573,"passed_time":0.6503288559,"remaining_time":0.4826482449}, -{"learn":[0.588177907],"iteration":574,"passed_time":0.6514378289,"remaining_time":0.4814975257}, -{"learn":[0.5880087151],"iteration":575,"passed_time":0.6525914693,"remaining_time":0.4803798316}, -{"learn":[0.5878877522],"iteration":576,"passed_time":0.6537895269,"remaining_time":0.4792945752}, -{"learn":[0.5877394438],"iteration":577,"passed_time":0.6548682496,"remaining_time":0.4781218016}, -{"learn":[0.5875354276],"iteration":578,"passed_time":0.6559645141,"remaining_time":0.4769621079}, -{"learn":[0.5873781879],"iteration":579,"passed_time":0.6570876957,"remaining_time":0.4758221245}, -{"learn":[0.5871570215],"iteration":580,"passed_time":0.6587660931,"remaining_time":0.4750826041}, -{"learn":[0.5869408178],"iteration":581,"passed_time":0.659811357,"remaining_time":0.4738851327}, -{"learn":[0.5867958342],"iteration":582,"passed_time":0.6609653306,"remaining_time":0.4727659397}, -{"learn":[0.5866464684],"iteration":583,"passed_time":0.6622057638,"remaining_time":0.4717082153}, -{"learn":[0.5864211198],"iteration":584,"passed_time":0.6632387359,"remaining_time":0.470502693}, -{"learn":[0.5861778077],"iteration":585,"passed_time":0.6644023763,"remaining_time":0.4693900747}, -{"learn":[0.5860218984],"iteration":586,"passed_time":0.6654665155,"remaining_time":0.4682072758}, -{"learn":[0.5858051579],"iteration":587,"passed_time":0.6666558646,"remaining_time":0.4671126126}, -{"learn":[0.5856502809],"iteration":588,"passed_time":0.6677981715,"remaining_time":0.4659848022}, -{"learn":[0.5855076758],"iteration":589,"passed_time":0.6688702691,"remaining_time":0.4648081531}, -{"learn":[0.5853526765],"iteration":590,"passed_time":0.6701624529,"remaining_time":0.4637841679}, -{"learn":[0.5852234908],"iteration":591,"passed_time":0.6712103419,"remaining_time":0.4625909113}, -{"learn":[0.5849590421],"iteration":592,"passed_time":0.6722512307,"remaining_time":0.4613933405}, -{"learn":[0.5847811281],"iteration":593,"passed_time":0.673328995,"remaining_time":0.4602215017}, -{"learn":[0.5846573345],"iteration":594,"passed_time":0.6743824674,"remaining_time":0.4590334442}, -{"learn":[0.5844178553],"iteration":595,"passed_time":0.6755394828,"remaining_time":0.4579160252}, -{"learn":[0.5842622801],"iteration":596,"passed_time":0.6765653714,"remaining_time":0.4567099576}, -{"learn":[0.5841617009],"iteration":597,"passed_time":0.6776817612,"remaining_time":0.4555653311}, -{"learn":[0.5839732073],"iteration":598,"passed_time":0.6788619853,"remaining_time":0.4544635327}, -{"learn":[0.5838466201],"iteration":599,"passed_time":0.6799833752,"remaining_time":0.4533222501}, -{"learn":[0.5836809592],"iteration":600,"passed_time":0.6810322225,"remaining_time":0.4521328732}, -{"learn":[0.5834816861],"iteration":601,"passed_time":0.6821450289,"remaining_time":0.4509862484}, -{"learn":[0.5832933774],"iteration":602,"passed_time":0.6833710036,"remaining_time":0.4499142428}, -{"learn":[0.5830915643],"iteration":603,"passed_time":0.6844310177,"remaining_time":0.4487329189}, -{"learn":[0.5828762469],"iteration":604,"passed_time":0.6854983235,"remaining_time":0.4475567567}, -{"learn":[0.5827102786],"iteration":605,"passed_time":0.6866743808,"remaining_time":0.4464516601}, -{"learn":[0.5825584191],"iteration":606,"passed_time":0.687741645,"remaining_time":0.4452758921}, -{"learn":[0.5823849377],"iteration":607,"passed_time":0.6887979091,"remaining_time":0.4440933887}, -{"learn":[0.5822421333],"iteration":608,"passed_time":0.690043759,"remaining_time":0.4430330209}, -{"learn":[0.5820446465],"iteration":609,"passed_time":0.6910978146,"remaining_time":0.4418494225}, -{"learn":[0.5819186008],"iteration":610,"passed_time":0.692178204,"remaining_time":0.4406830137}, -{"learn":[0.581712043],"iteration":611,"passed_time":0.6932407181,"remaining_time":0.4395055533}, -{"learn":[0.581418597],"iteration":612,"passed_time":0.6943498579,"remaining_time":0.4383579038}, -{"learn":[0.5812617905],"iteration":613,"passed_time":0.6954395807,"remaining_time":0.4371981729}, -{"learn":[0.5811345824],"iteration":614,"passed_time":0.6965800125,"remaining_time":0.4360704144}, -{"learn":[0.5809945797],"iteration":615,"passed_time":0.6976381933,"remaining_time":0.4348913413}, -{"learn":[0.5807703215],"iteration":616,"passed_time":0.6987466663,"remaining_time":0.4337438788}, -{"learn":[0.5806810234],"iteration":617,"passed_time":0.6999198069,"remaining_time":0.432636515}, -{"learn":[0.5804906681],"iteration":618,"passed_time":0.7010630305,"remaining_time":0.4315105244}, -{"learn":[0.5802844937],"iteration":619,"passed_time":0.7021482116,"remaining_time":0.4303489039}, -{"learn":[0.5801082221],"iteration":620,"passed_time":0.7034296453,"remaining_time":0.4293073036}, -{"learn":[0.5798591849],"iteration":621,"passed_time":0.704482826,"remaining_time":0.428126219}, -{"learn":[0.5796337432],"iteration":622,"passed_time":0.7055546319,"remaining_time":0.4269568158}, -{"learn":[0.5794423033],"iteration":623,"passed_time":0.7066436047,"remaining_time":0.4257980695}, -{"learn":[0.5792417402],"iteration":624,"passed_time":0.7078405373,"remaining_time":0.4247043224}, -{"learn":[0.5790863885],"iteration":625,"passed_time":0.7089428853,"remaining_time":0.4235537366}, -{"learn":[0.5789031467],"iteration":626,"passed_time":0.710103359,"remaining_time":0.4224378834}, -{"learn":[0.5788019539],"iteration":627,"passed_time":0.7112906665,"remaining_time":0.4213377833}, -{"learn":[0.5785530882],"iteration":628,"passed_time":0.7124135564,"remaining_time":0.4201994109}, -{"learn":[0.5783661907],"iteration":629,"passed_time":0.7135047793,"remaining_time":0.4190424894}, -{"learn":[0.5780794351],"iteration":630,"passed_time":0.7147117536,"remaining_time":0.4179534661}, -{"learn":[0.5777616782],"iteration":631,"passed_time":0.7159083529,"remaining_time":0.4168580283}, -{"learn":[0.57746221],"iteration":632,"passed_time":0.7169644503,"remaining_time":0.4156808108}, -{"learn":[0.5772864292],"iteration":633,"passed_time":0.7180339645,"remaining_time":0.4145117208}, -{"learn":[0.5771663299],"iteration":634,"passed_time":0.7192291054,"remaining_time":0.4134151551}, -{"learn":[0.5769549527],"iteration":635,"passed_time":0.720354912,"remaining_time":0.4122785974}, -{"learn":[0.5766596787],"iteration":636,"passed_time":0.7214282596,"remaining_time":0.4111121793}, -{"learn":[0.5765605303],"iteration":637,"passed_time":0.7224764402,"remaining_time":0.4099317733}, -{"learn":[0.576398549],"iteration":638,"passed_time":0.7235958301,"remaining_time":0.4087920104}, -{"learn":[0.5762556725],"iteration":639,"passed_time":0.7246975948,"remaining_time":0.4076423971}, -{"learn":[0.5761487527],"iteration":640,"passed_time":0.7257884843,"remaining_time":0.4064868422}, -{"learn":[0.5758335528],"iteration":641,"passed_time":0.7268527484,"remaining_time":0.4053166416}, -{"learn":[0.5756773535],"iteration":642,"passed_time":0.7280441809,"remaining_time":0.4042173757}, -{"learn":[0.5754980346],"iteration":643,"passed_time":0.7290890282,"remaining_time":0.403036792}, -{"learn":[0.5753363568],"iteration":644,"passed_time":0.7301502089,"remaining_time":0.4018656189}, -{"learn":[0.5751553704],"iteration":645,"passed_time":0.7312020146,"remaining_time":0.4006896489}, -{"learn":[0.574994782],"iteration":646,"passed_time":0.7323464881,"remaining_time":0.3995646218}, -{"learn":[0.5746520685],"iteration":647,"passed_time":0.7334104189,"remaining_time":0.3983957831}, -{"learn":[0.5744786518],"iteration":648,"passed_time":0.7344540162,"remaining_time":0.3972162707}, -{"learn":[0.5743093647],"iteration":649,"passed_time":0.7356278651,"remaining_time":0.396107312}, -{"learn":[0.5740378195],"iteration":650,"passed_time":0.7367850472,"remaining_time":0.3949892188}, -{"learn":[0.5738607313],"iteration":651,"passed_time":0.7378511863,"remaining_time":0.3938224123}, -{"learn":[0.5736602143],"iteration":652,"passed_time":0.7389247423,"remaining_time":0.3926598554}, -{"learn":[0.5735057779],"iteration":653,"passed_time":0.740055549,"remaining_time":0.3915278592}, -{"learn":[0.5733589489],"iteration":654,"passed_time":0.7411317716,"remaining_time":0.3903671163}, -{"learn":[0.5732260899],"iteration":655,"passed_time":0.7421862856,"remaining_time":0.3891952473}, -{"learn":[0.5730274171],"iteration":656,"passed_time":0.7433458844,"remaining_time":0.3880785972}, -{"learn":[0.5728035078],"iteration":657,"passed_time":0.7446276931,"remaining_time":0.3870253359}, -{"learn":[0.5726621361],"iteration":658,"passed_time":0.7458181673,"remaining_time":0.3859241199}, -{"learn":[0.5724996493],"iteration":659,"passed_time":0.746877223,"remaining_time":0.3847549331}, -{"learn":[0.572275212],"iteration":660,"passed_time":0.7479529873,"remaining_time":0.3835946486}, -{"learn":[0.5721652811],"iteration":661,"passed_time":0.7490609187,"remaining_time":0.3824510431}, -{"learn":[0.5719889143],"iteration":662,"passed_time":0.7501363497,"remaining_time":0.3812910254}, -{"learn":[0.5717793936],"iteration":663,"passed_time":0.7512037389,"remaining_time":0.3801271932}, -{"learn":[0.5715225666],"iteration":664,"passed_time":0.7522635863,"remaining_time":0.3789598517}, -{"learn":[0.5713071394],"iteration":665,"passed_time":0.7533256838,"remaining_time":0.3777939615}, -{"learn":[0.5711611734],"iteration":666,"passed_time":0.7543965313,"remaining_time":0.376632751}, -{"learn":[0.5709508581],"iteration":667,"passed_time":0.755449712,"remaining_time":0.3754630305}, -{"learn":[0.5708466585],"iteration":668,"passed_time":0.7566116858,"remaining_time":0.3743474858}, -{"learn":[0.5706789963],"iteration":669,"passed_time":0.7577440342,"remaining_time":0.3732172109}, -{"learn":[0.5705145294],"iteration":670,"passed_time":0.7588354237,"remaining_time":0.3720668471}, -{"learn":[0.5703594655],"iteration":671,"passed_time":0.760090482,"remaining_time":0.3709965448}, -{"learn":[0.570233263],"iteration":672,"passed_time":0.7614281248,"remaining_time":0.3699658199}, -{"learn":[0.5700568003],"iteration":673,"passed_time":0.7624864306,"remaining_time":0.3687990747}, -{"learn":[0.5698230012],"iteration":674,"passed_time":0.7635332778,"remaining_time":0.3676271338}, -{"learn":[0.5696445855],"iteration":675,"passed_time":0.7645738333,"remaining_time":0.3664525473}, -{"learn":[0.5694219371],"iteration":676,"passed_time":0.7657392655,"remaining_time":0.3653379361}, -{"learn":[0.5691902986],"iteration":677,"passed_time":0.7668205715,"remaining_time":0.3641832213}, -{"learn":[0.568975701],"iteration":678,"passed_time":0.7679993372,"remaining_time":0.3630747971}, -{"learn":[0.5687357631],"iteration":679,"passed_time":0.7691370607,"remaining_time":0.3619468521}, -{"learn":[0.5686058667],"iteration":680,"passed_time":0.7702342003,"remaining_time":0.3607998677}, -{"learn":[0.5684074399],"iteration":681,"passed_time":0.7713038395,"remaining_time":0.3596402067}, -{"learn":[0.5683267239],"iteration":682,"passed_time":0.7724631049,"remaining_time":0.3585224074}, -{"learn":[0.5681378304],"iteration":683,"passed_time":0.773627162,"remaining_time":0.3574067006}, -{"learn":[0.5679212045],"iteration":684,"passed_time":0.7746735926,"remaining_time":0.3562367616}, -{"learn":[0.5677783883],"iteration":685,"passed_time":0.77573119,"remaining_time":0.355072294}, -{"learn":[0.5675905176],"iteration":686,"passed_time":0.7768494966,"remaining_time":0.3539357968}, -{"learn":[0.5674470133],"iteration":687,"passed_time":0.7781517639,"remaining_time":0.3528827766}, -{"learn":[0.5672686787],"iteration":688,"passed_time":0.7792316949,"remaining_time":0.3517286751}, -{"learn":[0.5671459155],"iteration":689,"passed_time":0.7803041675,"remaining_time":0.3505714376}, -{"learn":[0.5669955805],"iteration":690,"passed_time":0.7815277671,"remaining_time":0.3494820261}, -{"learn":[0.5666697152],"iteration":691,"passed_time":0.7826763657,"remaining_time":0.3483588449}, -{"learn":[0.566539699],"iteration":692,"passed_time":0.7837397549,"remaining_time":0.3471978423}, -{"learn":[0.5663154141],"iteration":693,"passed_time":0.7848836867,"remaining_time":0.3460726342}, -{"learn":[0.5661290985],"iteration":694,"passed_time":0.7862049543,"remaining_time":0.3450251958}, -{"learn":[0.5660170629],"iteration":695,"passed_time":0.7873039272,"remaining_time":0.3438798763}, -{"learn":[0.5658454568],"iteration":696,"passed_time":0.7884658594,"remaining_time":0.3427620594}, -{"learn":[0.5657412965],"iteration":697,"passed_time":0.7895270818,"remaining_time":0.3416005426}, -{"learn":[0.565656909],"iteration":698,"passed_time":0.7905984711,"remaining_time":0.3404436907}, -{"learn":[0.5654805971],"iteration":699,"passed_time":0.7917784451,"remaining_time":0.3393336193}, -{"learn":[0.565362411],"iteration":700,"passed_time":0.7928059171,"remaining_time":0.3381583013}, -{"learn":[0.5652005669],"iteration":701,"passed_time":0.7939410988,"remaining_time":0.3370291274}, -{"learn":[0.5650263732],"iteration":702,"passed_time":0.7950689472,"remaining_time":0.3358968383}, -{"learn":[0.5648323631],"iteration":703,"passed_time":0.7961495032,"remaining_time":0.3347446775}, -{"learn":[0.5645947556],"iteration":704,"passed_time":0.797213434,"remaining_time":0.3335857632}, -{"learn":[0.5644599485],"iteration":705,"passed_time":0.7990616253,"remaining_time":0.332753708}, -{"learn":[0.564204921],"iteration":706,"passed_time":0.8001342229,"remaining_time":0.3315973512}, -{"learn":[0.5640519764],"iteration":707,"passed_time":0.8011656949,"remaining_time":0.3304242696}, -{"learn":[0.5639119189],"iteration":708,"passed_time":0.8024847124,"remaining_time":0.3293696069}, -{"learn":[0.5637137979],"iteration":709,"passed_time":0.80355681,"remaining_time":0.3282133449}, -{"learn":[0.5635321559],"iteration":710,"passed_time":0.8045959488,"remaining_time":0.3270439229}, -{"learn":[0.5633965376],"iteration":711,"passed_time":0.8058216735,"remaining_time":0.3259503398}, -{"learn":[0.5631966568],"iteration":712,"passed_time":0.8070241895,"remaining_time":0.324847044}, -{"learn":[0.5629439664],"iteration":713,"passed_time":0.8080998704,"remaining_time":0.3236926652}, -{"learn":[0.5627552647],"iteration":714,"passed_time":0.8091498011,"remaining_time":0.3225282424}, -{"learn":[0.5626807493],"iteration":715,"passed_time":0.8102886495,"remaining_time":0.3213994085}, -{"learn":[0.5624805497],"iteration":716,"passed_time":0.8115894585,"remaining_time":0.3203344725}, -{"learn":[0.5623499406],"iteration":717,"passed_time":0.8127545573,"remaining_time":0.3192155782}, -{"learn":[0.5621985714],"iteration":718,"passed_time":0.8139339063,"remaining_time":0.3181021247}, -{"learn":[0.5620233085],"iteration":719,"passed_time":0.8150923801,"remaining_time":0.31698037}, -{"learn":[0.5619094409],"iteration":720,"passed_time":0.8162041865,"remaining_time":0.315840455}, -{"learn":[0.5617663317],"iteration":721,"passed_time":0.8173027011,"remaining_time":0.3146954999}, -{"learn":[0.5615274657],"iteration":722,"passed_time":0.8184172576,"remaining_time":0.3135568193}, -{"learn":[0.5614016072],"iteration":723,"passed_time":0.8198394849,"remaining_time":0.3125354942}, -{"learn":[0.5612694287],"iteration":724,"passed_time":0.8233901571,"remaining_time":0.3123204044}, -{"learn":[0.5610634381],"iteration":725,"passed_time":0.8272548335,"remaining_time":0.3122146341}, -{"learn":[0.5608926924],"iteration":726,"passed_time":0.8286105182,"remaining_time":0.3111563569}, -{"learn":[0.5607440575],"iteration":727,"passed_time":0.8311309267,"remaining_time":0.3105324341}, -{"learn":[0.5606459699],"iteration":728,"passed_time":0.8332265796,"remaining_time":0.3097454089}, -{"learn":[0.5604593988],"iteration":729,"passed_time":0.8344734295,"remaining_time":0.3086408575}, -{"learn":[0.5602402607],"iteration":730,"passed_time":0.8355403603,"remaining_time":0.3074697085}, -{"learn":[0.5600333014],"iteration":731,"passed_time":0.8366292915,"remaining_time":0.3063068991}, -{"learn":[0.5598194436],"iteration":732,"passed_time":0.8378276407,"remaining_time":0.3051841474}, -{"learn":[0.5597098828],"iteration":733,"passed_time":0.8388986133,"remaining_time":0.3040150288}, -{"learn":[0.5595499759],"iteration":734,"passed_time":0.8405878024,"remaining_time":0.3030690716}, -{"learn":[0.559324633],"iteration":735,"passed_time":0.8420361967,"remaining_time":0.3020347227}, -{"learn":[0.5591558322],"iteration":736,"passed_time":0.8431526282,"remaining_time":0.3008807886}, -{"learn":[0.558980647],"iteration":737,"passed_time":0.8442287675,"remaining_time":0.2997126519}, -{"learn":[0.5588159007],"iteration":738,"passed_time":0.8453028235,"remaining_time":0.2985440283}, -{"learn":[0.5586143253],"iteration":739,"passed_time":0.8464188383,"remaining_time":0.2973904026}, -{"learn":[0.5584324854],"iteration":740,"passed_time":0.8474663939,"remaining_time":0.2962129501}, -{"learn":[0.5582234063],"iteration":741,"passed_time":0.8485166162,"remaining_time":0.2950367749}, -{"learn":[0.5580350105],"iteration":742,"passed_time":0.849881176,"remaining_time":0.2939696665}, -{"learn":[0.5578868641],"iteration":743,"passed_time":0.8509730655,"remaining_time":0.2928079365}, -{"learn":[0.5577588577],"iteration":744,"passed_time":0.8520688718,"remaining_time":0.2916477346}, -{"learn":[0.5576122867],"iteration":745,"passed_time":0.853164178,"remaining_time":0.2904875351}, -{"learn":[0.5575166974],"iteration":746,"passed_time":0.8542426923,"remaining_time":0.2893218222}, -{"learn":[0.5574477164],"iteration":747,"passed_time":0.8554884172,"remaining_time":0.2882126753}, -{"learn":[0.5573025254],"iteration":748,"passed_time":0.8565343061,"remaining_time":0.2870361961}, -{"learn":[0.5571818754],"iteration":749,"passed_time":0.8580838684,"remaining_time":0.2860279561}, -{"learn":[0.5570053351],"iteration":750,"passed_time":0.859257509,"remaining_time":0.2848936348}, -{"learn":[0.5567012378],"iteration":751,"passed_time":0.8603013562,"remaining_time":0.2837164047}, -{"learn":[0.5565143939],"iteration":752,"passed_time":0.861437788,"remaining_time":0.2825698986}, -{"learn":[0.5563202494],"iteration":753,"passed_time":0.8626311789,"remaining_time":0.2814420027}, -{"learn":[0.5561048874],"iteration":754,"passed_time":0.8637610689,"remaining_time":0.280293327}, -{"learn":[0.5560310721],"iteration":755,"passed_time":0.8651440456,"remaining_time":0.2792263851}, -{"learn":[0.5559032035],"iteration":756,"passed_time":0.8663630202,"remaining_time":0.2781059629}, -{"learn":[0.5556773884],"iteration":757,"passed_time":0.8674392011,"remaining_time":0.2769396922}, -{"learn":[0.5554237404],"iteration":758,"passed_time":0.8685478826,"remaining_time":0.2757839785}, -{"learn":[0.5552554185],"iteration":759,"passed_time":0.8696663141,"remaining_time":0.2746314676}, -{"learn":[0.5551290079],"iteration":760,"passed_time":0.8708414964,"remaining_time":0.2734968694}, -{"learn":[0.5549633835],"iteration":761,"passed_time":0.8719198857,"remaining_time":0.2723319328}, -{"learn":[0.5548311341],"iteration":762,"passed_time":0.8732058195,"remaining_time":0.2712316897}, -{"learn":[0.5546711171],"iteration":763,"passed_time":0.874595463,"remaining_time":0.2701629964}, -{"learn":[0.5545365493],"iteration":764,"passed_time":0.875704186,"remaining_time":0.2690071683}, -{"learn":[0.5544011318],"iteration":765,"passed_time":0.8767388248,"remaining_time":0.2678288316}, -{"learn":[0.5542163136],"iteration":766,"passed_time":0.877832631,"remaining_time":0.2666688436}, -{"learn":[0.5540799772],"iteration":767,"passed_time":0.8789572293,"remaining_time":0.2655183297}, -{"learn":[0.5539516357],"iteration":768,"passed_time":0.8800237435,"remaining_time":0.2643504353}, -{"learn":[0.553717142],"iteration":769,"passed_time":0.8810882576,"remaining_time":0.2631822068}, -{"learn":[0.5535495657],"iteration":770,"passed_time":0.8825873192,"remaining_time":0.2621433153}, -{"learn":[0.553403792],"iteration":771,"passed_time":0.8836479583,"remaining_time":0.2609737494}, -{"learn":[0.5532358044],"iteration":772,"passed_time":0.8847620565,"remaining_time":0.2598201641}, -{"learn":[0.5530988019],"iteration":773,"passed_time":0.8859578224,"remaining_time":0.258690527}, -{"learn":[0.5529529706],"iteration":774,"passed_time":0.887133338,"remaining_time":0.2575548401}, -{"learn":[0.5527736306],"iteration":775,"passed_time":0.8882693948,"remaining_time":0.2564076604}, -{"learn":[0.5525740784],"iteration":776,"passed_time":0.8894519105,"remaining_time":0.255273843}, -{"learn":[0.5523988589],"iteration":777,"passed_time":0.8905701337,"remaining_time":0.2541215549}, -{"learn":[0.5522617496],"iteration":778,"passed_time":0.8918547758,"remaining_time":0.2530165667}, -{"learn":[0.5520769314],"iteration":779,"passed_time":0.8929509987,"remaining_time":0.251857974}, -{"learn":[0.5519216436],"iteration":780,"passed_time":0.8940819721,"remaining_time":0.2507092854}, -{"learn":[0.5517846698],"iteration":781,"passed_time":0.8951764033,"remaining_time":0.2495504551}, -{"learn":[0.5516019696],"iteration":782,"passed_time":0.8963341687,"remaining_time":0.2484093418}, -{"learn":[0.5515248823],"iteration":783,"passed_time":0.8975916021,"remaining_time":0.2472956455}, -{"learn":[0.551412334],"iteration":784,"passed_time":0.8987460758,"remaining_time":0.2461533838}, -{"learn":[0.551316933],"iteration":785,"passed_time":0.8999968424,"remaining_time":0.2450373082}, -{"learn":[0.5512066025],"iteration":786,"passed_time":0.9010818152,"remaining_time":0.2438760186}, -{"learn":[0.5510420861],"iteration":787,"passed_time":0.9021746214,"remaining_time":0.2427170301}, -{"learn":[0.5508210285],"iteration":788,"passed_time":0.9032420939,"remaining_time":0.2415514345}, -{"learn":[0.5506904058],"iteration":789,"passed_time":0.9043761923,"remaining_time":0.240403798}, -{"learn":[0.5504929906],"iteration":790,"passed_time":0.9056341257,"remaining_time":0.2392889156}, -{"learn":[0.5502393339],"iteration":791,"passed_time":0.9068214332,"remaining_time":0.2381551239}, -{"learn":[0.5500673218],"iteration":792,"passed_time":0.9080711581,"remaining_time":0.2370374902}, -{"learn":[0.5498658881],"iteration":793,"passed_time":0.9091629226,"remaining_time":0.2358785416}, -{"learn":[0.5497903262],"iteration":794,"passed_time":0.9102544788,"remaining_time":0.2347197084}, -{"learn":[0.5496638458],"iteration":795,"passed_time":0.9115397459,"remaining_time":0.2336106886}, -{"learn":[0.5494455014],"iteration":796,"passed_time":0.9126618441,"remaining_time":0.2324596667}, -{"learn":[0.5492022359],"iteration":797,"passed_time":0.9138558184,"remaining_time":0.2313269114}, -{"learn":[0.5490872019],"iteration":798,"passed_time":0.9149518746,"remaining_time":0.2301693702}, -{"learn":[0.5489065226],"iteration":799,"passed_time":0.9160629727,"remaining_time":0.2290157432}, -{"learn":[0.5487057435],"iteration":800,"passed_time":0.9172344883,"remaining_time":0.2278772324}, -{"learn":[0.5485074883],"iteration":801,"passed_time":0.9182998775,"remaining_time":0.2267124386}, -{"learn":[0.5483695235],"iteration":802,"passed_time":0.9194598095,"remaining_time":0.2255710865}, -{"learn":[0.5481713053],"iteration":803,"passed_time":0.9206471587,"remaining_time":0.224436372}, -{"learn":[0.5480101384],"iteration":804,"passed_time":0.9219915932,"remaining_time":0.2233395785}, -{"learn":[0.5478715915],"iteration":805,"passed_time":0.9230665242,"remaining_time":0.2221773023}, -{"learn":[0.5475953509],"iteration":806,"passed_time":0.9242684568,"remaining_time":0.2210456161}, -{"learn":[0.547408714],"iteration":807,"passed_time":0.9255065983,"remaining_time":0.21992236}, -{"learn":[0.5472241436],"iteration":808,"passed_time":0.9265874877,"remaining_time":0.2187616936}, -{"learn":[0.547046197],"iteration":809,"passed_time":0.9276947107,"remaining_time":0.2176074013}, -{"learn":[0.5468800084],"iteration":810,"passed_time":0.9287983504,"remaining_time":0.2164523899}, -{"learn":[0.5466156398],"iteration":811,"passed_time":0.930097701,"remaining_time":0.2153428175}, -{"learn":[0.5465582902],"iteration":812,"passed_time":0.9311890905,"remaining_time":0.2141849446}, -{"learn":[0.5463975279],"iteration":813,"passed_time":0.9324492739,"remaining_time":0.2130658046}, -{"learn":[0.546287305],"iteration":814,"passed_time":0.9337234159,"remaining_time":0.211949487}, -{"learn":[0.5461004895],"iteration":815,"passed_time":0.934811972,"remaining_time":0.2107909349}, -{"learn":[0.5458764408],"iteration":816,"passed_time":0.9358718611,"remaining_time":0.2096261329}, -{"learn":[0.5457505651],"iteration":817,"passed_time":0.9370783355,"remaining_time":0.2084942018}, -{"learn":[0.5455673223],"iteration":818,"passed_time":0.938272518,"remaining_time":0.2073593721}, -{"learn":[0.5453657635],"iteration":819,"passed_time":0.9393419906,"remaining_time":0.2061970223}, -{"learn":[0.5451750098],"iteration":820,"passed_time":0.9407089254,"remaining_time":0.2050997535}, -{"learn":[0.5450580229],"iteration":821,"passed_time":0.9418477322,"remaining_time":0.2039524286}, -{"learn":[0.5448891122],"iteration":822,"passed_time":0.9430239562,"remaining_time":0.2028131716}, -{"learn":[0.5447159953],"iteration":823,"passed_time":0.9441911801,"remaining_time":0.2016719025}, -{"learn":[0.5445744778],"iteration":824,"passed_time":0.9454946557,"remaining_time":0.2005594724}, -{"learn":[0.5443809225],"iteration":825,"passed_time":0.9468624239,"remaining_time":0.1994601232}, -{"learn":[0.5442042196],"iteration":826,"passed_time":0.9480271477,"remaining_time":0.19831765}, -{"learn":[0.5439359693],"iteration":827,"passed_time":0.9495146675,"remaining_time":0.1972421773}, -{"learn":[0.5436948438],"iteration":828,"passed_time":0.950806643,"remaining_time":0.1961253751}, -{"learn":[0.5435238046],"iteration":829,"passed_time":0.9519422831,"remaining_time":0.1949761303}, -{"learn":[0.5433885592],"iteration":830,"passed_time":0.9530060056,"remaining_time":0.1938122924}, -{"learn":[0.5432087084],"iteration":831,"passed_time":0.9545835683,"remaining_time":0.1927524513}, -{"learn":[0.5429354732],"iteration":832,"passed_time":0.9557564172,"remaining_time":0.1916102301}, -{"learn":[0.5427264428],"iteration":833,"passed_time":0.9572851875,"remaining_time":0.1905387783}, -{"learn":[0.5424446678],"iteration":834,"passed_time":0.9584514114,"remaining_time":0.1893945903}, -{"learn":[0.5423728941],"iteration":835,"passed_time":0.9595989683,"remaining_time":0.1882466876}, -{"learn":[0.5422192589],"iteration":836,"passed_time":0.9607939842,"remaining_time":0.187108028}, -{"learn":[0.5420059953],"iteration":837,"passed_time":0.9621563773,"remaining_time":0.1860015908}, -{"learn":[0.5419305179],"iteration":838,"passed_time":0.963314851,"remaining_time":0.1848554124}, -{"learn":[0.5416955576],"iteration":839,"passed_time":0.964439741,"remaining_time":0.1837028078}, -{"learn":[0.5415667697],"iteration":840,"passed_time":0.9659413859,"remaining_time":0.1826214987}, -{"learn":[0.5414730371],"iteration":841,"passed_time":0.9670932763,"remaining_time":0.1814735602}, -{"learn":[0.5413254033],"iteration":842,"passed_time":0.9683060841,"remaining_time":0.1803369575}, -{"learn":[0.541134908],"iteration":843,"passed_time":0.969452891,"remaining_time":0.1791879751}, -{"learn":[0.541011651],"iteration":844,"passed_time":0.9708942018,"remaining_time":0.1780930193}, -{"learn":[0.5408742065],"iteration":845,"passed_time":0.9720472588,"remaining_time":0.1769447729}, -{"learn":[0.5407677399],"iteration":846,"passed_time":0.97351282,"remaining_time":0.1758529651}, -{"learn":[0.5405882682],"iteration":847,"passed_time":0.9748717964,"remaining_time":0.174741171}, -{"learn":[0.5404063591],"iteration":848,"passed_time":0.9759860195,"remaining_time":0.1735852638}, -{"learn":[0.5402199597],"iteration":849,"passed_time":0.9771223263,"remaining_time":0.1724333517}, -{"learn":[0.5400828497],"iteration":850,"passed_time":0.9783578011,"remaining_time":0.1712988394}, -{"learn":[0.5399611765],"iteration":851,"passed_time":0.979505858,"remaining_time":0.1701489049}, -{"learn":[0.5396695028],"iteration":852,"passed_time":0.9806189978,"remaining_time":0.1689929574}, -{"learn":[0.5394488059],"iteration":853,"passed_time":0.9821755602,"remaining_time":0.1679129178}, -{"learn":[0.5391908301],"iteration":854,"passed_time":0.9833997431,"remaining_time":0.166775395}, -{"learn":[0.5390772765],"iteration":855,"passed_time":0.9846534264,"remaining_time":0.1656426325}, -{"learn":[0.5388830726],"iteration":856,"passed_time":0.9858470256,"remaining_time":0.164499562}, -{"learn":[0.5387260102],"iteration":857,"passed_time":0.9874740056,"remaining_time":0.1634280988}, -{"learn":[0.5385718663],"iteration":858,"passed_time":0.9887822313,"remaining_time":0.1623030205}, -{"learn":[0.5384163577],"iteration":859,"passed_time":0.9903007932,"remaining_time":0.161211757}, -{"learn":[0.5382201659],"iteration":860,"passed_time":0.9915760185,"remaining_time":0.1600802167}, -{"learn":[0.5379996906],"iteration":861,"passed_time":0.9927680343,"remaining_time":0.1589350217}, -{"learn":[0.5378266584],"iteration":862,"passed_time":0.9939941756,"remaining_time":0.1577951356}, -{"learn":[0.5376524191],"iteration":863,"passed_time":0.9955644049,"remaining_time":0.1567092119}, -{"learn":[0.5375314462],"iteration":864,"passed_time":0.996932423,"remaining_time":0.1555906094}, -{"learn":[0.5374158523],"iteration":865,"passed_time":0.9985464445,"remaining_time":0.154509496}, -{"learn":[0.5373387291],"iteration":866,"passed_time":0.9996967098,"remaining_time":0.153356012}, -{"learn":[0.5371031689],"iteration":867,"passed_time":1.000813516,"remaining_time":0.1521974472}, -{"learn":[0.5369876964],"iteration":868,"passed_time":1.002058075,"remaining_time":0.1510582368}, -{"learn":[0.5368424466],"iteration":869,"passed_time":1.003375425,"remaining_time":0.1499296613}, -{"learn":[0.5366527847],"iteration":870,"passed_time":1.004651734,"remaining_time":0.1487945737}, -{"learn":[0.5364835345],"iteration":871,"passed_time":1.005933751,"remaining_time":0.1476600002}, -{"learn":[0.5363997115],"iteration":872,"passed_time":1.007516855,"remaining_time":0.1465688896}, -{"learn":[0.5362290419],"iteration":873,"passed_time":1.008723205,"remaining_time":0.1454223385}, -{"learn":[0.5361499667],"iteration":874,"passed_time":1.010380019,"remaining_time":0.1443400026}, -{"learn":[0.5359272704],"iteration":875,"passed_time":1.011926539,"remaining_time":0.143240743}, -{"learn":[0.5357993232],"iteration":876,"passed_time":1.013088471,"remaining_time":0.1420865245}, -{"learn":[0.5356482822],"iteration":877,"passed_time":1.014843078,"remaining_time":0.1410146418}, -{"learn":[0.5355361733],"iteration":878,"passed_time":1.016382015,"remaining_time":0.1399115174}, -{"learn":[0.5354460196],"iteration":879,"passed_time":1.017927619,"remaining_time":0.1388083117}, -{"learn":[0.5352588228],"iteration":880,"passed_time":1.019176552,"remaining_time":0.1376640292}, -{"learn":[0.53512148],"iteration":881,"passed_time":1.020487653,"remaining_time":0.1365278266}, -{"learn":[0.5350096075],"iteration":882,"passed_time":1.021694044,"remaining_time":0.1353773535}, -{"learn":[0.5348475038],"iteration":883,"passed_time":1.023954116,"remaining_time":0.1343650197}, -{"learn":[0.534620608],"iteration":884,"passed_time":1.025320301,"remaining_time":0.1332337114}, -{"learn":[0.5345059191],"iteration":885,"passed_time":1.026687652,"remaining_time":0.1321020229}, -{"learn":[0.5343386233],"iteration":886,"passed_time":1.027889626,"remaining_time":0.1309487348}, -{"learn":[0.5341194767],"iteration":887,"passed_time":1.029000266,"remaining_time":0.1297838173}, -{"learn":[0.533889748],"iteration":888,"passed_time":1.030475786,"remaining_time":0.1286645807}, -{"learn":[0.5337391311],"iteration":889,"passed_time":1.03169926,"remaining_time":0.1275133917}, -{"learn":[0.5335737931],"iteration":890,"passed_time":1.033147655,"remaining_time":0.126389556}, -{"learn":[0.5334144509],"iteration":891,"passed_time":1.034404421,"remaining_time":0.1252417909}, -{"learn":[0.5332543181],"iteration":892,"passed_time":1.035710105,"remaining_time":0.1240996431}, -{"learn":[0.5330324114],"iteration":893,"passed_time":1.03693808,"remaining_time":0.1229479155}, -{"learn":[0.532823744],"iteration":894,"passed_time":1.038020761,"remaining_time":0.121778972}, -{"learn":[0.5326132813],"iteration":895,"passed_time":1.039392988,"remaining_time":0.1206438289}, -{"learn":[0.532559536],"iteration":896,"passed_time":1.040504877,"remaining_time":0.1194782635}, -{"learn":[0.5323901087],"iteration":897,"passed_time":1.041834853,"remaining_time":0.1183375891}, -{"learn":[0.532317485],"iteration":898,"passed_time":1.043248247,"remaining_time":0.1172058654}, -{"learn":[0.5321770734],"iteration":899,"passed_time":1.044346262,"remaining_time":0.1160384735}, -{"learn":[0.5319322789],"iteration":900,"passed_time":1.045449068,"remaining_time":0.1148717622}, -{"learn":[0.5316690346],"iteration":901,"passed_time":1.046637001,"remaining_time":0.1137144413}, -{"learn":[0.5315424691],"iteration":902,"passed_time":1.048160604,"remaining_time":0.1125931103}, -{"learn":[0.5313859248],"iteration":903,"passed_time":1.049427079,"remaining_time":0.1114435837}, -{"learn":[0.531195805],"iteration":904,"passed_time":1.050513969,"remaining_time":0.110274947}, -{"learn":[0.5310412898],"iteration":905,"passed_time":1.051734527,"remaining_time":0.1091203593}, -{"learn":[0.5309069909],"iteration":906,"passed_time":1.0528255,"remaining_time":0.107952339}, -{"learn":[0.5308202803],"iteration":907,"passed_time":1.054048308,"remaining_time":0.1067978461}, -{"learn":[0.5306762481],"iteration":908,"passed_time":1.055409576,"remaining_time":0.1056570642}, -{"learn":[0.5305210105],"iteration":909,"passed_time":1.05676726,"remaining_time":0.1045154433}, -{"learn":[0.5303613837],"iteration":910,"passed_time":1.057928734,"remaining_time":0.1033541793}, -{"learn":[0.5301894383],"iteration":911,"passed_time":1.059413587,"remaining_time":0.1022241181}, -{"learn":[0.5300110846],"iteration":912,"passed_time":1.060551852,"remaining_time":0.1010602532}, -{"learn":[0.5298896467],"iteration":913,"passed_time":1.06171916,"remaining_time":0.09989917694}, -{"learn":[0.5297722075],"iteration":914,"passed_time":1.062816382,"remaining_time":0.09873157651}, -{"learn":[0.5295404489],"iteration":915,"passed_time":1.064131692,"remaining_time":0.09758412892}, -{"learn":[0.5294298694],"iteration":916,"passed_time":1.065476001,"remaining_time":0.09643894013}, -{"learn":[0.5292101992],"iteration":917,"passed_time":1.066543182,"remaining_time":0.0952685631}, -{"learn":[0.5289950717],"iteration":918,"passed_time":1.06778824,"remaining_time":0.09411408864}, -{"learn":[0.5288228305],"iteration":919,"passed_time":1.069120091,"remaining_time":0.09296696446}, -{"learn":[0.5286330477],"iteration":920,"passed_time":1.070387441,"remaining_time":0.09181390649}, -{"learn":[0.5284490903],"iteration":921,"passed_time":1.071462414,"remaining_time":0.0906443257}, -{"learn":[0.5283180803],"iteration":922,"passed_time":1.072724306,"remaining_time":0.08949054339}, -{"learn":[0.5281316824],"iteration":923,"passed_time":1.073802779,"remaining_time":0.08832144066}, -{"learn":[0.5279960696],"iteration":924,"passed_time":1.074910668,"remaining_time":0.08715491905}, -{"learn":[0.5277708018],"iteration":925,"passed_time":1.076039225,"remaining_time":0.08599017564}, -{"learn":[0.5275788182],"iteration":926,"passed_time":1.077167282,"remaining_time":0.08482547094}, -{"learn":[0.5274954053],"iteration":927,"passed_time":1.078315589,"remaining_time":0.08366241635}, -{"learn":[0.5273939801],"iteration":928,"passed_time":1.079599106,"remaining_time":0.08250972712}, -{"learn":[0.5271941343],"iteration":929,"passed_time":1.080878998,"remaining_time":0.08135648369}, -{"learn":[0.5270978216],"iteration":930,"passed_time":1.08203968,"remaining_time":0.08019413308}, -{"learn":[0.5269792396],"iteration":931,"passed_time":1.083161403,"remaining_time":0.07902894356}, -{"learn":[0.5268377973],"iteration":932,"passed_time":1.08430196,"remaining_time":0.07786519969}, -{"learn":[0.5267032069],"iteration":933,"passed_time":1.085477225,"remaining_time":0.07670395811}, -{"learn":[0.5265548995],"iteration":934,"passed_time":1.08655849,"remaining_time":0.0755361517}, -{"learn":[0.5264515743],"iteration":935,"passed_time":1.08769538,"remaining_time":0.07437233367}, -{"learn":[0.5262363111],"iteration":936,"passed_time":1.088955063,"remaining_time":0.07321682923}, -{"learn":[0.5262123118],"iteration":937,"passed_time":1.090084787,"remaining_time":0.07205251255}, -{"learn":[0.5261404386],"iteration":938,"passed_time":1.091339928,"remaining_time":0.07089641707}, -{"learn":[0.5260256059],"iteration":939,"passed_time":1.092537986,"remaining_time":0.06973646719}, -{"learn":[0.5259196314],"iteration":940,"passed_time":1.093713835,"remaining_time":0.06857504385}, -{"learn":[0.5257448753],"iteration":941,"passed_time":1.094825808,"remaining_time":0.06740965697}, -{"learn":[0.5255640861],"iteration":942,"passed_time":1.09598199,"remaining_time":0.06624705561}, -{"learn":[0.5254048598],"iteration":943,"passed_time":1.097287049,"remaining_time":0.06509329953}, -{"learn":[0.5252093179],"iteration":944,"passed_time":1.098435939,"remaining_time":0.06393013404}, -{"learn":[0.5250705737],"iteration":945,"passed_time":1.099588246,"remaining_time":0.06276719377}, -{"learn":[0.5249127042],"iteration":946,"passed_time":1.100744178,"remaining_time":0.06160447884}, -{"learn":[0.5248016433],"iteration":947,"passed_time":1.101941403,"remaining_time":0.06044404319}, -{"learn":[0.5245889009],"iteration":948,"passed_time":1.103026792,"remaining_time":0.05927751991}, -{"learn":[0.5244611525],"iteration":949,"passed_time":1.104130098,"remaining_time":0.05811211045}, -{"learn":[0.52435538],"iteration":950,"passed_time":1.10523203,"remaining_time":0.05694676074}, -{"learn":[0.5242868134],"iteration":951,"passed_time":1.106400087,"remaining_time":0.05578487834}, -{"learn":[0.5241478183],"iteration":952,"passed_time":1.107504393,"remaining_time":0.05461983892}, -{"learn":[0.523947669],"iteration":953,"passed_time":1.108621033,"remaining_time":0.05345552152}, -{"learn":[0.5237888331],"iteration":954,"passed_time":1.109708881,"remaining_time":0.05228994727}, -{"learn":[0.5236090071],"iteration":955,"passed_time":1.110803479,"remaining_time":0.05112484631}, -{"learn":[0.5234509657],"iteration":956,"passed_time":1.111964036,"remaining_time":0.04996285637}, -{"learn":[0.5232790155],"iteration":957,"passed_time":1.113029467,"remaining_time":0.04879669896}, -{"learn":[0.5230899075],"iteration":958,"passed_time":1.114440902,"remaining_time":0.04764554431}, -{"learn":[0.5229585604],"iteration":959,"passed_time":1.115597376,"remaining_time":0.046483224}, -{"learn":[0.5228564751],"iteration":960,"passed_time":1.116897685,"remaining_time":0.04532675308}, -{"learn":[0.5226973984],"iteration":961,"passed_time":1.118131035,"remaining_time":0.04416733817}, -{"learn":[0.522581195],"iteration":962,"passed_time":1.119245049,"remaining_time":0.04300318466}, -{"learn":[0.5224049925],"iteration":963,"passed_time":1.120307939,"remaining_time":0.04183722592}, -{"learn":[0.5221831982],"iteration":964,"passed_time":1.12141937,"remaining_time":0.0406732414}, -{"learn":[0.5220633205],"iteration":965,"passed_time":1.122702429,"remaining_time":0.0395154064}, -{"learn":[0.5218727774],"iteration":966,"passed_time":1.123848444,"remaining_time":0.03835263563}, -{"learn":[0.5217142792],"iteration":967,"passed_time":1.124948292,"remaining_time":0.03718837329}, -{"learn":[0.5216137175],"iteration":968,"passed_time":1.126049265,"remaining_time":0.03602427989}, -{"learn":[0.521431127],"iteration":969,"passed_time":1.127147405,"remaining_time":0.03486022901}, -{"learn":[0.5212491425],"iteration":970,"passed_time":1.128320503,"remaining_time":0.03369855263}, -{"learn":[0.5210412582],"iteration":971,"passed_time":1.129375601,"remaining_time":0.03253345352}, -{"learn":[0.5209096834],"iteration":972,"passed_time":1.130485574,"remaining_time":0.03137010328}, -{"learn":[0.5206924059],"iteration":973,"passed_time":1.131710799,"remaining_time":0.03020993918}, -{"learn":[0.5204450378],"iteration":974,"passed_time":1.13279648,"remaining_time":0.02904606358}, -{"learn":[0.5203452705],"iteration":975,"passed_time":1.133940328,"remaining_time":0.02788377856}, -{"learn":[0.5201276544],"iteration":976,"passed_time":1.135022676,"remaining_time":0.02672008347}, -{"learn":[0.5200265373],"iteration":977,"passed_time":1.136771116,"remaining_time":0.02557153839}, -{"learn":[0.5199170844],"iteration":978,"passed_time":1.137911089,"remaining_time":0.02440871591}, -{"learn":[0.5197050537],"iteration":979,"passed_time":1.139124272,"remaining_time":0.02324743412}, -{"learn":[0.5195470424],"iteration":980,"passed_time":1.14019212,"remaining_time":0.02208323168}, -{"learn":[0.5194250506],"iteration":981,"passed_time":1.141367885,"remaining_time":0.0209212036}, -{"learn":[0.5193402584],"iteration":982,"passed_time":1.142640277,"remaining_time":0.01976081863}, -{"learn":[0.5191450323],"iteration":983,"passed_time":1.143999295,"remaining_time":0.01860161456}, -{"learn":[0.5190161094],"iteration":984,"passed_time":1.145095185,"remaining_time":0.01743799774}, -{"learn":[0.5188890325],"iteration":985,"passed_time":1.14614549,"remaining_time":0.01627387106}, -{"learn":[0.518662949],"iteration":986,"passed_time":1.147782637,"remaining_time":0.01511770444}, -{"learn":[0.5185427602],"iteration":987,"passed_time":1.148910319,"remaining_time":0.01395437634}, -{"learn":[0.518436865],"iteration":988,"passed_time":1.150014584,"remaining_time":0.01279085988}, -{"learn":[0.5183853031],"iteration":989,"passed_time":1.151108765,"remaining_time":0.01162736126}, -{"learn":[0.5182570586],"iteration":990,"passed_time":1.152181737,"remaining_time":0.01046380993}, -{"learn":[0.5181277957],"iteration":991,"passed_time":1.15323071,"remaining_time":0.009300247659}, -{"learn":[0.5179707171],"iteration":992,"passed_time":1.15427339,"remaining_time":0.008136871834}, -{"learn":[0.5178342938],"iteration":993,"passed_time":1.155688492,"remaining_time":0.006975986876}, -{"learn":[0.5176966263],"iteration":994,"passed_time":1.156769257,"remaining_time":0.005812910838}, -{"learn":[0.5175970443],"iteration":995,"passed_time":1.157896355,"remaining_time":0.004650186165}, -{"learn":[0.5174165617],"iteration":996,"passed_time":1.159128663,"remaining_time":0.003487849538}, -{"learn":[0.5172515223],"iteration":997,"passed_time":1.160268345,"remaining_time":0.002325187064}, -{"learn":[0.5170768331],"iteration":998,"passed_time":1.161338359,"remaining_time":0.00116250086}, -{"learn":[0.5169045154],"iteration":999,"passed_time":1.16242329,"remaining_time":0} -]} diff --git a/catboost_info/learn/events.out.tfevents b/catboost_info/learn/events.out.tfevents deleted file mode 100644 index 64bb1c50794d710ebfba4c25c6b08b9076cac8e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54870 zcmZ|YcUX^o_&4xSM3J3jX0Pm#Ju;(VMAC+ywtzJ80!?s{D0H7iB#$8fQl;JF^*SFrOI*!sH%B+ z+PrEeRlCN3+B9)=e_qK-m47c#R|*WHc_k-RE82nD?&$TKSIwpBP!mv&D^+^)s)bbL ze;d(w=hthr*X5PGRLP`)+F2zxjaMzDYULA9y|r#y^Qx6p-3b8oC8zIMUMWabGgnXx zTI7}TN>QrZFN3ly+_8XHt)=S3X;5)(`wE^{8>vz|49Y+~#E;KXlB)0PK`AP(I>xKE zQZ+{hRHZ`MOkTBHG z<&~OLsg3~U9zWwUulh*Ux!#~Yf4cjCSAC^Qz743bB2x`s^^>Yab?S}3ukPn|U*%PQ zsd`Zis@lZSl~)6#>TotFgMI59c{Na~(&9k%jkZwZ)gY<*9tmox+M*G>8Z1?@{-8|L ziw5&*h*YKB1eNL0UT_bGO4T$cP`Pa*SMgcHq-w4?s6S2`$9bhLRTYOpwJhzG!>i#^ zWwaSoi*7FjzpoKerDh1~m|p%JK5L{@y9=GduSQFi{3uY@ z;;%jC)flNt8U)JpabGiDjg_h+YM^Gf2ol_laZ+Wk0Lo)XnLv$~Dut$?Tsx(l;wzjW zRc(I_YwQ4R)-Qd+D-Eft$^}(+C_s@{6Q$~SI;g6W-(I|$BvpGJf$A~n-4b3+ma1_f zpz3?%$@6N8ROx$zQY!23!KW~dr~!-SJS1+c^jyk>K6oa zA~I`xx(-z8kMS{l)=X*Ep2eUP#@QS4YL--eoC9jNpSfU^qA69OQ$bZdIVk8+v!yC! z7^p*Dh41+a=SWqQ8mJC~`|an|T&Xhc0BYvXTXwvfCsmsApz=qSj^@>TsVc4++W4!q zoVR)>uNFvEuM$uNSGMftm6lX#=YqPY5;crh3#IDCD^Q9Vxrw}5Bvp|ypvJsze~nk# zQg!hGs8#(v+<2uURed}`*%b`);gzmb#W{e=9$_cAEYQmIl|4(j!^_;0*gCRI(fL79Brmdq=CsWP4f%3#2ebY3l& zs`g_+O!oUJ0w}%S?*(gL8>H%YAgF$q$^{*Jqf}Mj0~Hi{dk}wJo22T5 zE2!0P4+uKIW~oZC2c=~5ryZZQMXDa30JY-Usb;(~lB#ybpmMJVx$tVMR1Mz*nw zDqaIrO2&r2yxJ{Q>FS`ovO8|z)gGy8HVBl-BxOOz-YZpoyMlT;s^}@7wNI)JwFPxl zZ~rJ>?UyQbIZ#QZol|*bELEj-gBv?rQV-{DygDFN$0|VuHG5LcD-)@@R|sm_D@(yj z;6bU{`VN$VO823B)*-3-@eabLGOaL`|@C5~49g(W?d!Xhl%@&NK{*$U~ zPf*7I$X z3}FQ_zS;K%0%~T)5GiSmU zr~*s)&+8A*t`hd74X_(YmAiO$jj&i5U`^ZIiR0OI!iLlgZ0sdz+Bc1P=0aFhIk31L zYe(?Rm9XeMV8c4Ay7J78u#RcKqIN$Kyd^gXGmit-V|Sm|e40C9cSC_0{7G8JvzvtV z_5(KmXyH+wc@S3Z3GC3JX?J+$Ntl)+u#{Gs%XxN-Fh?t3HuH@IziuzWdL0F(d3}fm zpLUzDRVKh*oK5+~GjGBM838jH=b*>4JB0OF4Qy^!#5A7WC9KUtVEvX{?#(kF!qn#h zlPNaHZmKv`LqDSTFV2Qq~AuCXMuzrtsT(Vxtgo1d-3c6Ve7sE^E-VphG#*98Ds;~ z|MKk;&w>dXn+j}f;XJ|bErhV(C}6t{qWkh`p@h{00K0gkLmkh;2=n&_)@+$-7|+59 zOLhhJwsWf+Jc}UgtRpb@xaEO7dq~(CTVUI^Z|TOfNWuzF0aMoMZq2hO!itUpi+I1j z3D2Sl)7k-S-r_++c@{&Mks+{X)nBW47E9O?Jz%Z+8NK1zBf_#L0gF7j<{QuA2pc>a zSm&Iw^*nn_SkMq)6Gwg+#j|+Aa@Bxk{&5hDf)WU`PysgXaP@3H?FnHAm4Mx>`JuwI zM8f1-02}C(BS?En*toy_8#|ZVgNm1YS`uNyN`ZC$vqJE=pAqI%2&_+#vS3`2OxS?; zz&@J#x$s4%5a#$A*sfBYt~^U6Y+o`kr}Gu%JbO;q+fZQYqfdwM>;++dfxre87zpNX zFA1A)7udi(7S4RyE5fF@0qfJl>mJWu6Q<_~>|v^d63^ZcHr5(gyM7)KJbO!6=uu!= zgPa84?li)3_W=u#TeE~uOD8OQGq7DPzi03)gRt}Kf%P1cs>ZWS!UC59Gg_$ln`c>s zX=wx7tmtONvv-7f%mMaKDdQv0vI)zc1kBn^&zNWLDH{gt_oVI%dG>*@UA=$>_F5j# zvmC-|+5@ZayzV&9atW(#3C!!whz~r=Bg|e7SdZ^51<&mxVR=>k8r$opOdY|}Up`@) zrNEA>dpzWeEFet20N5Bsz_O|>+wkl&VP{_f+q`y;U_f6;*r+&QPeuex z=hMCr78DFDd_}YY&x#0pehb*m1z!?)_LZ;@7hub>T6y#A8(|wS0?U1U=rhlX343)4 z*uN3sg5k_}!nW@M=J!2hBcE16nC=E(UUl{@cvebS@DgBpiJO-3tc zhA^X7z%)m;5H#~z!iwX8^=`W2J744~;rW3oBl)$+RKNyali;$_0WA&J7qbW&>NlyjX!xb0%=I(96p8Qd3?313lKezJN=1th#GGH!qPO9?k4q?5&0?Tp8)8yG*!phTu zg?NmZ&odvwLQ;X*@4geuGhf20qkzdJ9T1#(x<}ah2f#|Z8w!?L?i1GgF0co4vjn%q zkFcJez^pDs3zq);3H$C0tT0%n2Y*Wf2LD(FcHC+NL&#zqVk)B6kA2Ya}n&MhGD+ehaX0lc~CVS}0-vtpV0!rtU^QI*$gnZbOk^I1@>jTR&h0 z_x}jy0a1jtRR*T(SiXWUGMcczO2BM3ZxsA+VhGzQ3#@#DvS7t9mazJY-i__`lW{vA zzQ{*}X?z9tIwf;A&*BJMmji5e{5-)>?J;4F>A;qauUyKf#S=C$3E0_Xr?>DdfiTA~ zVC8=GmOOhx*uHzfyp)!Q@+^_CU^igjK8CvU>?vW}uK{~&=h%v8NrX+e0p|F{Nzf;s z5ms*wY-pCUV0|)~ury;}H|*aDP7b6Hrn&`~`G4|)IZi5J!K;Dgepn$m74e*~Zp(q` zjB77w<}V04t^@4#JXygU=OtxxfX!I6q&NTEUJ-U;46yb$tpq#JuL;vr2PV@oTd-jD zhOnQ#fwf#ZPKPh@EnzcNfSuntPSBOp2)o)ASi8Po1uIYKgvqo5wyL?F;M{8lVJUxl zH8wok7FQGbYs(}oq7<0%s1U(hl0}%>XJ9j0Kl;t5y(8@AJ76m{x?kp5Heo%V1FQ4x znaQ*Fgbhppwk-UzU`qReu$mBHWi!f3`LrCug6;!*;kE7^&vFUV@CJ4vcw#-z@(6Rh z4(yW7bHS|RBVlvxfW@eOZNaDI6E^G&FmpRQd7c#z=6?iO{oUDukMJkL6pVqbX(hjy zPy0;R#GSw%oGK~cSs`J0TY+WW`2Y9>90P>bnD5Ue)pdpH@OxaywuXzFiay zXG#ehCkw3E(=+|}v@*hW{ps1*C)efvoy)Uw!gMNt#p~%m;@J;(Di6?6@oFC$;DA!A3_?6bh$ zwD1yqyX^^^Xa+1`ns$4>$V-G-9s<_<&J8D?T_$Ya4q$7>I*j9)17QJcfc2e!UeHS% z3G1p4>|C;SFrVf`*f=dGxPXuNaF-4Gem9XpTz@`+I z3Qn_JBWzP;F&97e$9ZXYMm6!^4$mv zukPO1C)<^j2o`m25O%E`n4-72V9e!C*rY;W=l|`?<*)4~VcxHRjSQ@q#xoDX4m|;; z-9JmvCp`&U5Dn~I&`80y-7UhDgMoe0D)#1!^dcHerXZ0}Jt*`;lkf zglS&}rX+t&aBX)8dtwdj-o*^TO!zKg(@cQry&hZ17wJRT)y=?GCtC;xy}pDQtpc{| zxX)ug?H*xf%YfY}SuQyDdY>?(g}~;os}r;!Kf-#<0XC@ju|a&1{)7$G0Jh&ea5&Eb z2um3S?1t7oBc25kHoPw|i*pwQkNW{(kt)EFH_Z~v@`DI7>;No(R*GQdDVVTJa==>d z3EjzGTL@tT>bo^IyeS1oi+C1FSl?=3J5T9E^DK-o?;>EqVM>CTa5!Ol1;FM$%@+)@ zBM5tw0ZcZ?Pp~}pkg%UGfw?bkwwS-RNWvncff>x!7i=~~5oR9*Os&o2nS5F_VViw` zS;>zVEPlrjw#gmXk+IH#!@049&2a`c_(P>XU*sdgme>L7kUVn(&*BJse*)N2i=Y^u zJtpjs39w6*3dKB&CoF0+u)pIwEAuRYupMiF*|ps)*lc=2Sd%5ddi2}BfKN*#tZ)vn z`kFw&TF_I%QfB~jn;Roo{7xcl+C*Uf8;t$f3@7`^kiz?+vV#>si5v zDuu8LMPRN6{Xg+VrV@6f39t&Csuw(aPMC46YGa=~^(lTN&t4GL@dvO;R`>ey>?L6< z3W24~meJzbE5gRS1@^+lVF=G&6PEfISX{J;4A0&WW*7qOgl1`5p1mb(*F9kWEuN*z zvoyk9cmh+eP!r5L(g_=O6BT=VH&4^{jGS`pHIsoY?BGF z!gW6qc=nF47Q29Lja?`BzGV}3buF;f+gE?#)7}%7umsqQ2}`H&>;qwYw1C}Tn<&_j z$sx>S8nERS!`ky{xrDio29`SJ%p0EN5!PuSu#bP-B6;?au(hhdrbP7@j3@I6%TWS0 zyI3=cPb(m-t~s#S`JDuB$tS|@{p;G;xit4@De`Hb2~#Ww7NVCTm_Qd2Ci@lGz@~*) z`Lr*D&CLZ?sQEOVXGMf%y#!YI;Gp0w`AXQSL|_F0zasdwZ-gz20jAXL;Q*c$6V}-u z*rjRz2}XF|2{U#9cK51G8J|`{*l9aphyOW+^Q@FGm*c<;_ZC(2tc)8OZ0NXUwL-0=iAng58U|WjMoA7Br30tlO%-6}@mS+`&rOg6%=*nqxp8X=sdK|FC zZFSFhR!Nxl5MXaUU9I9-6=mIl^+>RY=h<(<4l4qS>l7szs#O!FE(=WKR`>)yt%k6t zwJMD*=+@s2f}NFG!utLK=9n~V44?Lgu*tc=_GgW0#`$t(6u%gTN1-lRRgpCXUwq}ZIGM{#W{6l4S-oUJqQs49JBwd4_+2R?(>{kKns$Ddjzcwqv1}*`1VDph5JUdI+<+;EPnMVmu{aF+CRRfsiF=fGr z>KtK7LxA1g7dDkI@;qUYJ%NR(^%QJ2*$~#WGq8b48wE3}3xut11#E=T>^^*vwuHI- z?b6t}dfk{6$g_)tH7f=7LdH+fg6s%un+>cYIaDyfuqVtu8Q6Te*0p?*mk5)K0OruV z(^j5cCd~FWFoo-#mh;Skuw5>|&Zv3Jy&~8yGHJWO;rHa z)~NdtzQ~(|y{%JjYzlIfH7-2!AZ%eZFslWV1g9cA37cCAEMNYVU}66jVJq^1jT=_- zlP}VXFxyOEt%~NW@$5EXLtX-Vd*h$r_vTHQaxAb539{Yzv^#{E1OeOkF*1&4cL~e7 z1#FJO)|Nc;A?&y#u#xQp1;1`z!Ys}LGuvk4#;4sQEW`v@hgXWeJiAX=kP)z$w+ou` z%#Sdub-*IdP4CJxf5M(=1Kaf5b`#G62veU8ETr(gSy+XUCJbOUc$^O8; z^gXD~vmn9-bOn|ymtx1WV8R0AfvKaR zN?nd%VEBZv=@WphKfSvZpO#42A$4HQ+C}N`>?vV^J%Kq_g$qu6BoP*?1kCJbj$jr0 z8DUm(z@iIxMDj%@6Snksr^Xg^rOH?^3{4?ySP8ImzwbNqX{m&z6#%UI2y3$z*pCe}W%;ysgoQ2!mXMb4fM?l+9h(g-Apevp z&)yTZemt<@E~2IO4}_f<3T)ERwSsRz4q@ljfUVxN@;F~)E@A4*z`Wu{AL3aaVXs>Q z+n)3JFwZ^`_E82{@euR(Jj*A{wYpEzkXA<6GJRlr5A4SAY2}2Cm=COG!{XjN`$1Tf zX~52PsmB>_BJ0U0iXX8wd1KW|@lunHr*h#|PZUa`(aoQFB z+RO=aS_>?~b?-HvSrC@71laNDwRF9tp~zE&O`Q*H!}E#sJXZs=By7VJV5$4s2p+&` z!rqSpb}3J@4}WcE2;0&P*q$iUY@S&WCf^R&OZ)$I#<1bq&JtEG2kdUl5_3Myny|jV z+Bf!+l|NG_@$4L7XN!Q{HuVvF-_8@ZIUCsUxj*UPso~me2%GZ?*kHfR6?~Bw2)msK zOfPWbRG!%q_A?q-lImbpo?RrYBmme--NXJovmz3IW9c;-TwTo+(H!|n=(*sg?4X$|bD;?`Y!nj2vqn*qC#U#G;g8-%^6 zZP(bje#jZqvuX_wz@4zEWx$M9I0=T>HwpWm3(Pm;kKmSg5H|5Gu**?}g15wzFpmUa zm&UD1=Wod^!c0Pdo%*OR_yu?ow#ggVtKhqWZ@_KBe69dX-MH&0U!*r-11dp0Ng_<8J1||-iS(R81A9i;!?wU|&U?Y61Ff4*eQ=;FZi@qgcZL4HmJL<56@l`rWp%tS37OG-P%y(8^UD6fJIGF z6s%ypCCtzd*zf)RtN0?*2z%!aY*^Vr!S5}du)B`HoM&D>&ZlJ%_WeAt9yO+dk8mbo zW~YHYKXF3vDrXU<`5&-e8Wr?FUBd%-M_ADgU``gp*YVeuP1uSxz_#ZY&<)UrwD*K9 z)dhCVW8Hi{?E_)`=L1_A9JYyPIfVI41txoJieU7bOIYD>U}Iy&=1&g<=AjOt(vg1Zom>BYfj@?4Pl+y0}I+cLa<&^OW5|7z-o*83Vt|$2rK#5 zy0PKK+V~FSi>xC|wF=nFq1y_1_Ls29CBTAe$AP6V_rqF!Mi|Q}`m!5%z5atTqJDOAYdh{wFEy?JHk}^0GqOD zaaX=bd&2TmfxY}Mj2=2`_y$}etV=s!pHIIK4CpTtcC9I}fu$;A`63+%Q>;~N?8?`D zW+?E?k+5zhz=~5(U*MS&VW#ha4Oh+*e5kGvHtrR$)ab#2x5SySX7Ru}RL1w^i@Zvh zQVg(svrNG#=o(=OA;7}lbc*BCt`m098`xB1O~Kh27s4#B09$a)tvR3OO4y%^z{UsU zci@>DVSOxt-F%|=mS;Bz`*R3b+>AJ1p1BkDcRR4<{r4{9*-gTJt_N0bku{oU9)$f` z3M}!^eOI1&61HgpF#loy>o4tV_;ueROm_yb*_N_H`7|%W#tsJ-a3#i%XaDD)FjZ-# z+^WUGJw`kC7#nx0RRgyEcDEd!c@vi38Cd;|HV=4qhp-6>z?9dPKjPV4!j{Sa8>rPY zg=ap5H7QeQ>|7>SZVUFPdm-x_JE|&jJY32?4f#dpAMn3M6dNU0?yNtHb!T2ZSlR04veg z5ls7n2y?m!Y)Lm=!L9Ya}DZw7C~6GF0iFKA%c!jfz3_( zkI5}&EYP5kxvQh=?Tm+=ciz@l0;ao3$P_0Z3NT4 zXM`=f4D65NpIE-gWWrvZ0d{|3w?RBhAuP%a*k_|ND|nVl*u#Usx?lb!SZI7s*rPqb zdjHDZ$)~*_?B7OUDwDY}PkTjJwid8nI$Hz-`qzZz&IFcWUoDs| zz9H=ML}1U$WCc5!ZwY%k0GQ0ph1>aSOCwBA1z61Q7SDN>PS`eiU?KYR3wV}6ShWnW z;o%NeJj*0(>aUiKeX`i3EShIogjIY6HbVbjcb>f?EGrjS{*Gstd6rF>cN(xeeziY% z_MWhmr@&$>as@-|4}=*+0PD5lm*8ufLs(NkU@z26JM%^666WLqOv74UFfPd>?9Me{ zLD}Ex__U9Nb-oPDpmztsvSvPE^0vT~edGV~X$6E`F$4CrzKLLD{)w;_hk+@&-4ryu z&xD!p1{VB&BmL`Y8m4`Pgmv5itVm_TWB%H{5LTxT?A#zZYn~Mmc3clwO>b?%w%u34 zwC4b;47s?NPy0q#uNlDRAF^r1vtq)mMgiNR)zge;-wEqC7+BvbE5V_&62hkS0yg>U z;(vTvDPe_OfF%Tu5DY`h2>aI_*yi`fzxlLs!or&atM0k0C(nLR_E)~Ky;=|JCs;!I zN!X?;V2gj>5=_@C2#YTUR?)2DBVXh%!alzTmVZ)DooAJVtxp5C^EU;B7te_*uR%&)r8611NLlqsUWR}u-+cPTAC#a8eT17T33K+9sfLoFY*sz zSvJ5Drs@ce@6{2u(gIlGGE>3!&tJk`9sqW(TU)`@=pSKyjDYQEsV&D}TRmYb41gJ^ zM?B%#i5Al3vDeFhrD}dm4RIg0)v`!Ysc6TiGsL@C`UeSVjS`*su)2ojgz2mUqCKwmT_! zCv6Cu_!8KpBme7f;cgh0Tp;Xm0x-KyV+D%?wuG5Q0JDzVd4_-77YTcQAK0=rdjzMD z>=CPze3}Dci~j@G zL%+3PL&lLXjh(>GobkEEr#TT;whq|rBMxhLc7-srrNDZ-Hc#f6GhzGY0lR)nu9#<6 z3Co@aOf9%ZFbcXxn8#>fYwel{mdCCW7CRVNKmUG<_##~h`>P6UP+p`7&s+)Hsst?B z{=XeOb0e(0C9unCM+Mh*gD|aTz_jHH1q=J`gpI0d-q>E#CVcMA7kQJg{4!v3WikcR zJ`cjW7Xcd(_dbSC^CT=Y2bi5jYe6%=MVMSVu!xIm1?D|ZR&8vty?SueqJ^C8UT4zRx^iyAguWgV4ful?fJAo!tSpF_Qo?xFz9_in2`anysisB@o7PXnP>s)ciK+C zf(h$93z$;U9%Vi)gs=gVfhj8XaphSkVRyy@Yx%Q_U^o*-n2kEHbxl_5@@e6O?dc6{ zbJs0`A$9~|&6R;|+}>?GpZ1WjDGI<;P9N~$StMckGQhOmb_*6hq6l-TlxzG3bjTkQ z%BMvWHsLEWS7*U&F@`XgJYd!Zr`qsov4nlk0_J~qUOvwr5oY!Rn5)Gp!E`;2u>3?| z+m}A9<Da>?HPHGPfI0CWg#%tKU#r2drnxvBw(Yr^|#^K3&IS>0`nedD41lv zB&_oQV7ITwsqtyA2s_vdSR1`~!TjwtVe?gh70q4!j8A(**d_&FM=puZbG;?3WfNeX z<(u~6)6xiQRU_NjCnp;&6igq|2{Ww#wkW}L0H2mYn13O#@uL<9Hm)-Xo00>}yK>VP zJ}rx|uW7)Z=9how**n6zBm!HqX~PwsWfL|b23Vr3q888I6E-&tnBy7UYMy-{tS|_e zhlhh;){#S)nJ=)hMYm`1X}N?o_XK9Y-Po|M3|&xAQ|2NpJRLO-4r64rk$u(wa@ S1tYvKgk>)QwrJtt8UF*D?l08< diff --git a/catboost_info/learn_error.tsv b/catboost_info/learn_error.tsv deleted file mode 100644 index 30e49bba..00000000 --- a/catboost_info/learn_error.tsv +++ /dev/null @@ -1,1001 +0,0 @@ -iter Logloss -0 0.6928287833 -1 0.6926164346 -2 0.6924060032 -3 0.6922061951 -4 0.6919050072 -5 0.691670916 -6 0.6914286307 -7 0.6910840058 -8 0.6907501367 -9 0.6905266754 -10 0.6902108601 -11 0.6899110402 -12 0.6897678923 -13 0.6895523065 -14 0.6893331015 -15 0.6889941588 -16 0.6887095933 -17 0.6885156519 -18 0.6882187429 -19 0.6879135541 -20 0.687697466 -21 0.6874472905 -22 0.687284936 -23 0.6870264131 -24 0.6866763484 -25 0.6864787251 -26 0.6862068171 -27 0.686048033 -28 0.6857677154 -29 0.6854892539 -30 0.6852026013 -31 0.6849279945 -32 0.6847059523 -33 0.6845645139 -34 0.6843277955 -35 0.6841055761 -36 0.6838078629 -37 0.683537295 -38 0.6832856679 -39 0.683036311 -40 0.6826603834 -41 0.6825702211 -42 0.6823844966 -43 0.6821721103 -44 0.6819953415 -45 0.6816754017 -46 0.6815330468 -47 0.6812347701 -48 0.6810628101 -49 0.6808755478 -50 0.6807493585 -51 0.6804509029 -52 0.6803251196 -53 0.680213535 -54 0.6798640298 -55 0.6797186547 -56 0.679505348 -57 0.6791986169 -58 0.6790541683 -59 0.6787328061 -60 0.6785615931 -61 0.6783498609 -62 0.6780073876 -63 0.6777334812 -64 0.6773925562 -65 0.6772580202 -66 0.6770390765 -67 0.6768627712 -68 0.6767381944 -69 0.6764800491 -70 0.6763113114 -71 0.6760785307 -72 0.6759073986 -73 0.6756884286 -74 0.6754932357 -75 0.6752823846 -76 0.6750764536 -77 0.6748006547 -78 0.6746149098 -79 0.6743795255 -80 0.6741601159 -81 0.6739583715 -82 0.6736956411 -83 0.6735222682 -84 0.6732040071 -85 0.6730653342 -86 0.6727821352 -87 0.6726847729 -88 0.6724062595 -89 0.6722732874 -90 0.6720428269 -91 0.6718851637 -92 0.6717745622 -93 0.6716173719 -94 0.6714800803 -95 0.6713188357 -96 0.6711623649 -97 0.6709778679 -98 0.6706995134 -99 0.6706233192 -100 0.6703872418 -101 0.6702086988 -102 0.6699334796 -103 0.6697245445 -104 0.6694821826 -105 0.6693429681 -106 0.6692443922 -107 0.6690957163 -108 0.6689903048 -109 0.668850182 -110 0.6686834278 -111 0.6685945587 -112 0.6683676461 -113 0.6682199765 -114 0.6680477742 -115 0.6679219029 -116 0.6678083834 -117 0.6675823422 -118 0.6673951098 -119 0.6672506656 -120 0.6670696664 -121 0.6667165763 -122 0.6665780153 -123 0.6663949212 -124 0.6660985541 -125 0.6658269877 -126 0.6656440187 -127 0.6655221413 -128 0.6653756244 -129 0.6652414277 -130 0.66510967 -131 0.6649534115 -132 0.664709159 -133 0.6644466829 -134 0.6642076197 -135 0.6640760489 -136 0.6638759781 -137 0.6636627943 -138 0.6634215245 -139 0.6633030921 -140 0.6631113541 -141 0.662986964 -142 0.662829127 -143 0.6627006591 -144 0.6624516614 -145 0.6623631013 -146 0.6621185781 -147 0.6619535145 -148 0.6617618135 -149 0.6615291483 -150 0.6612972842 -151 0.6610713393 -152 0.6608558469 -153 0.6605726319 -154 0.6603816831 -155 0.6601677036 -156 0.6600519771 -157 0.6599233624 -158 0.6596793023 -159 0.659501313 -160 0.6592179566 -161 0.6590524625 -162 0.6589222389 -163 0.6587672488 -164 0.6585432905 -165 0.6583341285 -166 0.6581287575 -167 0.658040769 -168 0.657824124 -169 0.6576711522 -170 0.6574105284 -171 0.6573513967 -172 0.6572393594 -173 0.6571337901 -174 0.656967115 -175 0.6567832979 -176 0.6565641804 -177 0.6563728518 -178 0.6561657601 -179 0.655904797 -180 0.6556907144 -181 0.6554749836 -182 0.6552384278 -183 0.6550593705 -184 0.6549176946 -185 0.6547667344 -186 0.6546407621 -187 0.654531388 -188 0.6543715973 -189 0.6542344294 -190 0.653980908 -191 0.6537231655 -192 0.6535846343 -193 0.6532570799 -194 0.6531244226 -195 0.6530105959 -196 0.6528758555 -197 0.6527330184 -198 0.652579639 -199 0.6524510676 -200 0.6523011961 -201 0.6520717755 -202 0.65195605 -203 0.6517967451 -204 0.6516507776 -205 0.6515417944 -206 0.6512425091 -207 0.6511639815 -208 0.6510348185 -209 0.6508672783 -210 0.6507311498 -211 0.6505463552 -212 0.650325255 -213 0.6501750068 -214 0.6499916934 -215 0.6499259299 -216 0.6497298657 -217 0.6496321568 -218 0.6495153521 -219 0.6493507922 -220 0.6491371804 -221 0.6489323062 -222 0.6487269873 -223 0.6485897273 -224 0.6485224681 -225 0.6482982815 -226 0.6481669177 -227 0.6479954591 -228 0.6478675495 -229 0.6477284999 -230 0.6474944265 -231 0.6473038441 -232 0.6470612389 -233 0.6469377301 -234 0.6467344211 -235 0.6465578608 -236 0.6462007877 -237 0.6460313848 -238 0.6458084912 -239 0.645565545 -240 0.6454666549 -241 0.6452336406 -242 0.6450761694 -243 0.6449271099 -244 0.6446656228 -245 0.6444511293 -246 0.6442758803 -247 0.6441133995 -248 0.6439721373 -249 0.6438202551 -250 0.6436297006 -251 0.6435316476 -252 0.6433556983 -253 0.6432501392 -254 0.6430529146 -255 0.6429007964 -256 0.6427050358 -257 0.6425969601 -258 0.64239199 -259 0.6422389106 -260 0.6421388836 -261 0.6418177949 -262 0.6416277654 -263 0.6414999049 -264 0.641403861 -265 0.6412156053 -266 0.6410922328 -267 0.6409248609 -268 0.6408260454 -269 0.6407395757 -270 0.6406765192 -271 0.6405300314 -272 0.6402917271 -273 0.6401005668 -274 0.6399810568 -275 0.6398442654 -276 0.6396609865 -277 0.6395399797 -278 0.6393915779 -279 0.6392510533 -280 0.6390640876 -281 0.6388813133 -282 0.6386231752 -283 0.6384054253 -284 0.6382830578 -285 0.6381060976 -286 0.6379678556 -287 0.637898437 -288 0.6377864434 -289 0.6376816795 -290 0.6374682544 -291 0.6372822114 -292 0.6370751767 -293 0.6369206376 -294 0.6367744339 -295 0.6366542495 -296 0.6364635964 -297 0.6363697405 -298 0.6360921908 -299 0.6359513904 -300 0.6357112166 -301 0.6355495896 -302 0.6354084417 -303 0.6353168145 -304 0.6351611326 -305 0.6350570747 -306 0.6349289594 -307 0.6347149332 -308 0.6345938333 -309 0.6344716645 -310 0.6343805546 -311 0.6342541118 -312 0.6341957596 -313 0.6339729768 -314 0.6337278764 -315 0.6335920365 -316 0.6333865776 -317 0.6331644196 -318 0.6330564327 -319 0.6328799647 -320 0.6326293133 -321 0.6324649571 -322 0.6322994461 -323 0.6321805908 -324 0.6319767135 -325 0.6317227783 -326 0.6315527576 -327 0.6313431718 -328 0.6312776656 -329 0.6310615527 -330 0.6309051025 -331 0.6306737106 -332 0.6304642575 -333 0.6303361181 -334 0.6302354293 -335 0.6301192269 -336 0.629981865 -337 0.6297073564 -338 0.6296129758 -339 0.6294242323 -340 0.6292916404 -341 0.6291595625 -342 0.6290588264 -343 0.6288420988 -344 0.6286427013 -345 0.6284962895 -346 0.6283360565 -347 0.6281451808 -348 0.6280083719 -349 0.6277919523 -350 0.6276657808 -351 0.6275668792 -352 0.6273892886 -353 0.6272167352 -354 0.6270626375 -355 0.6268568126 -356 0.6267554228 -357 0.6266514279 -358 0.6266002689 -359 0.6264469905 -360 0.6262237731 -361 0.6260506135 -362 0.6258476306 -363 0.6256479288 -364 0.6254577162 -365 0.6252714788 -366 0.6250642782 -367 0.6249302091 -368 0.6248063466 -369 0.624690983 -370 0.6244881791 -371 0.6243543796 -372 0.6241406811 -373 0.6240586132 -374 0.6239186862 -375 0.6237425797 -376 0.6235103706 -377 0.6232618576 -378 0.6230423742 -379 0.6228993874 -380 0.6227141417 -381 0.6225744734 -382 0.6224494116 -383 0.6222950807 -384 0.6221331603 -385 0.6219647921 -386 0.6217540633 -387 0.621576683 -388 0.6214684761 -389 0.6213231941 -390 0.6210937545 -391 0.6209777285 -392 0.6208072926 -393 0.6206963867 -394 0.6204372677 -395 0.6202551767 -396 0.6200011736 -397 0.6198859016 -398 0.6197676271 -399 0.6196238705 -400 0.6194628335 -401 0.6192820561 -402 0.6191287958 -403 0.6190112194 -404 0.6188244898 -405 0.6186323589 -406 0.618501291 -407 0.618335109 -408 0.6182382013 -409 0.6180877322 -410 0.6178987142 -411 0.6177274632 -412 0.6175628143 -413 0.6173870936 -414 0.617243719 -415 0.617076468 -416 0.6169526231 -417 0.6167942897 -418 0.6164803784 -419 0.6163095595 -420 0.6161848351 -421 0.6160444539 -422 0.6158717535 -423 0.6156687018 -424 0.6155442288 -425 0.6153987844 -426 0.6150702755 -427 0.6148315705 -428 0.6146912117 -429 0.6145858122 -430 0.6144470683 -431 0.6143511808 -432 0.614153372 -433 0.6140563648 -434 0.6138333404 -435 0.613673912 -436 0.613576502 -437 0.6133663253 -438 0.6132683391 -439 0.6131613093 -440 0.6129250814 -441 0.6128435837 -442 0.612668239 -443 0.6125632313 -444 0.6122853605 -445 0.612130259 -446 0.6119902833 -447 0.6118376246 -448 0.6117137681 -449 0.6115924957 -450 0.6113412557 -451 0.6111673834 -452 0.6109274262 -453 0.6108157003 -454 0.6106415561 -455 0.6104567948 -456 0.6103790373 -457 0.6102637745 -458 0.6100885733 -459 0.6098868869 -460 0.6095725763 -461 0.6093974847 -462 0.6092903271 -463 0.6091473356 -464 0.6089835447 -465 0.6087066913 -466 0.6084564614 -467 0.6082511926 -468 0.6081150344 -469 0.6079835426 -470 0.607821293 -471 0.6076626389 -472 0.6074862958 -473 0.6072599715 -474 0.607132385 -475 0.6069274992 -476 0.6067469422 -477 0.6066197488 -478 0.6064370432 -479 0.6062565573 -480 0.6060803436 -481 0.6058863889 -482 0.6057108685 -483 0.6055753117 -484 0.6054485469 -485 0.6052253509 -486 0.6051180262 -487 0.6049694509 -488 0.6047492718 -489 0.6046068876 -490 0.6044819774 -491 0.6042493579 -492 0.6039649679 -493 0.6037830331 -494 0.6034944903 -495 0.6031894111 -496 0.6030692694 -497 0.602857329 -498 0.6027120707 -499 0.6025975162 -500 0.6023946798 -501 0.6022233018 -502 0.6020096537 -503 0.6017527374 -504 0.6016262717 -505 0.6014828534 -506 0.6013815306 -507 0.6010625342 -508 0.6009207315 -509 0.6007574298 -510 0.6005437978 -511 0.6003599775 -512 0.600228366 -513 0.6000519316 -514 0.5998173338 -515 0.5996808159 -516 0.5994794911 -517 0.5993400552 -518 0.5991918493 -519 0.5990687744 -520 0.5989251275 -521 0.5987484682 -522 0.598539905 -523 0.5983243863 -524 0.598140471 -525 0.5979920466 -526 0.5978144014 -527 0.5976198173 -528 0.5973817659 -529 0.5970926086 -530 0.5968562337 -531 0.5965884118 -532 0.5963067416 -533 0.596152156 -534 0.5959415132 -535 0.5957594547 -536 0.5955065894 -537 0.5953756532 -538 0.595092336 -539 0.5949285408 -540 0.5947331968 -541 0.5945482366 -542 0.5944289428 -543 0.594254527 -544 0.5941060575 -545 0.5939215336 -546 0.5937015993 -547 0.593632453 -548 0.5934795942 -549 0.5932974668 -550 0.5931481645 -551 0.5930201136 -552 0.5927748207 -553 0.5925972796 -554 0.5923743694 -555 0.5921400612 -556 0.5919419924 -557 0.591639888 -558 0.5914261055 -559 0.5913167288 -560 0.5910459835 -561 0.590899325 -562 0.5906364836 -563 0.5904312804 -564 0.5902427931 -565 0.5899763873 -566 0.5896645423 -567 0.5893953601 -568 0.5892079017 -569 0.5890369001 -570 0.5888700644 -571 0.5886944212 -572 0.5885472318 -573 0.5882955796 -574 0.588177907 -575 0.5880087151 -576 0.5878877522 -577 0.5877394438 -578 0.5875354276 -579 0.5873781879 -580 0.5871570215 -581 0.5869408178 -582 0.5867958342 -583 0.5866464684 -584 0.5864211198 -585 0.5861778077 -586 0.5860218984 -587 0.5858051579 -588 0.5856502809 -589 0.5855076758 -590 0.5853526765 -591 0.5852234908 -592 0.5849590421 -593 0.5847811281 -594 0.5846573345 -595 0.5844178553 -596 0.5842622801 -597 0.5841617009 -598 0.5839732073 -599 0.5838466201 -600 0.5836809592 -601 0.5834816861 -602 0.5832933774 -603 0.5830915643 -604 0.5828762469 -605 0.5827102786 -606 0.5825584191 -607 0.5823849377 -608 0.5822421333 -609 0.5820446465 -610 0.5819186008 -611 0.581712043 -612 0.581418597 -613 0.5812617905 -614 0.5811345824 -615 0.5809945797 -616 0.5807703215 -617 0.5806810234 -618 0.5804906681 -619 0.5802844937 -620 0.5801082221 -621 0.5798591849 -622 0.5796337432 -623 0.5794423033 -624 0.5792417402 -625 0.5790863885 -626 0.5789031467 -627 0.5788019539 -628 0.5785530882 -629 0.5783661907 -630 0.5780794351 -631 0.5777616782 -632 0.57746221 -633 0.5772864292 -634 0.5771663299 -635 0.5769549527 -636 0.5766596787 -637 0.5765605303 -638 0.576398549 -639 0.5762556725 -640 0.5761487527 -641 0.5758335528 -642 0.5756773535 -643 0.5754980346 -644 0.5753363568 -645 0.5751553704 -646 0.574994782 -647 0.5746520685 -648 0.5744786518 -649 0.5743093647 -650 0.5740378195 -651 0.5738607313 -652 0.5736602143 -653 0.5735057779 -654 0.5733589489 -655 0.5732260899 -656 0.5730274171 -657 0.5728035078 -658 0.5726621361 -659 0.5724996493 -660 0.572275212 -661 0.5721652811 -662 0.5719889143 -663 0.5717793936 -664 0.5715225666 -665 0.5713071394 -666 0.5711611734 -667 0.5709508581 -668 0.5708466585 -669 0.5706789963 -670 0.5705145294 -671 0.5703594655 -672 0.570233263 -673 0.5700568003 -674 0.5698230012 -675 0.5696445855 -676 0.5694219371 -677 0.5691902986 -678 0.568975701 -679 0.5687357631 -680 0.5686058667 -681 0.5684074399 -682 0.5683267239 -683 0.5681378304 -684 0.5679212045 -685 0.5677783883 -686 0.5675905176 -687 0.5674470133 -688 0.5672686787 -689 0.5671459155 -690 0.5669955805 -691 0.5666697152 -692 0.566539699 -693 0.5663154141 -694 0.5661290985 -695 0.5660170629 -696 0.5658454568 -697 0.5657412965 -698 0.565656909 -699 0.5654805971 -700 0.565362411 -701 0.5652005669 -702 0.5650263732 -703 0.5648323631 -704 0.5645947556 -705 0.5644599485 -706 0.564204921 -707 0.5640519764 -708 0.5639119189 -709 0.5637137979 -710 0.5635321559 -711 0.5633965376 -712 0.5631966568 -713 0.5629439664 -714 0.5627552647 -715 0.5626807493 -716 0.5624805497 -717 0.5623499406 -718 0.5621985714 -719 0.5620233085 -720 0.5619094409 -721 0.5617663317 -722 0.5615274657 -723 0.5614016072 -724 0.5612694287 -725 0.5610634381 -726 0.5608926924 -727 0.5607440575 -728 0.5606459699 -729 0.5604593988 -730 0.5602402607 -731 0.5600333014 -732 0.5598194436 -733 0.5597098828 -734 0.5595499759 -735 0.559324633 -736 0.5591558322 -737 0.558980647 -738 0.5588159007 -739 0.5586143253 -740 0.5584324854 -741 0.5582234063 -742 0.5580350105 -743 0.5578868641 -744 0.5577588577 -745 0.5576122867 -746 0.5575166974 -747 0.5574477164 -748 0.5573025254 -749 0.5571818754 -750 0.5570053351 -751 0.5567012378 -752 0.5565143939 -753 0.5563202494 -754 0.5561048874 -755 0.5560310721 -756 0.5559032035 -757 0.5556773884 -758 0.5554237404 -759 0.5552554185 -760 0.5551290079 -761 0.5549633835 -762 0.5548311341 -763 0.5546711171 -764 0.5545365493 -765 0.5544011318 -766 0.5542163136 -767 0.5540799772 -768 0.5539516357 -769 0.553717142 -770 0.5535495657 -771 0.553403792 -772 0.5532358044 -773 0.5530988019 -774 0.5529529706 -775 0.5527736306 -776 0.5525740784 -777 0.5523988589 -778 0.5522617496 -779 0.5520769314 -780 0.5519216436 -781 0.5517846698 -782 0.5516019696 -783 0.5515248823 -784 0.551412334 -785 0.551316933 -786 0.5512066025 -787 0.5510420861 -788 0.5508210285 -789 0.5506904058 -790 0.5504929906 -791 0.5502393339 -792 0.5500673218 -793 0.5498658881 -794 0.5497903262 -795 0.5496638458 -796 0.5494455014 -797 0.5492022359 -798 0.5490872019 -799 0.5489065226 -800 0.5487057435 -801 0.5485074883 -802 0.5483695235 -803 0.5481713053 -804 0.5480101384 -805 0.5478715915 -806 0.5475953509 -807 0.547408714 -808 0.5472241436 -809 0.547046197 -810 0.5468800084 -811 0.5466156398 -812 0.5465582902 -813 0.5463975279 -814 0.546287305 -815 0.5461004895 -816 0.5458764408 -817 0.5457505651 -818 0.5455673223 -819 0.5453657635 -820 0.5451750098 -821 0.5450580229 -822 0.5448891122 -823 0.5447159953 -824 0.5445744778 -825 0.5443809225 -826 0.5442042196 -827 0.5439359693 -828 0.5436948438 -829 0.5435238046 -830 0.5433885592 -831 0.5432087084 -832 0.5429354732 -833 0.5427264428 -834 0.5424446678 -835 0.5423728941 -836 0.5422192589 -837 0.5420059953 -838 0.5419305179 -839 0.5416955576 -840 0.5415667697 -841 0.5414730371 -842 0.5413254033 -843 0.541134908 -844 0.541011651 -845 0.5408742065 -846 0.5407677399 -847 0.5405882682 -848 0.5404063591 -849 0.5402199597 -850 0.5400828497 -851 0.5399611765 -852 0.5396695028 -853 0.5394488059 -854 0.5391908301 -855 0.5390772765 -856 0.5388830726 -857 0.5387260102 -858 0.5385718663 -859 0.5384163577 -860 0.5382201659 -861 0.5379996906 -862 0.5378266584 -863 0.5376524191 -864 0.5375314462 -865 0.5374158523 -866 0.5373387291 -867 0.5371031689 -868 0.5369876964 -869 0.5368424466 -870 0.5366527847 -871 0.5364835345 -872 0.5363997115 -873 0.5362290419 -874 0.5361499667 -875 0.5359272704 -876 0.5357993232 -877 0.5356482822 -878 0.5355361733 -879 0.5354460196 -880 0.5352588228 -881 0.53512148 -882 0.5350096075 -883 0.5348475038 -884 0.534620608 -885 0.5345059191 -886 0.5343386233 -887 0.5341194767 -888 0.533889748 -889 0.5337391311 -890 0.5335737931 -891 0.5334144509 -892 0.5332543181 -893 0.5330324114 -894 0.532823744 -895 0.5326132813 -896 0.532559536 -897 0.5323901087 -898 0.532317485 -899 0.5321770734 -900 0.5319322789 -901 0.5316690346 -902 0.5315424691 -903 0.5313859248 -904 0.531195805 -905 0.5310412898 -906 0.5309069909 -907 0.5308202803 -908 0.5306762481 -909 0.5305210105 -910 0.5303613837 -911 0.5301894383 -912 0.5300110846 -913 0.5298896467 -914 0.5297722075 -915 0.5295404489 -916 0.5294298694 -917 0.5292101992 -918 0.5289950717 -919 0.5288228305 -920 0.5286330477 -921 0.5284490903 -922 0.5283180803 -923 0.5281316824 -924 0.5279960696 -925 0.5277708018 -926 0.5275788182 -927 0.5274954053 -928 0.5273939801 -929 0.5271941343 -930 0.5270978216 -931 0.5269792396 -932 0.5268377973 -933 0.5267032069 -934 0.5265548995 -935 0.5264515743 -936 0.5262363111 -937 0.5262123118 -938 0.5261404386 -939 0.5260256059 -940 0.5259196314 -941 0.5257448753 -942 0.5255640861 -943 0.5254048598 -944 0.5252093179 -945 0.5250705737 -946 0.5249127042 -947 0.5248016433 -948 0.5245889009 -949 0.5244611525 -950 0.52435538 -951 0.5242868134 -952 0.5241478183 -953 0.523947669 -954 0.5237888331 -955 0.5236090071 -956 0.5234509657 -957 0.5232790155 -958 0.5230899075 -959 0.5229585604 -960 0.5228564751 -961 0.5226973984 -962 0.522581195 -963 0.5224049925 -964 0.5221831982 -965 0.5220633205 -966 0.5218727774 -967 0.5217142792 -968 0.5216137175 -969 0.521431127 -970 0.5212491425 -971 0.5210412582 -972 0.5209096834 -973 0.5206924059 -974 0.5204450378 -975 0.5203452705 -976 0.5201276544 -977 0.5200265373 -978 0.5199170844 -979 0.5197050537 -980 0.5195470424 -981 0.5194250506 -982 0.5193402584 -983 0.5191450323 -984 0.5190161094 -985 0.5188890325 -986 0.518662949 -987 0.5185427602 -988 0.518436865 -989 0.5183853031 -990 0.5182570586 -991 0.5181277957 -992 0.5179707171 -993 0.5178342938 -994 0.5176966263 -995 0.5175970443 -996 0.5174165617 -997 0.5172515223 -998 0.5170768331 -999 0.5169045154 diff --git a/catboost_info/time_left.tsv b/catboost_info/time_left.tsv deleted file mode 100644 index ad79a73b..00000000 --- a/catboost_info/time_left.tsv +++ /dev/null @@ -1,1001 +0,0 @@ -iter Passed Remaining -0 1 1348 -1 2 1277 -2 4 1445 -3 5 1434 -4 6 1363 -5 7 1307 -6 9 1304 -7 10 1291 -8 11 1277 -9 12 1274 -10 14 1259 -11 15 1239 -12 16 1238 -13 17 1244 -14 18 1230 -15 19 1223 -16 21 1215 -17 22 1207 -18 23 1197 -19 24 1188 -20 25 1188 -21 26 1185 -22 27 1183 -23 29 1180 -24 30 1177 -25 31 1171 -26 32 1164 -27 33 1162 -28 34 1159 -29 35 1156 -30 37 1177 -31 38 1173 -32 39 1169 -33 41 1166 -34 42 1164 -35 43 1159 -36 44 1154 -37 45 1151 -38 46 1148 -39 47 1145 -40 48 1141 -41 49 1136 -42 51 1146 -43 52 1145 -44 53 1142 -45 54 1138 -46 55 1134 -47 57 1131 -48 58 1127 -49 59 1125 -50 60 1123 -51 61 1120 -52 62 1117 -53 63 1117 -54 64 1114 -55 66 1113 -56 67 1113 -57 68 1110 -58 69 1106 -59 70 1105 -60 71 1104 -61 72 1101 -62 73 1099 -63 74 1095 -64 75 1093 -65 77 1090 -66 78 1088 -67 79 1086 -68 80 1084 -69 81 1082 -70 82 1081 -71 83 1081 -72 85 1080 -73 86 1078 -74 87 1076 -75 88 1075 -76 89 1073 -77 90 1072 -78 91 1072 -79 93 1069 -80 94 1068 -81 95 1066 -82 96 1064 -83 97 1062 -84 98 1062 -85 99 1060 -86 100 1058 -87 101 1056 -88 103 1054 -89 104 1052 -90 105 1050 -91 106 1048 -92 107 1048 -93 108 1046 -94 109 1044 -95 110 1042 -96 111 1041 -97 113 1040 -98 114 1038 -99 115 1036 -100 116 1034 -101 117 1033 -102 118 1030 -103 119 1030 -104 120 1028 -105 121 1026 -106 122 1025 -107 123 1023 -108 125 1023 -109 126 1022 -110 127 1020 -111 128 1020 -112 129 1019 -113 130 1017 -114 131 1015 -115 133 1014 -116 134 1013 -117 135 1012 -118 136 1011 -119 137 1010 -120 138 1009 -121 140 1007 -122 141 1007 -123 142 1006 -124 143 1004 -125 144 1002 -126 145 1001 -127 146 999 -128 147 997 -129 148 996 -130 150 995 -131 151 993 -132 152 991 -133 153 990 -134 154 989 -135 155 987 -136 156 985 -137 157 985 -138 159 988 -139 160 986 -140 161 985 -141 163 984 -142 164 983 -143 165 982 -144 167 985 -145 168 984 -146 169 982 -147 170 981 -148 171 980 -149 172 979 -150 173 977 -151 175 977 -152 176 976 -153 177 974 -154 178 973 -155 179 971 -156 180 970 -157 181 968 -158 182 967 -159 184 967 -160 185 967 -161 186 966 -162 188 965 -163 189 963 -164 190 962 -165 191 961 -166 192 959 -167 193 958 -168 194 956 -169 195 955 -170 196 954 -171 197 952 -172 198 951 -173 200 949 -174 201 948 -175 202 946 -176 203 945 -177 204 943 -178 205 942 -179 206 940 -180 208 942 -181 209 941 -182 210 939 -183 211 938 -184 212 937 -185 213 936 -186 215 934 -187 216 933 -188 217 932 -189 218 930 -190 219 929 -191 220 928 -192 221 926 -193 222 925 -194 223 924 -195 225 923 -196 226 921 -197 227 921 -198 228 920 -199 229 918 -200 230 916 -201 231 915 -202 233 914 -203 234 913 -204 235 912 -205 236 910 -206 237 909 -207 238 908 -208 239 906 -209 240 905 -210 241 904 -211 243 903 -212 244 902 -213 245 901 -214 246 899 -215 247 898 -216 248 897 -217 249 896 -218 250 894 -219 252 893 -220 253 892 -221 254 891 -222 255 889 -223 256 888 -224 257 887 -225 258 886 -226 259 885 -227 261 884 -228 262 882 -229 263 881 -230 264 880 -231 265 879 -232 266 878 -233 267 876 -234 269 875 -235 270 874 -236 271 872 -237 272 871 -238 273 870 -239 274 869 -240 275 867 -241 276 867 -242 277 865 -243 279 864 -244 280 863 -245 281 862 -246 282 861 -247 283 860 -248 284 859 -249 285 857 -250 287 856 -251 288 855 -252 289 853 -253 290 852 -254 291 851 -255 292 850 -256 293 848 -257 294 847 -258 295 846 -259 296 844 -260 297 843 -261 299 842 -262 300 841 -263 301 839 -264 302 838 -265 303 837 -266 304 836 -267 305 834 -268 306 833 -269 307 832 -270 308 831 -271 310 829 -272 311 828 -273 312 827 -274 313 825 -275 314 824 -276 315 823 -277 316 822 -278 317 820 -279 318 819 -280 319 818 -281 320 817 -282 322 816 -283 323 815 -284 324 813 -285 325 812 -286 326 811 -287 327 810 -288 328 809 -289 330 808 -290 331 807 -291 332 806 -292 333 804 -293 334 803 -294 335 802 -295 336 801 -296 337 799 -297 339 798 -298 340 797 -299 341 796 -300 342 795 -301 343 794 -302 344 793 -303 345 792 -304 347 790 -305 348 789 -306 349 788 -307 350 787 -308 351 786 -309 352 784 -310 353 783 -311 354 782 -312 355 781 -313 357 780 -314 358 778 -315 359 778 -316 361 777 -317 362 776 -318 363 775 -319 364 774 -320 365 772 -321 366 771 -322 367 770 -323 368 768 -324 369 767 -325 370 766 -326 371 765 -327 372 764 -328 374 762 -329 375 761 -330 376 760 -331 377 759 -332 378 757 -333 379 756 -334 380 755 -335 381 754 -336 382 752 -337 383 751 -338 385 750 -339 386 749 -340 387 748 -341 388 746 -342 389 745 -343 390 744 -344 391 743 -345 392 742 -346 393 741 -347 394 740 -348 396 738 -349 397 737 -350 398 736 -351 399 735 -352 400 734 -353 401 733 -354 402 731 -355 403 730 -356 404 729 -357 406 728 -358 407 727 -359 408 726 -360 409 725 -361 410 723 -362 411 722 -363 412 721 -364 414 720 -365 415 719 -366 416 717 -367 417 716 -368 418 715 -369 419 714 -370 420 713 -371 421 711 -372 422 710 -373 423 709 -374 425 708 -375 426 707 -376 427 705 -377 428 704 -378 429 703 -379 430 702 -380 431 701 -381 433 700 -382 434 699 -383 435 698 -384 436 697 -385 437 695 -386 438 694 -387 439 693 -388 441 692 -389 442 691 -390 443 690 -391 444 689 -392 445 688 -393 446 687 -394 447 686 -395 448 684 -396 450 683 -397 451 682 -398 452 681 -399 453 680 -400 454 678 -401 455 677 -402 456 676 -403 457 675 -404 458 673 -405 460 673 -406 461 672 -407 462 671 -408 463 670 -409 465 669 -410 466 667 -411 467 666 -412 468 665 -413 469 664 -414 470 663 -415 471 662 -416 472 660 -417 473 659 -418 475 658 -419 476 657 -420 477 656 -421 478 655 -422 479 653 -423 480 653 -424 481 651 -425 482 650 -426 484 649 -427 485 648 -428 486 647 -429 487 645 -430 488 644 -431 489 643 -432 490 642 -433 491 641 -434 493 640 -435 494 639 -436 495 638 -437 496 637 -438 497 635 -439 498 634 -440 499 633 -441 501 632 -442 502 631 -443 503 630 -444 504 628 -445 505 627 -446 506 626 -447 507 625 -448 508 624 -449 510 623 -450 511 622 -451 512 620 -452 513 619 -453 514 618 -454 515 617 -455 516 616 -456 517 615 -457 518 614 -458 520 612 -459 521 611 -460 522 610 -461 523 609 -462 524 608 -463 525 607 -464 526 605 -465 527 604 -466 528 603 -467 529 602 -468 530 601 -469 532 600 -470 533 599 -471 534 597 -472 535 596 -473 536 595 -474 537 594 -475 539 593 -476 540 592 -477 541 591 -478 542 590 -479 543 589 -480 544 587 -481 546 586 -482 547 585 -483 548 584 -484 549 583 -485 550 582 -486 551 581 -487 552 580 -488 554 578 -489 555 578 -490 556 576 -491 557 575 -492 558 574 -493 559 573 -494 561 572 -495 562 571 -496 563 570 -497 564 568 -498 565 567 -499 566 566 -500 567 565 -501 568 564 -502 569 563 -503 571 561 -504 572 560 -505 573 559 -506 574 558 -507 575 557 -508 576 556 -509 577 555 -510 578 553 -511 579 552 -512 581 551 -513 582 550 -514 583 549 -515 584 548 -516 585 546 -517 586 545 -518 588 545 -519 589 543 -520 590 542 -521 591 541 -522 592 540 -523 593 539 -524 594 538 -525 595 537 -526 597 535 -527 598 534 -528 599 533 -529 600 532 -530 601 531 -531 602 530 -532 603 528 -533 604 527 -534 606 526 -535 607 525 -536 608 524 -537 609 523 -538 610 522 -539 611 521 -540 612 520 -541 614 518 -542 615 517 -543 616 516 -544 617 515 -545 618 514 -546 619 512 -547 620 511 -548 621 510 -549 622 509 -550 624 508 -551 625 507 -552 626 506 -553 627 505 -554 628 503 -555 629 502 -556 630 501 -557 631 500 -558 632 499 -559 634 498 -560 635 497 -561 636 496 -562 638 495 -563 639 494 -564 640 492 -565 641 491 -566 642 490 -567 643 489 -568 644 488 -569 645 487 -570 646 486 -571 647 484 -572 649 483 -573 650 482 -574 651 481 -575 652 480 -576 653 479 -577 654 478 -578 655 476 -579 657 475 -580 658 475 -581 659 473 -582 660 472 -583 662 471 -584 663 470 -585 664 469 -586 665 468 -587 666 467 -588 667 465 -589 668 464 -590 670 463 -591 671 462 -592 672 461 -593 673 460 -594 674 459 -595 675 457 -596 676 456 -597 677 455 -598 678 454 -599 679 453 -600 681 452 -601 682 450 -602 683 449 -603 684 448 -604 685 447 -605 686 446 -606 687 445 -607 688 444 -608 690 443 -609 691 441 -610 692 440 -611 693 439 -612 694 438 -613 695 437 -614 696 436 -615 697 434 -616 698 433 -617 699 432 -618 701 431 -619 702 430 -620 703 429 -621 704 428 -622 705 426 -623 706 425 -624 707 424 -625 708 423 -626 710 422 -627 711 421 -628 712 420 -629 713 419 -630 714 417 -631 715 416 -632 716 415 -633 718 414 -634 719 413 -635 720 412 -636 721 411 -637 722 409 -638 723 408 -639 724 407 -640 725 406 -641 726 405 -642 728 404 -643 729 403 -644 730 401 -645 731 400 -646 732 399 -647 733 398 -648 734 397 -649 735 396 -650 736 394 -651 737 393 -652 738 392 -653 740 391 -654 741 390 -655 742 389 -656 743 388 -657 744 387 -658 745 385 -659 746 384 -660 747 383 -661 749 382 -662 750 381 -663 751 380 -664 752 378 -665 753 377 -666 754 376 -667 755 375 -668 756 374 -669 757 373 -670 758 372 -671 760 370 -672 761 369 -673 762 368 -674 763 367 -675 764 366 -676 765 365 -677 766 364 -678 767 363 -679 769 361 -680 770 360 -681 771 359 -682 772 358 -683 773 357 -684 774 356 -685 775 355 -686 776 353 -687 778 352 -688 779 351 -689 780 350 -690 781 349 -691 782 348 -692 783 347 -693 784 346 -694 786 345 -695 787 343 -696 788 342 -697 789 341 -698 790 340 -699 791 339 -700 792 338 -701 793 337 -702 795 335 -703 796 334 -704 797 333 -705 799 332 -706 800 331 -707 801 330 -708 802 329 -709 803 328 -710 804 327 -711 805 325 -712 807 324 -713 808 323 -714 809 322 -715 810 321 -716 811 320 -717 812 319 -718 813 318 -719 815 316 -720 816 315 -721 817 314 -722 818 313 -723 819 312 -724 823 312 -725 827 312 -726 828 311 -727 831 310 -728 833 309 -729 834 308 -730 835 307 -731 836 306 -732 837 305 -733 838 304 -734 840 303 -735 842 302 -736 843 300 -737 844 299 -738 845 298 -739 846 297 -740 847 296 -741 848 295 -742 849 293 -743 850 292 -744 852 291 -745 853 290 -746 854 289 -747 855 288 -748 856 287 -749 858 286 -750 859 284 -751 860 283 -752 861 282 -753 862 281 -754 863 280 -755 865 279 -756 866 278 -757 867 276 -758 868 275 -759 869 274 -760 870 273 -761 871 272 -762 873 271 -763 874 270 -764 875 269 -765 876 267 -766 877 266 -767 878 265 -768 880 264 -769 881 263 -770 882 262 -771 883 260 -772 884 259 -773 885 258 -774 887 257 -775 888 256 -776 889 255 -777 890 254 -778 891 253 -779 892 251 -780 894 250 -781 895 249 -782 896 248 -783 897 247 -784 898 246 -785 899 245 -786 901 243 -787 902 242 -788 903 241 -789 904 240 -790 905 239 -791 906 238 -792 908 237 -793 909 235 -794 910 234 -795 911 233 -796 912 232 -797 913 231 -798 914 230 -799 916 229 -800 917 227 -801 918 226 -802 919 225 -803 920 224 -804 921 223 -805 923 222 -806 924 221 -807 925 219 -808 926 218 -809 927 217 -810 928 216 -811 930 215 -812 931 214 -813 932 213 -814 933 211 -815 934 210 -816 935 209 -817 937 208 -818 938 207 -819 939 206 -820 940 205 -821 941 203 -822 943 202 -823 944 201 -824 945 200 -825 946 199 -826 948 198 -827 949 197 -828 950 196 -829 951 194 -830 953 193 -831 954 192 -832 955 191 -833 957 190 -834 958 189 -835 959 188 -836 960 187 -837 962 186 -838 963 184 -839 964 183 -840 965 182 -841 967 181 -842 968 180 -843 969 179 -844 970 178 -845 972 176 -846 973 175 -847 974 174 -848 975 173 -849 977 172 -850 978 171 -851 979 170 -852 980 168 -853 982 167 -854 983 166 -855 984 165 -856 985 164 -857 987 163 -858 988 162 -859 990 161 -860 991 160 -861 992 158 -862 993 157 -863 995 156 -864 996 155 -865 998 154 -866 999 153 -867 1000 152 -868 1002 151 -869 1003 149 -870 1004 148 -871 1005 147 -872 1007 146 -873 1008 145 -874 1010 144 -875 1011 143 -876 1013 142 -877 1014 141 -878 1016 139 -879 1017 138 -880 1019 137 -881 1020 136 -882 1021 135 -883 1023 134 -884 1025 133 -885 1026 132 -886 1027 130 -887 1029 129 -888 1030 128 -889 1031 127 -890 1033 126 -891 1034 125 -892 1035 124 -893 1036 122 -894 1038 121 -895 1039 120 -896 1040 119 -897 1041 118 -898 1043 117 -899 1044 116 -900 1045 114 -901 1046 113 -902 1048 112 -903 1049 111 -904 1050 110 -905 1051 109 -906 1052 107 -907 1054 106 -908 1055 105 -909 1056 104 -910 1057 103 -911 1059 102 -912 1060 101 -913 1061 99 -914 1062 98 -915 1064 97 -916 1065 96 -917 1066 95 -918 1067 94 -919 1069 92 -920 1070 91 -921 1071 90 -922 1072 89 -923 1073 88 -924 1074 87 -925 1076 85 -926 1077 84 -927 1078 83 -928 1079 82 -929 1080 81 -930 1082 80 -931 1083 79 -932 1084 77 -933 1085 76 -934 1086 75 -935 1087 74 -936 1088 73 -937 1090 72 -938 1091 70 -939 1092 69 -940 1093 68 -941 1094 67 -942 1095 66 -943 1097 65 -944 1098 63 -945 1099 62 -946 1100 61 -947 1101 60 -948 1103 59 -949 1104 58 -950 1105 56 -951 1106 55 -952 1107 54 -953 1108 53 -954 1109 52 -955 1110 51 -956 1111 49 -957 1113 48 -958 1114 47 -959 1115 46 -960 1116 45 -961 1118 44 -962 1119 43 -963 1120 41 -964 1121 40 -965 1122 39 -966 1123 38 -967 1124 37 -968 1126 36 -969 1127 34 -970 1128 33 -971 1129 32 -972 1130 31 -973 1131 30 -974 1132 29 -975 1133 27 -976 1135 26 -977 1136 25 -978 1137 24 -979 1139 23 -980 1140 22 -981 1141 20 -982 1142 19 -983 1143 18 -984 1145 17 -985 1146 16 -986 1147 15 -987 1148 13 -988 1150 12 -989 1151 11 -990 1152 10 -991 1153 9 -992 1154 8 -993 1155 6 -994 1156 5 -995 1157 4 -996 1159 3 -997 1160 2 -998 1161 1 -999 1162 0 From b2c47a39576405fee1cc01b9a500264e88235f70 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Wed, 14 Jan 2026 23:09:29 -0500 Subject: [PATCH 18/29] Resolve coderabbit comments --- .gitignore | 2 +- examples/ept_attack/run_ept_attack.py | 12 ++--- .../attacks/ept_attack/test_classification.py | 50 +++++++------------ 3 files changed, 24 insertions(+), 40 deletions(-) diff --git a/.gitignore b/.gitignore index a62ff834..c440f287 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,4 @@ tests/integration/attacks/tartan_federer/assets/tartan_federer_attack_results *.out +# CatBoost training artifacts -+catboost_info/ \ No newline at end of file ++catboost_info/ diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 7870f669..ac43405e 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -162,7 +162,7 @@ def run_attack_classifier_training(config: DictConfig) -> None: train_labels = df_train_features["is_train"] df_train_features = df_train_features.drop(columns=["is_train"]) - test_feature_files = sorted_feature_files[26:] + test_feature_files = sorted_feature_files[25:] df_test_features = pd.concat([pd.read_csv(f) for f in test_feature_files], ignore_index=True) test_labels = df_test_features["is_train"] df_test_features = df_test_features.drop(columns=["is_train"]) @@ -207,22 +207,22 @@ def run_attack_classifier_training(config: DictConfig) -> None: col_name = col_name.replace("_at_", "_").replace(".0", "") row[f"{diffusion_model_name}_{col_name}"] = score_value - trianing_directory_name = f"{classifier}_" + "_".join(selected_columns_tuple) - trianing_output_path = output_summary_path / trianing_directory_name - trianing_output_path.mkdir(parents=True, exist_ok=True) + training_directory_name = f"{classifier}_" + "_".join(selected_columns_tuple) + training_output_path = output_summary_path / training_directory_name + training_output_path.mkdir(parents=True, exist_ok=True) # Save prediction results prediction_results_df = results["prediction_results"] prediction_results_file_name = f"{diffusion_model_name}_prediction_results.csv" save_dataframe( df=pd.DataFrame(prediction_results_df), - file_path=trianing_output_path, + file_path=training_output_path, file_name=prediction_results_file_name, ) # Save scores scores_file_name = f"{diffusion_model_name}_results.txt" - with open(trianing_output_path / scores_file_name, "w") as f: + with open(training_output_path / scores_file_name, "w") as f: for score_name, score_value in results["scores"].items(): f.write(f"{score_name}: {score_value}\n") diff --git a/tests/unit/attacks/ept_attack/test_classification.py b/tests/unit/attacks/ept_attack/test_classification.py index d646db4e..ca4753f1 100644 --- a/tests/unit/attacks/ept_attack/test_classification.py +++ b/tests/unit/attacks/ept_attack/test_classification.py @@ -1,15 +1,16 @@ +from unittest.mock import MagicMock, patch + import numpy as np import pandas as pd import pytest import torch -from unittest.mock import patch, MagicMock from midst_toolkit.attacks.ept.classification import ( - filter_data, MLPClassifier, - train_mlp, + filter_data, get_scores, train_attack_classifier, + train_mlp, ) @@ -22,7 +23,7 @@ def sample_features_df(): "feature2_error_ratio": [0.01, 0.02, 0.03], "feature3_accuracy": [0.9, 0.8, 0.7], "feature4_prediction": [1, 0, 1], - "another_feature": [4, 5, 6], + "another_feature": [4, 5, 6], } return pd.DataFrame(data) @@ -69,7 +70,7 @@ def test_mlp_classifier(): input_tensor = torch.randn(4, input_size) output = model(input_tensor) assert output.shape == (4, output_size) - assert torch.all(output >= 0) and torch.all(output <= 1) + assert torch.all(output >= 0) and torch.all(output <= 1) @patch("midst_toolkit.attacks.ept.classification.MLPClassifier") @@ -81,13 +82,11 @@ def test_train_mlp(mock_mlp_class): mock_model.return_value = torch.rand(10, 1, requires_grad=True) eval_output_mock = MagicMock() - eval_output_mock.squeeze.return_value.cpu.return_value.numpy.return_value = np.array( - [0.6, 0.4, 0.7] - ) + eval_output_mock.squeeze.return_value.cpu.return_value.numpy.return_value = np.array([0.6, 0.4, 0.7]) mock_model.side_effect = [ torch.rand(10, 1, requires_grad=True), # 1st call (training) - eval_output_mock, # 2nd call (evaluation) + eval_output_mock, # 2nd call (evaluation) ] mock_mlp_class.return_value.to.return_value = mock_model @@ -111,9 +110,7 @@ def test_train_mlp(mock_mlp_class): ] # Test with eval=False - y_pred_no_eval, y_proba_no_eval = train_mlp( - x_train, y_train, x_test, device, eval=False, epochs=1 - ) + y_pred_no_eval, y_proba_no_eval = train_mlp(x_train, y_train, x_test, device, eval=False, epochs=1) assert y_pred_no_eval is None assert y_proba_no_eval is None @@ -153,9 +150,7 @@ def attack_data(): @pytest.mark.parametrize("classifier_type", ["XGBoost", "CatBoost"]) @patch("midst_toolkit.attacks.ept.classification.XGBClassifier") @patch("midst_toolkit.attacks.ept.classification.CatBoostClassifier") -def test_train_attack_classifier_tree_models( - mock_catboost, mock_xgboost, classifier_type, attack_data -): +def test_train_attack_classifier_tree_models(mock_catboost, mock_xgboost, classifier_type, attack_data): # Tests train_attack_classifier for XGBoost and CatBoost x_train, y_train, x_test, y_test = attack_data columns_list = ["error"] @@ -168,9 +163,7 @@ def test_train_attack_classifier_tree_models( else: mock_catboost.return_value = mock_model - results = train_attack_classifier( - classifier_type, columns_list, x_train, y_train, x_test, y_test - ) + results = train_attack_classifier(classifier_type, columns_list, x_train, y_train, x_test, y_test) assert "prediction_results" in results assert "scores" in results @@ -187,20 +180,14 @@ def test_train_attack_classifier_mismatched_data(attack_data): # Test mismatches with pytest.raises(AssertionError, match="Mismatch in number of training samples and labels"): - train_attack_classifier( - "XGBoost", columns_list, x_train.head(10), y_train, x_test, y_test - ) + train_attack_classifier("XGBoost", columns_list, x_train.head(10), y_train, x_test, y_test) with pytest.raises(AssertionError, match="Mismatch in number of test samples and labels"): - train_attack_classifier( - "XGBoost", columns_list, x_train, y_train, x_test.head(5), y_test - ) + train_attack_classifier("XGBoost", columns_list, x_train, y_train, x_test.head(5), y_test) x_test_wrong_features = x_test.rename(columns={"feature_error": "another_feature"}) with pytest.raises(AssertionError, match="Mismatch in number of features between train and test sets"): - train_attack_classifier( - "XGBoost", columns_list, x_train, y_train, x_test_wrong_features, y_test - ) + train_attack_classifier("XGBoost", columns_list, x_train, y_train, x_test_wrong_features, y_test) @patch("midst_toolkit.attacks.ept.classification.train_mlp") @@ -210,9 +197,7 @@ def test_train_attack_classifier_mlp(mock_train_mlp, attack_data): columns_list = ["error"] mock_train_mlp.return_value = (np.zeros(10), np.zeros(10)) - results = train_attack_classifier( - "MLP", columns_list, x_train, y_train, x_test, y_test - ) + results = train_attack_classifier("MLP", columns_list, x_train, y_train, x_test, y_test) assert "prediction_results" in results assert "scores" in results @@ -220,10 +205,9 @@ def test_train_attack_classifier_mlp(mock_train_mlp, attack_data): assert mock_train_mlp.call_args[1]["eval"] is True + def test_train_attack_classifier_unsupported(attack_data): # Tests that an unsupported classifier type raises an assertion error x_train, y_train, x_test, y_test = attack_data with pytest.raises(AssertionError, match="Unsupported classifier type: SVM"): - train_attack_classifier( - "SVM", ["error"], x_train, y_train, x_test, y_test - ) \ No newline at end of file + train_attack_classifier("SVM", ["error"], x_train, y_train, x_test, y_test) From 1d3f018d93d4adaca440a7ae79f803c0b787a064 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Thu, 15 Jan 2026 09:47:00 -0500 Subject: [PATCH 19/29] Fix gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c440f287..08ea1217 100644 --- a/.gitignore +++ b/.gitignore @@ -52,5 +52,5 @@ tests/integration/attacks/tartan_federer/assets/tartan_federer_attack_results *.err *.out -+# CatBoost training artifacts -+catboost_info/ +# CatBoost training artifacts +catboost_info/ From 2c6442a9c9a65b9f53834e7e3e323fe2fc194804 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Thu, 15 Jan 2026 10:05:30 -0500 Subject: [PATCH 20/29] Upgrade uv.lock --- uv.lock | 1162 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 592 insertions(+), 570 deletions(-) diff --git a/uv.lock b/uv.lock index d5433ebf..ce99667b 100644 --- a/uv.lock +++ b/uv.lock @@ -8,16 +8,16 @@ resolution-markers = [ [[package]] name = "alembic" -version = "1.17.2" +version = "1.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mako" }, { name = "sqlalchemy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/a6/74c8cadc2882977d80ad756a13857857dbcf9bd405bc80b662eb10651282/alembic-1.17.2.tar.gz", hash = "sha256:bbe9751705c5e0f14877f02d46c53d10885e377e3d90eda810a016f9baa19e8e", size = 1988064, upload-time = "2025-11-14T20:35:04.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/cc/aca263693b2ece99fa99a09b6d092acb89973eb2bb575faef1777e04f8b4/alembic-1.18.1.tar.gz", hash = "sha256:83ac6b81359596816fb3b893099841a0862f2117b2963258e965d70dc62fb866", size = 2044319, upload-time = "2026-01-14T18:53:14.907Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/88/6237e97e3385b57b5f1528647addea5cc03d4d65d5979ab24327d41fb00d/alembic-1.17.2-py3-none-any.whl", hash = "sha256:f483dd1fe93f6c5d49217055e4d15b905b425b6af906746abb35b69c1996c4e6", size = 248554, upload-time = "2025-11-14T20:35:05.699Z" }, + { url = "https://files.pythonhosted.org/packages/83/36/cd9cb6101e81e39076b2fbe303bfa3c85ca34e55142b0324fcbf22c5c6e2/alembic-1.18.1-py3-none-any.whl", hash = "sha256:f1c3b0920b87134e851c25f1f7f236d8a332c34b75416802d06971df5d1b7810", size = 260973, upload-time = "2026-01-14T18:53:17.533Z" }, ] [[package]] @@ -99,30 +99,30 @@ wheels = [ [[package]] name = "boto3" -version = "1.42.2" +version = "1.42.28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/3b/be2c0175ff58d6abef88467d7e93225231059621181bc0cfd32fd8b05260/boto3-1.42.2.tar.gz", hash = "sha256:2b403f503bfe8486fd273e41f0b5a033d0e8dad5d94c5a5c0669e92272bd4f17", size = 112828, upload-time = "2025-12-03T17:50:22.599Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/aa/a44ea8c8ee8239f3f7c32cce966512c846297df5fe48b56db6882f3b7ca0/boto3-1.42.28.tar.gz", hash = "sha256:7d56c298b8d98f5e9b04cf5d6627f68e7792e25614533aef17f815681b5e1096", size = 112846, upload-time = "2026-01-14T20:37:21.448Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/3f/ba8d7e362ab595279663fdc77902ee46592252ea7210596bdcc3d2eee12b/boto3-1.42.2-py3-none-any.whl", hash = "sha256:e93c55fecfecc6f05de604288d216a49b06a3c2c53421848ca4afad55f0614b7", size = 140622, upload-time = "2025-12-03T17:50:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/69/35/5d95169ed145f0c49ebfeb6a5228ab63d54e95a2c7a43f0f0eb893540660/boto3-1.42.28-py3-none-any.whl", hash = "sha256:7994bc2a094c1894f6a4221a1696c5d18af6c9c888191051866f1d05c4fba431", size = 140575, upload-time = "2026-01-14T20:37:20.098Z" }, ] [[package]] name = "botocore" -version = "1.42.2" +version = "1.42.28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/29/1c9b4f73a738d1464c07ccd8b74ed7f21d7f00319bfd6e397a0e897fd61f/botocore-1.42.2.tar.gz", hash = "sha256:3dbeba76168764219cbe392aa67cbc9265cfa05b09970ed5f2e0c786b8ac5010", size = 14843197, upload-time = "2025-12-03T17:50:11.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/8d/e0828726aa568e5ab0ec477c7a47a82aa37f00951858d9ad892b6b1d5e32/botocore-1.42.28.tar.gz", hash = "sha256:0c15e78d1accf97df691083331f682e97b1bef73ef12dcdaadcf652abf9c182c", size = 14886029, upload-time = "2026-01-14T20:37:11.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/b3/4d413a69696a5d096af3f27c91e40f841886aecd849ee62dbb366c50d7ae/botocore-1.42.2-py3-none-any.whl", hash = "sha256:8bb3f0ce39c6a7f63b404a2632ab1a5189187b27317c7b97fe45494677633b5d", size = 14517436, upload-time = "2025-12-03T17:50:07.589Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ff/72470b92ba96868be1936b8b3c7a70f902b60d36268bdeddb732317bef7a/botocore-1.42.28-py3-none-any.whl", hash = "sha256:d26c7a0851489ce1a18279f9802fe434bd736ea861d4888cc2c7d83fb1f6af8f", size = 14559264, upload-time = "2026-01-14T20:37:08.184Z" }, ] [[package]] @@ -187,11 +187,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.11.12" +version = "2026.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, ] [[package]] @@ -464,76 +464,76 @@ wheels = [ [[package]] name = "coverage" -version = "7.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/45/2c665ca77ec32ad67e25c77daf1cee28ee4558f3bc571cdbaf88a00b9f23/coverage-7.13.0.tar.gz", hash = "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936", size = 820905, upload-time = "2025-12-08T13:14:38.055Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/f1/2619559f17f31ba00fc40908efd1fbf1d0a5536eb75dc8341e7d660a08de/coverage-7.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf", size = 218274, upload-time = "2025-12-08T13:12:52.095Z" }, - { url = "https://files.pythonhosted.org/packages/2b/11/30d71ae5d6e949ff93b2a79a2c1b4822e00423116c5c6edfaeef37301396/coverage-7.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f", size = 218638, upload-time = "2025-12-08T13:12:53.418Z" }, - { url = "https://files.pythonhosted.org/packages/79/c2/fce80fc6ded8d77e53207489d6065d0fed75db8951457f9213776615e0f5/coverage-7.13.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb", size = 250129, upload-time = "2025-12-08T13:12:54.744Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b6/51b5d1eb6fcbb9a1d5d6984e26cbe09018475c2922d554fd724dd0f056ee/coverage-7.13.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621", size = 252885, upload-time = "2025-12-08T13:12:56.401Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f8/972a5affea41de798691ab15d023d3530f9f56a72e12e243f35031846ff7/coverage-7.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74", size = 253974, upload-time = "2025-12-08T13:12:57.718Z" }, - { url = "https://files.pythonhosted.org/packages/8a/56/116513aee860b2c7968aa3506b0f59b22a959261d1dbf3aea7b4450a7520/coverage-7.13.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57", size = 250538, upload-time = "2025-12-08T13:12:59.254Z" }, - { url = "https://files.pythonhosted.org/packages/d6/75/074476d64248fbadf16dfafbf93fdcede389ec821f74ca858d7c87d2a98c/coverage-7.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8", size = 251912, upload-time = "2025-12-08T13:13:00.604Z" }, - { url = "https://files.pythonhosted.org/packages/f2/d2/aa4f8acd1f7c06024705c12609d8698c51b27e4d635d717cd1934c9668e2/coverage-7.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d", size = 250054, upload-time = "2025-12-08T13:13:01.892Z" }, - { url = "https://files.pythonhosted.org/packages/19/98/8df9e1af6a493b03694a1e8070e024e7d2cdc77adedc225a35e616d505de/coverage-7.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b", size = 249619, upload-time = "2025-12-08T13:13:03.236Z" }, - { url = "https://files.pythonhosted.org/packages/d8/71/f8679231f3353018ca66ef647fa6fe7b77e6bff7845be54ab84f86233363/coverage-7.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd", size = 251496, upload-time = "2025-12-08T13:13:04.511Z" }, - { url = "https://files.pythonhosted.org/packages/04/86/9cb406388034eaf3c606c22094edbbb82eea1fa9d20c0e9efadff20d0733/coverage-7.13.0-cp312-cp312-win32.whl", hash = "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef", size = 220808, upload-time = "2025-12-08T13:13:06.422Z" }, - { url = "https://files.pythonhosted.org/packages/1c/59/af483673df6455795daf5f447c2f81a3d2fcfc893a22b8ace983791f6f34/coverage-7.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae", size = 221616, upload-time = "2025-12-08T13:13:07.95Z" }, - { url = "https://files.pythonhosted.org/packages/64/b0/959d582572b30a6830398c60dd419c1965ca4b5fb38ac6b7093a0d50ca8d/coverage-7.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080", size = 220261, upload-time = "2025-12-08T13:13:09.581Z" }, - { url = "https://files.pythonhosted.org/packages/7c/cc/bce226595eb3bf7d13ccffe154c3c487a22222d87ff018525ab4dd2e9542/coverage-7.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf", size = 218297, upload-time = "2025-12-08T13:13:10.977Z" }, - { url = "https://files.pythonhosted.org/packages/3b/9f/73c4d34600aae03447dff3d7ad1d0ac649856bfb87d1ca7d681cfc913f9e/coverage-7.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a", size = 218673, upload-time = "2025-12-08T13:13:12.562Z" }, - { url = "https://files.pythonhosted.org/packages/63/ab/8fa097db361a1e8586535ae5073559e6229596b3489ec3ef2f5b38df8cb2/coverage-7.13.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74", size = 249652, upload-time = "2025-12-08T13:13:13.909Z" }, - { url = "https://files.pythonhosted.org/packages/90/3a/9bfd4de2ff191feb37ef9465855ca56a6f2f30a3bca172e474130731ac3d/coverage-7.13.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6", size = 252251, upload-time = "2025-12-08T13:13:15.553Z" }, - { url = "https://files.pythonhosted.org/packages/df/61/b5d8105f016e1b5874af0d7c67542da780ccd4a5f2244a433d3e20ceb1ad/coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b", size = 253492, upload-time = "2025-12-08T13:13:16.849Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b8/0fad449981803cc47a4694768b99823fb23632150743f9c83af329bb6090/coverage-7.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232", size = 249850, upload-time = "2025-12-08T13:13:18.142Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e9/8d68337c3125014d918cf4327d5257553a710a2995a6a6de2ac77e5aa429/coverage-7.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971", size = 251633, upload-time = "2025-12-08T13:13:19.56Z" }, - { url = "https://files.pythonhosted.org/packages/55/14/d4112ab26b3a1bc4b3c1295d8452dcf399ed25be4cf649002fb3e64b2d93/coverage-7.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d", size = 249586, upload-time = "2025-12-08T13:13:20.883Z" }, - { url = "https://files.pythonhosted.org/packages/2c/a9/22b0000186db663b0d82f86c2f1028099ae9ac202491685051e2a11a5218/coverage-7.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137", size = 249412, upload-time = "2025-12-08T13:13:22.22Z" }, - { url = "https://files.pythonhosted.org/packages/a1/2e/42d8e0d9e7527fba439acdc6ed24a2b97613b1dc85849b1dd935c2cffef0/coverage-7.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511", size = 251191, upload-time = "2025-12-08T13:13:23.899Z" }, - { url = "https://files.pythonhosted.org/packages/a4/af/8c7af92b1377fd8860536aadd58745119252aaaa71a5213e5a8e8007a9f5/coverage-7.13.0-cp313-cp313-win32.whl", hash = "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1", size = 220829, upload-time = "2025-12-08T13:13:25.182Z" }, - { url = "https://files.pythonhosted.org/packages/58/f9/725e8bf16f343d33cbe076c75dc8370262e194ff10072c0608b8e5cf33a3/coverage-7.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a", size = 221640, upload-time = "2025-12-08T13:13:26.836Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ff/e98311000aa6933cc79274e2b6b94a2fe0fe3434fca778eba82003675496/coverage-7.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6", size = 220269, upload-time = "2025-12-08T13:13:28.116Z" }, - { url = "https://files.pythonhosted.org/packages/cf/cf/bbaa2e1275b300343ea865f7d424cc0a2e2a1df6925a070b2b2d5d765330/coverage-7.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a", size = 218990, upload-time = "2025-12-08T13:13:29.463Z" }, - { url = "https://files.pythonhosted.org/packages/21/1d/82f0b3323b3d149d7672e7744c116e9c170f4957e0c42572f0366dbb4477/coverage-7.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8", size = 219340, upload-time = "2025-12-08T13:13:31.524Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/fe3fd4702a3832a255f4d43013eacb0ef5fc155a5960ea9269d8696db28b/coverage-7.13.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053", size = 260638, upload-time = "2025-12-08T13:13:32.965Z" }, - { url = "https://files.pythonhosted.org/packages/ad/01/63186cb000307f2b4da463f72af9b85d380236965574c78e7e27680a2593/coverage-7.13.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071", size = 262705, upload-time = "2025-12-08T13:13:34.378Z" }, - { url = "https://files.pythonhosted.org/packages/7c/a1/c0dacef0cc865f2455d59eed3548573ce47ed603205ffd0735d1d78b5906/coverage-7.13.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e", size = 265125, upload-time = "2025-12-08T13:13:35.73Z" }, - { url = "https://files.pythonhosted.org/packages/ef/92/82b99223628b61300bd382c205795533bed021505eab6dd86e11fb5d7925/coverage-7.13.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493", size = 259844, upload-time = "2025-12-08T13:13:37.69Z" }, - { url = "https://files.pythonhosted.org/packages/cf/2c/89b0291ae4e6cd59ef042708e1c438e2290f8c31959a20055d8768349ee2/coverage-7.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0", size = 262700, upload-time = "2025-12-08T13:13:39.525Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f9/a5f992efae1996245e796bae34ceb942b05db275e4b34222a9a40b9fbd3b/coverage-7.13.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e", size = 260321, upload-time = "2025-12-08T13:13:41.172Z" }, - { url = "https://files.pythonhosted.org/packages/4c/89/a29f5d98c64fedbe32e2ac3c227fbf78edc01cc7572eee17d61024d89889/coverage-7.13.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c", size = 259222, upload-time = "2025-12-08T13:13:43.282Z" }, - { url = "https://files.pythonhosted.org/packages/b3/c3/940fe447aae302a6701ee51e53af7e08b86ff6eed7631e5740c157ee22b9/coverage-7.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e", size = 261411, upload-time = "2025-12-08T13:13:44.72Z" }, - { url = "https://files.pythonhosted.org/packages/eb/31/12a4aec689cb942a89129587860ed4d0fd522d5fda81237147fde554b8ae/coverage-7.13.0-cp313-cp313t-win32.whl", hash = "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46", size = 221505, upload-time = "2025-12-08T13:13:46.332Z" }, - { url = "https://files.pythonhosted.org/packages/65/8c/3b5fe3259d863572d2b0827642c50c3855d26b3aefe80bdc9eba1f0af3b0/coverage-7.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39", size = 222569, upload-time = "2025-12-08T13:13:47.79Z" }, - { url = "https://files.pythonhosted.org/packages/b0/39/f71fa8316a96ac72fc3908839df651e8eccee650001a17f2c78cdb355624/coverage-7.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e", size = 220841, upload-time = "2025-12-08T13:13:49.243Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4b/9b54bedda55421449811dcd5263a2798a63f48896c24dfb92b0f1b0845bd/coverage-7.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256", size = 218343, upload-time = "2025-12-08T13:13:50.811Z" }, - { url = "https://files.pythonhosted.org/packages/59/df/c3a1f34d4bba2e592c8979f924da4d3d4598b0df2392fbddb7761258e3dc/coverage-7.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a", size = 218672, upload-time = "2025-12-08T13:13:52.284Z" }, - { url = "https://files.pythonhosted.org/packages/07/62/eec0659e47857698645ff4e6ad02e30186eb8afd65214fd43f02a76537cb/coverage-7.13.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9", size = 249715, upload-time = "2025-12-08T13:13:53.791Z" }, - { url = "https://files.pythonhosted.org/packages/23/2d/3c7ff8b2e0e634c1f58d095f071f52ed3c23ff25be524b0ccae8b71f99f8/coverage-7.13.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19", size = 252225, upload-time = "2025-12-08T13:13:55.274Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ac/fb03b469d20e9c9a81093575003f959cf91a4a517b783aab090e4538764b/coverage-7.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be", size = 253559, upload-time = "2025-12-08T13:13:57.161Z" }, - { url = "https://files.pythonhosted.org/packages/29/62/14afa9e792383c66cc0a3b872a06ded6e4ed1079c7d35de274f11d27064e/coverage-7.13.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb", size = 249724, upload-time = "2025-12-08T13:13:58.692Z" }, - { url = "https://files.pythonhosted.org/packages/31/b7/333f3dab2939070613696ab3ee91738950f0467778c6e5a5052e840646b7/coverage-7.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8", size = 251582, upload-time = "2025-12-08T13:14:00.642Z" }, - { url = "https://files.pythonhosted.org/packages/81/cb/69162bda9381f39b2287265d7e29ee770f7c27c19f470164350a38318764/coverage-7.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b", size = 249538, upload-time = "2025-12-08T13:14:02.556Z" }, - { url = "https://files.pythonhosted.org/packages/e0/76/350387b56a30f4970abe32b90b2a434f87d29f8b7d4ae40d2e8a85aacfb3/coverage-7.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9", size = 249349, upload-time = "2025-12-08T13:14:04.015Z" }, - { url = "https://files.pythonhosted.org/packages/86/0d/7f6c42b8d59f4c7e43ea3059f573c0dcfed98ba46eb43c68c69e52ae095c/coverage-7.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927", size = 251011, upload-time = "2025-12-08T13:14:05.505Z" }, - { url = "https://files.pythonhosted.org/packages/d7/f1/4bb2dff379721bb0b5c649d5c5eaf438462cad824acf32eb1b7ca0c7078e/coverage-7.13.0-cp314-cp314-win32.whl", hash = "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f", size = 221091, upload-time = "2025-12-08T13:14:07.127Z" }, - { url = "https://files.pythonhosted.org/packages/ba/44/c239da52f373ce379c194b0ee3bcc121020e397242b85f99e0afc8615066/coverage-7.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc", size = 221904, upload-time = "2025-12-08T13:14:08.542Z" }, - { url = "https://files.pythonhosted.org/packages/89/1f/b9f04016d2a29c2e4a0307baefefad1a4ec5724946a2b3e482690486cade/coverage-7.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b", size = 220480, upload-time = "2025-12-08T13:14:10.958Z" }, - { url = "https://files.pythonhosted.org/packages/16/d4/364a1439766c8e8647860584171c36010ca3226e6e45b1753b1b249c5161/coverage-7.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28", size = 219074, upload-time = "2025-12-08T13:14:13.345Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f4/71ba8be63351e099911051b2089662c03d5671437a0ec2171823c8e03bec/coverage-7.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe", size = 219342, upload-time = "2025-12-08T13:14:15.02Z" }, - { url = "https://files.pythonhosted.org/packages/5e/25/127d8ed03d7711a387d96f132589057213e3aef7475afdaa303412463f22/coverage-7.13.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657", size = 260713, upload-time = "2025-12-08T13:14:16.907Z" }, - { url = "https://files.pythonhosted.org/packages/fd/db/559fbb6def07d25b2243663b46ba9eb5a3c6586c0c6f4e62980a68f0ee1c/coverage-7.13.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff", size = 262825, upload-time = "2025-12-08T13:14:18.68Z" }, - { url = "https://files.pythonhosted.org/packages/37/99/6ee5bf7eff884766edb43bd8736b5e1c5144d0fe47498c3779326fe75a35/coverage-7.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3", size = 265233, upload-time = "2025-12-08T13:14:20.55Z" }, - { url = "https://files.pythonhosted.org/packages/d8/90/92f18fe0356ea69e1f98f688ed80cec39f44e9f09a1f26a1bbf017cc67f2/coverage-7.13.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b", size = 259779, upload-time = "2025-12-08T13:14:22.367Z" }, - { url = "https://files.pythonhosted.org/packages/90/5d/b312a8b45b37a42ea7d27d7d3ff98ade3a6c892dd48d1d503e773503373f/coverage-7.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d", size = 262700, upload-time = "2025-12-08T13:14:24.309Z" }, - { url = "https://files.pythonhosted.org/packages/63/f8/b1d0de5c39351eb71c366f872376d09386640840a2e09b0d03973d791e20/coverage-7.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e", size = 260302, upload-time = "2025-12-08T13:14:26.068Z" }, - { url = "https://files.pythonhosted.org/packages/aa/7c/d42f4435bc40c55558b3109a39e2d456cddcec37434f62a1f1230991667a/coverage-7.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940", size = 259136, upload-time = "2025-12-08T13:14:27.604Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d3/23413241dc04d47cfe19b9a65b32a2edd67ecd0b817400c2843ebc58c847/coverage-7.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2", size = 261467, upload-time = "2025-12-08T13:14:29.09Z" }, - { url = "https://files.pythonhosted.org/packages/13/e6/6e063174500eee216b96272c0d1847bf215926786f85c2bd024cf4d02d2f/coverage-7.13.0-cp314-cp314t-win32.whl", hash = "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7", size = 221875, upload-time = "2025-12-08T13:14:31.106Z" }, - { url = "https://files.pythonhosted.org/packages/3b/46/f4fb293e4cbe3620e3ac2a3e8fd566ed33affb5861a9b20e3dd6c1896cbc/coverage-7.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc", size = 222982, upload-time = "2025-12-08T13:14:33.1Z" }, - { url = "https://files.pythonhosted.org/packages/68/62/5b3b9018215ed9733fbd1ae3b2ed75c5de62c3b55377a52cae732e1b7805/coverage-7.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a", size = 221016, upload-time = "2025-12-08T13:14:34.601Z" }, - { url = "https://files.pythonhosted.org/packages/8d/4c/1968f32fb9a2604645827e11ff84a31e59d532e01995f904723b4f5328b3/coverage-7.13.0-py3-none-any.whl", hash = "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904", size = 210068, upload-time = "2025-12-08T13:14:36.236Z" }, +version = "7.13.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/f9/e92df5e07f3fc8d4c7f9a0f146ef75446bf870351cd37b788cf5897f8079/coverage-7.13.1.tar.gz", hash = "sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd", size = 825862, upload-time = "2025-12-28T15:42:56.969Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/8a/87af46cccdfa78f53db747b09f5f9a21d5fc38d796834adac09b30a8ce74/coverage-7.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6f34591000f06e62085b1865c9bc5f7858df748834662a51edadfd2c3bfe0dd3", size = 218927, upload-time = "2025-12-28T15:40:52.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/a8/6e22fdc67242a4a5a153f9438d05944553121c8f4ba70cb072af4c41362e/coverage-7.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b67e47c5595b9224599016e333f5ec25392597a89d5744658f837d204e16c63e", size = 219288, upload-time = "2025-12-28T15:40:54.262Z" }, + { url = "https://files.pythonhosted.org/packages/d0/0a/853a76e03b0f7c4375e2ca025df45c918beb367f3e20a0a8e91967f6e96c/coverage-7.13.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e7b8bd70c48ffb28461ebe092c2345536fb18bbbf19d287c8913699735f505c", size = 250786, upload-time = "2025-12-28T15:40:56.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b4/694159c15c52b9f7ec7adf49d50e5f8ee71d3e9ef38adb4445d13dd56c20/coverage-7.13.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c223d078112e90dc0e5c4e35b98b9584164bea9fbbd221c0b21c5241f6d51b62", size = 253543, upload-time = "2025-12-28T15:40:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/96/b2/7f1f0437a5c855f87e17cf5d0dc35920b6440ff2b58b1ba9788c059c26c8/coverage-7.13.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:794f7c05af0763b1bbd1b9e6eff0e52ad068be3b12cd96c87de037b01390c968", size = 254635, upload-time = "2025-12-28T15:40:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d1/73c3fdb8d7d3bddd9473c9c6a2e0682f09fc3dfbcb9c3f36412a7368bcab/coverage-7.13.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0642eae483cc8c2902e4af7298bf886d605e80f26382124cddc3967c2a3df09e", size = 251202, upload-time = "2025-12-28T15:41:01.328Z" }, + { url = "https://files.pythonhosted.org/packages/66/3c/f0edf75dcc152f145d5598329e864bbbe04ab78660fe3e8e395f9fff010f/coverage-7.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5e772ed5fef25b3de9f2008fe67b92d46831bd2bc5bdc5dd6bfd06b83b316f", size = 252566, upload-time = "2025-12-28T15:41:03.319Z" }, + { url = "https://files.pythonhosted.org/packages/17/b3/e64206d3c5f7dcbceafd14941345a754d3dbc78a823a6ed526e23b9cdaab/coverage-7.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:45980ea19277dc0a579e432aef6a504fe098ef3a9032ead15e446eb0f1191aee", size = 250711, upload-time = "2025-12-28T15:41:06.411Z" }, + { url = "https://files.pythonhosted.org/packages/dc/ad/28a3eb970a8ef5b479ee7f0c484a19c34e277479a5b70269dc652b730733/coverage-7.13.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f18eca6028ffa62adbd185a8f1e1dd242f2e68164dba5c2b74a5204850b4cf", size = 250278, upload-time = "2025-12-28T15:41:08.285Z" }, + { url = "https://files.pythonhosted.org/packages/54/e3/c8f0f1a93133e3e1291ca76cbb63565bd4b5c5df63b141f539d747fff348/coverage-7.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8dca5590fec7a89ed6826fce625595279e586ead52e9e958d3237821fbc750c", size = 252154, upload-time = "2025-12-28T15:41:09.969Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bf/9939c5d6859c380e405b19e736321f1c7d402728792f4c752ad1adcce005/coverage-7.13.1-cp312-cp312-win32.whl", hash = "sha256:ff86d4e85188bba72cfb876df3e11fa243439882c55957184af44a35bd5880b7", size = 221487, upload-time = "2025-12-28T15:41:11.468Z" }, + { url = "https://files.pythonhosted.org/packages/fa/dc/7282856a407c621c2aad74021680a01b23010bb8ebf427cf5eacda2e876f/coverage-7.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:16cc1da46c04fb0fb128b4dc430b78fa2aba8a6c0c9f8eb391fd5103409a6ac6", size = 222299, upload-time = "2025-12-28T15:41:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/10/79/176a11203412c350b3e9578620013af35bcdb79b651eb976f4a4b32044fa/coverage-7.13.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d9bc218650022a768f3775dd7fdac1886437325d8d295d923ebcfef4892ad5c", size = 220941, upload-time = "2025-12-28T15:41:14.975Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a4/e98e689347a1ff1a7f67932ab535cef82eb5e78f32a9e4132e114bbb3a0a/coverage-7.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cb237bfd0ef4d5eb6a19e29f9e528ac67ac3be932ea6b44fb6cc09b9f3ecff78", size = 218951, upload-time = "2025-12-28T15:41:16.653Z" }, + { url = "https://files.pythonhosted.org/packages/32/33/7cbfe2bdc6e2f03d6b240d23dc45fdaf3fd270aaf2d640be77b7f16989ab/coverage-7.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1dcb645d7e34dcbcc96cd7c132b1fc55c39263ca62eb961c064eb3928997363b", size = 219325, upload-time = "2025-12-28T15:41:18.609Z" }, + { url = "https://files.pythonhosted.org/packages/59/f6/efdabdb4929487baeb7cb2a9f7dac457d9356f6ad1b255be283d58b16316/coverage-7.13.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3d42df8201e00384736f0df9be2ced39324c3907607d17d50d50116c989d84cd", size = 250309, upload-time = "2025-12-28T15:41:20.629Z" }, + { url = "https://files.pythonhosted.org/packages/12/da/91a52516e9d5aea87d32d1523f9cdcf7a35a3b298e6be05d6509ba3cfab2/coverage-7.13.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa3edde1aa8807de1d05934982416cb3ec46d1d4d91e280bcce7cca01c507992", size = 252907, upload-time = "2025-12-28T15:41:22.257Z" }, + { url = "https://files.pythonhosted.org/packages/75/38/f1ea837e3dc1231e086db1638947e00d264e7e8c41aa8ecacf6e1e0c05f4/coverage-7.13.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9edd0e01a343766add6817bc448408858ba6b489039eaaa2018474e4001651a4", size = 254148, upload-time = "2025-12-28T15:41:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/7f/43/f4f16b881aaa34954ba446318dea6b9ed5405dd725dd8daac2358eda869a/coverage-7.13.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:985b7836931d033570b94c94713c6dba5f9d3ff26045f72c3e5dbc5fe3361e5a", size = 250515, upload-time = "2025-12-28T15:41:25.437Z" }, + { url = "https://files.pythonhosted.org/packages/84/34/8cba7f00078bd468ea914134e0144263194ce849ec3baad187ffb6203d1c/coverage-7.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ffed1e4980889765c84a5d1a566159e363b71d6b6fbaf0bebc9d3c30bc016766", size = 252292, upload-time = "2025-12-28T15:41:28.459Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/cffac66c7652d84ee4ac52d3ccb94c015687d3b513f9db04bfcac2ac800d/coverage-7.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8842af7f175078456b8b17f1b73a0d16a65dcbdc653ecefeb00a56b3c8c298c4", size = 250242, upload-time = "2025-12-28T15:41:30.02Z" }, + { url = "https://files.pythonhosted.org/packages/f4/78/9a64d462263dde416f3c0067efade7b52b52796f489b1037a95b0dc389c9/coverage-7.13.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:ccd7a6fca48ca9c131d9b0a2972a581e28b13416fc313fb98b6d24a03ce9a398", size = 250068, upload-time = "2025-12-28T15:41:32.007Z" }, + { url = "https://files.pythonhosted.org/packages/69/c8/a8994f5fece06db7c4a97c8fc1973684e178599b42e66280dded0524ef00/coverage-7.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0403f647055de2609be776965108447deb8e384fe4a553c119e3ff6bfbab4784", size = 251846, upload-time = "2025-12-28T15:41:33.946Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f7/91fa73c4b80305c86598a2d4e54ba22df6bf7d0d97500944af7ef155d9f7/coverage-7.13.1-cp313-cp313-win32.whl", hash = "sha256:549d195116a1ba1e1ae2f5ca143f9777800f6636eab917d4f02b5310d6d73461", size = 221512, upload-time = "2025-12-28T15:41:35.519Z" }, + { url = "https://files.pythonhosted.org/packages/45/0b/0768b4231d5a044da8f75e097a8714ae1041246bb765d6b5563bab456735/coverage-7.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:5899d28b5276f536fcf840b18b61a9fce23cc3aec1d114c44c07fe94ebeaa500", size = 222321, upload-time = "2025-12-28T15:41:37.371Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b8/bdcb7253b7e85157282450262008f1366aa04663f3e3e4c30436f596c3e2/coverage-7.13.1-cp313-cp313-win_arm64.whl", hash = "sha256:868a2fae76dfb06e87291bcbd4dcbcc778a8500510b618d50496e520bd94d9b9", size = 220949, upload-time = "2025-12-28T15:41:39.553Z" }, + { url = "https://files.pythonhosted.org/packages/70/52/f2be52cc445ff75ea8397948c96c1b4ee14f7f9086ea62fc929c5ae7b717/coverage-7.13.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:67170979de0dacac3f3097d02b0ad188d8edcea44ccc44aaa0550af49150c7dc", size = 219643, upload-time = "2025-12-28T15:41:41.567Z" }, + { url = "https://files.pythonhosted.org/packages/47/79/c85e378eaa239e2edec0c5523f71542c7793fe3340954eafb0bc3904d32d/coverage-7.13.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f80e2bb21bfab56ed7405c2d79d34b5dc0bc96c2c1d2a067b643a09fb756c43a", size = 219997, upload-time = "2025-12-28T15:41:43.418Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9b/b1ade8bfb653c0bbce2d6d6e90cc6c254cbb99b7248531cc76253cb4da6d/coverage-7.13.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f83351e0f7dcdb14d7326c3d8d8c4e915fa685cbfdc6281f9470d97a04e9dfe4", size = 261296, upload-time = "2025-12-28T15:41:45.207Z" }, + { url = "https://files.pythonhosted.org/packages/1f/af/ebf91e3e1a2473d523e87e87fd8581e0aa08741b96265730e2d79ce78d8d/coverage-7.13.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb3f6562e89bad0110afbe64e485aac2462efdce6232cdec7862a095dc3412f6", size = 263363, upload-time = "2025-12-28T15:41:47.163Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8b/fb2423526d446596624ac7fde12ea4262e66f86f5120114c3cfd0bb2befa/coverage-7.13.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77545b5dcda13b70f872c3b5974ac64c21d05e65b1590b441c8560115dc3a0d1", size = 265783, upload-time = "2025-12-28T15:41:49.03Z" }, + { url = "https://files.pythonhosted.org/packages/9b/26/ef2adb1e22674913b89f0fe7490ecadcef4a71fa96f5ced90c60ec358789/coverage-7.13.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4d240d260a1aed814790bbe1f10a5ff31ce6c21bc78f0da4a1e8268d6c80dbd", size = 260508, upload-time = "2025-12-28T15:41:51.035Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7d/f0f59b3404caf662e7b5346247883887687c074ce67ba453ea08c612b1d5/coverage-7.13.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d2287ac9360dec3837bfdad969963a5d073a09a85d898bd86bea82aa8876ef3c", size = 263357, upload-time = "2025-12-28T15:41:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b1/29896492b0b1a047604d35d6fa804f12818fa30cdad660763a5f3159e158/coverage-7.13.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0d2c11f3ea4db66b5cbded23b20185c35066892c67d80ec4be4bab257b9ad1e0", size = 260978, upload-time = "2025-12-28T15:41:54.589Z" }, + { url = "https://files.pythonhosted.org/packages/48/f2/971de1238a62e6f0a4128d37adadc8bb882ee96afbe03ff1570291754629/coverage-7.13.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:3fc6a169517ca0d7ca6846c3c5392ef2b9e38896f61d615cb75b9e7134d4ee1e", size = 259877, upload-time = "2025-12-28T15:41:56.263Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fc/0474efcbb590ff8628830e9aaec5f1831594874360e3251f1fdec31d07a3/coverage-7.13.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d10a2ed46386e850bb3de503a54f9fe8192e5917fcbb143bfef653a9355e9a53", size = 262069, upload-time = "2025-12-28T15:41:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/88/4f/3c159b7953db37a7b44c0eab8a95c37d1aa4257c47b4602c04022d5cb975/coverage-7.13.1-cp313-cp313t-win32.whl", hash = "sha256:75a6f4aa904301dab8022397a22c0039edc1f51e90b83dbd4464b8a38dc87842", size = 222184, upload-time = "2025-12-28T15:41:59.763Z" }, + { url = "https://files.pythonhosted.org/packages/58/a5/6b57d28f81417f9335774f20679d9d13b9a8fb90cd6160957aa3b54a2379/coverage-7.13.1-cp313-cp313t-win_amd64.whl", hash = "sha256:309ef5706e95e62578cda256b97f5e097916a2c26247c287bbe74794e7150df2", size = 223250, upload-time = "2025-12-28T15:42:01.52Z" }, + { url = "https://files.pythonhosted.org/packages/81/7c/160796f3b035acfbb58be80e02e484548595aa67e16a6345e7910ace0a38/coverage-7.13.1-cp313-cp313t-win_arm64.whl", hash = "sha256:92f980729e79b5d16d221038dbf2e8f9a9136afa072f9d5d6ed4cb984b126a09", size = 221521, upload-time = "2025-12-28T15:42:03.275Z" }, + { url = "https://files.pythonhosted.org/packages/aa/8e/ba0e597560c6563fc0adb902fda6526df5d4aa73bb10adf0574d03bd2206/coverage-7.13.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:97ab3647280d458a1f9adb85244e81587505a43c0c7cff851f5116cd2814b894", size = 218996, upload-time = "2025-12-28T15:42:04.978Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8e/764c6e116f4221dc7aa26c4061181ff92edb9c799adae6433d18eeba7a14/coverage-7.13.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8f572d989142e0908e6acf57ad1b9b86989ff057c006d13b76c146ec6a20216a", size = 219326, upload-time = "2025-12-28T15:42:06.691Z" }, + { url = "https://files.pythonhosted.org/packages/4f/a6/6130dc6d8da28cdcbb0f2bf8865aeca9b157622f7c0031e48c6cf9a0e591/coverage-7.13.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d72140ccf8a147e94274024ff6fd8fb7811354cf7ef88b1f0a988ebaa5bc774f", size = 250374, upload-time = "2025-12-28T15:42:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/82/2b/783ded568f7cd6b677762f780ad338bf4b4750205860c17c25f7c708995e/coverage-7.13.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d3c9f051b028810f5a87c88e5d6e9af3c0ff32ef62763bf15d29f740453ca909", size = 252882, upload-time = "2025-12-28T15:42:10.515Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b2/9808766d082e6a4d59eb0cc881a57fc1600eb2c5882813eefff8254f71b5/coverage-7.13.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f398ba4df52d30b1763f62eed9de5620dcde96e6f491f4c62686736b155aa6e4", size = 254218, upload-time = "2025-12-28T15:42:12.208Z" }, + { url = "https://files.pythonhosted.org/packages/44/ea/52a985bb447c871cb4d2e376e401116520991b597c85afdde1ea9ef54f2c/coverage-7.13.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:132718176cc723026d201e347f800cd1a9e4b62ccd3f82476950834dad501c75", size = 250391, upload-time = "2025-12-28T15:42:14.21Z" }, + { url = "https://files.pythonhosted.org/packages/7f/1d/125b36cc12310718873cfc8209ecfbc1008f14f4f5fa0662aa608e579353/coverage-7.13.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9e549d642426e3579b3f4b92d0431543b012dcb6e825c91619d4e93b7363c3f9", size = 252239, upload-time = "2025-12-28T15:42:16.292Z" }, + { url = "https://files.pythonhosted.org/packages/6a/16/10c1c164950cade470107f9f14bbac8485f8fb8515f515fca53d337e4a7f/coverage-7.13.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:90480b2134999301eea795b3a9dbf606c6fbab1b489150c501da84a959442465", size = 250196, upload-time = "2025-12-28T15:42:18.54Z" }, + { url = "https://files.pythonhosted.org/packages/2a/c6/cd860fac08780c6fd659732f6ced1b40b79c35977c1356344e44d72ba6c4/coverage-7.13.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e825dbb7f84dfa24663dd75835e7257f8882629fc11f03ecf77d84a75134b864", size = 250008, upload-time = "2025-12-28T15:42:20.365Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/a8c58d3d38f82a5711e1e0a67268362af48e1a03df27c03072ac30feefcf/coverage-7.13.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:623dcc6d7a7ba450bbdbeedbaa0c42b329bdae16491af2282f12a7e809be7eb9", size = 251671, upload-time = "2025-12-28T15:42:22.114Z" }, + { url = "https://files.pythonhosted.org/packages/f0/bc/fd4c1da651d037a1e3d53e8cb3f8182f4b53271ffa9a95a2e211bacc0349/coverage-7.13.1-cp314-cp314-win32.whl", hash = "sha256:6e73ebb44dca5f708dc871fe0b90cf4cff1a13f9956f747cc87b535a840386f5", size = 221777, upload-time = "2025-12-28T15:42:23.919Z" }, + { url = "https://files.pythonhosted.org/packages/4b/50/71acabdc8948464c17e90b5ffd92358579bd0910732c2a1c9537d7536aa6/coverage-7.13.1-cp314-cp314-win_amd64.whl", hash = "sha256:be753b225d159feb397bd0bf91ae86f689bad0da09d3b301478cd39b878ab31a", size = 222592, upload-time = "2025-12-28T15:42:25.619Z" }, + { url = "https://files.pythonhosted.org/packages/f7/c8/a6fb943081bb0cc926499c7907731a6dc9efc2cbdc76d738c0ab752f1a32/coverage-7.13.1-cp314-cp314-win_arm64.whl", hash = "sha256:228b90f613b25ba0019361e4ab81520b343b622fc657daf7e501c4ed6a2366c0", size = 221169, upload-time = "2025-12-28T15:42:27.629Z" }, + { url = "https://files.pythonhosted.org/packages/16/61/d5b7a0a0e0e40d62e59bc8c7aa1afbd86280d82728ba97f0673b746b78e2/coverage-7.13.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:60cfb538fe9ef86e5b2ab0ca8fc8d62524777f6c611dcaf76dc16fbe9b8e698a", size = 219730, upload-time = "2025-12-28T15:42:29.306Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2c/8881326445fd071bb49514d1ce97d18a46a980712b51fee84f9ab42845b4/coverage-7.13.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:57dfc8048c72ba48a8c45e188d811e5efd7e49b387effc8fb17e97936dde5bf6", size = 220001, upload-time = "2025-12-28T15:42:31.319Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d7/50de63af51dfa3a7f91cc37ad8fcc1e244b734232fbc8b9ab0f3c834a5cd/coverage-7.13.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3f2f725aa3e909b3c5fdb8192490bdd8e1495e85906af74fe6e34a2a77ba0673", size = 261370, upload-time = "2025-12-28T15:42:32.992Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2c/d31722f0ec918fd7453b2758312729f645978d212b410cd0f7c2aed88a94/coverage-7.13.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ee68b21909686eeb21dfcba2c3b81fee70dcf38b140dcd5aa70680995fa3aa5", size = 263485, upload-time = "2025-12-28T15:42:34.759Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7a/2c114fa5c5fc08ba0777e4aec4c97e0b4a1afcb69c75f1f54cff78b073ab/coverage-7.13.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:724b1b270cb13ea2e6503476e34541a0b1f62280bc997eab443f87790202033d", size = 265890, upload-time = "2025-12-28T15:42:36.517Z" }, + { url = "https://files.pythonhosted.org/packages/65/d9/f0794aa1c74ceabc780fe17f6c338456bbc4e96bd950f2e969f48ac6fb20/coverage-7.13.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:916abf1ac5cf7eb16bc540a5bf75c71c43a676f5c52fcb9fe75a2bd75fb944e8", size = 260445, upload-time = "2025-12-28T15:42:38.646Z" }, + { url = "https://files.pythonhosted.org/packages/49/23/184b22a00d9bb97488863ced9454068c79e413cb23f472da6cbddc6cfc52/coverage-7.13.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:776483fd35b58d8afe3acbd9988d5de592ab6da2d2a865edfdbc9fdb43e7c486", size = 263357, upload-time = "2025-12-28T15:42:40.788Z" }, + { url = "https://files.pythonhosted.org/packages/7d/bd/58af54c0c9199ea4190284f389005779d7daf7bf3ce40dcd2d2b2f96da69/coverage-7.13.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b6f3b96617e9852703f5b633ea01315ca45c77e879584f283c44127f0f1ec564", size = 260959, upload-time = "2025-12-28T15:42:42.808Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2a/6839294e8f78a4891bf1df79d69c536880ba2f970d0ff09e7513d6e352e9/coverage-7.13.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:bd63e7b74661fed317212fab774e2a648bc4bb09b35f25474f8e3325d2945cd7", size = 259792, upload-time = "2025-12-28T15:42:44.818Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c3/528674d4623283310ad676c5af7414b9850ab6d55c2300e8aa4b945ec554/coverage-7.13.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:933082f161bbb3e9f90d00990dc956120f608cdbcaeea15c4d897f56ef4fe416", size = 262123, upload-time = "2025-12-28T15:42:47.108Z" }, + { url = "https://files.pythonhosted.org/packages/06/c5/8c0515692fb4c73ac379d8dc09b18eaf0214ecb76ea6e62467ba7a1556ff/coverage-7.13.1-cp314-cp314t-win32.whl", hash = "sha256:18be793c4c87de2965e1c0f060f03d9e5aff66cfeae8e1dbe6e5b88056ec153f", size = 222562, upload-time = "2025-12-28T15:42:49.144Z" }, + { url = "https://files.pythonhosted.org/packages/05/0e/c0a0c4678cb30dac735811db529b321d7e1c9120b79bd728d4f4d6b010e9/coverage-7.13.1-cp314-cp314t-win_amd64.whl", hash = "sha256:0e42e0ec0cd3e0d851cb3c91f770c9301f48647cb2877cb78f74bdaa07639a79", size = 223670, upload-time = "2025-12-28T15:42:51.218Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/b177aa0011f354abf03a8f30a85032686d290fdeed4222b27d36b4372a50/coverage-7.13.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eaecf47ef10c72ece9a2a92118257da87e460e113b83cc0d2905cbbe931792b4", size = 221707, upload-time = "2025-12-28T15:42:53.034Z" }, + { url = "https://files.pythonhosted.org/packages/cc/48/d9f421cb8da5afaa1a64570d9989e00fb7955e6acddc5a12979f7666ef60/coverage-7.13.1-py3-none-any.whl", hash = "sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573", size = 210722, upload-time = "2025-12-28T15:42:54.901Z" }, ] [[package]] @@ -579,23 +579,23 @@ wheels = [ [[package]] name = "debugpy" -version = "1.8.17" +version = "1.8.19" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/ad/71e708ff4ca377c4230530d6a7aa7992592648c122a2cd2b321cf8b35a76/debugpy-1.8.17.tar.gz", hash = "sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e", size = 1644129, upload-time = "2025-09-17T16:33:20.633Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/75/9e12d4d42349b817cd545b89247696c67917aab907012ae5b64bbfea3199/debugpy-1.8.19.tar.gz", hash = "sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb", size = 1644590, upload-time = "2025-12-15T21:53:28.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/2b/9d8e65beb2751876c82e1aceb32f328c43ec872711fa80257c7674f45650/debugpy-1.8.17-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d", size = 2549522, upload-time = "2025-09-17T16:33:38.466Z" }, - { url = "https://files.pythonhosted.org/packages/b4/78/eb0d77f02971c05fca0eb7465b18058ba84bd957062f5eec82f941ac792a/debugpy-1.8.17-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc", size = 4309417, upload-time = "2025-09-17T16:33:41.299Z" }, - { url = "https://files.pythonhosted.org/packages/37/42/c40f1d8cc1fed1e75ea54298a382395b8b937d923fcf41ab0797a554f555/debugpy-1.8.17-cp312-cp312-win32.whl", hash = "sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf", size = 5277130, upload-time = "2025-09-17T16:33:43.554Z" }, - { url = "https://files.pythonhosted.org/packages/72/22/84263b205baad32b81b36eac076de0cdbe09fe2d0637f5b32243dc7c925b/debugpy-1.8.17-cp312-cp312-win_amd64.whl", hash = "sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464", size = 5319053, upload-time = "2025-09-17T16:33:53.033Z" }, - { url = "https://files.pythonhosted.org/packages/50/76/597e5cb97d026274ba297af8d89138dfd9e695767ba0e0895edb20963f40/debugpy-1.8.17-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464", size = 2538386, upload-time = "2025-09-17T16:33:54.594Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/ce5c34fcdfec493701f9d1532dba95b21b2f6394147234dce21160bd923f/debugpy-1.8.17-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088", size = 4292100, upload-time = "2025-09-17T16:33:56.353Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/7873cf2146577ef71d2a20bf553f12df865922a6f87b9e8ee1df04f01785/debugpy-1.8.17-cp313-cp313-win32.whl", hash = "sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83", size = 5277002, upload-time = "2025-09-17T16:33:58.231Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl", hash = "sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420", size = 5319047, upload-time = "2025-09-17T16:34:00.586Z" }, - { url = "https://files.pythonhosted.org/packages/de/45/115d55b2a9da6de812696064ceb505c31e952c5d89c4ed1d9bb983deec34/debugpy-1.8.17-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1", size = 2536899, upload-time = "2025-09-17T16:34:02.657Z" }, - { url = "https://files.pythonhosted.org/packages/5a/73/2aa00c7f1f06e997ef57dc9b23d61a92120bec1437a012afb6d176585197/debugpy-1.8.17-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f", size = 4268254, upload-time = "2025-09-17T16:34:04.486Z" }, - { url = "https://files.pythonhosted.org/packages/86/b5/ed3e65c63c68a6634e3ba04bd10255c8e46ec16ebed7d1c79e4816d8a760/debugpy-1.8.17-cp314-cp314-win32.whl", hash = "sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670", size = 5277203, upload-time = "2025-09-17T16:34:06.65Z" }, - { url = "https://files.pythonhosted.org/packages/b0/26/394276b71c7538445f29e792f589ab7379ae70fd26ff5577dfde71158e96/debugpy-1.8.17-cp314-cp314-win_amd64.whl", hash = "sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c", size = 5318493, upload-time = "2025-09-17T16:34:08.483Z" }, - { url = "https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl", hash = "sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef", size = 5283210, upload-time = "2025-09-17T16:34:25.835Z" }, + { url = "https://files.pythonhosted.org/packages/4a/15/d762e5263d9e25b763b78be72dc084c7a32113a0bac119e2f7acae7700ed/debugpy-1.8.19-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:bccb1540a49cde77edc7ce7d9d075c1dbeb2414751bc0048c7a11e1b597a4c2e", size = 2549995, upload-time = "2025-12-15T21:53:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/a7/88/f7d25c68b18873b7c53d7c156ca7a7ffd8e77073aa0eac170a9b679cf786/debugpy-1.8.19-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:e9c68d9a382ec754dc05ed1d1b4ed5bd824b9f7c1a8cd1083adb84b3c93501de", size = 4309891, upload-time = "2025-12-15T21:53:45.26Z" }, + { url = "https://files.pythonhosted.org/packages/c5/4f/a65e973aba3865794da65f71971dca01ae66666132c7b2647182d5be0c5f/debugpy-1.8.19-cp312-cp312-win32.whl", hash = "sha256:6599cab8a783d1496ae9984c52cb13b7c4a3bd06a8e6c33446832a5d97ce0bee", size = 5286355, upload-time = "2025-12-15T21:53:46.763Z" }, + { url = "https://files.pythonhosted.org/packages/d8/3a/d3d8b48fec96e3d824e404bf428276fb8419dfa766f78f10b08da1cb2986/debugpy-1.8.19-cp312-cp312-win_amd64.whl", hash = "sha256:66e3d2fd8f2035a8f111eb127fa508469dfa40928a89b460b41fd988684dc83d", size = 5328239, upload-time = "2025-12-15T21:53:48.868Z" }, + { url = "https://files.pythonhosted.org/packages/71/3d/388035a31a59c26f1ecc8d86af607d0c42e20ef80074147cd07b180c4349/debugpy-1.8.19-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d", size = 2538859, upload-time = "2025-12-15T21:53:50.478Z" }, + { url = "https://files.pythonhosted.org/packages/4a/19/c93a0772d0962294f083dbdb113af1a7427bb632d36e5314297068f55db7/debugpy-1.8.19-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606", size = 4292575, upload-time = "2025-12-15T21:53:51.821Z" }, + { url = "https://files.pythonhosted.org/packages/5c/56/09e48ab796b0a77e3d7dc250f95251832b8bf6838c9632f6100c98bdf426/debugpy-1.8.19-cp313-cp313-win32.whl", hash = "sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976", size = 5286209, upload-time = "2025-12-15T21:53:53.602Z" }, + { url = "https://files.pythonhosted.org/packages/fb/4e/931480b9552c7d0feebe40c73725dd7703dcc578ba9efc14fe0e6d31cfd1/debugpy-1.8.19-cp313-cp313-win_amd64.whl", hash = "sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73", size = 5328206, upload-time = "2025-12-15T21:53:55.433Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b9/cbec520c3a00508327476c7fce26fbafef98f412707e511eb9d19a2ef467/debugpy-1.8.19-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af", size = 2537372, upload-time = "2025-12-15T21:53:57.318Z" }, + { url = "https://files.pythonhosted.org/packages/88/5e/cf4e4dc712a141e10d58405c58c8268554aec3c35c09cdcda7535ff13f76/debugpy-1.8.19-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809", size = 4268729, upload-time = "2025-12-15T21:53:58.712Z" }, + { url = "https://files.pythonhosted.org/packages/82/a3/c91a087ab21f1047db328c1d3eb5d1ff0e52de9e74f9f6f6fa14cdd93d58/debugpy-1.8.19-cp314-cp314-win32.whl", hash = "sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b", size = 5286388, upload-time = "2025-12-15T21:54:00.687Z" }, + { url = "https://files.pythonhosted.org/packages/17/b8/bfdc30b6e94f1eff09f2dc9cc1f9cd1c6cde3d996bcbd36ce2d9a4956e99/debugpy-1.8.19-cp314-cp314-win_amd64.whl", hash = "sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f", size = 5327741, upload-time = "2025-12-15T21:54:02.148Z" }, + { url = "https://files.pythonhosted.org/packages/25/3e/e27078370414ef35fafad2c06d182110073daaeb5d3bf734b0b1eeefe452/debugpy-1.8.19-py2.py3-none-any.whl", hash = "sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38", size = 5292321, upload-time = "2025-12-15T21:54:16.024Z" }, ] [[package]] @@ -651,96 +651,96 @@ wheels = [ [[package]] name = "faiss-cpu" -version = "1.13.1" +version = "1.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "packaging" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/66/92/c4f30580aee11fda3f424f8509d9b5ad96b9f44409f52a7ceb6b42880e50/faiss_cpu-1.13.1-cp310-abi3-macosx_14_0_arm64.whl", hash = "sha256:2967def7aa2da8efbf6a5da81138780aa17a9970ca666417cb632a00a593423d", size = 3418004, upload-time = "2025-12-05T01:01:51.955Z" }, - { url = "https://files.pythonhosted.org/packages/04/1f/30803e63affa8bbdfd549f83ed5d39ccf900c030b6da8010d0b95f7ae1d1/faiss_cpu-1.13.1-cp310-abi3-macosx_14_0_x86_64.whl", hash = "sha256:30c179891656a988f5223e586c696432aacc5f4e763d85e165be30ef57ac2bbf", size = 7806468, upload-time = "2025-12-05T01:01:54.096Z" }, - { url = "https://files.pythonhosted.org/packages/17/ae/40f66b640664af319ff8be87a9b0cc2c9ec025a2cf82b27cc27964fcf3c0/faiss_cpu-1.13.1-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff5bdbf392081659e6b0f98f03b602bf08d1b5a790e28aa1185ae925decff6b2", size = 11410471, upload-time = "2025-12-05T01:01:56.038Z" }, - { url = "https://files.pythonhosted.org/packages/38/f8/b8f0862ec6af8a71c6410a61baa35571161f7dba616aed696e91cb464630/faiss_cpu-1.13.1-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3de25edb0e69c1b95eeda923b2e23da01f472b2cc3f4817e63b25a56847d6ea7", size = 23719213, upload-time = "2025-12-05T01:01:58.545Z" }, - { url = "https://files.pythonhosted.org/packages/4c/ee/01e07e4e780b0b739a3299ca8e5b4751970629b0f2c51f5ec464718e9f9e/faiss_cpu-1.13.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0b2f0e6cd30511b9fe320a2309389269269d3e363cc88c3a0380095a8c08ae27", size = 13400767, upload-time = "2025-12-05T01:02:00.742Z" }, - { url = "https://files.pythonhosted.org/packages/da/27/0c4e249fe50f87f1f038c80deebcdd28b23617bb42e3e5708b34c86fdae7/faiss_cpu-1.13.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8ad542573ad05af6c508f4cf5268ba2aad06f0c8d4e780a0eeba7fe6fd274922", size = 24960102, upload-time = "2025-12-05T01:02:04.56Z" }, - { url = "https://files.pythonhosted.org/packages/09/bc/ce942b00958ef52caca71666c06fa801fcd99dc61a9873ab067932dd3d5e/faiss_cpu-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:0fece5b63e8d014f8db4abfe0b4c9a82e6508e64f450fce700e5cb4b47041f1a", size = 18812863, upload-time = "2025-12-05T01:02:14.982Z" }, - { url = "https://files.pythonhosted.org/packages/47/ab/7b91c9cb328d960466e23cd9ca02f44d554ac5761d41262b74daa1715da1/faiss_cpu-1.13.1-cp312-cp312-win_arm64.whl", hash = "sha256:168986e3f152a7568257c5ac50f3cf1a1aaa34fb41e1ba7259799bcb8ffe687f", size = 8507940, upload-time = "2025-12-05T01:02:18.078Z" }, - { url = "https://files.pythonhosted.org/packages/aa/75/0fb845be2e674531ce7f89207d7f932ffbc8fc50f866dba5569512305cc9/faiss_cpu-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:5f71c8840794c39c1e1cdd92c2ef4d3f77b3e650f614f296e31c2545ad2bab51", size = 18812964, upload-time = "2025-12-05T01:02:20.505Z" }, - { url = "https://files.pythonhosted.org/packages/00/2c/c13c816546ffc5b0b7f8ca64811b24b17d73ff6382464f1ab0eed87b7753/faiss_cpu-1.13.1-cp313-cp313-win_arm64.whl", hash = "sha256:24cb2d6ce2459c94e15a6cecfed15ff8d9f997aed7bae4037c0f045022030cb3", size = 8508631, upload-time = "2025-12-05T01:02:22.751Z" }, - { url = "https://files.pythonhosted.org/packages/45/6f/adf064c644a80c0ebd499144ccbab672c9946361132617ceafcc48819771/faiss_cpu-1.13.1-cp314-cp314-win_amd64.whl", hash = "sha256:5195ab9149c563cafe4da8ab4cc0b84b177cbb1f8aa897a8c199e11ef4f37e16", size = 18816994, upload-time = "2025-12-05T01:02:25.055Z" }, - { url = "https://files.pythonhosted.org/packages/61/53/042f863a6a1202af8eec94604dc8b192319253faabb8ee6070297a24c091/faiss_cpu-1.13.1-cp314-cp314-win_arm64.whl", hash = "sha256:ffc58173e24026ee4dc08c50dd3506ad553d4b2103892500b0d4ae9344027d57", size = 8511280, upload-time = "2025-12-05T01:02:27.163Z" }, + { url = "https://files.pythonhosted.org/packages/07/c9/671f66f6b31ec48e5825d36435f0cb91189fa8bb6b50724029dbff4ca83c/faiss_cpu-1.13.2-cp310-abi3-macosx_14_0_arm64.whl", hash = "sha256:a9064eb34f8f64438dd5b95c8f03a780b1a3f0b99c46eeacb1f0b5d15fc02dc1", size = 3452776, upload-time = "2025-12-24T10:27:01.419Z" }, + { url = "https://files.pythonhosted.org/packages/5a/4a/97150aa1582fb9c2bca95bd8fc37f27d3b470acec6f0a6833844b21e4b40/faiss_cpu-1.13.2-cp310-abi3-macosx_14_0_x86_64.whl", hash = "sha256:c8d097884521e1ecaea6467aeebbf1aa56ee4a36350b48b2ca6b39366565c317", size = 7896434, upload-time = "2025-12-24T10:27:03.592Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d0/0940575f059591ca31b63a881058adb16a387020af1709dcb7669460115c/faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ee330a284042c2480f2e90450a10378fd95655d62220159b1408f59ee83ebf1", size = 11485825, upload-time = "2025-12-24T10:27:05.681Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e1/a5acac02aa593809f0123539afe7b4aff61d1db149e7093239888c9053e1/faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab88ee287c25a119213153d033f7dd64c3ccec466ace267395872f554b648cd7", size = 23845772, upload-time = "2025-12-24T10:27:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7b/49dcaf354834ec457e85ca769d50bc9b5f3003fab7c94a9dcf08cf742793/faiss_cpu-1.13.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85511129b34f890d19c98b82a0cd5ffb27d89d1cec2ee41d2621ee9f9ef8cf3f", size = 13477567, upload-time = "2025-12-24T10:27:10.822Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6b/12bb4037921c38bb2c0b4cfc213ca7e04bbbebbfea89b0b5746248ce446e/faiss_cpu-1.13.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b32eb4065bac352b52a9f5ae07223567fab0a976c7d05017c01c45a1c24264f", size = 25102239, upload-time = "2025-12-24T10:27:13.476Z" }, + { url = "https://files.pythonhosted.org/packages/87/ff/35ed875423200c17bdd594ce921abfc1812ddd21e09355290b9a94e170ab/faiss_cpu-1.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:b82c01d30430dd7b1fa442001b9099735d1a82f6bb72033acdc9206d5ac66a64", size = 18890300, upload-time = "2025-12-24T10:27:24.194Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3a/bbdf5deaf6feb34b46b469c0a0acd40216c3d3c6ecf5aeb71d56b8a650e3/faiss_cpu-1.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2c4f696ae76e7c97cbc12311db83aaf1e7f4f7be06a3ffea7e5b0e8ec1fd805b", size = 8553157, upload-time = "2025-12-24T10:27:26.38Z" }, + { url = "https://files.pythonhosted.org/packages/60/4b/903d85bf3a8264d49964ec799e45c7ffc91098606b8bc9ef2c904c1a56cb/faiss_cpu-1.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:cb4b5ee184816a4b099162ac93c0d7f0033d81a88e7c1291d0a9cc41ec348984", size = 18891330, upload-time = "2025-12-24T10:27:28.806Z" }, + { url = "https://files.pythonhosted.org/packages/b2/52/5d10642da628f63544aab27e48416be4a7ea25c6b81d8bd65016d8538b00/faiss_cpu-1.13.2-cp313-cp313-win_arm64.whl", hash = "sha256:1243967eeb2298791ff7f3683a4abd2100d7e6ec7542ca05c3b75d47a7f621e5", size = 8553088, upload-time = "2025-12-24T10:27:31.325Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b1/daaab8046f56c60079648bd83774f61b283b59a9930a2f60790ee4cdedfe/faiss_cpu-1.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:c8b645e7d56591aa35dc75415bb53a62e4a494dba010e16f4b67daeffd830bd7", size = 18892621, upload-time = "2025-12-24T10:27:33.923Z" }, + { url = "https://files.pythonhosted.org/packages/06/6f/5eaf3e249c636e616ebb52e369a4a2f1d32b1caf9a611b4f917b3dd21423/faiss_cpu-1.13.2-cp314-cp314-win_arm64.whl", hash = "sha256:8113a2a80b59fe5653cf66f5c0f18be0a691825601a52a614c30beb1fca9bc7c", size = 8556374, upload-time = "2025-12-24T10:27:36.653Z" }, ] [[package]] name = "faker" -version = "38.2.0" +version = "40.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tzdata" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/27/022d4dbd4c20567b4c294f79a133cc2f05240ea61e0d515ead18c995c249/faker-38.2.0.tar.gz", hash = "sha256:20672803db9c7cb97f9b56c18c54b915b6f1d8991f63d1d673642dc43f5ce7ab", size = 1941469, upload-time = "2025-11-19T16:37:31.892Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/77/1c3ff07b6739b9a1d23ca01ec0a90a309a33b78e345a3eb52f9ce9240e36/faker-40.1.2.tar.gz", hash = "sha256:b76a68163aa5f171d260fc24827a8349bc1db672f6a665359e8d0095e8135d30", size = 1949802, upload-time = "2026-01-13T20:51:49.917Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/93/00c94d45f55c336434a15f98d906387e87ce28f9918e4444829a8fda432d/faker-38.2.0-py3-none-any.whl", hash = "sha256:35fe4a0a79dee0dc4103a6083ee9224941e7d3594811a50e3969e547b0d2ee65", size = 1980505, upload-time = "2025-11-19T16:37:30.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/ec/91a434c8a53d40c3598966621dea9c50512bec6ce8e76fa1751015e74cef/faker-40.1.2-py3-none-any.whl", hash = "sha256:93503165c165d330260e4379fd6dc07c94da90c611ed3191a0174d2ab9966a42", size = 1985633, upload-time = "2026-01-13T20:51:47.982Z" }, ] [[package]] name = "filelock" -version = "3.20.1" +version = "3.20.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/23/ce7a1126827cedeb958fc043d61745754464eb56c5937c35bbf2b8e26f34/filelock-3.20.1.tar.gz", hash = "sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c", size = 19476, upload-time = "2025-12-15T23:54:28.027Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl", hash = "sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a", size = 16666, upload-time = "2025-12-15T23:54:26.874Z" }, + { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, ] [[package]] name = "fonttools" -version = "4.61.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, - { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, - { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, - { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" }, - { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" }, - { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" }, - { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" }, - { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" }, - { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" }, - { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" }, - { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" }, - { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" }, - { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" }, - { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" }, - { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" }, - { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" }, - { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" }, - { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" }, - { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" }, - { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" }, + { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" }, + { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" }, + { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" }, + { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, + { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, + { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, + { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, + { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, ] [[package]] name = "fsspec" -version = "2025.12.0" +version = "2026.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/27/954057b0d1f53f086f681755207dda6de6c660ce133c829158e8e8fe7895/fsspec-2025.12.0.tar.gz", hash = "sha256:c505de011584597b1060ff778bb664c1bc022e87921b0e4f10cc9c44f9635973", size = 309748, upload-time = "2025-12-03T15:23:42.687Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/7d/5df2650c57d47c57232af5ef4b4fdbff182070421e405e0d62c6cdbfaa87/fsspec-2026.1.0.tar.gz", hash = "sha256:e987cb0496a0d81bba3a9d1cee62922fb395e7d4c3b575e57f547953334fe07b", size = 310496, upload-time = "2026-01-09T15:21:35.562Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/c7/b64cae5dba3a1b138d7123ec36bb5ccd39d39939f18454407e5468f4763f/fsspec-2025.12.0-py3-none-any.whl", hash = "sha256:8bf1fe301b7d8acfa6e8571e3b1c3d158f909666642431cc78a1b7b4dbc5ec5b", size = 201422, upload-time = "2025-12-03T15:23:41.434Z" }, + { url = "https://files.pythonhosted.org/packages/01/c9/97cc5aae1648dcb851958a3ddf73ccd7dbe5650d95203ecb4d7720b4cdbf/fsspec-2026.1.0-py3-none-any.whl", hash = "sha256:cb76aa913c2285a3b49bdd5fc55b1d7c708d7208126b60f2eb8194fe1b4cbdcc", size = 201838, upload-time = "2026-01-09T15:21:34.041Z" }, ] [[package]] @@ -844,11 +844,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.15" +version = "2.6.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/8d/e8b97e6bd3fb6fb271346f7981362f1e04d6a7463abd0de79e1fda17c067/identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980", size = 99360, upload-time = "2026-01-12T18:58:58.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, + { url = "https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0", size = 99202, upload-time = "2026-01-12T18:58:56.627Z" }, ] [[package]] @@ -895,7 +895,7 @@ wheels = [ [[package]] name = "ipython" -version = "9.8.0" +version = "9.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -909,9 +909,9 @@ dependencies = [ { name = "stack-data" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/51/a703c030f4928646d390b4971af4938a1b10c9dfce694f0d99a0bb073cb2/ipython-9.8.0.tar.gz", hash = "sha256:8e4ce129a627eb9dd221c41b1d2cdaed4ef7c9da8c17c63f6f578fe231141f83", size = 4424940, upload-time = "2025-12-03T10:18:24.353Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/dd/fb08d22ec0c27e73c8bc8f71810709870d51cadaf27b7ddd3f011236c100/ipython-9.9.0.tar.gz", hash = "sha256:48fbed1b2de5e2c7177eefa144aba7fcb82dac514f09b57e2ac9da34ddb54220", size = 4425043, upload-time = "2026-01-05T12:36:46.233Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/df/8ee1c5dd1e3308b5d5b2f2dfea323bb2f3827da8d654abb6642051199049/ipython-9.8.0-py3-none-any.whl", hash = "sha256:ebe6d1d58d7d988fbf23ff8ff6d8e1622cfdb194daf4b7b73b792c4ec3b85385", size = 621374, upload-time = "2025-12-03T10:18:22.335Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/162cfaee4ccf370465c5af1ce36a9eacec1becb552f2033bb3584e6f640a/ipython-9.9.0-py3-none-any.whl", hash = "sha256:b457fe9165df2b84e8ec909a97abcf2ed88f565970efba16b1f7229c283d252b", size = 621431, upload-time = "2026-01-05T12:36:44.669Z" }, ] [[package]] @@ -961,16 +961,16 @@ wheels = [ [[package]] name = "joblib" -version = "1.5.2" +version = "1.5.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload-time = "2025-08-27T12:15:46.575Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, ] [[package]] name = "jupyter-client" -version = "8.6.3" +version = "8.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-core" }, @@ -979,9 +979,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, ] [[package]] @@ -1071,54 +1071,54 @@ wheels = [ [[package]] name = "librt" -version = "0.7.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/d9/6f3d3fcf5e5543ed8a60cc70fa7d50508ed60b8a10e9af6d2058159ab54e/librt-0.7.3.tar.gz", hash = "sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798", size = 144549, upload-time = "2025-12-06T19:04:45.553Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/90/ed8595fa4e35b6020317b5ea8d226a782dcbac7a997c19ae89fb07a41c66/librt-0.7.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3", size = 55687, upload-time = "2025-12-06T19:03:39.245Z" }, - { url = "https://files.pythonhosted.org/packages/dd/f6/6a20702a07b41006cb001a759440cb6b5362530920978f64a2b2ae2bf729/librt-0.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18", size = 57127, upload-time = "2025-12-06T19:03:40.3Z" }, - { url = "https://files.pythonhosted.org/packages/79/f3/b0c4703d5ffe9359b67bb2ccb86c42d4e930a363cfc72262ac3ba53cff3e/librt-0.7.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60", size = 165336, upload-time = "2025-12-06T19:03:41.369Z" }, - { url = "https://files.pythonhosted.org/packages/02/69/3ba05b73ab29ccbe003856232cea4049769be5942d799e628d1470ed1694/librt-0.7.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed", size = 174237, upload-time = "2025-12-06T19:03:42.44Z" }, - { url = "https://files.pythonhosted.org/packages/22/ad/d7c2671e7bf6c285ef408aa435e9cd3fdc06fd994601e1f2b242df12034f/librt-0.7.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e", size = 189017, upload-time = "2025-12-06T19:03:44.01Z" }, - { url = "https://files.pythonhosted.org/packages/f4/94/d13f57193148004592b618555f296b41d2d79b1dc814ff8b3273a0bf1546/librt-0.7.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b", size = 183983, upload-time = "2025-12-06T19:03:45.834Z" }, - { url = "https://files.pythonhosted.org/packages/02/10/b612a9944ebd39fa143c7e2e2d33f2cb790205e025ddd903fb509a3a3bb3/librt-0.7.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f", size = 177602, upload-time = "2025-12-06T19:03:46.944Z" }, - { url = "https://files.pythonhosted.org/packages/1f/48/77bc05c4cc232efae6c5592c0095034390992edbd5bae8d6cf1263bb7157/librt-0.7.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c", size = 199282, upload-time = "2025-12-06T19:03:48.069Z" }, - { url = "https://files.pythonhosted.org/packages/12/aa/05916ccd864227db1ffec2a303ae34f385c6b22d4e7ce9f07054dbcf083c/librt-0.7.3-cp312-cp312-win32.whl", hash = "sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b", size = 47879, upload-time = "2025-12-06T19:03:49.289Z" }, - { url = "https://files.pythonhosted.org/packages/50/92/7f41c42d31ea818b3c4b9cc1562e9714bac3c676dd18f6d5dd3d0f2aa179/librt-0.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a", size = 54972, upload-time = "2025-12-06T19:03:50.335Z" }, - { url = "https://files.pythonhosted.org/packages/3f/dc/53582bbfb422311afcbc92adb75711f04e989cec052f08ec0152fbc36c9c/librt-0.7.3-cp312-cp312-win_arm64.whl", hash = "sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc", size = 48338, upload-time = "2025-12-06T19:03:51.431Z" }, - { url = "https://files.pythonhosted.org/packages/93/7d/e0ce1837dfb452427db556e6d4c5301ba3b22fe8de318379fbd0593759b9/librt-0.7.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed", size = 55742, upload-time = "2025-12-06T19:03:52.459Z" }, - { url = "https://files.pythonhosted.org/packages/be/c0/3564262301e507e1d5cf31c7d84cb12addf0d35e05ba53312494a2eba9a4/librt-0.7.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc", size = 57163, upload-time = "2025-12-06T19:03:53.516Z" }, - { url = "https://files.pythonhosted.org/packages/be/ac/245e72b7e443d24a562f6047563c7f59833384053073ef9410476f68505b/librt-0.7.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e", size = 165840, upload-time = "2025-12-06T19:03:54.918Z" }, - { url = "https://files.pythonhosted.org/packages/98/af/587e4491f40adba066ba39a450c66bad794c8d92094f936a201bfc7c2b5f/librt-0.7.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5", size = 174827, upload-time = "2025-12-06T19:03:56.082Z" }, - { url = "https://files.pythonhosted.org/packages/78/21/5b8c60ea208bc83dd00421022a3874330685d7e856404128dc3728d5d1af/librt-0.7.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055", size = 189612, upload-time = "2025-12-06T19:03:57.507Z" }, - { url = "https://files.pythonhosted.org/packages/da/2f/8b819169ef696421fb81cd04c6cdf225f6e96f197366001e9d45180d7e9e/librt-0.7.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292", size = 184584, upload-time = "2025-12-06T19:03:58.686Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fc/af9d225a9395b77bd7678362cb055d0b8139c2018c37665de110ca388022/librt-0.7.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910", size = 178269, upload-time = "2025-12-06T19:03:59.769Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d8/7b4fa1683b772966749d5683aa3fd605813defffe157833a8fa69cc89207/librt-0.7.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093", size = 199852, upload-time = "2025-12-06T19:04:00.901Z" }, - { url = "https://files.pythonhosted.org/packages/77/e8/4598413aece46ca38d9260ef6c51534bd5f34b5c21474fcf210ce3a02123/librt-0.7.3-cp313-cp313-win32.whl", hash = "sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe", size = 47936, upload-time = "2025-12-06T19:04:02.054Z" }, - { url = "https://files.pythonhosted.org/packages/af/80/ac0e92d5ef8c6791b3e2c62373863827a279265e0935acdf807901353b0e/librt-0.7.3-cp313-cp313-win_amd64.whl", hash = "sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0", size = 54965, upload-time = "2025-12-06T19:04:03.224Z" }, - { url = "https://files.pythonhosted.org/packages/f1/fd/042f823fcbff25c1449bb4203a29919891ca74141b68d3a5f6612c4ce283/librt-0.7.3-cp313-cp313-win_arm64.whl", hash = "sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a", size = 48350, upload-time = "2025-12-06T19:04:04.234Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ae/c6ecc7bb97134a71b5241e8855d39964c0e5f4d96558f0d60593892806d2/librt-0.7.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93", size = 55175, upload-time = "2025-12-06T19:04:05.308Z" }, - { url = "https://files.pythonhosted.org/packages/cf/bc/2cc0cb0ab787b39aa5c7645cd792433c875982bdf12dccca558b89624594/librt-0.7.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e", size = 56881, upload-time = "2025-12-06T19:04:06.674Z" }, - { url = "https://files.pythonhosted.org/packages/8e/87/397417a386190b70f5bf26fcedbaa1515f19dce33366e2684c6b7ee83086/librt-0.7.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207", size = 163710, upload-time = "2025-12-06T19:04:08.437Z" }, - { url = "https://files.pythonhosted.org/packages/c9/37/7338f85b80e8a17525d941211451199845093ca242b32efbf01df8531e72/librt-0.7.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f", size = 172471, upload-time = "2025-12-06T19:04:10.124Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e0/741704edabbfae2c852fedc1b40d9ed5a783c70ed3ed8e4fe98f84b25d13/librt-0.7.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678", size = 186804, upload-time = "2025-12-06T19:04:11.586Z" }, - { url = "https://files.pythonhosted.org/packages/f4/d1/0a82129d6ba242f3be9af34815be089f35051bc79619f5c27d2c449ecef6/librt-0.7.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218", size = 181817, upload-time = "2025-12-06T19:04:12.802Z" }, - { url = "https://files.pythonhosted.org/packages/4f/32/704f80bcf9979c68d4357c46f2af788fbf9d5edda9e7de5786ed2255e911/librt-0.7.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620", size = 175602, upload-time = "2025-12-06T19:04:14.004Z" }, - { url = "https://files.pythonhosted.org/packages/f7/6d/4355cfa0fae0c062ba72f541d13db5bc575770125a7ad3d4f46f4109d305/librt-0.7.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e", size = 196497, upload-time = "2025-12-06T19:04:15.487Z" }, - { url = "https://files.pythonhosted.org/packages/2e/eb/ac6d8517d44209e5a712fde46f26d0055e3e8969f24d715f70bd36056230/librt-0.7.3-cp314-cp314-win32.whl", hash = "sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3", size = 44678, upload-time = "2025-12-06T19:04:16.688Z" }, - { url = "https://files.pythonhosted.org/packages/e9/93/238f026d141faf9958da588c761a0812a1a21c98cc54a76f3608454e4e59/librt-0.7.3-cp314-cp314-win_amd64.whl", hash = "sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010", size = 51689, upload-time = "2025-12-06T19:04:17.726Z" }, - { url = "https://files.pythonhosted.org/packages/52/44/43f462ad9dcf9ed7d3172fe2e30d77b980956250bd90e9889a9cca93df2a/librt-0.7.3-cp314-cp314-win_arm64.whl", hash = "sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e", size = 44662, upload-time = "2025-12-06T19:04:18.771Z" }, - { url = "https://files.pythonhosted.org/packages/1d/35/fed6348915f96b7323241de97f26e2af481e95183b34991df12fd5ce31b1/librt-0.7.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a", size = 57347, upload-time = "2025-12-06T19:04:19.812Z" }, - { url = "https://files.pythonhosted.org/packages/9a/f2/045383ccc83e3fea4fba1b761796584bc26817b6b2efb6b8a6731431d16f/librt-0.7.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a", size = 59223, upload-time = "2025-12-06T19:04:20.862Z" }, - { url = "https://files.pythonhosted.org/packages/77/3f/c081f8455ab1d7f4a10dbe58463ff97119272ff32494f21839c3b9029c2c/librt-0.7.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f", size = 183861, upload-time = "2025-12-06T19:04:21.963Z" }, - { url = "https://files.pythonhosted.org/packages/1d/f5/73c5093c22c31fbeaebc25168837f05ebfd8bf26ce00855ef97a5308f36f/librt-0.7.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e", size = 194594, upload-time = "2025-12-06T19:04:23.14Z" }, - { url = "https://files.pythonhosted.org/packages/78/b8/d5f17d4afe16612a4a94abfded94c16c5a033f183074fb130dfe56fc1a42/librt-0.7.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e", size = 206759, upload-time = "2025-12-06T19:04:24.328Z" }, - { url = "https://files.pythonhosted.org/packages/36/2e/021765c1be85ee23ffd5b5b968bb4cba7526a4db2a0fc27dcafbdfc32da7/librt-0.7.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70", size = 203210, upload-time = "2025-12-06T19:04:25.544Z" }, - { url = "https://files.pythonhosted.org/packages/77/f0/9923656e42da4fd18c594bd08cf6d7e152d4158f8b808e210d967f0dcceb/librt-0.7.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712", size = 196708, upload-time = "2025-12-06T19:04:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/fc/0b/0708b886ac760e64d6fbe7e16024e4be3ad1a3629d19489a97e9cf4c3431/librt-0.7.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42", size = 217212, upload-time = "2025-12-06T19:04:27.892Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7f/12a73ff17bca4351e73d585dd9ebf46723c4a8622c4af7fe11a2e2d011ff/librt-0.7.3-cp314-cp314t-win32.whl", hash = "sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd", size = 45586, upload-time = "2025-12-06T19:04:29.116Z" }, - { url = "https://files.pythonhosted.org/packages/e2/df/8decd032ac9b995e4f5606cde783711a71094128d88d97a52e397daf2c89/librt-0.7.3-cp314-cp314t-win_amd64.whl", hash = "sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f", size = 53002, upload-time = "2025-12-06T19:04:30.173Z" }, - { url = "https://files.pythonhosted.org/packages/de/0c/6605b6199de8178afe7efc77ca1d8e6db00453bc1d3349d27605c0f42104/librt-0.7.3-cp314-cp314t-win_arm64.whl", hash = "sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b", size = 45647, upload-time = "2025-12-06T19:04:31.302Z" }, +version = "0.7.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/24/5f3646ff414285e0f7708fa4e946b9bf538345a41d1c375c439467721a5e/librt-0.7.8.tar.gz", hash = "sha256:1a4ede613941d9c3470b0368be851df6bb78ab218635512d0370b27a277a0862", size = 148323, upload-time = "2026-01-14T12:56:16.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/04/79d8fcb43cae376c7adbab7b2b9f65e48432c9eced62ac96703bcc16e09b/librt-0.7.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b6943885b2d49c48d0cff23b16be830ba46b0152d98f62de49e735c6e655a63", size = 57472, upload-time = "2026-01-14T12:55:08.528Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ba/60b96e93043d3d659da91752689023a73981336446ae82078cddf706249e/librt-0.7.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46ef1f4b9b6cc364b11eea0ecc0897314447a66029ee1e55859acb3dd8757c93", size = 58986, upload-time = "2026-01-14T12:55:09.466Z" }, + { url = "https://files.pythonhosted.org/packages/7c/26/5215e4cdcc26e7be7eee21955a7e13cbf1f6d7d7311461a6014544596fac/librt-0.7.8-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:907ad09cfab21e3c86e8f1f87858f7049d1097f77196959c033612f532b4e592", size = 168422, upload-time = "2026-01-14T12:55:10.499Z" }, + { url = "https://files.pythonhosted.org/packages/0f/84/e8d1bc86fa0159bfc24f3d798d92cafd3897e84c7fea7fe61b3220915d76/librt-0.7.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2991b6c3775383752b3ca0204842743256f3ad3deeb1d0adc227d56b78a9a850", size = 177478, upload-time = "2026-01-14T12:55:11.577Z" }, + { url = "https://files.pythonhosted.org/packages/57/11/d0268c4b94717a18aa91df1100e767b010f87b7ae444dafaa5a2d80f33a6/librt-0.7.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03679b9856932b8c8f674e87aa3c55ea11c9274301f76ae8dc4d281bda55cf62", size = 192439, upload-time = "2026-01-14T12:55:12.7Z" }, + { url = "https://files.pythonhosted.org/packages/8d/56/1e8e833b95fe684f80f8894ae4d8b7d36acc9203e60478fcae599120a975/librt-0.7.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3968762fec1b2ad34ce57458b6de25dbb4142713e9ca6279a0d352fa4e9f452b", size = 191483, upload-time = "2026-01-14T12:55:13.838Z" }, + { url = "https://files.pythonhosted.org/packages/17/48/f11cf28a2cb6c31f282009e2208312aa84a5ee2732859f7856ee306176d5/librt-0.7.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb7a7807523a31f03061288cc4ffc065d684c39db7644c676b47d89553c0d714", size = 185376, upload-time = "2026-01-14T12:55:15.017Z" }, + { url = "https://files.pythonhosted.org/packages/b8/6a/d7c116c6da561b9155b184354a60a3d5cdbf08fc7f3678d09c95679d13d9/librt-0.7.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad64a14b1e56e702e19b24aae108f18ad1bf7777f3af5fcd39f87d0c5a814449", size = 206234, upload-time = "2026-01-14T12:55:16.571Z" }, + { url = "https://files.pythonhosted.org/packages/61/de/1975200bb0285fc921c5981d9978ce6ce11ae6d797df815add94a5a848a3/librt-0.7.8-cp312-cp312-win32.whl", hash = "sha256:0241a6ed65e6666236ea78203a73d800dbed896cf12ae25d026d75dc1fcd1dac", size = 44057, upload-time = "2026-01-14T12:55:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/8e/cd/724f2d0b3461426730d4877754b65d39f06a41ac9d0a92d5c6840f72b9ae/librt-0.7.8-cp312-cp312-win_amd64.whl", hash = "sha256:6db5faf064b5bab9675c32a873436b31e01d66ca6984c6f7f92621656033a708", size = 50293, upload-time = "2026-01-14T12:55:19.179Z" }, + { url = "https://files.pythonhosted.org/packages/bd/cf/7e899acd9ee5727ad8160fdcc9994954e79fab371c66535c60e13b968ffc/librt-0.7.8-cp312-cp312-win_arm64.whl", hash = "sha256:57175aa93f804d2c08d2edb7213e09276bd49097611aefc37e3fa38d1fb99ad0", size = 43574, upload-time = "2026-01-14T12:55:20.185Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fe/b1f9de2829cf7fc7649c1dcd202cfd873837c5cc2fc9e526b0e7f716c3d2/librt-0.7.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4c3995abbbb60b3c129490fa985dfe6cac11d88fc3c36eeb4fb1449efbbb04fc", size = 57500, upload-time = "2026-01-14T12:55:21.219Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d4/4a60fbe2e53b825f5d9a77325071d61cd8af8506255067bf0c8527530745/librt-0.7.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44e0c2cbc9bebd074cf2cdbe472ca185e824be4e74b1c63a8e934cea674bebf2", size = 59019, upload-time = "2026-01-14T12:55:22.256Z" }, + { url = "https://files.pythonhosted.org/packages/6a/37/61ff80341ba5159afa524445f2d984c30e2821f31f7c73cf166dcafa5564/librt-0.7.8-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d2f1e492cae964b3463a03dc77a7fe8742f7855d7258c7643f0ee32b6651dd3", size = 169015, upload-time = "2026-01-14T12:55:23.24Z" }, + { url = "https://files.pythonhosted.org/packages/1c/86/13d4f2d6a93f181ebf2fc953868826653ede494559da8268023fe567fca3/librt-0.7.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:451e7ffcef8f785831fdb791bd69211f47e95dc4c6ddff68e589058806f044c6", size = 178161, upload-time = "2026-01-14T12:55:24.826Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/e24ef01305954fc4d771f1f09f3dd682f9eb610e1bec188ffb719374d26e/librt-0.7.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3469e1af9f1380e093ae06bedcbdd11e407ac0b303a56bbe9afb1d6824d4982d", size = 193015, upload-time = "2026-01-14T12:55:26.04Z" }, + { url = "https://files.pythonhosted.org/packages/88/a0/92b6bd060e720d7a31ed474d046a69bd55334ec05e9c446d228c4b806ae3/librt-0.7.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f11b300027ce19a34f6d24ebb0a25fd0e24a9d53353225a5c1e6cadbf2916b2e", size = 192038, upload-time = "2026-01-14T12:55:27.208Z" }, + { url = "https://files.pythonhosted.org/packages/06/bb/6f4c650253704279c3a214dad188101d1b5ea23be0606628bc6739456624/librt-0.7.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4adc73614f0d3c97874f02f2c7fd2a27854e7e24ad532ea6b965459c5b757eca", size = 186006, upload-time = "2026-01-14T12:55:28.594Z" }, + { url = "https://files.pythonhosted.org/packages/dc/00/1c409618248d43240cadf45f3efb866837fa77e9a12a71481912135eb481/librt-0.7.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60c299e555f87e4c01b2eca085dfccda1dde87f5a604bb45c2906b8305819a93", size = 206888, upload-time = "2026-01-14T12:55:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/d9/83/b2cfe8e76ff5c1c77f8a53da3d5de62d04b5ebf7cf913e37f8bca43b5d07/librt-0.7.8-cp313-cp313-win32.whl", hash = "sha256:b09c52ed43a461994716082ee7d87618096851319bf695d57ec123f2ab708951", size = 44126, upload-time = "2026-01-14T12:55:31.44Z" }, + { url = "https://files.pythonhosted.org/packages/a9/0b/c59d45de56a51bd2d3a401fc63449c0ac163e4ef7f523ea8b0c0dee86ec5/librt-0.7.8-cp313-cp313-win_amd64.whl", hash = "sha256:f8f4a901a3fa28969d6e4519deceab56c55a09d691ea7b12ca830e2fa3461e34", size = 50262, upload-time = "2026-01-14T12:55:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b9/973455cec0a1ec592395250c474164c4a58ebf3e0651ee920fef1a2623f1/librt-0.7.8-cp313-cp313-win_arm64.whl", hash = "sha256:43d4e71b50763fcdcf64725ac680d8cfa1706c928b844794a7aa0fa9ac8e5f09", size = 43600, upload-time = "2026-01-14T12:55:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/1a/73/fa8814c6ce2d49c3827829cadaa1589b0bf4391660bd4510899393a23ebc/librt-0.7.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:be927c3c94c74b05128089a955fba86501c3b544d1d300282cc1b4bd370cb418", size = 57049, upload-time = "2026-01-14T12:55:35.056Z" }, + { url = "https://files.pythonhosted.org/packages/53/fe/f6c70956da23ea235fd2e3cc16f4f0b4ebdfd72252b02d1164dd58b4e6c3/librt-0.7.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7b0803e9008c62a7ef79058233db7ff6f37a9933b8f2573c05b07ddafa226611", size = 58689, upload-time = "2026-01-14T12:55:36.078Z" }, + { url = "https://files.pythonhosted.org/packages/1f/4d/7a2481444ac5fba63050d9abe823e6bc16896f575bfc9c1e5068d516cdce/librt-0.7.8-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:79feb4d00b2a4e0e05c9c56df707934f41fcb5fe53fd9efb7549068d0495b758", size = 166808, upload-time = "2026-01-14T12:55:37.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/3c/10901d9e18639f8953f57c8986796cfbf4c1c514844a41c9197cf87cb707/librt-0.7.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9122094e3f24aa759c38f46bd8863433820654927370250f460ae75488b66ea", size = 175614, upload-time = "2026-01-14T12:55:38.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/01/5cbdde0951a5090a80e5ba44e6357d375048123c572a23eecfb9326993a7/librt-0.7.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e03bea66af33c95ce3addf87a9bf1fcad8d33e757bc479957ddbc0e4f7207ac", size = 189955, upload-time = "2026-01-14T12:55:39.939Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b4/e80528d2f4b7eaf1d437fcbd6fc6ba4cbeb3e2a0cb9ed5a79f47c7318706/librt-0.7.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1ade7f31675db00b514b98f9ab9a7698c7282dad4be7492589109471852d398", size = 189370, upload-time = "2026-01-14T12:55:41.057Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ab/938368f8ce31a9787ecd4becb1e795954782e4312095daf8fd22420227c8/librt-0.7.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a14229ac62adcf1b90a15992f1ab9c69ae8b99ffb23cb64a90878a6e8a2f5b81", size = 183224, upload-time = "2026-01-14T12:55:42.328Z" }, + { url = "https://files.pythonhosted.org/packages/3c/10/559c310e7a6e4014ac44867d359ef8238465fb499e7eb31b6bfe3e3f86f5/librt-0.7.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5bcaaf624fd24e6a0cb14beac37677f90793a96864c67c064a91458611446e83", size = 203541, upload-time = "2026-01-14T12:55:43.501Z" }, + { url = "https://files.pythonhosted.org/packages/f8/db/a0db7acdb6290c215f343835c6efda5b491bb05c3ddc675af558f50fdba3/librt-0.7.8-cp314-cp314-win32.whl", hash = "sha256:7aa7d5457b6c542ecaed79cec4ad98534373c9757383973e638ccced0f11f46d", size = 40657, upload-time = "2026-01-14T12:55:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/72/e0/4f9bdc2a98a798511e81edcd6b54fe82767a715e05d1921115ac70717f6f/librt-0.7.8-cp314-cp314-win_amd64.whl", hash = "sha256:3d1322800771bee4a91f3b4bd4e49abc7d35e65166821086e5afd1e6c0d9be44", size = 46835, upload-time = "2026-01-14T12:55:45.655Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3d/59c6402e3dec2719655a41ad027a7371f8e2334aa794ed11533ad5f34969/librt-0.7.8-cp314-cp314-win_arm64.whl", hash = "sha256:5363427bc6a8c3b1719f8f3845ea53553d301382928a86e8fab7984426949bce", size = 39885, upload-time = "2026-01-14T12:55:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9c/2481d80950b83085fb14ba3c595db56330d21bbc7d88a19f20165f3538db/librt-0.7.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ca916919793a77e4a98d4a1701e345d337ce53be4a16620f063191f7322ac80f", size = 59161, upload-time = "2026-01-14T12:55:48.45Z" }, + { url = "https://files.pythonhosted.org/packages/96/79/108df2cfc4e672336765d54e3ff887294c1cc36ea4335c73588875775527/librt-0.7.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:54feb7b4f2f6706bb82325e836a01be805770443e2400f706e824e91f6441dde", size = 61008, upload-time = "2026-01-14T12:55:49.527Z" }, + { url = "https://files.pythonhosted.org/packages/46/f2/30179898f9994a5637459d6e169b6abdc982012c0a4b2d4c26f50c06f911/librt-0.7.8-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39a4c76fee41007070f872b648cc2f711f9abf9a13d0c7162478043377b52c8e", size = 187199, upload-time = "2026-01-14T12:55:50.587Z" }, + { url = "https://files.pythonhosted.org/packages/b4/da/f7563db55cebdc884f518ba3791ad033becc25ff68eb70902b1747dc0d70/librt-0.7.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac9c8a458245c7de80bc1b9765b177055efff5803f08e548dd4bb9ab9a8d789b", size = 198317, upload-time = "2026-01-14T12:55:51.991Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6c/4289acf076ad371471fa86718c30ae353e690d3de6167f7db36f429272f1/librt-0.7.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b67aa7eff150f075fda09d11f6bfb26edffd300f6ab1666759547581e8f666", size = 210334, upload-time = "2026-01-14T12:55:53.682Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7f/377521ac25b78ac0a5ff44127a0360ee6d5ddd3ce7327949876a30533daa/librt-0.7.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:535929b6eff670c593c34ff435d5440c3096f20fa72d63444608a5aef64dd581", size = 211031, upload-time = "2026-01-14T12:55:54.827Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b1/e1e96c3e20b23d00cf90f4aad48f0deb4cdfec2f0ed8380d0d85acf98bbf/librt-0.7.8-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:63937bd0f4d1cb56653dc7ae900d6c52c41f0015e25aaf9902481ee79943b33a", size = 204581, upload-time = "2026-01-14T12:55:56.811Z" }, + { url = "https://files.pythonhosted.org/packages/43/71/0f5d010e92ed9747e14bef35e91b6580533510f1e36a8a09eb79ee70b2f0/librt-0.7.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf243da9e42d914036fd362ac3fa77d80a41cadcd11ad789b1b5eec4daaf67ca", size = 224731, upload-time = "2026-01-14T12:55:58.175Z" }, + { url = "https://files.pythonhosted.org/packages/22/f0/07fb6ab5c39a4ca9af3e37554f9d42f25c464829254d72e4ebbd81da351c/librt-0.7.8-cp314-cp314t-win32.whl", hash = "sha256:171ca3a0a06c643bd0a2f62a8944e1902c94aa8e5da4db1ea9a8daf872685365", size = 41173, upload-time = "2026-01-14T12:55:59.315Z" }, + { url = "https://files.pythonhosted.org/packages/24/d4/7e4be20993dc6a782639625bd2f97f3c66125c7aa80c82426956811cfccf/librt-0.7.8-cp314-cp314t-win_amd64.whl", hash = "sha256:445b7304145e24c60288a2f172b5ce2ca35c0f81605f5299f3fa567e189d2e32", size = 47668, upload-time = "2026-01-14T12:56:00.261Z" }, + { url = "https://files.pythonhosted.org/packages/fc/85/69f92b2a7b3c0f88ffe107c86b952b397004b5b8ea5a81da3d9c04c04422/librt-0.7.8-cp314-cp314t-win_arm64.whl", hash = "sha256:8766ece9de08527deabcd7cb1b4f1a967a385d26e33e536d6d8913db6ef74f06", size = 40550, upload-time = "2026-01-14T12:56:01.542Z" }, ] [[package]] @@ -1248,7 +1248,7 @@ wheels = [ [[package]] name = "matplotlib" -version = "3.10.7" +version = "3.10.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "contourpy" }, @@ -1261,43 +1261,43 @@ dependencies = [ { name = "pyparsing" }, { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" }, - { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" }, - { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" }, - { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" }, - { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" }, - { url = "https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f", size = 8273212, upload-time = "2025-10-09T00:26:56.752Z" }, - { url = "https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c", size = 8128713, upload-time = "2025-10-09T00:26:59.001Z" }, - { url = "https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1", size = 8698527, upload-time = "2025-10-09T00:27:00.69Z" }, - { url = "https://files.pythonhosted.org/packages/d0/7f/ccdca06f4c2e6c7989270ed7829b8679466682f4cfc0f8c9986241c023b6/matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632", size = 9529690, upload-time = "2025-10-09T00:27:02.664Z" }, - { url = "https://files.pythonhosted.org/packages/b8/95/b80fc2c1f269f21ff3d193ca697358e24408c33ce2b106a7438a45407b63/matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84", size = 9593732, upload-time = "2025-10-09T00:27:04.653Z" }, - { url = "https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815", size = 8122727, upload-time = "2025-10-09T00:27:06.814Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a6/2faaf48133b82cf3607759027f82b5c702aa99cdfcefb7f93d6ccf26a424/matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7", size = 7992958, upload-time = "2025-10-09T00:27:08.567Z" }, - { url = "https://files.pythonhosted.org/packages/4a/f0/b018fed0b599bd48d84c08794cb242227fe3341952da102ee9d9682db574/matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355", size = 8316849, upload-time = "2025-10-09T00:27:10.254Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b7/bb4f23856197659f275e11a2a164e36e65e9b48ea3e93c4ec25b4f163198/matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b", size = 8178225, upload-time = "2025-10-09T00:27:12.241Z" }, - { url = "https://files.pythonhosted.org/packages/62/56/0600609893ff277e6f3ab3c0cef4eafa6e61006c058e84286c467223d4d5/matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67", size = 8711708, upload-time = "2025-10-09T00:27:13.879Z" }, - { url = "https://files.pythonhosted.org/packages/d8/1a/6bfecb0cafe94d6658f2f1af22c43b76cf7a1c2f0dc34ef84cbb6809617e/matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67", size = 9541409, upload-time = "2025-10-09T00:27:15.684Z" }, - { url = "https://files.pythonhosted.org/packages/08/50/95122a407d7f2e446fd865e2388a232a23f2b81934960ea802f3171518e4/matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84", size = 9594054, upload-time = "2025-10-09T00:27:17.547Z" }, - { url = "https://files.pythonhosted.org/packages/13/76/75b194a43b81583478a81e78a07da8d9ca6ddf50dd0a2ccabf258059481d/matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2", size = 8200100, upload-time = "2025-10-09T00:27:20.039Z" }, - { url = "https://files.pythonhosted.org/packages/f5/9e/6aefebdc9f8235c12bdeeda44cc0383d89c1e41da2c400caf3ee2073a3ce/matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf", size = 8042131, upload-time = "2025-10-09T00:27:21.608Z" }, - { url = "https://files.pythonhosted.org/packages/0d/4b/e5bc2c321b6a7e3a75638d937d19ea267c34bd5a90e12bee76c4d7c7a0d9/matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100", size = 8273787, upload-time = "2025-10-09T00:27:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/86/ad/6efae459c56c2fbc404da154e13e3a6039129f3c942b0152624f1c621f05/matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f", size = 8131348, upload-time = "2025-10-09T00:27:24.926Z" }, - { url = "https://files.pythonhosted.org/packages/a6/5a/a4284d2958dee4116359cc05d7e19c057e64ece1b4ac986ab0f2f4d52d5a/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715", size = 9533949, upload-time = "2025-10-09T00:27:26.704Z" }, - { url = "https://files.pythonhosted.org/packages/de/ff/f3781b5057fa3786623ad8976fc9f7b0d02b2f28534751fd5a44240de4cf/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1", size = 9804247, upload-time = "2025-10-09T00:27:28.514Z" }, - { url = "https://files.pythonhosted.org/packages/47/5a/993a59facb8444efb0e197bf55f545ee449902dcee86a4dfc580c3b61314/matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722", size = 9595497, upload-time = "2025-10-09T00:27:30.418Z" }, - { url = "https://files.pythonhosted.org/packages/0d/a5/77c95aaa9bb32c345cbb49626ad8eb15550cba2e6d4c88081a6c2ac7b08d/matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866", size = 8252732, upload-time = "2025-10-09T00:27:32.332Z" }, - { url = "https://files.pythonhosted.org/packages/74/04/45d269b4268d222390d7817dae77b159651909669a34ee9fdee336db5883/matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb", size = 8124240, upload-time = "2025-10-09T00:27:33.94Z" }, - { url = "https://files.pythonhosted.org/packages/4b/c7/ca01c607bb827158b439208c153d6f14ddb9fb640768f06f7ca3488ae67b/matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1", size = 8316938, upload-time = "2025-10-09T00:27:35.534Z" }, - { url = "https://files.pythonhosted.org/packages/84/d2/5539e66e9f56d2fdec94bb8436f5e449683b4e199bcc897c44fbe3c99e28/matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4", size = 8178245, upload-time = "2025-10-09T00:27:37.334Z" }, - { url = "https://files.pythonhosted.org/packages/77/b5/e6ca22901fd3e4fe433a82e583436dd872f6c966fca7e63cf806b40356f8/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318", size = 9541411, upload-time = "2025-10-09T00:27:39.387Z" }, - { url = "https://files.pythonhosted.org/packages/9e/99/a4524db57cad8fee54b7237239a8f8360bfcfa3170d37c9e71c090c0f409/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca", size = 9803664, upload-time = "2025-10-09T00:27:41.492Z" }, - { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" }, - { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" }, - { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, + { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, + { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, + { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, + { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, + { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, + { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, + { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, + { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, + { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, + { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, + { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, ] [[package]] @@ -1483,7 +1483,7 @@ wheels = [ [[package]] name = "mkdocs-material" -version = "9.7.0" +version = "9.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, @@ -1498,9 +1498,9 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/3b/111b84cd6ff28d9e955b5f799ef217a17bc1684ac346af333e6100e413cb/mkdocs_material-9.7.0.tar.gz", hash = "sha256:602b359844e906ee402b7ed9640340cf8a474420d02d8891451733b6b02314ec", size = 4094546, upload-time = "2025-11-11T08:49:09.73Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/e2/2ffc356cd72f1473d07c7719d82a8f2cbd261666828614ecb95b12169f41/mkdocs_material-9.7.1.tar.gz", hash = "sha256:89601b8f2c3e6c6ee0a918cc3566cb201d40bf37c3cd3c2067e26fadb8cce2b8", size = 4094392, upload-time = "2025-12-18T09:49:00.308Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/87/eefe8d5e764f4cf50ed91b943f8e8f96b5efd65489d8303b7a36e2e79834/mkdocs_material-9.7.0-py3-none-any.whl", hash = "sha256:da2866ea53601125ff5baa8aa06404c6e07af3c5ce3d5de95e3b52b80b442887", size = 9283770, upload-time = "2025-11-11T08:49:06.26Z" }, + { url = "https://files.pythonhosted.org/packages/3e/32/ed071cb721aca8c227718cffcf7bd539620e9799bbf2619e90c757bfd030/mkdocs_material-9.7.1-py3-none-any.whl", hash = "sha256:3f6100937d7d731f87f1e3e3b021c97f7239666b9ba1151ab476cabb96c60d5c", size = 9297166, upload-time = "2025-12-18T09:48:56.664Z" }, ] [[package]] @@ -1598,35 +1598,35 @@ wheels = [ [[package]] name = "mypy" -version = "1.19.0" +version = "1.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "librt" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/b5/b58cdc25fadd424552804bf410855d52324183112aa004f0732c5f6324cf/mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528", size = 3579025, upload-time = "2025-11-28T15:49:01.26Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/7e/1afa8fb188b876abeaa14460dc4983f909aaacaa4bf5718c00b2c7e0b3d5/mypy-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d", size = 13207728, upload-time = "2025-11-28T15:46:26.463Z" }, - { url = "https://files.pythonhosted.org/packages/b2/13/f103d04962bcbefb1644f5ccb235998b32c337d6c13145ea390b9da47f3e/mypy-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760", size = 12202945, upload-time = "2025-11-28T15:48:49.143Z" }, - { url = "https://files.pythonhosted.org/packages/e4/93/a86a5608f74a22284a8ccea8592f6e270b61f95b8588951110ad797c2ddd/mypy-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6", size = 12718673, upload-time = "2025-11-28T15:47:37.193Z" }, - { url = "https://files.pythonhosted.org/packages/3d/58/cf08fff9ced0423b858f2a7495001fda28dc058136818ee9dffc31534ea9/mypy-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2", size = 13608336, upload-time = "2025-11-28T15:48:32.625Z" }, - { url = "https://files.pythonhosted.org/packages/64/ed/9c509105c5a6d4b73bb08733102a3ea62c25bc02c51bca85e3134bf912d3/mypy-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431", size = 13833174, upload-time = "2025-11-28T15:45:48.091Z" }, - { url = "https://files.pythonhosted.org/packages/cd/71/01939b66e35c6f8cb3e6fdf0b657f0fd24de2f8ba5e523625c8e72328208/mypy-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018", size = 10112208, upload-time = "2025-11-28T15:46:41.702Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0d/a1357e6bb49e37ce26fcf7e3cc55679ce9f4ebee0cd8b6ee3a0e301a9210/mypy-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e", size = 13191993, upload-time = "2025-11-28T15:47:22.336Z" }, - { url = "https://files.pythonhosted.org/packages/5d/75/8e5d492a879ec4490e6ba664b5154e48c46c85b5ac9785792a5ec6a4d58f/mypy-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d", size = 12174411, upload-time = "2025-11-28T15:44:55.492Z" }, - { url = "https://files.pythonhosted.org/packages/71/31/ad5dcee9bfe226e8eaba777e9d9d251c292650130f0450a280aec3485370/mypy-1.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba", size = 12727751, upload-time = "2025-11-28T15:44:14.169Z" }, - { url = "https://files.pythonhosted.org/packages/77/06/b6b8994ce07405f6039701f4b66e9d23f499d0b41c6dd46ec28f96d57ec3/mypy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364", size = 13593323, upload-time = "2025-11-28T15:46:34.699Z" }, - { url = "https://files.pythonhosted.org/packages/68/b1/126e274484cccdf099a8e328d4fda1c7bdb98a5e888fa6010b00e1bbf330/mypy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee", size = 13818032, upload-time = "2025-11-28T15:46:18.286Z" }, - { url = "https://files.pythonhosted.org/packages/f8/56/53a8f70f562dfc466c766469133a8a4909f6c0012d83993143f2a9d48d2d/mypy-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53", size = 10120644, upload-time = "2025-11-28T15:47:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/b0/f4/7751f32f56916f7f8c229fe902cbdba3e4dd3f3ea9e8b872be97e7fc546d/mypy-1.19.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d", size = 13185236, upload-time = "2025-11-28T15:45:20.696Z" }, - { url = "https://files.pythonhosted.org/packages/35/31/871a9531f09e78e8d145032355890384f8a5b38c95a2c7732d226b93242e/mypy-1.19.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18", size = 12213902, upload-time = "2025-11-28T15:46:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/58/b8/af221910dd40eeefa2077a59107e611550167b9994693fc5926a0b0f87c0/mypy-1.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7", size = 12738600, upload-time = "2025-11-28T15:44:22.521Z" }, - { url = "https://files.pythonhosted.org/packages/11/9f/c39e89a3e319c1d9c734dedec1183b2cc3aefbab066ec611619002abb932/mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f", size = 13592639, upload-time = "2025-11-28T15:48:08.55Z" }, - { url = "https://files.pythonhosted.org/packages/97/6d/ffaf5f01f5e284d9033de1267e6c1b8f3783f2cf784465378a86122e884b/mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835", size = 13799132, upload-time = "2025-11-28T15:47:06.032Z" }, - { url = "https://files.pythonhosted.org/packages/fe/b0/c33921e73aaa0106224e5a34822411bea38046188eb781637f5a5b07e269/mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1", size = 10269832, upload-time = "2025-11-28T15:47:29.392Z" }, - { url = "https://files.pythonhosted.org/packages/09/0e/fe228ed5aeab470c6f4eb82481837fadb642a5aa95cc8215fd2214822c10/mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9", size = 2469714, upload-time = "2025-11-28T15:45:33.22Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/6f/63/e7493e5f90e1e085c562bb06e2eb32cae27c5057b9653348d38b47daaecc/mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", size = 10118104, upload-time = "2025-12-15T05:03:10.834Z" }, + { url = "https://files.pythonhosted.org/packages/de/9f/a6abae693f7a0c697dbb435aac52e958dc8da44e92e08ba88d2e42326176/mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", size = 13201927, upload-time = "2025-12-15T05:02:29.138Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a4/45c35ccf6e1c65afc23a069f50e2c66f46bd3798cbe0d680c12d12935caa/mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", size = 12206730, upload-time = "2025-12-15T05:03:01.325Z" }, + { url = "https://files.pythonhosted.org/packages/05/bb/cdcf89678e26b187650512620eec8368fded4cfd99cfcb431e4cdfd19dec/mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", size = 12724581, upload-time = "2025-12-15T05:03:20.087Z" }, + { url = "https://files.pythonhosted.org/packages/d1/32/dd260d52babf67bad8e6770f8e1102021877ce0edea106e72df5626bb0ec/mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", size = 13616252, upload-time = "2025-12-15T05:02:49.036Z" }, + { url = "https://files.pythonhosted.org/packages/71/d0/5e60a9d2e3bd48432ae2b454b7ef2b62a960ab51292b1eda2a95edd78198/mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", size = 13840848, upload-time = "2025-12-15T05:02:55.95Z" }, + { url = "https://files.pythonhosted.org/packages/98/76/d32051fa65ecf6cc8c6610956473abdc9b4c43301107476ac03559507843/mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd", size = 10135510, upload-time = "2025-12-15T05:02:58.438Z" }, + { url = "https://files.pythonhosted.org/packages/de/eb/b83e75f4c820c4247a58580ef86fcd35165028f191e7e1ba57128c52782d/mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", size = 13199744, upload-time = "2025-12-15T05:03:30.823Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/52785ab7bfa165f87fcbb61547a93f98bb20e7f82f90f165a1f69bce7b3d/mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", size = 12215815, upload-time = "2025-12-15T05:02:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c6/bdd60774a0dbfb05122e3e925f2e9e846c009e479dcec4821dad881f5b52/mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", size = 12740047, upload-time = "2025-12-15T05:03:33.168Z" }, + { url = "https://files.pythonhosted.org/packages/32/2a/66ba933fe6c76bd40d1fe916a83f04fed253152f451a877520b3c4a5e41e/mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", size = 13601998, upload-time = "2025-12-15T05:03:13.056Z" }, + { url = "https://files.pythonhosted.org/packages/e3/da/5055c63e377c5c2418760411fd6a63ee2b96cf95397259038756c042574f/mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", size = 13807476, upload-time = "2025-12-15T05:03:17.977Z" }, + { url = "https://files.pythonhosted.org/packages/cd/09/4ebd873390a063176f06b0dbf1f7783dd87bd120eae7727fa4ae4179b685/mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f", size = 10281872, upload-time = "2025-12-15T05:03:05.549Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" }, ] [[package]] @@ -1640,11 +1640,11 @@ wheels = [ [[package]] name = "narwhals" -version = "2.13.0" +version = "2.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/89/ea/f82ef99ced4d03c33bb314c9b84a08a0a86c448aaa11ffd6256b99538aa5/narwhals-2.13.0.tar.gz", hash = "sha256:ee94c97f4cf7cfeebbeca8d274784df8b3d7fd3f955ce418af998d405576fdd9", size = 594555, upload-time = "2025-12-01T13:54:05.329Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/6d/b57c64e5038a8cf071bce391bb11551657a74558877ac961e7fa905ece27/narwhals-2.15.0.tar.gz", hash = "sha256:a9585975b99d95084268445a1fdd881311fa26ef1caa18020d959d5b2ff9a965", size = 603479, upload-time = "2026-01-06T08:10:13.27Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/0d/1861d1599571974b15b025e12b142d8e6b42ad66c8a07a89cb0fc21f1e03/narwhals-2.13.0-py3-none-any.whl", hash = "sha256:9b795523c179ca78204e3be53726da374168f906e38de2ff174c2363baaaf481", size = 426407, upload-time = "2025-12-01T13:54:03.861Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2e/cf2ffeb386ac3763526151163ad7da9f1b586aac96d2b4f7de1eaebf0c61/narwhals-2.15.0-py3-none-any.whl", hash = "sha256:cbfe21ca19d260d9fd67f995ec75c44592d1f106933b03ddd375df7ac841f9d6", size = 432856, upload-time = "2026-01-06T08:10:11.511Z" }, ] [[package]] @@ -1682,11 +1682,11 @@ wheels = [ [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] [[package]] @@ -1980,11 +1980,11 @@ wheels = [ [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/b2/bb8e495d5262bfec41ab5cb18f522f1012933347fb5d9e62452d446baca2/pathspec-1.0.3.tar.gz", hash = "sha256:bac5cf97ae2c2876e2d25ebb15078eb04d76e4b98921ee31c6f85ade8b59444d", size = 130841, upload-time = "2026-01-09T15:46:46.009Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl", hash = "sha256:e80767021c1cc524aa3fb14bedda9c34406591343cc42797b386ce7b9354fb6c", size = 55021, upload-time = "2026-01-09T15:46:44.652Z" }, ] [[package]] @@ -2022,71 +2022,71 @@ wheels = [ [[package]] name = "pillow" -version = "12.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, - { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, - { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, - { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, - { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, - { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, - { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, - { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, - { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, - { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, - { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, - { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, - { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, - { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, - { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, - { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, - { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, - { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, - { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, - { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, - { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, - { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, - { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, - { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, - { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, - { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, - { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, - { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, - { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, - { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, - { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, - { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, - { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, - { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, - { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, - { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, - { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, - { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, - { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, - { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, - { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, - { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, +version = "12.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, + { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, + { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, + { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c7/2530a4aa28248623e9d7f27316b42e27c32ec410f695929696f2e0e4a778/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1", size = 4062543, upload-time = "2026-01-02T09:11:31.566Z" }, + { url = "https://files.pythonhosted.org/packages/8f/1f/40b8eae823dc1519b87d53c30ed9ef085506b05281d313031755c1705f73/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179", size = 4138373, upload-time = "2026-01-02T09:11:33.367Z" }, + { url = "https://files.pythonhosted.org/packages/d4/77/6fa60634cf06e52139fd0e89e5bbf055e8166c691c42fb162818b7fda31d/pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0", size = 3601241, upload-time = "2026-01-02T09:11:35.011Z" }, + { url = "https://files.pythonhosted.org/packages/4f/bf/28ab865de622e14b747f0cd7877510848252d950e43002e224fb1c9ababf/pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587", size = 5262410, upload-time = "2026-01-02T09:11:36.682Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/583420a1b55e715937a85bd48c5c0991598247a1fd2eb5423188e765ea02/pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac", size = 4657312, upload-time = "2026-01-02T09:11:38.535Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fd/f5a0896839762885b3376ff04878f86ab2b097c2f9a9cdccf4eda8ba8dc0/pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b", size = 6232605, upload-time = "2026-01-02T09:11:40.602Z" }, + { url = "https://files.pythonhosted.org/packages/98/aa/938a09d127ac1e70e6ed467bd03834350b33ef646b31edb7452d5de43792/pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea", size = 8041617, upload-time = "2026-01-02T09:11:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/17/e8/538b24cb426ac0186e03f80f78bc8dc7246c667f58b540bdd57c71c9f79d/pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c", size = 6346509, upload-time = "2026-01-02T09:11:44.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/632e58ec89a32738cabfd9ec418f0e9898a2b4719afc581f07c04a05e3c9/pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc", size = 7038117, upload-time = "2026-01-02T09:11:46.736Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a2/d40308cf86eada842ca1f3ffa45d0ca0df7e4ab33c83f81e73f5eaed136d/pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644", size = 6460151, upload-time = "2026-01-02T09:11:48.625Z" }, + { url = "https://files.pythonhosted.org/packages/f1/88/f5b058ad6453a085c5266660a1417bdad590199da1b32fb4efcff9d33b05/pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c", size = 7164534, upload-time = "2026-01-02T09:11:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/19/ce/c17334caea1db789163b5d855a5735e47995b0b5dc8745e9a3605d5f24c0/pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171", size = 6332551, upload-time = "2026-01-02T09:11:52.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/07/74a9d941fa45c90a0d9465098fe1ec85de3e2afbdc15cc4766622d516056/pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a", size = 7040087, upload-time = "2026-01-02T09:11:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/88/09/c99950c075a0e9053d8e880595926302575bc742b1b47fe1bbcc8d388d50/pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45", size = 2452470, upload-time = "2026-01-02T09:11:56.522Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ba/970b7d85ba01f348dee4d65412476321d40ee04dcb51cd3735b9dc94eb58/pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d", size = 5264816, upload-time = "2026-01-02T09:11:58.227Z" }, + { url = "https://files.pythonhosted.org/packages/10/60/650f2fb55fdba7a510d836202aa52f0baac633e50ab1cf18415d332188fb/pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0", size = 4660472, upload-time = "2026-01-02T09:12:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/5273a99478956a099d533c4f46cbaa19fd69d606624f4334b85e50987a08/pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554", size = 6268974, upload-time = "2026-01-02T09:12:02.572Z" }, + { url = "https://files.pythonhosted.org/packages/b4/26/0bf714bc2e73d5267887d47931d53c4ceeceea6978148ed2ab2a4e6463c4/pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e", size = 8073070, upload-time = "2026-01-02T09:12:04.75Z" }, + { url = "https://files.pythonhosted.org/packages/43/cf/1ea826200de111a9d65724c54f927f3111dc5ae297f294b370a670c17786/pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82", size = 6380176, upload-time = "2026-01-02T09:12:06.626Z" }, + { url = "https://files.pythonhosted.org/packages/03/e0/7938dd2b2013373fd85d96e0f38d62b7a5a262af21ac274250c7ca7847c9/pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4", size = 7067061, upload-time = "2026-01-02T09:12:08.624Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/a2aa97d37272a929a98437a8c0ac37b3cf012f4f8721e1bd5154699b2518/pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0", size = 6491824, upload-time = "2026-01-02T09:12:10.488Z" }, + { url = "https://files.pythonhosted.org/packages/a4/44/80e46611b288d51b115826f136fb3465653c28f491068a72d3da49b54cd4/pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b", size = 7190911, upload-time = "2026-01-02T09:12:12.772Z" }, + { url = "https://files.pythonhosted.org/packages/86/77/eacc62356b4cf81abe99ff9dbc7402750044aed02cfd6a503f7c6fc11f3e/pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65", size = 6336445, upload-time = "2026-01-02T09:12:14.775Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3c/57d81d0b74d218706dafccb87a87ea44262c43eef98eb3b164fd000e0491/pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0", size = 7045354, upload-time = "2026-01-02T09:12:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/ac/82/8b9b97bba2e3576a340f93b044a3a3a09841170ab4c1eb0d5c93469fd32f/pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8", size = 2454547, upload-time = "2026-01-02T09:12:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, + { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, + { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, + { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, + { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, + { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, + { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, + { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, + { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, + { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, ] [[package]] @@ -2155,15 +2155,15 @@ wheels = [ [[package]] name = "plotly" -version = "6.5.0" +version = "6.5.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "narwhals" }, { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/05/1199e2a03ce6637960bc1e951ca0f928209a48cfceb57355806a88f214cf/plotly-6.5.0.tar.gz", hash = "sha256:d5d38224883fd38c1409bef7d6a8dc32b74348d39313f3c52ca998b8e447f5c8", size = 7013624, upload-time = "2025-11-17T18:39:24.523Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/4f/8a10a9b9f5192cb6fdef62f1d77fa7d834190b2c50c0cd256bd62879212b/plotly-6.5.2.tar.gz", hash = "sha256:7478555be0198562d1435dee4c308268187553cc15516a2f4dd034453699e393", size = 7015695, upload-time = "2026-01-14T21:26:51.222Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl", hash = "sha256:5ac851e100367735250206788a2b1325412aa4a4917a4fe3e6f0bc5aa6f3d90a", size = 9893174, upload-time = "2025-11-17T18:39:20.351Z" }, + { url = "https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl", hash = "sha256:91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4", size = 9895973, upload-time = "2026-01-14T21:26:47.135Z" }, ] [[package]] @@ -2177,7 +2177,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "4.5.0" +version = "4.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -2186,9 +2186,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/9b/6a4ffb4ed980519da959e1cf3122fc6cb41211daa58dbae1c73c0e519a37/pre_commit-4.5.0.tar.gz", hash = "sha256:dc5a065e932b19fc1d4c653c6939068fe54325af8e741e74e88db4d28a4dd66b", size = 198428, upload-time = "2025-11-22T21:02:42.304Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/c4/b2d28e9d2edf4f1713eb3c29307f1a63f3d67cf09bdda29715a36a68921a/pre_commit-4.5.0-py2.py3-none-any.whl", hash = "sha256:25e2ce09595174d9c97860a95609f9f852c0614ba602de3561e267547f2335e1", size = 226429, upload-time = "2025-11-22T21:02:40.836Z" }, + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, ] [[package]] @@ -2205,28 +2205,30 @@ wheels = [ [[package]] name = "psutil" -version = "7.1.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload-time = "2025-11-02T12:25:58.161Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload-time = "2025-11-02T12:26:00.491Z" }, - { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload-time = "2025-11-02T12:26:02.613Z" }, - { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload-time = "2025-11-02T12:26:05.207Z" }, - { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload-time = "2025-11-02T12:26:07.447Z" }, - { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload-time = "2025-11-02T12:26:09.719Z" }, - { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload-time = "2025-11-02T12:26:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload-time = "2025-11-02T12:26:14.358Z" }, - { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload-time = "2025-11-02T12:26:16.699Z" }, - { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload-time = "2025-11-02T12:26:18.848Z" }, - { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload-time = "2025-11-02T12:26:21.183Z" }, - { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload-time = "2025-11-02T12:26:23.148Z" }, - { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" }, - { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" }, - { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" }, +version = "7.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/8e/f0c242053a368c2aa89584ecd1b054a18683f13d6e5a318fc9ec36582c94/psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d", size = 129624, upload-time = "2025-12-29T08:26:04.255Z" }, + { url = "https://files.pythonhosted.org/packages/26/97/a58a4968f8990617decee234258a2b4fc7cd9e35668387646c1963e69f26/psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49", size = 130132, upload-time = "2025-12-29T08:26:06.228Z" }, + { url = "https://files.pythonhosted.org/packages/db/6d/ed44901e830739af5f72a85fa7ec5ff1edea7f81bfbf4875e409007149bd/psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc", size = 180612, upload-time = "2025-12-29T08:26:08.276Z" }, + { url = "https://files.pythonhosted.org/packages/c7/65/b628f8459bca4efbfae50d4bf3feaab803de9a160b9d5f3bd9295a33f0c2/psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf", size = 183201, upload-time = "2025-12-29T08:26:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f", size = 139081, upload-time = "2025-12-29T08:26:12.483Z" }, + { url = "https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672", size = 134767, upload-time = "2025-12-29T08:26:14.528Z" }, + { url = "https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679", size = 129716, upload-time = "2025-12-29T08:26:16.017Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f", size = 130133, upload-time = "2025-12-29T08:26:18.009Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129", size = 181518, upload-time = "2025-12-29T08:26:20.241Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a", size = 184348, upload-time = "2025-12-29T08:26:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79", size = 140400, upload-time = "2025-12-29T08:26:23.993Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266", size = 135430, upload-time = "2025-12-29T08:26:25.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" }, + { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" }, + { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, + { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, ] [[package]] @@ -2374,24 +2376,24 @@ wheels = [ [[package]] name = "pymdown-extensions" -version = "10.18" +version = "10.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/95/e4fa281e3f13b3d9c4aaebb21ef44879840325fa418276dd921209a5e9f9/pymdown_extensions-10.18.tar.gz", hash = "sha256:20252abe6367354b24191431617a072ee6be9f68c5afcc74ea5573508a61f9e5", size = 847697, upload-time = "2025-12-07T17:22:12.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/35/e3814a5b7df295df69d035cfb8aab78b2967cdf11fcfae7faed726b66664/pymdown_extensions-10.20.tar.gz", hash = "sha256:5c73566ab0cf38c6ba084cb7c5ea64a119ae0500cce754ccb682761dfea13a52", size = 852774, upload-time = "2025-12-31T19:59:42.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/a4/aa2bada4a2fd648f40f19affa55d2c01dc7ff5ea9cffd3dfdeb6114951db/pymdown_extensions-10.18-py3-none-any.whl", hash = "sha256:090bca72be43f7d3186374e23c782899dbef9dc153ef24c59dcd3c346f9ffcae", size = 266703, upload-time = "2025-12-07T17:22:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/10/47caf89cbb52e5bb764696fd52a8c591a2f0e851a93270c05a17f36000b5/pymdown_extensions-10.20-py3-none-any.whl", hash = "sha256:ea9e62add865da80a271d00bfa1c0fa085b20d133fb3fc97afdc88e682f60b2f", size = 268733, upload-time = "2025-12-31T19:59:40.652Z" }, ] [[package]] name = "pyparsing" -version = "3.2.5" +version = "3.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c1/1d9de9aeaa1b89b0186e5fe23294ff6517fce1bc69149185577cd31016b2/pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c", size = 1550512, upload-time = "2025-12-23T03:14:04.391Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, + { url = "https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82", size = 121793, upload-time = "2025-12-23T03:14:02.103Z" }, ] [[package]] @@ -2617,28 +2619,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/d9/f7a0c4b3a2bf2556cd5d99b05372c29980249ef71e8e32669ba77428c82c/ruff-0.14.8.tar.gz", hash = "sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed", size = 5765385, upload-time = "2025-12-04T15:06:17.669Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/b8/9537b52010134b1d2b72870cc3f92d5fb759394094741b09ceccae183fbe/ruff-0.14.8-py3-none-linux_armv6l.whl", hash = "sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb", size = 13441540, upload-time = "2025-12-04T15:06:14.896Z" }, - { url = "https://files.pythonhosted.org/packages/24/00/99031684efb025829713682012b6dd37279b1f695ed1b01725f85fd94b38/ruff-0.14.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9", size = 13669384, upload-time = "2025-12-04T15:06:51.809Z" }, - { url = "https://files.pythonhosted.org/packages/72/64/3eb5949169fc19c50c04f28ece2c189d3b6edd57e5b533649dae6ca484fe/ruff-0.14.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f", size = 12806917, upload-time = "2025-12-04T15:06:08.925Z" }, - { url = "https://files.pythonhosted.org/packages/c4/08/5250babb0b1b11910f470370ec0cbc67470231f7cdc033cee57d4976f941/ruff-0.14.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b", size = 13256112, upload-time = "2025-12-04T15:06:23.498Z" }, - { url = "https://files.pythonhosted.org/packages/78/4c/6c588e97a8e8c2d4b522c31a579e1df2b4d003eddfbe23d1f262b1a431ff/ruff-0.14.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52", size = 13227559, upload-time = "2025-12-04T15:06:33.432Z" }, - { url = "https://files.pythonhosted.org/packages/23/ce/5f78cea13eda8eceac71b5f6fa6e9223df9b87bb2c1891c166d1f0dce9f1/ruff-0.14.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c", size = 13896379, upload-time = "2025-12-04T15:06:02.687Z" }, - { url = "https://files.pythonhosted.org/packages/cf/79/13de4517c4dadce9218a20035b21212a4c180e009507731f0d3b3f5df85a/ruff-0.14.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344", size = 15372786, upload-time = "2025-12-04T15:06:29.828Z" }, - { url = "https://files.pythonhosted.org/packages/00/06/33df72b3bb42be8a1c3815fd4fae83fa2945fc725a25d87ba3e42d1cc108/ruff-0.14.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b", size = 14990029, upload-time = "2025-12-04T15:06:36.812Z" }, - { url = "https://files.pythonhosted.org/packages/64/61/0f34927bd90925880394de0e081ce1afab66d7b3525336f5771dcf0cb46c/ruff-0.14.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a", size = 14407037, upload-time = "2025-12-04T15:06:39.979Z" }, - { url = "https://files.pythonhosted.org/packages/96/bc/058fe0aefc0fbf0d19614cb6d1a3e2c048f7dc77ca64957f33b12cfdc5ef/ruff-0.14.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2", size = 14102390, upload-time = "2025-12-04T15:06:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/af/a4/e4f77b02b804546f4c17e8b37a524c27012dd6ff05855d2243b49a7d3cb9/ruff-0.14.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a", size = 14230793, upload-time = "2025-12-04T15:06:20.497Z" }, - { url = "https://files.pythonhosted.org/packages/3f/52/bb8c02373f79552e8d087cedaffad76b8892033d2876c2498a2582f09dcf/ruff-0.14.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b", size = 13160039, upload-time = "2025-12-04T15:06:49.06Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ad/b69d6962e477842e25c0b11622548df746290cc6d76f9e0f4ed7456c2c31/ruff-0.14.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf", size = 13205158, upload-time = "2025-12-04T15:06:54.574Z" }, - { url = "https://files.pythonhosted.org/packages/06/63/54f23da1315c0b3dfc1bc03fbc34e10378918a20c0b0f086418734e57e74/ruff-0.14.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6", size = 13469550, upload-time = "2025-12-04T15:05:59.209Z" }, - { url = "https://files.pythonhosted.org/packages/70/7d/a4d7b1961e4903bc37fffb7ddcfaa7beb250f67d97cfd1ee1d5cddb1ec90/ruff-0.14.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e", size = 14211332, upload-time = "2025-12-04T15:06:06.027Z" }, - { url = "https://files.pythonhosted.org/packages/5d/93/2a5063341fa17054e5c86582136e9895db773e3c2ffb770dde50a09f35f0/ruff-0.14.8-py3-none-win32.whl", hash = "sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7", size = 13151890, upload-time = "2025-12-04T15:06:11.668Z" }, - { url = "https://files.pythonhosted.org/packages/02/1c/65c61a0859c0add13a3e1cbb6024b42de587456a43006ca2d4fd3d1618fe/ruff-0.14.8-py3-none-win_amd64.whl", hash = "sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097", size = 14537826, upload-time = "2025-12-04T15:06:26.409Z" }, - { url = "https://files.pythonhosted.org/packages/6d/63/8b41cea3afd7f58eb64ac9251668ee0073789a3bc9ac6f816c8c6fef986d/ruff-0.14.8-py3-none-win_arm64.whl", hash = "sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99", size = 13634522, upload-time = "2025-12-04T15:06:43.212Z" }, +version = "0.14.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/77/9a7fe084d268f8855d493e5031ea03fa0af8cc05887f638bf1c4e3363eb8/ruff-0.14.11.tar.gz", hash = "sha256:f6dc463bfa5c07a59b1ff2c3b9767373e541346ea105503b4c0369c520a66958", size = 5993417, upload-time = "2026-01-08T19:11:58.322Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/a6/a4c40a5aaa7e331f245d2dc1ac8ece306681f52b636b40ef87c88b9f7afd/ruff-0.14.11-py3-none-linux_armv6l.whl", hash = "sha256:f6ff2d95cbd335841a7217bdfd9c1d2e44eac2c584197ab1385579d55ff8830e", size = 12951208, upload-time = "2026-01-08T19:12:09.218Z" }, + { url = "https://files.pythonhosted.org/packages/5c/5c/360a35cb7204b328b685d3129c08aca24765ff92b5a7efedbdd6c150d555/ruff-0.14.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f6eb5c1c8033680f4172ea9c8d3706c156223010b8b97b05e82c59bdc774ee6", size = 13330075, upload-time = "2026-01-08T19:12:02.549Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9e/0cc2f1be7a7d33cae541824cf3f95b4ff40d03557b575912b5b70273c9ec/ruff-0.14.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f2fc34cc896f90080fca01259f96c566f74069a04b25b6205d55379d12a6855e", size = 12257809, upload-time = "2026-01-08T19:12:00.366Z" }, + { url = "https://files.pythonhosted.org/packages/a7/e5/5faab97c15bb75228d9f74637e775d26ac703cc2b4898564c01ab3637c02/ruff-0.14.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53386375001773ae812b43205d6064dae49ff0968774e6befe16a994fc233caa", size = 12678447, upload-time = "2026-01-08T19:12:13.899Z" }, + { url = "https://files.pythonhosted.org/packages/1b/33/e9767f60a2bef779fb5855cab0af76c488e0ce90f7bb7b8a45c8a2ba4178/ruff-0.14.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a697737dce1ca97a0a55b5ff0434ee7205943d4874d638fe3ae66166ff46edbe", size = 12758560, upload-time = "2026-01-08T19:11:42.55Z" }, + { url = "https://files.pythonhosted.org/packages/eb/84/4c6cf627a21462bb5102f7be2a320b084228ff26e105510cd2255ea868e5/ruff-0.14.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6845ca1da8ab81ab1dce755a32ad13f1db72e7fba27c486d5d90d65e04d17b8f", size = 13599296, upload-time = "2026-01-08T19:11:30.371Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/92b5ed7ea66d849f6157e695dc23d5d6d982bd6aa8d077895652c38a7cae/ruff-0.14.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e36ce2fd31b54065ec6f76cb08d60159e1b32bdf08507862e32f47e6dde8bcbf", size = 15048981, upload-time = "2026-01-08T19:12:04.742Z" }, + { url = "https://files.pythonhosted.org/packages/61/df/c1bd30992615ac17c2fb64b8a7376ca22c04a70555b5d05b8f717163cf9f/ruff-0.14.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590bcc0e2097ecf74e62a5c10a6b71f008ad82eb97b0a0079e85defe19fe74d9", size = 14633183, upload-time = "2026-01-08T19:11:40.069Z" }, + { url = "https://files.pythonhosted.org/packages/04/e9/fe552902f25013dd28a5428a42347d9ad20c4b534834a325a28305747d64/ruff-0.14.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53fe71125fc158210d57fe4da26e622c9c294022988d08d9347ec1cf782adafe", size = 14050453, upload-time = "2026-01-08T19:11:37.555Z" }, + { url = "https://files.pythonhosted.org/packages/ae/93/f36d89fa021543187f98991609ce6e47e24f35f008dfe1af01379d248a41/ruff-0.14.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a35c9da08562f1598ded8470fcfef2afb5cf881996e6c0a502ceb61f4bc9c8a3", size = 13757889, upload-time = "2026-01-08T19:12:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/b7/9f/c7fb6ecf554f28709a6a1f2a7f74750d400979e8cd47ed29feeaa1bd4db8/ruff-0.14.11-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0f3727189a52179393ecf92ec7057c2210203e6af2676f08d92140d3e1ee72c1", size = 13955832, upload-time = "2026-01-08T19:11:55.064Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/153315310f250f76900a98278cf878c64dfb6d044e184491dd3289796734/ruff-0.14.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eb09f849bd37147a789b85995ff734a6c4a095bed5fd1608c4f56afc3634cde2", size = 12586522, upload-time = "2026-01-08T19:11:35.356Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2b/a73a2b6e6d2df1d74bf2b78098be1572191e54bec0e59e29382d13c3adc5/ruff-0.14.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:c61782543c1231bf71041461c1f28c64b961d457d0f238ac388e2ab173d7ecb7", size = 12724637, upload-time = "2026-01-08T19:11:47.796Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/09100590320394401cd3c48fc718a8ba71c7ddb1ffd07e0ad6576b3a3df2/ruff-0.14.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82ff352ea68fb6766140381748e1f67f83c39860b6446966cff48a315c3e2491", size = 13145837, upload-time = "2026-01-08T19:11:32.87Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d8/e035db859d1d3edf909381eb8ff3e89a672d6572e9454093538fe6f164b0/ruff-0.14.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:728e56879df4ca5b62a9dde2dd0eb0edda2a55160c0ea28c4025f18c03f86984", size = 13850469, upload-time = "2026-01-08T19:12:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/4e/02/bb3ff8b6e6d02ce9e3740f4c17dfbbfb55f34c789c139e9cd91985f356c7/ruff-0.14.11-py3-none-win32.whl", hash = "sha256:337c5dd11f16ee52ae217757d9b82a26400be7efac883e9e852646f1557ed841", size = 12851094, upload-time = "2026-01-08T19:11:45.163Z" }, + { url = "https://files.pythonhosted.org/packages/58/f1/90ddc533918d3a2ad628bc3044cdfc094949e6d4b929220c3f0eb8a1c998/ruff-0.14.11-py3-none-win_amd64.whl", hash = "sha256:f981cea63d08456b2c070e64b79cb62f951aa1305282974d4d5216e6e0178ae6", size = 14001379, upload-time = "2026-01-08T19:11:52.591Z" }, + { url = "https://files.pythonhosted.org/packages/c4/1c/1dbe51782c0e1e9cfce1d1004752672d2d4629ea46945d19d731ad772b3b/ruff-0.14.11-py3-none-win_arm64.whl", hash = "sha256:649fb6c9edd7f751db276ef42df1f3df41c38d67d199570ae2a7bd6cbc3590f0", size = 12938644, upload-time = "2026-01-08T19:11:50.027Z" }, ] [[package]] @@ -2655,7 +2657,7 @@ wheels = [ [[package]] name = "scikit-learn" -version = "1.7.2" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib" }, @@ -2663,89 +2665,99 @@ dependencies = [ { name = "scipy" }, { name = "threadpoolctl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload-time = "2025-09-09T08:20:43.19Z" }, - { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload-time = "2025-09-09T08:20:45.468Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload-time = "2025-09-09T08:20:47.982Z" }, - { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload-time = "2025-09-09T08:20:50.366Z" }, - { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256, upload-time = "2025-09-09T08:20:52.627Z" }, - { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload-time = "2025-09-09T08:20:54.731Z" }, - { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload-time = "2025-09-09T08:20:57.313Z" }, - { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload-time = "2025-09-09T08:20:59.671Z" }, - { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload-time = "2025-09-09T08:21:01.71Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057, upload-time = "2025-09-09T08:21:04.234Z" }, - { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload-time = "2025-09-09T08:21:06.381Z" }, - { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload-time = "2025-09-09T08:21:08.628Z" }, - { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload-time = "2025-09-09T08:21:11.486Z" }, - { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload-time = "2025-09-09T08:21:13.602Z" }, - { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749, upload-time = "2025-09-09T08:21:15.96Z" }, - { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload-time = "2025-09-09T08:21:18.557Z" }, - { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload-time = "2025-09-09T08:21:20.695Z" }, - { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload-time = "2025-09-09T08:21:22.645Z" }, - { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload-time = "2025-09-09T08:21:24.65Z" }, - { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload-time = "2025-09-09T08:21:26.713Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", size = 8019359, upload-time = "2025-12-10T07:07:59.838Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", size = 7641898, upload-time = "2025-12-10T07:08:01.36Z" }, + { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, + { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" }, + { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" }, + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, + { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, ] [[package]] name = "scipy" -version = "1.16.3" +version = "1.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, - { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, - { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, - { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, - { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, - { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, - { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, - { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, - { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, - { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, - { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, - { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, - { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, - { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, - { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, - { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, - { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, - { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, - { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, - { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, - { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, - { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, - { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, - { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, - { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, - { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, - { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, - { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, - { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, - { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, - { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, - { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, - { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, - { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, - { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, - { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, - { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, - { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, + { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, + { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, + { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, + { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b6/8ac583d6da79e7b9e520579f03007cb006f063642afd6b2eeb16b890bf93/scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812", size = 36287211, upload-time = "2026-01-10T21:28:43.122Z" }, + { url = "https://files.pythonhosted.org/packages/55/fb/7db19e0b3e52f882b420417644ec81dd57eeef1bd1705b6f689d8ff93541/scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2", size = 24312646, upload-time = "2026-01-10T21:28:49.893Z" }, + { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, + { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, + { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, + { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, + { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, + { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/f9/cc/2bd59140ed3b2fa2882fb15da0a9cb1b5a6443d67cfd0d98d4cec83a57ec/scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0", size = 36328593, upload-time = "2026-01-10T21:28:28.007Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/c87cc44a0d2c7aaf0f003aef2904c3d097b422a96c7e7c07f5efd9073c1b/scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67", size = 24625083, upload-time = "2026-01-10T21:28:35.188Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, + { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, + { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, + { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, + { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, + { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, + { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, ] [[package]] @@ -2834,31 +2846,37 @@ wheels = [ [[package]] name = "sqlalchemy" -version = "2.0.44" +version = "2.0.45" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/f2/840d7b9496825333f532d2e3976b8eadbf52034178aac53630d09fe6e1ef/sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22", size = 9819830, upload-time = "2025-10-10T14:39:12.935Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/c4/59c7c9b068e6813c898b771204aad36683c96318ed12d4233e1b18762164/sqlalchemy-2.0.44-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250", size = 2139675, upload-time = "2025-10-10T16:03:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ae/eeb0920537a6f9c5a3708e4a5fc55af25900216bdb4847ec29cfddf3bf3a/sqlalchemy-2.0.44-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29", size = 2127726, upload-time = "2025-10-10T16:03:35.934Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d5/2ebbabe0379418eda8041c06b0b551f213576bfe4c2f09d77c06c07c8cc5/sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44", size = 3327603, upload-time = "2025-10-10T15:35:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/45/e5/5aa65852dadc24b7d8ae75b7efb8d19303ed6ac93482e60c44a585930ea5/sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1", size = 3337842, upload-time = "2025-10-10T15:43:45.431Z" }, - { url = "https://files.pythonhosted.org/packages/41/92/648f1afd3f20b71e880ca797a960f638d39d243e233a7082c93093c22378/sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7", size = 3264558, upload-time = "2025-10-10T15:35:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/40/cf/e27d7ee61a10f74b17740918e23cbc5bc62011b48282170dc4c66da8ec0f/sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d", size = 3301570, upload-time = "2025-10-10T15:43:48.407Z" }, - { url = "https://files.pythonhosted.org/packages/3b/3d/3116a9a7b63e780fb402799b6da227435be878b6846b192f076d2f838654/sqlalchemy-2.0.44-cp312-cp312-win32.whl", hash = "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4", size = 2103447, upload-time = "2025-10-10T15:03:21.678Z" }, - { url = "https://files.pythonhosted.org/packages/25/83/24690e9dfc241e6ab062df82cc0df7f4231c79ba98b273fa496fb3dd78ed/sqlalchemy-2.0.44-cp312-cp312-win_amd64.whl", hash = "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e", size = 2130912, upload-time = "2025-10-10T15:03:24.656Z" }, - { url = "https://files.pythonhosted.org/packages/45/d3/c67077a2249fdb455246e6853166360054c331db4613cda3e31ab1cadbef/sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1", size = 2135479, upload-time = "2025-10-10T16:03:37.671Z" }, - { url = "https://files.pythonhosted.org/packages/2b/91/eabd0688330d6fd114f5f12c4f89b0d02929f525e6bf7ff80aa17ca802af/sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45", size = 2123212, upload-time = "2025-10-10T16:03:41.755Z" }, - { url = "https://files.pythonhosted.org/packages/b0/bb/43e246cfe0e81c018076a16036d9b548c4cc649de241fa27d8d9ca6f85ab/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976", size = 3255353, upload-time = "2025-10-10T15:35:31.221Z" }, - { url = "https://files.pythonhosted.org/packages/b9/96/c6105ed9a880abe346b64d3b6ddef269ddfcab04f7f3d90a0bf3c5a88e82/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c", size = 3260222, upload-time = "2025-10-10T15:43:50.124Z" }, - { url = "https://files.pythonhosted.org/packages/44/16/1857e35a47155b5ad927272fee81ae49d398959cb749edca6eaa399b582f/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d", size = 3189614, upload-time = "2025-10-10T15:35:32.578Z" }, - { url = "https://files.pythonhosted.org/packages/88/ee/4afb39a8ee4fc786e2d716c20ab87b5b1fb33d4ac4129a1aaa574ae8a585/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40", size = 3226248, upload-time = "2025-10-10T15:43:51.862Z" }, - { url = "https://files.pythonhosted.org/packages/32/d5/0e66097fc64fa266f29a7963296b40a80d6a997b7ac13806183700676f86/sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73", size = 2101275, upload-time = "2025-10-10T15:03:26.096Z" }, - { url = "https://files.pythonhosted.org/packages/03/51/665617fe4f8c6450f42a6d8d69243f9420f5677395572c2fe9d21b493b7b/sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e", size = 2127901, upload-time = "2025-10-10T15:03:27.548Z" }, - { url = "https://files.pythonhosted.org/packages/9c/5e/6a29fa884d9fb7ddadf6b69490a9d45fded3b38541713010dad16b77d015/sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05", size = 1928718, upload-time = "2025-10-10T15:29:45.32Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/be/f9/5e4491e5ccf42f5d9cfc663741d261b3e6e1683ae7812114e7636409fcc6/sqlalchemy-2.0.45.tar.gz", hash = "sha256:1632a4bda8d2d25703fdad6363058d882541bdaaee0e5e3ddfa0cd3229efce88", size = 9869912, upload-time = "2025-12-09T21:05:16.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/c7/1900b56ce19bff1c26f39a4ce427faec7716c81ac792bfac8b6a9f3dca93/sqlalchemy-2.0.45-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3ee2aac15169fb0d45822983631466d60b762085bc4535cd39e66bea362df5f", size = 3333760, upload-time = "2025-12-09T22:11:02.66Z" }, + { url = "https://files.pythonhosted.org/packages/0a/93/3be94d96bb442d0d9a60e55a6bb6e0958dd3457751c6f8502e56ef95fed0/sqlalchemy-2.0.45-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d", size = 3348268, upload-time = "2025-12-09T22:13:49.054Z" }, + { url = "https://files.pythonhosted.org/packages/48/4b/f88ded696e61513595e4a9778f9d3f2bf7332cce4eb0c7cedaabddd6687b/sqlalchemy-2.0.45-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4", size = 3278144, upload-time = "2025-12-09T22:11:04.14Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6a/310ecb5657221f3e1bd5288ed83aa554923fb5da48d760a9f7622afeb065/sqlalchemy-2.0.45-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:107029bf4f43d076d4011f1afb74f7c3e2ea029ec82eb23d8527d5e909e97aa6", size = 3313907, upload-time = "2025-12-09T22:13:50.598Z" }, + { url = "https://files.pythonhosted.org/packages/5c/39/69c0b4051079addd57c84a5bfb34920d87456dd4c90cf7ee0df6efafc8ff/sqlalchemy-2.0.45-cp312-cp312-win32.whl", hash = "sha256:0c9f6ada57b58420a2c0277ff853abe40b9e9449f8d7d231763c6bc30f5c4953", size = 2112182, upload-time = "2025-12-09T21:39:30.824Z" }, + { url = "https://files.pythonhosted.org/packages/f7/4e/510db49dd89fc3a6e994bee51848c94c48c4a00dc905e8d0133c251f41a7/sqlalchemy-2.0.45-cp312-cp312-win_amd64.whl", hash = "sha256:8defe5737c6d2179c7997242d6473587c3beb52e557f5ef0187277009f73e5e1", size = 2139200, upload-time = "2025-12-09T21:39:32.321Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c8/7cc5221b47a54edc72a0140a1efa56e0a2730eefa4058d7ed0b4c4357ff8/sqlalchemy-2.0.45-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe187fc31a54d7fd90352f34e8c008cf3ad5d064d08fedd3de2e8df83eb4a1cf", size = 3277082, upload-time = "2025-12-09T22:11:06.167Z" }, + { url = "https://files.pythonhosted.org/packages/0e/50/80a8d080ac7d3d321e5e5d420c9a522b0aa770ec7013ea91f9a8b7d36e4a/sqlalchemy-2.0.45-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e", size = 3293131, upload-time = "2025-12-09T22:13:52.626Z" }, + { url = "https://files.pythonhosted.org/packages/da/4c/13dab31266fc9904f7609a5dc308a2432a066141d65b857760c3bef97e69/sqlalchemy-2.0.45-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b", size = 3225389, upload-time = "2025-12-09T22:11:08.093Z" }, + { url = "https://files.pythonhosted.org/packages/74/04/891b5c2e9f83589de202e7abaf24cd4e4fa59e1837d64d528829ad6cc107/sqlalchemy-2.0.45-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9c6378449e0940476577047150fd09e242529b761dc887c9808a9a937fe990c8", size = 3266054, upload-time = "2025-12-09T22:13:54.262Z" }, + { url = "https://files.pythonhosted.org/packages/f1/24/fc59e7f71b0948cdd4cff7a286210e86b0443ef1d18a23b0d83b87e4b1f7/sqlalchemy-2.0.45-cp313-cp313-win32.whl", hash = "sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a", size = 2110299, upload-time = "2025-12-09T21:39:33.486Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c5/d17113020b2d43073412aeca09b60d2009442420372123b8d49cc253f8b8/sqlalchemy-2.0.45-cp313-cp313-win_amd64.whl", hash = "sha256:afbf47dc4de31fa38fd491f3705cac5307d21d4bb828a4f020ee59af412744ee", size = 2136264, upload-time = "2025-12-09T21:39:36.801Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8d/bb40a5d10e7a5f2195f235c0b2f2c79b0bf6e8f00c0c223130a4fbd2db09/sqlalchemy-2.0.45-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83d7009f40ce619d483d26ac1b757dfe3167b39921379a8bd1b596cf02dab4a6", size = 3521998, upload-time = "2025-12-09T22:13:28.622Z" }, + { url = "https://files.pythonhosted.org/packages/75/a5/346128b0464886f036c039ea287b7332a410aa2d3fb0bb5d404cb8861635/sqlalchemy-2.0.45-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a", size = 3473434, upload-time = "2025-12-09T22:13:30.188Z" }, + { url = "https://files.pythonhosted.org/packages/cc/64/4e1913772646b060b025d3fc52ce91a58967fe58957df32b455de5a12b4f/sqlalchemy-2.0.45-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f46ec744e7f51275582e6a24326e10c49fbdd3fc99103e01376841213028774", size = 3272404, upload-time = "2025-12-09T22:11:09.662Z" }, + { url = "https://files.pythonhosted.org/packages/b3/27/caf606ee924282fe4747ee4fd454b335a72a6e018f97eab5ff7f28199e16/sqlalchemy-2.0.45-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:883c600c345123c033c2f6caca18def08f1f7f4c3ebeb591a63b6fceffc95cce", size = 3277057, upload-time = "2025-12-09T22:13:56.213Z" }, + { url = "https://files.pythonhosted.org/packages/85/d0/3d64218c9724e91f3d1574d12eb7ff8f19f937643815d8daf792046d88ab/sqlalchemy-2.0.45-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33", size = 3222279, upload-time = "2025-12-09T22:11:11.1Z" }, + { url = "https://files.pythonhosted.org/packages/24/10/dd7688a81c5bc7690c2a3764d55a238c524cd1a5a19487928844cb247695/sqlalchemy-2.0.45-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a420169cef179d4c9064365f42d779f1e5895ad26ca0c8b4c0233920973db74", size = 3244508, upload-time = "2025-12-09T22:13:57.932Z" }, + { url = "https://files.pythonhosted.org/packages/aa/41/db75756ca49f777e029968d9c9fee338c7907c563267740c6d310a8e3f60/sqlalchemy-2.0.45-cp314-cp314-win32.whl", hash = "sha256:e50dcb81a5dfe4b7b4a4aa8f338116d127cb209559124f3694c70d6cd072b68f", size = 2113204, upload-time = "2025-12-09T21:39:38.365Z" }, + { url = "https://files.pythonhosted.org/packages/89/a2/0e1590e9adb292b1d576dbcf67ff7df8cf55e56e78d2c927686d01080f4b/sqlalchemy-2.0.45-cp314-cp314-win_amd64.whl", hash = "sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177", size = 2138785, upload-time = "2025-12-09T21:39:39.503Z" }, + { url = "https://files.pythonhosted.org/packages/42/39/f05f0ed54d451156bbed0e23eb0516bcad7cbb9f18b3bf219c786371b3f0/sqlalchemy-2.0.45-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b", size = 3522029, upload-time = "2025-12-09T22:13:32.09Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/d15398b98b65c2bce288d5ee3f7d0a81f77ab89d9456994d5c7cc8b2a9db/sqlalchemy-2.0.45-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9a62b446b7d86a3909abbcd1cd3cc550a832f99c2bc37c5b22e1925438b9367b", size = 3475142, upload-time = "2025-12-09T22:13:33.739Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e1/3ccb13c643399d22289c6a9786c1a91e3dcbb68bce4beb44926ac2c557bf/sqlalchemy-2.0.45-py3-none-any.whl", hash = "sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0", size = 1936672, upload-time = "2025-12-09T21:54:52.608Z" }, ] [[package]] @@ -2961,43 +2979,47 @@ wheels = [ [[package]] name = "tomli" -version = "2.3.0" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, - { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, - { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, - { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, - { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, - { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, - { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, - { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, - { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, - { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, - { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, - { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, - { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, - { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, - { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, - { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, - { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, - { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, - { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, - { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, - { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, - { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, - { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, - { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, - { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, - { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, - { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, - { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, - { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, + { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, + { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, + { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, + { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, + { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, + { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, + { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, + { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, + { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, + { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, + { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, + { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, + { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, + { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, + { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, + { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, + { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, + { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, ] [[package]] @@ -3063,21 +3085,21 @@ wheels = [ [[package]] name = "tornado" -version = "6.5.2" +version = "6.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821, upload-time = "2025-08-08T18:27:00.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/1d/0a336abf618272d53f62ebe274f712e213f5a03c0b2339575430b8362ef2/tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7", size = 513632, upload-time = "2025-12-15T19:21:03.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563, upload-time = "2025-08-08T18:26:42.945Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729, upload-time = "2025-08-08T18:26:44.473Z" }, - { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295, upload-time = "2025-08-08T18:26:46.021Z" }, - { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644, upload-time = "2025-08-08T18:26:47.625Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878, upload-time = "2025-08-08T18:26:50.599Z" }, - { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549, upload-time = "2025-08-08T18:26:51.864Z" }, - { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973, upload-time = "2025-08-08T18:26:53.625Z" }, - { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954, upload-time = "2025-08-08T18:26:55.072Z" }, - { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023, upload-time = "2025-08-08T18:26:56.677Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427, upload-time = "2025-08-08T18:26:57.91Z" }, - { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456, upload-time = "2025-08-08T18:26:59.207Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9", size = 443909, upload-time = "2025-12-15T19:20:48.382Z" }, + { url = "https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843", size = 442163, upload-time = "2025-12-15T19:20:49.791Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b5/206f82d51e1bfa940ba366a8d2f83904b15942c45a78dd978b599870ab44/tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17", size = 445746, upload-time = "2025-12-15T19:20:51.491Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9d/1a3338e0bd30ada6ad4356c13a0a6c35fbc859063fa7eddb309183364ac1/tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335", size = 445083, upload-time = "2025-12-15T19:20:52.778Z" }, + { url = "https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f", size = 445315, upload-time = "2025-12-15T19:20:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/27/07/2273972f69ca63dbc139694a3fc4684edec3ea3f9efabf77ed32483b875c/tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84", size = 446003, upload-time = "2025-12-15T19:20:56.101Z" }, + { url = "https://files.pythonhosted.org/packages/d1/83/41c52e47502bf7260044413b6770d1a48dda2f0246f95ee1384a3cd9c44a/tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f", size = 445412, upload-time = "2025-12-15T19:20:57.398Z" }, + { url = "https://files.pythonhosted.org/packages/10/c7/bc96917f06cbee182d44735d4ecde9c432e25b84f4c2086143013e7b9e52/tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8", size = 445392, upload-time = "2025-12-15T19:20:58.692Z" }, + { url = "https://files.pythonhosted.org/packages/0c/1a/d7592328d037d36f2d2462f4bc1fbb383eec9278bc786c1b111cbbd44cfa/tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1", size = 446481, upload-time = "2025-12-15T19:21:00.008Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc", size = 446886, upload-time = "2025-12-15T19:21:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/50/49/8dc3fd90902f70084bd2cd059d576ddb4f8bb44c2c7c0e33a11422acb17e/tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1", size = 445910, upload-time = "2025-12-15T19:21:02.571Z" }, ] [[package]] @@ -3136,11 +3158,11 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] @@ -3154,16 +3176,16 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.35.4" +version = "20.36.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/28/e6f1a6f655d620846bd9df527390ecc26b3805a0c5989048c210e22c5ca9/virtualenv-20.35.4.tar.gz", hash = "sha256:643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c", size = 6028799, upload-time = "2025-10-29T06:57:40.511Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b", size = 6005095, upload-time = "2025-10-29T06:57:37.598Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, ] [[package]] @@ -3201,18 +3223,18 @@ wheels = [ [[package]] name = "xgboost" -version = "3.1.2" +version = "3.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "sys_platform == 'linux'" }, { name = "scipy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/64/42310363ecd814de5930981672d20da3d35271721ad2d2b4970b4092825b/xgboost-3.1.2.tar.gz", hash = "sha256:0f94496db277f5c227755e1f3ec775c59bafae38f58c94aa97c5198027c93df5", size = 1237438, upload-time = "2025-11-20T18:33:29.614Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/db/ff3eb8ff8cdf87a57cbb0f484234b4353178587236c4c84c1d307165c1f8/xgboost-3.1.3.tar.gz", hash = "sha256:0aeaa59d7ba09221a6fa75f70406751cfafdf3f149d0a91b197a1360404a28f3", size = 1237662, upload-time = "2026-01-10T00:20:13.458Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/1e/efdd603db8cb37422b01d925f9cce1baaac46508661c73f6aafd5b9d7c51/xgboost-3.1.2-py3-none-macosx_10_15_x86_64.whl", hash = "sha256:b44f6ee43a28b998e289ab05285bd65a65d7999c78cf60b215e523d23dc94c5d", size = 2377854, upload-time = "2025-11-20T18:06:21.217Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c6/ed928cb106f56ab73b3f4edb5287c1352251eb9225b5932d3dd5e2803f60/xgboost-3.1.2-py3-none-macosx_12_0_arm64.whl", hash = "sha256:09690f7430504fcd3b3e62bf826bb1282bb49873b68b07120d2696ab5638df41", size = 2211078, upload-time = "2025-11-20T18:06:47.063Z" }, - { url = "https://files.pythonhosted.org/packages/70/2f/5418f4b1deaf0886caf81c5e056299228ac2fc09b965a2dfe5e4496331c8/xgboost-3.1.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:f9b83f39340e5852bbf3e918318e7feb7a2a700ac7e8603f9bc3a06787f0d86b", size = 4953319, upload-time = "2025-11-20T18:28:29.851Z" }, - { url = "https://files.pythonhosted.org/packages/5e/ab/c60fcc137fa685533bb31e721de3ecc88959d393830d59d0204c5cbd2c85/xgboost-3.1.2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:24879ac75c0ee21acae0101f791bc43303f072a86d70fdfc89dae10a0008767f", size = 115885060, upload-time = "2025-11-20T18:32:00.773Z" }, - { url = "https://files.pythonhosted.org/packages/30/7d/41847e45ff075f3636c95d1000e0b75189aed4f1ae18c36812575bb42b4b/xgboost-3.1.2-py3-none-win_amd64.whl", hash = "sha256:e627c50003269b4562aa611ed348dff8cb770e11a9f784b3888a43139a0f5073", size = 71979118, upload-time = "2025-11-20T18:27:55.23Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a9/8668a5662c497c32ab127b7ca57d91153f499b31c725969a1e4147782e64/xgboost-3.1.3-py3-none-macosx_10_15_x86_64.whl", hash = "sha256:e16a6c352ee1a4c19372a7b2bb75129e10e63adeeabd3d11f21b7787378e5a50", size = 2378032, upload-time = "2026-01-10T00:18:14.103Z" }, + { url = "https://files.pythonhosted.org/packages/52/39/ec5c53228b091387e934d3d419e8e3a5ce98c1650d458987d6e254a15304/xgboost-3.1.3-py3-none-macosx_12_0_arm64.whl", hash = "sha256:a7a1d59f3529de0ad9089c59b6cc595cd7b4424feabcc06463c4bde41f202f74", size = 2211477, upload-time = "2026-01-10T00:18:34.409Z" }, + { url = "https://files.pythonhosted.org/packages/99/f7/ceb06e6b959e5a8b303883482ecad346495641947679e3f735ae8ac1caa7/xgboost-3.1.3-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2e31482633883b2e95fda6055db654bbfac82e10d91ad3d9929086ebd28eb1c4", size = 115346575, upload-time = "2026-01-10T00:19:11.44Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9c/9d4ad7f586698bad52a570d2bf81138e500a5d9f32723c2b4ed1dd9252d8/xgboost-3.1.3-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:687504d1d76dc797df08b0dbe8b83d58629cdc06df52378f617164d16142bf2c", size = 115926894, upload-time = "2026-01-10T00:19:49.123Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d8/4d4ae25452577f2dfabc66b60e712e7c01f9fe6c389fa88c546c2f427c4d/xgboost-3.1.3-py3-none-win_amd64.whl", hash = "sha256:3fe349b4c6030f0d66e166a3a6b7d470e776d530ea240d77335e36144cbe132a", size = 72011993, upload-time = "2026-01-10T00:17:42.98Z" }, ] From ce534ee1d70b756247d61dce885e1d3837870e58 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 16 Jan 2026 10:47:01 -0500 Subject: [PATCH 21/29] Fix test assertions --- .../evaluation/quality/test_mean_f1_score_difference.py | 6 +++--- .../evaluation/quality/test_mean_regression_difference.py | 2 +- .../quality/test_multi_target_modeling_difference.py | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py index b015c4d7..b62f6528 100644 --- a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py +++ b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py @@ -49,7 +49,7 @@ def test_mean_f1_score_diff_with_preprocess() -> None: assert pytest.approx(0.7668, abs=1e-8) == score["random_forest_real_train_f1"] assert pytest.approx(-0.06789999999999999, abs=1e-8) == score["mean_f1_difference"] else: - assert pytest.approx(0.7684, abs=1e-8) == score["random_forest_real_train_f1"] + assert pytest.approx(0.7656, abs=1e-8) == score["random_forest_real_train_f1"] assert pytest.approx(-0.06829999999999997, abs=1e-8) == score["mean_f1_difference"] assert pytest.approx(0.5008, abs=1e-8) == score["random_forest_synthetic_train_f1"] assert pytest.approx(0.5, abs=1e-8) == score["adaboost_real_train_f1"] @@ -78,7 +78,7 @@ def test_mean_f1_score_diff_with_no_categorical() -> None: if is_apple_silicon(): assert pytest.approx(-0.0792, abs=1e-8) == score["mean_f1_difference"] else: - assert pytest.approx(-0.0795, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(-0.0793, abs=1e-8) == score["mean_f1_difference"] unset_all_random_seeds() @@ -102,7 +102,7 @@ def test_mean_f1_score_diff_with_holdout_difference_f1() -> None: assert pytest.approx(0.7667172638761903, abs=1e-8) == score["random_forest_real_train_f1"] assert pytest.approx(-0.17912194553312424, abs=1e-8) == score["mean_f1_difference"] else: - assert pytest.approx(0.7683679496293229, abs=1e-8) == score["random_forest_real_train_f1"] + assert pytest.approx(0.7655658771879633, abs=1e-8) == score["random_forest_real_train_f1"] assert pytest.approx(-0.1795346169714074, abs=1e-8) == score["mean_f1_difference"] assert pytest.approx(0.40831722022666145, abs=1e-8) == score["random_forest_synthetic_train_f1"] assert pytest.approx(0.3632940727026944, abs=1e-8) == score["adaboost_real_train_f1"] diff --git a/tests/unit/evaluation/quality/test_mean_regression_difference.py b/tests/unit/evaluation/quality/test_mean_regression_difference.py index 97cd19b4..404f769f 100644 --- a/tests/unit/evaluation/quality/test_mean_regression_difference.py +++ b/tests/unit/evaluation/quality/test_mean_regression_difference.py @@ -106,7 +106,7 @@ def test_mean_regression_diff_with_no_categorical() -> None: if is_apple_silicon(): assert pytest.approx(-0.0565015943519761, abs=1e-8) == score["RandomForestRegressor_r2_difference"] else: - assert pytest.approx(-0.05648909197410379, abs=1e-8) == score["RandomForestRegressor_r2_difference"] + assert pytest.approx(-0.05648892075668577, abs=1e-8) == score["RandomForestRegressor_r2_difference"] unset_all_random_seeds() diff --git a/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py b/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py index 8d15b093..70fbddf9 100644 --- a/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py +++ b/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py @@ -8,6 +8,7 @@ from midst_toolkit.common.enumerations import ColumnType from midst_toolkit.common.random import set_all_random_seeds, unset_all_random_seeds from midst_toolkit.evaluation.quality.multi_target_modeling_difference import MultiTargetModelingDifference +from tests.utils.architecture import is_apple_silicon def get_regression_data() -> tuple[pd.DataFrame, pd.DataFrame]: @@ -189,7 +190,10 @@ def test_multi_target_modeling_difference_with_two_cat_targets() -> None: score = metric.compute(real_data, synthetic_data, holdout_data) - assert pytest.approx(-0.15399437057829385, abs=1e-8) == score["avg_f1_difference"] + if is_apple_silicon(): + assert pytest.approx(-0.15399437057829385, abs=1e-8) == score["avg_f1_difference"] + else: + assert pytest.approx(-0.153918889187196, abs=1e-8) == score["avg_f1_difference"] # Test that nothing breaks when we have no numerical columns From 4a0674bc17718a730230d7f52d51f5167b059b64 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 16 Jan 2026 10:56:51 -0500 Subject: [PATCH 22/29] Second set of test fix --- examples/ept_attack/run_ept_attack.py | 5 +++++ .../evaluation/quality/test_mean_f1_score_difference.py | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index ac43405e..9a4b59b0 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -21,6 +21,7 @@ from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe from midst_toolkit.attacks.ept.classification import train_attack_classifier from midst_toolkit.attacks.ept.feature_extraction import extract_features +from midst_toolkit.common.random import set_all_random_seeds from midst_toolkit.common.logger import log @@ -255,6 +256,10 @@ def main(config: DictConfig) -> None: """ log(INFO, "Running EPT-MIA Attack Example Pipeline.") + if config.random_seed is not None: + set_all_random_seeds(seed=config.random_seed) + log(INFO, f"Training phase random seed set to {config.random_seed}.") + if config.attack_settings.single_table: log(INFO, "Data: Single-table.") else: diff --git a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py index b62f6528..1f56328b 100644 --- a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py +++ b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py @@ -50,7 +50,7 @@ def test_mean_f1_score_diff_with_preprocess() -> None: assert pytest.approx(-0.06789999999999999, abs=1e-8) == score["mean_f1_difference"] else: assert pytest.approx(0.7656, abs=1e-8) == score["random_forest_real_train_f1"] - assert pytest.approx(-0.06829999999999997, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(-0.06759999999999997, abs=1e-8) == score["mean_f1_difference"] assert pytest.approx(0.5008, abs=1e-8) == score["random_forest_synthetic_train_f1"] assert pytest.approx(0.5, abs=1e-8) == score["adaboost_real_train_f1"] assert pytest.approx(0.49879999999999997, abs=1e-8) == score["adaboost_synthetic_train_f1"] @@ -78,7 +78,7 @@ def test_mean_f1_score_diff_with_no_categorical() -> None: if is_apple_silicon(): assert pytest.approx(-0.0792, abs=1e-8) == score["mean_f1_difference"] else: - assert pytest.approx(-0.0793, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(-0.0794, abs=1e-8) == score["mean_f1_difference"] unset_all_random_seeds() @@ -103,7 +103,7 @@ def test_mean_f1_score_diff_with_holdout_difference_f1() -> None: assert pytest.approx(-0.17912194553312424, abs=1e-8) == score["mean_f1_difference"] else: assert pytest.approx(0.7655658771879633, abs=1e-8) == score["random_forest_real_train_f1"] - assert pytest.approx(-0.1795346169714074, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(-0.17883409886106752, abs=1e-8) == score["mean_f1_difference"] assert pytest.approx(0.40831722022666145, abs=1e-8) == score["random_forest_synthetic_train_f1"] assert pytest.approx(0.3632940727026944, abs=1e-8) == score["adaboost_real_train_f1"] assert pytest.approx(0.33490261584802905, abs=1e-8) == score["adaboost_synthetic_train_f1"] From c77e4901685f09098bfb39cda4c59a015dfa97a1 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 16 Jan 2026 13:52:25 -0500 Subject: [PATCH 23/29] Ruff fix --- examples/ept_attack/run_ept_attack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 9a4b59b0..292e63c6 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -21,8 +21,8 @@ from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe from midst_toolkit.attacks.ept.classification import train_attack_classifier from midst_toolkit.attacks.ept.feature_extraction import extract_features -from midst_toolkit.common.random import set_all_random_seeds from midst_toolkit.common.logger import log +from midst_toolkit.common.random import set_all_random_seeds # Step 2 and 3: Attribute prediction model training and feature extraction From de380921939ab1537dff4baa90d5578e143083d4 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 16 Jan 2026 16:38:16 -0500 Subject: [PATCH 24/29] Scipy downgrade --- pyproject.toml | 1 + .../quality/test_mean_f1_score_difference.py | 10 +- .../test_mean_regression_difference.py | 2 +- .../test_multi_target_modeling_difference.py | 2 +- uv.lock | 110 +++++++++--------- 5 files changed, 64 insertions(+), 61 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 00fdad2b..ee9ad24d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ dependencies = [ "filelock>=3.20.1", "sdv>=1.18.0", "catboost>=1.2.8", + "scipy==1.16.3", ] [build-system] diff --git a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py index 1f56328b..9c8fdebe 100644 --- a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py +++ b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py @@ -46,8 +46,8 @@ def test_mean_f1_score_diff_with_preprocess() -> None: score = metric.compute(real_data, synthetic_data) # Due to numerical fluctuations on github runners, we have slightly different values. if is_apple_silicon(): - assert pytest.approx(0.7668, abs=1e-8) == score["random_forest_real_train_f1"] - assert pytest.approx(-0.06789999999999999, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(0.764, abs=1e-8) == score["random_forest_real_train_f1"] + assert pytest.approx(-0.-0.06719999999999998, abs=1e-8) == score["mean_f1_difference"] else: assert pytest.approx(0.7656, abs=1e-8) == score["random_forest_real_train_f1"] assert pytest.approx(-0.06759999999999997, abs=1e-8) == score["mean_f1_difference"] @@ -76,7 +76,7 @@ def test_mean_f1_score_diff_with_no_categorical() -> None: score = metric.compute(real_data, synthetic_data) # Due to numerical fluctuations on github runners, we have slightly different values. if is_apple_silicon(): - assert pytest.approx(-0.0792, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(-0.-0.07909999999999996, abs=1e-8) == score["mean_f1_difference"] else: assert pytest.approx(-0.0794, abs=1e-8) == score["mean_f1_difference"] unset_all_random_seeds() @@ -99,8 +99,8 @@ def test_mean_f1_score_diff_with_holdout_difference_f1() -> None: score = metric.compute(real_data, synthetic_data, holdout_data) # Due to numerical fluctuations on github runners, we have slightly different values. if is_apple_silicon(): - assert pytest.approx(0.7667172638761903, abs=1e-8) == score["random_forest_real_train_f1"] - assert pytest.approx(-0.17912194553312424, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(0.763919128428235, abs=1e-8) == score["random_forest_real_train_f1"] + assert pytest.approx(-0.1784224116711354, abs=1e-8) == score["mean_f1_difference"] else: assert pytest.approx(0.7655658771879633, abs=1e-8) == score["random_forest_real_train_f1"] assert pytest.approx(-0.17883409886106752, abs=1e-8) == score["mean_f1_difference"] diff --git a/tests/unit/evaluation/quality/test_mean_regression_difference.py b/tests/unit/evaluation/quality/test_mean_regression_difference.py index 404f769f..3d4faff3 100644 --- a/tests/unit/evaluation/quality/test_mean_regression_difference.py +++ b/tests/unit/evaluation/quality/test_mean_regression_difference.py @@ -104,7 +104,7 @@ def test_mean_regression_diff_with_no_categorical() -> None: score = metric.compute(real_data, synthetic_data, holdout_data) # Due to numerical fluctuations on github runners, we have slightly different values. if is_apple_silicon(): - assert pytest.approx(-0.0565015943519761, abs=1e-8) == score["RandomForestRegressor_r2_difference"] + assert pytest.approx(-0.05650138480537015, abs=1e-8) == score["RandomForestRegressor_r2_difference"] else: assert pytest.approx(-0.05648892075668577, abs=1e-8) == score["RandomForestRegressor_r2_difference"] diff --git a/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py b/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py index 70fbddf9..b2eeb73b 100644 --- a/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py +++ b/tests/unit/evaluation/quality/test_multi_target_modeling_difference.py @@ -191,7 +191,7 @@ def test_multi_target_modeling_difference_with_two_cat_targets() -> None: score = metric.compute(real_data, synthetic_data, holdout_data) if is_apple_silicon(): - assert pytest.approx(-0.15399437057829385, abs=1e-8) == score["avg_f1_difference"] + assert pytest.approx(-0.153918889187196, abs=1e-8) == score["avg_f1_difference"] else: assert pytest.approx(-0.153918889187196, abs=1e-8) == score["avg_f1_difference"] diff --git a/uv.lock b/uv.lock index ce99667b..b4396ba7 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.12" resolution-markers = [ "python_full_version >= '3.13'", @@ -1350,6 +1350,7 @@ dependencies = [ { name = "pillow" }, { name = "pydantic" }, { name = "scikit-learn" }, + { name = "scipy" }, { name = "sdv" }, { name = "syntheval" }, { name = "torch" }, @@ -1398,6 +1399,7 @@ requires-dist = [ { name = "pillow", specifier = ">=11.3.0" }, { name = "pydantic", specifier = ">=2.12.3" }, { name = "scikit-learn", specifier = ">=1.5.0" }, + { name = "scipy", specifier = "==1.16.3" }, { name = "sdv", specifier = ">=1.18.0" }, { name = "syntheval", specifier = ">=1.6.2" }, { name = "torch", specifier = ">=2.6.0" }, @@ -2701,63 +2703,63 @@ wheels = [ [[package]] name = "scipy" -version = "1.17.0" +version = "1.16.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, - { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, - { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, - { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, - { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, - { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, - { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, - { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, - { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, - { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, - { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, - { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, - { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, - { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, - { url = "https://files.pythonhosted.org/packages/b9/b6/8ac583d6da79e7b9e520579f03007cb006f063642afd6b2eeb16b890bf93/scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812", size = 36287211, upload-time = "2026-01-10T21:28:43.122Z" }, - { url = "https://files.pythonhosted.org/packages/55/fb/7db19e0b3e52f882b420417644ec81dd57eeef1bd1705b6f689d8ff93541/scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2", size = 24312646, upload-time = "2026-01-10T21:28:49.893Z" }, - { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, - { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, - { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, - { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, - { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, - { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, - { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, - { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, - { url = "https://files.pythonhosted.org/packages/f9/cc/2bd59140ed3b2fa2882fb15da0a9cb1b5a6443d67cfd0d98d4cec83a57ec/scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0", size = 36328593, upload-time = "2026-01-10T21:28:28.007Z" }, - { url = "https://files.pythonhosted.org/packages/13/1b/c87cc44a0d2c7aaf0f003aef2904c3d097b422a96c7e7c07f5efd9073c1b/scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67", size = 24625083, upload-time = "2026-01-10T21:28:35.188Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, - { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, - { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, - { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, - { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, - { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, - { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, - { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, - { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, - { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, - { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, - { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, - { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, - { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, - { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, + { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, + { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, + { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, + { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, + { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, + { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, + { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, + { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, ] [[package]] From 7e8d3106c98122b9016bf9a5644fdeb455c13f69 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Fri, 16 Jan 2026 16:39:15 -0500 Subject: [PATCH 25/29] Ruff fix --- .../unit/evaluation/quality/test_mean_f1_score_difference.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py index 9c8fdebe..5c4898f5 100644 --- a/tests/unit/evaluation/quality/test_mean_f1_score_difference.py +++ b/tests/unit/evaluation/quality/test_mean_f1_score_difference.py @@ -47,7 +47,7 @@ def test_mean_f1_score_diff_with_preprocess() -> None: # Due to numerical fluctuations on github runners, we have slightly different values. if is_apple_silicon(): assert pytest.approx(0.764, abs=1e-8) == score["random_forest_real_train_f1"] - assert pytest.approx(-0.-0.06719999999999998, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(-0.0 - 0.06719999999999998, abs=1e-8) == score["mean_f1_difference"] else: assert pytest.approx(0.7656, abs=1e-8) == score["random_forest_real_train_f1"] assert pytest.approx(-0.06759999999999997, abs=1e-8) == score["mean_f1_difference"] @@ -76,7 +76,7 @@ def test_mean_f1_score_diff_with_no_categorical() -> None: score = metric.compute(real_data, synthetic_data) # Due to numerical fluctuations on github runners, we have slightly different values. if is_apple_silicon(): - assert pytest.approx(-0.-0.07909999999999996, abs=1e-8) == score["mean_f1_difference"] + assert pytest.approx(-0.0 - 0.07909999999999996, abs=1e-8) == score["mean_f1_difference"] else: assert pytest.approx(-0.0794, abs=1e-8) == score["mean_f1_difference"] unset_all_random_seeds() From 1205e118349a6f3384df8ea0fde349eabcc17184 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Mon, 19 Jan 2026 13:50:08 -0500 Subject: [PATCH 26/29] First edits: David's comments --- examples/common/utils.py | 17 +++ examples/ept_attack/run_ept_attack.py | 120 ++++++++++------- .../attacks/ept/classification.py | 122 ++++++++++-------- .../attacks/ept_attack/test_classification.py | 6 +- 4 files changed, 162 insertions(+), 103 deletions(-) diff --git a/examples/common/utils.py b/examples/common/utils.py index 8a04571d..2e21a51b 100644 --- a/examples/common/utils.py +++ b/examples/common/utils.py @@ -29,3 +29,20 @@ def iterate_model_folders( model_folders = [entry for entry in current_path.iterdir() if entry.is_dir()] for model_folder_path in model_folders: yield model_name, model_folder_path, model_folder_path.name, mode + + +def directory_checks(directory_path: Path, custom_error_message: str = "") -> None: + """ + Performs checks to ensure that the feature extraction directory exists and is not empty. + + Args: + directory_path: Path to the directory to check. + custom_error_message: Additional message to include in the assertion error. + + Raises: + AssertionError: If the directory does not exist or is empty. + """ + assert directory_path.exists() and directory_path.is_dir(), ( + f"Directory not found: {directory_path}. " + custom_error_message + ) + assert any(directory_path.iterdir()), f"Directory is empty: {directory_path}. " + custom_error_message diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 292e63c6..0f57b81f 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -8,18 +8,18 @@ import itertools import json +from collections import defaultdict from datetime import datetime from logging import INFO from pathlib import Path -from typing import Any import hydra import pandas as pd from omegaconf import DictConfig -from examples.common.utils import iterate_model_folders +from examples.common.utils import directory_checks, iterate_model_folders from midst_toolkit.attacks.ensemble.data_utils import load_dataframe, save_dataframe -from midst_toolkit.attacks.ept.classification import train_attack_classifier +from midst_toolkit.attacks.ept.classification import ClassifierType, train_attack_classifier from midst_toolkit.attacks.ept.feature_extraction import extract_features from midst_toolkit.common.logger import log from midst_toolkit.common.random import set_all_random_seeds @@ -53,8 +53,7 @@ def run_attribute_prediction(config: DictConfig) -> None: } # Assert that the input data path exists and is not empty - assert input_data_path.exists() and input_data_path.is_dir(), f"Input data directory not found: {input_data_path}" - assert any(input_data_path.iterdir()), f"Input data directory is empty: {input_data_path}" + directory_checks(input_data_path) # Iterating over directories specific to the shadow models folder structure in the competition for model_name, model_data_path, model_folder, mode in iterate_model_folders( @@ -103,11 +102,47 @@ def run_attribute_prediction(config: DictConfig) -> None: save_dataframe(df=df_extracted_features, file_path=final_output_dir, file_name=file_name) +def _summarize_and_save_training_results( + summary_results: dict, output_summary_path: Path, summary_file_name: str +) -> pd.DataFrame: + """ + Processes summary results, saves them to a CSV, and returns the summary DataFrame. + + Args: + summary_results: A dictionary containing the summary results. + output_summary_path: The path where the summary CSV will be saved. + summary_file_name: The name of the summary CSV file. + + Returns: + A pandas DataFrame containing the summarized results. + """ + processed_results = [] + for (classifier, columns_lst), model_scores in summary_results.items(): + row: dict[str, str | float] = {"classifier": classifier, "column_types": columns_lst} + for diffusion_model_name, scores in model_scores: + for score_name, score_value in scores.items(): + col_name = ( + score_name.lower().replace(" ", "_").replace("-", "_").replace("_at_", "_").replace(".0", "") + ) + row[f"{diffusion_model_name}_{col_name}"] = score_value + processed_results.append(row) + + summary_df = pd.DataFrame(processed_results) + tpr_10_cols = [col for col in summary_df.columns if col.endswith("_tpr_fpr_10")] + if tpr_10_cols: + summary_df["final_tpr_fpr_10"] = summary_df[tpr_10_cols].max(axis=1) + + summary_df.to_csv(output_summary_path / summary_file_name, index=False) + log(INFO, f"Saved attack classifier summary to {output_summary_path / summary_file_name}") + return summary_df + + # Step 4: Attack classifier training def run_attack_classifier_training(config: DictConfig) -> None: """ - Trains multiple attack classifiers to distinguish between training and synthetic data, - and selects the best performing configuration based on evaluation metrics. + Trains multiple attack classifiers to distinguish between training and + non-training data, and selects the best performing configuration based + on evaluation metrics. This function orchestrates the training of various attack classifiers (XGBoost, CatBoost, MLP) to perform a membership inference attack. It iterates through @@ -142,17 +177,26 @@ def run_attack_classifier_training(config: DictConfig) -> None: features_data_path = Path(config.data_paths.attribute_features_path) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - summary_results: list[dict[str, Any]] = [] + + # An example of summary_results structure: + # { + # ('XGBoost', 'actual error'): [ + # ('tabddpm', {'AUC': 0.85, 'TPR at FPR=10%': 0.75, ...}), + # ('tabsyn', {'AUC': 0.80, 'TPR at FPR=10%': 0.70, ...}), + # ], + # ('CatBoost', 'accuracy prediction'): [ + # ('tabddpm', {'AUC': 0.82, 'TPR at FPR=10%': 0.72, ...}), + # ('tabsyn', {'AUC': 0.78, 'TPR at FPR=10% ': 0.68, ...}), + # ], + # ... + # } + + summary_results: dict[tuple[str, str], list[tuple[str, dict[str, float]]]] = defaultdict(list) for diffusion_model_name in diffusion_models: train_features_path = features_data_path / f"{diffusion_model_name}_black_box" / "train" - assert train_features_path.exists() and train_features_path.is_dir(), ( - f"Directory not found: {train_features_path}. Make sure to run feature extraction first." - ) - assert any(train_features_path.iterdir()), ( - f"Directory is empty: {train_features_path}. Make sure to run feature extraction first." - ) + directory_checks(train_features_path, "Make sure to run feature extraction first.") sorted_feature_files = sorted(train_features_path.glob("*.csv")) @@ -174,41 +218,27 @@ def run_attack_classifier_training(config: DictConfig) -> None: output_summary_path = Path(config.classifier_settings.results_output_path) / data_format / f"{timestamp}_train" output_summary_path.mkdir(parents=True, exist_ok=True) - for classifier in classifier_types: # XGBoost, CatBoost, MLP + for classifier in classifier_types: for r in range(1, len(column_types) + 1): - for selected_columns_tuple in itertools.combinations(column_types, r): - # Find if a result for this combination already exists - columns_str = " ".join(sorted(selected_columns_tuple)) - row = next( - ( - item - for item in summary_results - if item["classifier"] == classifier and item["columns_lst"] == columns_str - ), - None, - ) + for selected_column_types_tuple in itertools.combinations(column_types, r): + columns_str = " ".join(sorted(selected_column_types_tuple)) + result_key = (classifier, columns_str) - if not row: - row = {"classifier": classifier, "columns_lst": columns_str} - summary_results.append(row) + classifier_type = ClassifierType(classifier) results = train_attack_classifier( - classifier_type=classifier, - columns_list=list(selected_columns_tuple), + classifier_type=classifier_type, + column_types=list(selected_column_types_tuple), x_train=df_train_features, y_train=train_labels, x_test=df_test_features, y_test=test_labels, ) - # Update row with scores for the current diffusion model - for score_name, score_value in results["scores"].items(): - # Sanitize score_name for column header - col_name = score_name.lower().replace(" ", "_").replace("-", "_") - col_name = col_name.replace("_at_", "_").replace(".0", "") - row[f"{diffusion_model_name}_{col_name}"] = score_value + # Store raw scores for the current diffusion model + summary_results[result_key].append((diffusion_model_name, results["scores"])) - training_directory_name = f"{classifier}_" + "_".join(selected_columns_tuple) + training_directory_name = f"{classifier}_{'_'.join(selected_column_types_tuple)}" training_output_path = output_summary_path / training_directory_name training_output_path.mkdir(parents=True, exist_ok=True) @@ -227,22 +257,14 @@ def run_attack_classifier_training(config: DictConfig) -> None: for score_name, score_value in results["scores"].items(): f.write(f"{score_name}: {score_value}\n") - summary_file_name = "attack_classifier_summary.csv" - summary_df = pd.DataFrame(summary_results) - - # Add final_tpr_fpr_10 column which is the max TPR at FPR=10% across diffusion models - tpr_10_cols = [col for col in summary_df.columns if col.endswith("_tpr_fpr_10")] - if tpr_10_cols: - summary_df["final_tpr_fpr_10"] = summary_df[tpr_10_cols].max(axis=1) - - summary_df.to_csv(output_summary_path / summary_file_name, index=False) - - log(INFO, f"Saved attack classifier summary to {output_summary_path / summary_file_name}") + summary_df = _summarize_and_save_training_results(summary_results, output_summary_path, "attack_classifier_summary.csv") summary_df.sort_values(by=["final_tpr_fpr_10"], ascending=False, inplace=True) best_result = summary_df.head(1) log(INFO, f"Best performing attack configuration:\n{best_result}") + log(INFO, f"Best performing attack configuration:\n{best_result}") + @hydra.main(config_path=".", config_name="config", version_base=None) def main(config: DictConfig) -> None: diff --git a/src/midst_toolkit/attacks/ept/classification.py b/src/midst_toolkit/attacks/ept/classification.py index 3738e945..e49769aa 100644 --- a/src/midst_toolkit/attacks/ept/classification.py +++ b/src/midst_toolkit/attacks/ept/classification.py @@ -1,3 +1,4 @@ +from enum import Enum from logging import INFO from typing import Any @@ -10,9 +11,48 @@ from xgboost import XGBClassifier from midst_toolkit.common.logger import log +from midst_toolkit.common.variables import DEVICE -def filter_data(features_df: pd.DataFrame, columns_list: list[str]) -> np.ndarray: +class ClassifierType(Enum): + XGBOOST = "XGBoost" + CATBOOST = "CatBoost" + MLP = "MLP" + + +class ColumnType(Enum): + ACTUAL = "actual" + ERROR = "error" + ERROR_RATIO = "error_ratio" + ACCURACY = "accuracy" + PREDICTION = "prediction" + + +def should_keep_column(column_name: str, column_types: list[ColumnType]) -> bool: + """ + Determines if a column should be kept based on its suffix. + + Args: + column_name: The name of the column. + column_types: A list of `ColumnType` enums to check for. + + Returns: + True if the column should be kept, False otherwise. + """ + non_actual_suffixes = [s.value for s in ColumnType if s != ColumnType.ACTUAL] + non_actual_suffixes_in_list = [s.value for s in column_types if s != ColumnType.ACTUAL] + + if column_name.endswith(tuple(non_actual_suffixes_in_list)): + return True + + # 'actual' means we keep columns that don't have any of the other suffixes. + if ColumnType.ACTUAL in column_types: + return not column_name.endswith(tuple(non_actual_suffixes)) + + return False + + +def filter_data(features_df: pd.DataFrame, column_types: list[str]) -> np.ndarray: """ Filters columns from a single DataFrame based on specified suffixes. @@ -23,26 +63,18 @@ def filter_data(features_df: pd.DataFrame, columns_list: list[str]) -> np.ndarra Args: features_df: The pandas DataFrame to process. - columns_list: A list of strings specifying the types of columns - to select. + column_types: A list of strings specifying the types of columns + to select. (actual, error, error_ratio, accuracy, prediction) Returns: A NumPy array containing the data from the selected columns. """ - suffix_mapping = { - "actual": lambda x: not ( - x.endswith("error") or x.endswith("error_ratio") or x.endswith("accuracy") or x.endswith("prediction") - ), - "error": lambda x: x.endswith("error"), - "error_ratio": lambda x: x.endswith("error_ratio"), - "accuracy": lambda x: x.endswith("accuracy"), - "prediction": lambda x: x.endswith("prediction"), - } + try: + column_enums = [ColumnType(c) for c in column_types] + except ValueError as e: + raise ValueError(f"Invalid column type in `columns_list`. {e}") from e - # Filter columns for each type in args.columns_lst - selected_columns = [ - col for col_type in columns_list for col in features_df.columns if suffix_mapping[col_type](col) - ] + selected_columns = [column for column in features_df.columns if should_keep_column(column, column_enums)] return features_df[selected_columns].values @@ -58,7 +90,7 @@ def __init__(self, input_size: int = 100, hidden_size: int = 64, output_size: in hidden_size: The number of neurons in the hidden layer. Defaults to 64. output_size: The number of output neurons, typically 1 for binary classification. Defaults to 1. """ - super(MLPClassifier, self).__init__() + super().__init__() self.layers = nn.Sequential( nn.Linear(input_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, output_size), nn.Sigmoid() ) @@ -73,15 +105,14 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: Returns: The output tensor after passing through the network. """ - return self.layers(x) + return self.layers(x).squeeze(dim=-1) def train_mlp( x_train: np.ndarray, y_train: np.ndarray, - x_test: np.ndarray, - device: torch.device, - eval: bool, + x_test: np.ndarray | None = None, + device: torch.device = DEVICE, epochs: int = 10, ) -> tuple[np.ndarray | None, np.ndarray | None]: """ @@ -110,26 +141,22 @@ def train_mlp( torch.tensor(y_train, dtype=torch.float32).to(device), ) - if eval: - x_test_tensor = torch.tensor(x_test, dtype=torch.float32).to(device) - # Train the model for _ in range(epochs): model.train() optimizer.zero_grad() - outputs = model(x_train_tensor).squeeze() + outputs = model(x_train_tensor) loss = criterion(outputs, y_train_tensor) loss.backward() optimizer.step() y_pred, y_proba = None, None - if eval: - model.eval() - + if x_test is not None: + x_test_tensor = torch.tensor(x_test, dtype=torch.float32).to(device) with torch.no_grad(): # Get probabilities - y_proba = model(x_test_tensor).squeeze().cpu().numpy() + y_proba = model(x_test_tensor).cpu().numpy() # Convert probabilities to binary predictions y_pred = (y_proba > 0.5).astype(float) @@ -180,8 +207,8 @@ def get_scores( def train_attack_classifier( - classifier_type: str, - columns_list: list[str], + classifier_type: ClassifierType, + column_types: list[str], x_train: pd.DataFrame, y_train: pd.Series, x_test: pd.DataFrame, @@ -197,7 +224,8 @@ def train_attack_classifier( Args: classifier_type: The type of classifier to train. Supported values are "XGBoost", "CatBoost", and "MLP". - columns_list: A list of column names to be used as features for training the classifier. + column_types: A list of column type (actual, error, error_ratio, accuracy, prediction) + to be used as features for training the classifier. x_train: The feature data for the training set. y_train: The labels for the training set (membership status). x_test: The feature data for the test set. @@ -210,14 +238,14 @@ def train_attack_classifier( - "scores": A dictionary of performance metrics, including accuracy, AUC, and TPR at various FPR thresholds. """ - log(INFO, f"Training {classifier_type} classifier using features from columns: {columns_list}") + log(INFO, f"Training {classifier_type.value} classifier using features from column types: {column_types}") all_results: dict[str, Any] = {} - x_train_processed = filter_data(x_train, columns_list) + x_train_processed = filter_data(x_train, column_types) y_train_processed = y_train.to_numpy() - x_test_processed = filter_data(x_test, columns_list) + x_test_processed = filter_data(x_test, column_types) y_test_processed = y_test.to_numpy() assert x_train_processed.shape[0] == y_train_processed.shape[0], ( @@ -228,30 +256,26 @@ def train_attack_classifier( "Mismatch in number of features between train and test sets" ) - assert classifier_type in ["XGBoost", "CatBoost", "MLP"], f"Unsupported classifier type: {classifier_type}" - y_pred, y_proba = None, None - if classifier_type == "XGBoost": + if classifier_type == ClassifierType.XGBOOST: model = XGBClassifier() model.fit(x_train_processed, y_train_processed) y_pred = model.predict(x_test_processed) y_proba = model.predict_proba(x_test_processed)[:, 1] - elif classifier_type == "CatBoost": + elif classifier_type == ClassifierType.CATBOOST: model = CatBoostClassifier(verbose=0) model.fit(x_train_processed, y_train_processed) y_pred = model.predict(x_test_processed) y_proba = model.predict_proba(x_test_processed)[:, 1] - elif classifier_type == "MLP": - y_pred, y_proba = train_mlp( - x_train_processed, - y_train_processed, - x_test_processed, - torch.device("cuda" if torch.cuda.is_available() else "cpu"), - eval=True, - ) + elif classifier_type == ClassifierType.MLP: + y_pred, y_proba = train_mlp(x_train_processed, y_train_processed, x_test_processed, DEVICE) + + assert y_pred is not None and y_proba is not None, ( + "Predictions and probabilities should not be None to get scores." + ) prediction_results = { "y_true": y_test_processed, @@ -259,10 +283,6 @@ def train_attack_classifier( "y_pred": y_pred, } - assert y_pred is not None and y_proba is not None, ( - "Predictions and probabilities should not be None to get scores." - ) - fpr_thresholds = [0.1, 0.01, 0.001] all_results["prediction_results"] = prediction_results diff --git a/tests/unit/attacks/ept_attack/test_classification.py b/tests/unit/attacks/ept_attack/test_classification.py index ca4753f1..62d9069e 100644 --- a/tests/unit/attacks/ept_attack/test_classification.py +++ b/tests/unit/attacks/ept_attack/test_classification.py @@ -12,6 +12,7 @@ train_attack_classifier, train_mlp, ) +from midst_toolkit.common.variables import DEVICE @pytest.fixture @@ -94,10 +95,9 @@ def test_train_mlp(mock_mlp_class): x_train = np.random.rand(10, 5) y_train = np.random.randint(0, 2, 10) x_test = np.random.rand(3, 5) - device = torch.device("cpu") # Test with eval=True - y_pred, y_proba = train_mlp(x_train, y_train, x_test, device, eval=True, epochs=1) + y_pred, y_proba = train_mlp(x_train, y_train, x_test, DEVICE, epochs=1) assert y_pred is not None assert y_proba is not None assert y_pred.shape == (3,) @@ -110,7 +110,7 @@ def test_train_mlp(mock_mlp_class): ] # Test with eval=False - y_pred_no_eval, y_proba_no_eval = train_mlp(x_train, y_train, x_test, device, eval=False, epochs=1) + y_pred_no_eval, y_proba_no_eval = train_mlp(x_train, y_train, x_test=None, device=DEVICE, epochs=1) assert y_pred_no_eval is None assert y_proba_no_eval is None From e329ab259c6d9a19209dd8958f21ef2b0912d583 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Mon, 19 Jan 2026 14:45:41 -0500 Subject: [PATCH 27/29] Modify EPT classification tests --- .../attacks/ept/classification.py | 3 + .../attacks/ept_attack/test_classification.py | 189 ++++++++++++------ 2 files changed, 130 insertions(+), 62 deletions(-) diff --git a/src/midst_toolkit/attacks/ept/classification.py b/src/midst_toolkit/attacks/ept/classification.py index e49769aa..30b994b6 100644 --- a/src/midst_toolkit/attacks/ept/classification.py +++ b/src/midst_toolkit/attacks/ept/classification.py @@ -273,6 +273,9 @@ def train_attack_classifier( elif classifier_type == ClassifierType.MLP: y_pred, y_proba = train_mlp(x_train_processed, y_train_processed, x_test_processed, DEVICE) + else: + raise ValueError(f"Unsupported classifier type: {classifier_type}") + assert y_pred is not None and y_proba is not None, ( "Predictions and probabilities should not be None to get scores." ) diff --git a/tests/unit/attacks/ept_attack/test_classification.py b/tests/unit/attacks/ept_attack/test_classification.py index 62d9069e..43809304 100644 --- a/tests/unit/attacks/ept_attack/test_classification.py +++ b/tests/unit/attacks/ept_attack/test_classification.py @@ -4,6 +4,7 @@ import pandas as pd import pytest import torch +from enum import Enum from midst_toolkit.attacks.ept.classification import ( MLPClassifier, @@ -11,10 +12,15 @@ get_scores, train_attack_classifier, train_mlp, + ClassifierType, + ColumnType, ) from midst_toolkit.common.variables import DEVICE +class MockClassifierType(Enum): + UNSUPPORTED = "Unsupported" + @pytest.fixture def sample_features_df(): # Sample DataFrame for testing filter_data. @@ -30,87 +36,145 @@ def sample_features_df(): @pytest.mark.parametrize( - "columns_list, expected_cols", + "column_types, expected_cols", [ - (["actual"], ["feature1_actual", "another_feature"]), - (["error"], ["feature1_error"]), - (["error_ratio"], ["feature2_error_ratio"]), - (["accuracy"], ["feature3_accuracy"]), - (["prediction"], ["feature4_prediction"]), - (["error", "accuracy"], ["feature1_error", "feature3_accuracy"]), - ( - ["actual", "prediction"], - ["feature1_actual", "another_feature", "feature4_prediction"], + pytest.param( + [ColumnType.ACTUAL], + ["feature1_actual", "another_feature"], + id="filter_actual_columns", + ), + pytest.param( + [ColumnType.ERROR], + ["feature1_error"], + id="filter_error_columns", + ), + pytest.param( + [ColumnType.ERROR_RATIO], + ["feature2_error_ratio"], + id="filter_error_ratio_columns", + ), + pytest.param( + [ColumnType.ACCURACY], + ["feature3_accuracy"], + id="filter_accuracy_columns", + ), + pytest.param( + [ColumnType.PREDICTION], + ["feature4_prediction"], + id="filter_prediction_columns", + ), + pytest.param( + [ColumnType.ERROR, ColumnType.ACCURACY], + ["feature1_error", "feature3_accuracy"], + id="filter_multiple_column_types", + ), + pytest.param( + [ColumnType.ACTUAL, ColumnType.PREDICTION], + ["feature1_actual", "feature4_prediction", "another_feature"], + id="filter_actual_and_prediction_columns", + ), + pytest.param( + [], + [], + id="filter_no_columns_empty_list", ), - ([], []), ], ) -def test_filter_data(sample_features_df, columns_list, expected_cols): - # Tests that filter_data correctly selects columns based on suffixes. - result = filter_data(sample_features_df, columns_list) - expected = sample_features_df[expected_cols].values - np.testing.assert_array_equal(result, expected) - assert result.shape == (3, len(expected_cols)) +def test_filter_data(sample_features_df, column_types, expected_cols): + """ + Test that filter_data correctly selects columns based on ColumnType suffixes. + + Verifies that: + - The correct columns are selected for each ColumnType + - Multiple ColumnTypes can be filtered simultaneously + - Empty column_types list returns empty result + - Output shape matches expected dimensions + - Values are preserved correctly + """ + # Act + result = filter_data(sample_features_df, column_types) + + # Assert + expected = sample_features_df[expected_cols].values if expected_cols else np.array([]).reshape(3, 0) + + np.testing.assert_array_equal( + result, + expected, + err_msg=f"Filtered data does not match expected for column_types: {column_types}", + ) + assert result.shape == (3, len(expected_cols)), ( + f"Result shape {result.shape} does not match expected shape (3, {len(expected_cols)})" + ) def test_mlp_classifier(): - # Tests the MLPClassifier initialization and forward pass. + """ + Test the MLPClassifier initialization and forward pass. + + Verifies that: + - Model layers are initialized with correct dimensions + - Forward pass produces correct output shape + - Output values are in valid range [0, 1] (sigmoid activation) + """ + # Arrange input_size, hidden_size, output_size = 10, 5, 1 + batch_size = 4 + # Act model = MLPClassifier(input_size, hidden_size, output_size) - # Check layer types and sizes - assert isinstance(model.layers[0], torch.nn.Linear) - assert model.layers[0].in_features == input_size - assert model.layers[0].out_features == hidden_size - assert isinstance(model.layers[2], torch.nn.Linear) - assert model.layers[2].in_features == hidden_size - assert model.layers[2].out_features == output_size + # Assert - Check layer types and sizes + assert isinstance(model.layers[0], torch.nn.Linear), "First layer should be Linear" + assert model.layers[0].in_features == input_size, f"Expected input features: {input_size}" + assert model.layers[0].out_features == hidden_size, f"Expected hidden features: {hidden_size}" + assert isinstance(model.layers[2], torch.nn.Linear), "Third layer should be Linear" + assert model.layers[2].in_features == hidden_size, f"Expected hidden to output features: {hidden_size}" + assert model.layers[2].out_features == output_size, f"Expected output features: {output_size}" # Test forward pass - input_tensor = torch.randn(4, input_size) + input_tensor = torch.randn(batch_size, input_size) output = model(input_tensor) - assert output.shape == (4, output_size) - assert torch.all(output >= 0) and torch.all(output <= 1) - + + # The output may be squeezed, so check for either (batch_size,) or (batch_size, output_size) + assert output.shape in [(batch_size,), (batch_size, output_size)], ( + f"Output shape {output.shape} should be either ({batch_size},) or ({batch_size}, {output_size})" + ) + assert torch.all(output >= 0) and torch.all(output <= 1), ( + "Output values should be in range [0, 1] due to sigmoid activation" + ) @patch("midst_toolkit.attacks.ept.classification.MLPClassifier") def test_train_mlp(mock_mlp_class): - # Tests the train_mlp function's logic and outputs. + # Tests the train_mlp function with mocked MLPClassifier. + mock_model = MagicMock() mock_model.parameters.return_value = [torch.nn.Parameter(torch.randn(2, 2))] + mock_mlp_class.return_value.to.return_value = mock_model - mock_model.return_value = torch.rand(10, 1, requires_grad=True) + train_output_tensor = torch.rand(10, 1, requires_grad=True) eval_output_mock = MagicMock() - eval_output_mock.squeeze.return_value.cpu.return_value.numpy.return_value = np.array([0.6, 0.4, 0.7]) - - mock_model.side_effect = [ - torch.rand(10, 1, requires_grad=True), # 1st call (training) - eval_output_mock, # 2nd call (evaluation) - ] - - mock_mlp_class.return_value.to.return_value = mock_model + eval_output_mock.cpu.return_value.numpy.return_value = np.array([0.6, 0.4, 0.7]) x_train = np.random.rand(10, 5) - y_train = np.random.randint(0, 2, 10) + y_train = np.random.randint(0, 2, (10, 1)) x_test = np.random.rand(3, 5) - # Test with eval=True - y_pred, y_proba = train_mlp(x_train, y_train, x_test, DEVICE, epochs=1) + mock_model.side_effect = [train_output_tensor, eval_output_mock] + y_pred, y_proba = train_mlp(x_train, y_train, x_test=x_test, device=DEVICE, epochs=1) + assert y_pred is not None assert y_proba is not None assert y_pred.shape == (3,) assert y_proba.shape == (3,) - np.testing.assert_array_equal(y_pred, np.array([1, 0, 1])) - mock_model.side_effect = [ - torch.rand(10, 1, requires_grad=True), - eval_output_mock, - ] + np.testing.assert_array_equal(y_pred, np.array([1, 0, 1])) + + mock_model.side_effect = [train_output_tensor] - # Test with eval=False + # No eval y_pred_no_eval, y_proba_no_eval = train_mlp(x_train, y_train, x_test=None, device=DEVICE, epochs=1) + assert y_pred_no_eval is None assert y_proba_no_eval is None @@ -147,23 +211,23 @@ def attack_data(): return x_train, y_train, x_test, y_test -@pytest.mark.parametrize("classifier_type", ["XGBoost", "CatBoost"]) +@pytest.mark.parametrize("classifier_type", [ClassifierType.XGBOOST, ClassifierType.CATBOOST]) @patch("midst_toolkit.attacks.ept.classification.XGBClassifier") @patch("midst_toolkit.attacks.ept.classification.CatBoostClassifier") def test_train_attack_classifier_tree_models(mock_catboost, mock_xgboost, classifier_type, attack_data): # Tests train_attack_classifier for XGBoost and CatBoost x_train, y_train, x_test, y_test = attack_data - columns_list = ["error"] + column_types = [ColumnType.ERROR] mock_model = MagicMock() mock_model.predict.return_value = np.zeros(10) mock_model.predict_proba.return_value = np.zeros((10, 2)) - if classifier_type == "XGBoost": + if classifier_type == ClassifierType.XGBOOST: mock_xgboost.return_value = mock_model else: mock_catboost.return_value = mock_model - results = train_attack_classifier(classifier_type, columns_list, x_train, y_train, x_test, y_test) + results = train_attack_classifier(classifier_type, column_types, x_train, y_train, x_test, y_test) assert "prediction_results" in results assert "scores" in results @@ -176,38 +240,39 @@ def test_train_attack_classifier_tree_models(mock_catboost, mock_xgboost, classi def test_train_attack_classifier_mismatched_data(attack_data): # Tests that train_attack_classifier raises errors for mismatched data shapes x_train, y_train, x_test, y_test = attack_data - columns_list = ["error"] + column_types = [ColumnType.ERROR] # Test mismatches with pytest.raises(AssertionError, match="Mismatch in number of training samples and labels"): - train_attack_classifier("XGBoost", columns_list, x_train.head(10), y_train, x_test, y_test) + train_attack_classifier(ClassifierType.XGBOOST, column_types, x_train.head(10), y_train, x_test, y_test) with pytest.raises(AssertionError, match="Mismatch in number of test samples and labels"): - train_attack_classifier("XGBoost", columns_list, x_train, y_train, x_test.head(5), y_test) + train_attack_classifier(ClassifierType.XGBOOST, column_types, x_train, y_train, x_test.head(5), y_test) x_test_wrong_features = x_test.rename(columns={"feature_error": "another_feature"}) with pytest.raises(AssertionError, match="Mismatch in number of features between train and test sets"): - train_attack_classifier("XGBoost", columns_list, x_train, y_train, x_test_wrong_features, y_test) + train_attack_classifier(ClassifierType.XGBOOST, column_types, x_train, y_train, x_test_wrong_features, y_test) @patch("midst_toolkit.attacks.ept.classification.train_mlp") def test_train_attack_classifier_mlp(mock_train_mlp, attack_data): # Tests train_attack_classifier for the MLP model x_train, y_train, x_test, y_test = attack_data - columns_list = ["error"] + column_types = [ColumnType.ERROR] mock_train_mlp.return_value = (np.zeros(10), np.zeros(10)) - results = train_attack_classifier("MLP", columns_list, x_train, y_train, x_test, y_test) + results = train_attack_classifier(ClassifierType.MLP, column_types, x_train, y_train, x_test, y_test) assert "prediction_results" in results assert "scores" in results mock_train_mlp.assert_called_once() - - assert mock_train_mlp.call_args[1]["eval"] is True + def test_train_attack_classifier_unsupported(attack_data): # Tests that an unsupported classifier type raises an assertion error x_train, y_train, x_test, y_test = attack_data - with pytest.raises(AssertionError, match="Unsupported classifier type: SVM"): - train_attack_classifier("SVM", ["error"], x_train, y_train, x_test, y_test) + column_types = [ColumnType.ERROR] + + with pytest.raises(ValueError): + train_attack_classifier(MockClassifierType.UNSUPPORTED, column_types, x_train, y_train, x_test, y_test) From 942fcd1a27a757f5cb27f33ea0a73cee56e09343 Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Mon, 19 Jan 2026 14:49:58 -0500 Subject: [PATCH 28/29] Ruff fix --- examples/ept_attack/run_ept_attack.py | 6 ++++-- .../attacks/ept_attack/test_classification.py | 21 ++++++++++--------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index 0f57b81f..a9c888f4 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -111,7 +111,7 @@ def _summarize_and_save_training_results( Args: summary_results: A dictionary containing the summary results. output_summary_path: The path where the summary CSV will be saved. - summary_file_name: The name of the summary CSV file. + summary_file_name: The name of the summary CSV file. Returns: A pandas DataFrame containing the summarized results. @@ -257,7 +257,9 @@ def run_attack_classifier_training(config: DictConfig) -> None: for score_name, score_value in results["scores"].items(): f.write(f"{score_name}: {score_value}\n") - summary_df = _summarize_and_save_training_results(summary_results, output_summary_path, "attack_classifier_summary.csv") + summary_df = _summarize_and_save_training_results( + summary_results, output_summary_path, "attack_classifier_summary.csv" + ) summary_df.sort_values(by=["final_tpr_fpr_10"], ascending=False, inplace=True) best_result = summary_df.head(1) diff --git a/tests/unit/attacks/ept_attack/test_classification.py b/tests/unit/attacks/ept_attack/test_classification.py index 43809304..4f184ffc 100644 --- a/tests/unit/attacks/ept_attack/test_classification.py +++ b/tests/unit/attacks/ept_attack/test_classification.py @@ -1,19 +1,19 @@ +from enum import Enum from unittest.mock import MagicMock, patch import numpy as np import pandas as pd import pytest import torch -from enum import Enum from midst_toolkit.attacks.ept.classification import ( + ClassifierType, + ColumnType, MLPClassifier, filter_data, get_scores, train_attack_classifier, train_mlp, - ClassifierType, - ColumnType, ) from midst_toolkit.common.variables import DEVICE @@ -21,6 +21,7 @@ class MockClassifierType(Enum): UNSUPPORTED = "Unsupported" + @pytest.fixture def sample_features_df(): # Sample DataFrame for testing filter_data. @@ -83,7 +84,7 @@ def sample_features_df(): def test_filter_data(sample_features_df, column_types, expected_cols): """ Test that filter_data correctly selects columns based on ColumnType suffixes. - + Verifies that: - The correct columns are selected for each ColumnType - Multiple ColumnTypes can be filtered simultaneously @@ -93,10 +94,10 @@ def test_filter_data(sample_features_df, column_types, expected_cols): """ # Act result = filter_data(sample_features_df, column_types) - + # Assert expected = sample_features_df[expected_cols].values if expected_cols else np.array([]).reshape(3, 0) - + np.testing.assert_array_equal( result, expected, @@ -110,7 +111,7 @@ def test_filter_data(sample_features_df, column_types, expected_cols): def test_mlp_classifier(): """ Test the MLPClassifier initialization and forward pass. - + Verifies that: - Model layers are initialized with correct dimensions - Forward pass produces correct output shape @@ -134,7 +135,7 @@ def test_mlp_classifier(): # Test forward pass input_tensor = torch.randn(batch_size, input_size) output = model(input_tensor) - + # The output may be squeezed, so check for either (batch_size,) or (batch_size, output_size) assert output.shape in [(batch_size,), (batch_size, output_size)], ( f"Output shape {output.shape} should be either ({batch_size},) or ({batch_size}, {output_size})" @@ -143,6 +144,7 @@ def test_mlp_classifier(): "Output values should be in range [0, 1] due to sigmoid activation" ) + @patch("midst_toolkit.attacks.ept.classification.MLPClassifier") def test_train_mlp(mock_mlp_class): # Tests the train_mlp function with mocked MLPClassifier. @@ -169,7 +171,7 @@ def test_train_mlp(mock_mlp_class): assert y_proba.shape == (3,) np.testing.assert_array_equal(y_pred, np.array([1, 0, 1])) - + mock_model.side_effect = [train_output_tensor] # No eval @@ -266,7 +268,6 @@ def test_train_attack_classifier_mlp(mock_train_mlp, attack_data): assert "prediction_results" in results assert "scores" in results mock_train_mlp.assert_called_once() - def test_train_attack_classifier_unsupported(attack_data): From 56dc5b5141f7e5945201f0e0f92bc82ba8bf5efc Mon Sep 17 00:00:00 2001 From: Sara Kodeiri Date: Tue, 20 Jan 2026 13:04:10 -0500 Subject: [PATCH 29/29] Second round of David's comments --- examples/common/utils.py | 2 +- examples/ept_attack/run_ept_attack.py | 5 +++-- src/midst_toolkit/attacks/ept/classification.py | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/common/utils.py b/examples/common/utils.py index 2e21a51b..75129ca9 100644 --- a/examples/common/utils.py +++ b/examples/common/utils.py @@ -33,7 +33,7 @@ def iterate_model_folders( def directory_checks(directory_path: Path, custom_error_message: str = "") -> None: """ - Performs checks to ensure that the feature extraction directory exists and is not empty. + Performs checks to ensure that the given directory exists and is not empty. Args: directory_path: Path to the directory to check. diff --git a/examples/ept_attack/run_ept_attack.py b/examples/ept_attack/run_ept_attack.py index a9c888f4..f5a11a83 100644 --- a/examples/ept_attack/run_ept_attack.py +++ b/examples/ept_attack/run_ept_attack.py @@ -199,15 +199,16 @@ def run_attack_classifier_training(config: DictConfig) -> None: directory_checks(train_features_path, "Make sure to run feature extraction first.") sorted_feature_files = sorted(train_features_path.glob("*.csv")) + split_index = len(sorted_feature_files) * 5 // 6 # Get the first 25 feature files - train_feature_files = sorted_feature_files[:25] + train_feature_files = sorted_feature_files[:split_index] # Concatenate all the train feature files into a single dataframe df_train_features = pd.concat([pd.read_csv(f) for f in train_feature_files], ignore_index=True) train_labels = df_train_features["is_train"] df_train_features = df_train_features.drop(columns=["is_train"]) - test_feature_files = sorted_feature_files[25:] + test_feature_files = sorted_feature_files[split_index:] df_test_features = pd.concat([pd.read_csv(f) for f in test_feature_files], ignore_index=True) test_labels = df_test_features["is_train"] df_test_features = df_test_features.drop(columns=["is_train"]) diff --git a/src/midst_toolkit/attacks/ept/classification.py b/src/midst_toolkit/attacks/ept/classification.py index 30b994b6..07de10db 100644 --- a/src/midst_toolkit/attacks/ept/classification.py +++ b/src/midst_toolkit/attacks/ept/classification.py @@ -153,6 +153,7 @@ def train_mlp( y_pred, y_proba = None, None if x_test is not None: + model.eval() x_test_tensor = torch.tensor(x_test, dtype=torch.float32).to(device) with torch.no_grad(): # Get probabilities